[DebianGIS-dev] r919 - in packages/openev/trunk: . CVS debian pymod tools

frankie at alioth.debian.org frankie at alioth.debian.org
Sat Jun 23 22:27:40 UTC 2007


Author: frankie
Date: 2007-06-23 22:27:39 +0000 (Sat, 23 Jun 2007)
New Revision: 919

Added:
   packages/openev/trunk/debian/
   packages/openev/trunk/debian/README.Debian
   packages/openev/trunk/debian/changelog
   packages/openev/trunk/debian/compat
   packages/openev/trunk/debian/control
   packages/openev/trunk/debian/copyright
   packages/openev/trunk/debian/libgview-dev.dirs
   packages/openev/trunk/debian/libgview-dev.install
   packages/openev/trunk/debian/libgview1.dirs
   packages/openev/trunk/debian/libgview1.install
   packages/openev/trunk/debian/openev-doc.dirs
   packages/openev/trunk/debian/openev-doc.doc-base
   packages/openev/trunk/debian/openev-doc.docs
   packages/openev/trunk/debian/openev-doc.install
   packages/openev/trunk/debian/openev.dirs
   packages/openev/trunk/debian/openev.in
   packages/openev/trunk/debian/openev.install
   packages/openev/trunk/debian/openev.menu
   packages/openev/trunk/debian/rules
   packages/openev/trunk/debian/watch.ex
   packages/openev/trunk/pymod/Makefile
   packages/openev/trunk/tools/fusion.py
   packages/openev/trunk/tools/histoEnhance.py
   packages/openev/trunk/tools/maps.dat
   packages/openev/trunk/tools/projection.py
   packages/openev/trunk/tools/services.txt
   packages/openev/trunk/tools/wmstool.py
   packages/openev/trunk/version.config
Modified:
   packages/openev/trunk/CVS/Entries.Log
   packages/openev/trunk/Makefile.in
   packages/openev/trunk/configure
   packages/openev/trunk/configure.in
   packages/openev/trunk/gvshapeslayer.c
   packages/openev/trunk/gvviewarea.c
   packages/openev/trunk/pymod/Makefile.in
   packages/openev/trunk/pymod/filedlg.py
   packages/openev/trunk/pymod/gtkmissing.py
   packages/openev/trunk/pymod/gvclassification.py
   packages/openev/trunk/pymod/gvclassifydlg.py
   packages/openev/trunk/pymod/gvhtml.py
   packages/openev/trunk/pymod/gview.py
   packages/openev/trunk/pymod/gviewapp.py
   packages/openev/trunk/pymod/gvlabeledit.py
   packages/openev/trunk/pymod/gvlegenddlg.py
   packages/openev/trunk/pymod/gvmaptools.py
   packages/openev/trunk/pymod/gvogrdlg.py
   packages/openev/trunk/pymod/gvogrfsgui.py
   packages/openev/trunk/pymod/gvpquerypropdlg.py
   packages/openev/trunk/pymod/gvprint.py
   packages/openev/trunk/pymod/gvrasterpropdlg.py
   packages/openev/trunk/pymod/gvsdsdlg.py
   packages/openev/trunk/pymod/gvselbrowser.py
   packages/openev/trunk/pymod/gvutils.py
   packages/openev/trunk/pymod/gvvectorpropdlg.py
   packages/openev/trunk/pymod/gvviewwindow.py
   packages/openev/trunk/pymod/ibrowse.py
   packages/openev/trunk/pymod/layerdlg.py
   packages/openev/trunk/pymod/oe_about.py
   packages/openev/trunk/pymod/oeattedit.py
   packages/openev/trunk/pymod/openev.py
   packages/openev/trunk/pymod/pgu.py
   packages/openev/trunk/pymod/pgucolor.py
   packages/openev/trunk/pymod/pgucolorsel.py
   packages/openev/trunk/pymod/pgucolourswatch.py
   packages/openev/trunk/pymod/pgucombo.py
   packages/openev/trunk/pymod/pguentry.py
   packages/openev/trunk/pymod/pgufilesel.py
   packages/openev/trunk/pymod/pgufont.py
   packages/openev/trunk/pymod/pgugrid.py
   packages/openev/trunk/pymod/pgumenu.py
   packages/openev/trunk/pymod/pguprogress.py
   packages/openev/trunk/pymod/pgushapesgrid.py
   packages/openev/trunk/pymod/pgutextarea.py
   packages/openev/trunk/pymod/pgutogglebutton.py
   packages/openev/trunk/pymod/pyshell.py
   packages/openev/trunk/pymod/testmain.py
   packages/openev/trunk/pymod/toolexample.py
   packages/openev/trunk/pymod/vecplot.py
   packages/openev/trunk/tools/Tool_DriverList.py
   packages/openev/trunk/tools/Tool_Export.py
   packages/openev/trunk/tools/Tool_ShapesGrid.py
   packages/openev/trunk/tools/Tool_autopan.py
   packages/openev/trunk/tools/calculator.py
   packages/openev/trunk/tools/compose.py
   packages/openev/trunk/tools/fft.py
   packages/openev/trunk/tools/gvrastertools.py
   packages/openev/trunk/tools/imgproctemplate.py
   packages/openev/trunk/tools/isodata.py
   packages/openev/trunk/tools/mil_symbols.py
   packages/openev/trunk/tools/open_raw.py
   packages/openev/trunk/tools/open_subarea.py
   packages/openev/trunk/tools/rendertest.py
Log:
[svn-inject] Applying Debian modifications to trunk

Modified: packages/openev/trunk/CVS/Entries.Log
===================================================================
--- packages/openev/trunk/CVS/Entries.Log	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/CVS/Entries.Log	2007-06-23 22:27:39 UTC (rev 919)
@@ -7,3 +7,4 @@
 A D/symbols////
 A D/tools////
 A D/xmlconfig////
+A D/openev////

Modified: packages/openev/trunk/Makefile.in
===================================================================
--- packages/openev/trunk/Makefile.in	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/Makefile.in	2007-06-23 22:27:39 UTC (rev 919)
@@ -29,6 +29,7 @@
 CFLAGS = $(OPTFLAGS) @C_WFLAGS@ @CFLAGS@
 LDFLAGS = @LDFLAGS@
 
+include version.config
 
 LIBS = $(LDFLAGS) @LIBS@ 
 
@@ -36,7 +37,7 @@
 INSTALL_LIB 	=	./install-sh -c
 INSTALL_DIR	= 	./install-sh -d
 
-default: configure libgv.a gvtest
+default: configure libgview.a libgview.so.$(major).$(minor) gvtest gvtest2
 	(cd pymod; $(MAKE))
 
 all:	default
@@ -44,45 +45,61 @@
 %.o : %.c
 	$(CC) $(CFLAGS) -c $<
 
-libgv.a: $(OBJ)
+libgview.a: $(OBJ)
 	rm -f $@
 	ar cq $@ $(OBJ)
 	@RANLIB@ $@
 
-gvtest:	testmain.o libgv.a
-	$(CXX) -g -o $@ testmain.o libgv.a $(LIBS)
+libgview.so.$(major).$(minor): $(OBJ)
+	$(CC) -shared -Wl,-soname,libgview.so.$(major) $(OBJ) -lgtk -lgtkgl -lgdal -lGL -o $@
+	ln -sf $@ libgview.so.$(major)
+	ln -sf $@ libgview.so
 
+gvtest:	testmain.o libgview.a
+	$(CC) -g -o $@ testmain.o libgview.a $(LIBS)
+
+gvtest2:	testmain.o libgview.so
+	$(CC) -g -o $@ testmain.o -L. -lgview $(LIBS)
+
 clean:
-	rm -f gvtest *.o *.so *.a
+	rm -f gvtest gvtest2 *.o *.so* *.a gv_config.h
 	(cd pymod; $(MAKE) clean)
 
 distclean: dist-clean
 
 dist-clean: clean
-	rm Makefile config.log config.cache config.status
+	rm -f Makefile config.log config.cache config.status
 
 configure:	configure.in
 	-autoconf
 
-install:
+install: all
 	$(INSTALL_DIR) $(INST_PREFIX)/bin
+	$(INSTALL_DIR) $(INST_PREFIX)/lib
 	$(INSTALL_DIR) $(INST_PREFIX)/ramps
 	$(INSTALL_DIR) $(INST_PREFIX)/tools
 	$(INSTALL_DIR) $(INST_PREFIX)/pymod
-	$(INSTALL_DIR) $(INST_PREFIX)/html
+	$(INSTALL_DIR) $(INST_PREFIX)/html/developer_info
 	$(INSTALL_DIR) $(INST_PREFIX)/pics
 	$(INSTALL_DIR) $(INST_PREFIX)/symbols
 	$(INSTALL_DIR) $(INST_PREFIX)/xmlconfig
 	$(INSTALL) gvtest $(INST_PREFIX)/bin
+	$(INSTALL) gvtest2 $(INST_PREFIX)/bin
 	$(INSTALL_LIB) pymod/_gvmodule.so $(INST_PREFIX)/pymod
 	$(INSTALL_LIB) pymod/_gtkmissing.so $(INST_PREFIX)/pymod
+	cp -P libgview.* $(INST_PREFIX)/lib
+	$(INSTALL_LIB) libgview.a $(INST_PREFIX)/lib
+	-$(INSTALL_LIB) libgview.la $(INST_PREFIX)/lib
+	$(INSTALL_LIB) libgview.so.$(major).$(minor) $(INST_PREFIX)/lib
 	cp pymod/*.py $(INST_PREFIX)/pymod
 	cp pymod/*.so $(INST_PREFIX)/pymod
 	chmod a+x $(INST_PREFIX)/pymod/openev.py
 	chmod a+x $(INST_PREFIX)/pymod/ibrowse.py
 	chmod a+x $(INST_PREFIX)/pymod/gvplot.py
 	cp tools/*.* $(INST_PREFIX)/tools
+	cp pics/*.* $(INST_PREFIX)/pics
 	cp ramps/*.* $(INST_PREFIX)/ramps
 	cp html/*.* $(INST_PREFIX)/html
+	cp html/developer_info/*.* $(INST_PREFIX)/html/developer_info
 	cp symbols/*.* $(INST_PREFIX)/symbols
 	cp xmlconfig/*.* $(INST_PREFIX)/xmlconfig

Modified: packages/openev/trunk/configure
===================================================================
--- packages/openev/trunk/configure	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/configure	2007-06-23 22:27:39 UTC (rev 919)
@@ -965,7 +965,7 @@
     else
       echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
     fi
-    cd $ac_popdir
+    cd "$ac_popdir"
   done
 fi
 
@@ -1883,8 +1883,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -1942,8 +1941,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2059,8 +2057,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2114,8 +2111,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2160,8 +2156,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2205,8 +2200,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2390,8 +2384,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2449,8 +2442,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2521,8 +2513,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2566,8 +2557,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_cxx_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_cxx_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -2726,8 +2716,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3045,8 +3034,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3216,8 +3204,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3289,8 +3276,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3441,8 +3427,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3484,8 +3469,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3542,8 +3526,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3705,8 +3688,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -3800,8 +3782,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4344,8 +4325,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4458,8 +4438,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4517,8 +4496,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4576,8 +4554,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4654,8 +4631,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4776,8 +4752,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4849,8 +4824,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -4923,8 +4897,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5028,8 +5001,7 @@
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
-	 { ac_try='test -z "$ac_c_werror_flag"
-			 || test ! -s conftest.err'
+	 { ac_try='test -z "$ac_c_werror_flag"			 || test ! -s conftest.err'
   { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -5213,7 +5185,7 @@
 if test "$with_render_plugin" == "yes" ; then
     # Will enable g_module_* code.
      CFLAGS="$CFLAGS -malign-double -fPIC -DGV_USE_RENDER_PLUGIN"
-    # This is needed to access stuff inside libgv.a from the plugin.
+    # This is needed to access stuff inside libgview.a from the plugin.
     LDFLAGS="$LDFLAGS -rdynamic"
 
     echo "$as_me:$LINENO: result: yes" >&5
@@ -6082,11 +6054,6 @@
 
 
 
-  if test x"$ac_file" != x-; then
-    { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    rm -f "$ac_file"
-  fi
   # Let's still pretend it is `configure' which instantiates (i.e., don't
   # use $as_me), people would be surprised to read:
   #    /* config.h.  Generated by config.status.  */
@@ -6125,6 +6092,12 @@
 	 fi;;
       esac
     done` || { (exit 1); exit 1; }
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
   sed "$ac_vpsub

Modified: packages/openev/trunk/configure.in
===================================================================
--- packages/openev/trunk/configure.in	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/configure.in	2007-06-23 22:27:39 UTC (rev 919)
@@ -165,7 +165,7 @@
 if test "$with_render_plugin" == "yes" ; then
     # Will enable g_module_* code.
      CFLAGS="$CFLAGS -malign-double -fPIC -DGV_USE_RENDER_PLUGIN"
-    # This is needed to access stuff inside libgv.a from the plugin.
+    # This is needed to access stuff inside libgview.a from the plugin.
     LDFLAGS="$LDFLAGS -rdynamic"
     
     AC_MSG_RESULT([yes])

Added: packages/openev/trunk/debian/README.Debian
===================================================================
--- packages/openev/trunk/debian/README.Debian	                        (rev 0)
+++ packages/openev/trunk/debian/README.Debian	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,33 @@
+openev for Debian
+-----------------
+
+this is my first attempt to make a python package.
+the upstream source files are not available for direct download.
+i have downloaded them from cvs (see later).
+
+in addition, there are a few tools by Mario Beauchamp (starged at videotron.ca) 
+downloadable from http://pages.infinit.net/starged/openev, specifically:
+* a wms client to access wms services, documented at 
+  http://pages.infinit.net/starged/openev/wmstool/home.htm
+* a fusion tool for pansharpening, pan merging of panchromatic and RGB images.
+* Image enhancement (AKA contrast stretching, scaling) using histograms 
+  and statistical analysis.
+  see http://pages.infinit.net/starged/openev/histogram/home.htm
+* an Early version of a raster reprojection utility.
+
+to get the source, run the following:
+mkdir openev-cvs
+cd openev-cvs
+cvs -d:pserver:anonymous at cvs.sourceforge.net:/cvsroot/openev login
+cvs -z3 -d:pserver:anonymous at cvs.sourceforge.net:/cvsroot/openev co openev
+
+#in addition, please download newer versions of the following:
+http://pages.infinit.net/starged/openev/wmstool/wmstool.py
+http://pages.infinit.net/starged/openev/wmstool/maps.dat
+http://pages.infinit.net/starged/openev/wmstool/services.txt
+http://pages.infinit.net/starged/openev/fusion.py
+http://pages.infinit.net/starged/openev/histogram/histoEnhance.py
+http://pages.infinit.net/starged/openev/projection.py
+these files should go into tools/*
+
+ -- Alex Bodnaru <alexbodn at 012.net.il>, Thu, 20 Oct 2005 00:51:18 +0200

Added: packages/openev/trunk/debian/changelog
===================================================================
--- packages/openev/trunk/debian/changelog	                        (rev 0)
+++ packages/openev/trunk/debian/changelog	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,6 @@
+openev (1.9.0-cvs20051112-1) unstable; urgency=low
+
+  * Initial release Closes: #291562
+
+ -- Alex Bodnaru <alexbodn at 012.net.il>  Thu, 20 Oct 2005 00:51:18 +0200
+

Added: packages/openev/trunk/debian/compat
===================================================================
--- packages/openev/trunk/debian/compat	                        (rev 0)
+++ packages/openev/trunk/debian/compat	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+4

Added: packages/openev/trunk/debian/control
===================================================================
--- packages/openev/trunk/debian/control	                        (rev 0)
+++ packages/openev/trunk/debian/control	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,48 @@
+Source: openev
+Section: science
+Priority: optional
+Maintainer: Alex Bodnaru <alexbodn at 012.net.il>
+Build-Depends: debhelper (>= 4.0.0), autotools-dev, python, python-gtk-1.2, python-gdal, gtkglarea5-dev, libgdal1-dev, findutils
+Standards-Version: 3.6.2
+
+Package: openev
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, python, python-numeric, python-numeric-ext, python-gdal, proj (>= 4.0.0), python-gtk-1.2, python-gtkextra
+Recommends: openev-doc (= ${Source-Version})
+Description: Application for viewing and analysing geospatial data
+ OpenEV is a library, and reference application for viewing and analysing 
+ raster and vector geospatial data.
+ Objectives
+ * Run on popular platforms (Linux, Windows, Solaris, IRIX).
+ * Handle raster and vector data.
+ * Support 2d and 3d display.
+ * Gracefully handle very large (gigabyte) raster datasets.
+ * Support multi-channel, and complex raster datasets.
+ * Understand and interpret georeferencing information, and provide on-the-fly 
+   reprojection of datasets.
+ * Provide view manipulation functions (pan, zoom, rotate) at interactive frame
+   rates.
+ * Provide a powerful image analysis tool.
+ * Serve as a component in a variety of image analysis applications. 
+
+Package: libgview-dev
+Section: libdevel
+Architecture: any
+Depends: libgview1 (= ${Source-Version})
+Description: Library for analysing geospatial data. static libs and headers
+ libgview is a library, and reference application (openev) for viewing 
+ and analysing raster and vector geospatial data.
+
+Package: libgview1
+Section: libs
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, xlibmesa-gl
+Description: Library for viewing and analysing geospatial data
+ libgview is a library, and reference application (openev) for viewing 
+ and analysing raster and vector geospatial data.
+
+Package: openev-doc
+Architecture: all
+Description: Application for analysing geospatial data. Documentation
+ OpenEV is a library, and reference application for viewing and analysing 
+ raster and vector geospatial data.

Added: packages/openev/trunk/debian/copyright
===================================================================
--- packages/openev/trunk/debian/copyright	                        (rev 0)
+++ packages/openev/trunk/debian/copyright	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,10 @@
+This package was debianized by Alex Bodnaru <alexbodn at 012.net.il> on
+Thu, 20 Oct 2005 00:51:18 +0200.
+
+It was downloaded from http://openev.sourceforge.net
+
+Upstream Authors: See documentation and site.
+
+This code is released under the terms of the GNU Lesser GENERAL PUBLIC LICENSE.
+On Debian GNU/Linux systems, the complete text of the GNU Lesser General
+Public License can be found in `/usr/share/common-licenses/LGPL'.

Added: packages/openev/trunk/debian/libgview-dev.dirs
===================================================================
--- packages/openev/trunk/debian/libgview-dev.dirs	                        (rev 0)
+++ packages/openev/trunk/debian/libgview-dev.dirs	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+usr/lib
+usr/include

Added: packages/openev/trunk/debian/libgview-dev.install
===================================================================
--- packages/openev/trunk/debian/libgview-dev.install	                        (rev 0)
+++ packages/openev/trunk/debian/libgview-dev.install	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,3 @@
+usr/lib/libgview.*a
+usr/lib/libgview.so
+usr/include/*

Added: packages/openev/trunk/debian/libgview1.dirs
===================================================================
--- packages/openev/trunk/debian/libgview1.dirs	                        (rev 0)
+++ packages/openev/trunk/debian/libgview1.dirs	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/lib

Added: packages/openev/trunk/debian/libgview1.install
===================================================================
--- packages/openev/trunk/debian/libgview1.install	                        (rev 0)
+++ packages/openev/trunk/debian/libgview1.install	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/lib/libgview.so.*

Added: packages/openev/trunk/debian/openev-doc.dirs
===================================================================
--- packages/openev/trunk/debian/openev-doc.dirs	                        (rev 0)
+++ packages/openev/trunk/debian/openev-doc.dirs	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/share/doc/openev-doc/html

Added: packages/openev/trunk/debian/openev-doc.doc-base
===================================================================
--- packages/openev/trunk/debian/openev-doc.doc-base	                        (rev 0)
+++ packages/openev/trunk/debian/openev-doc.doc-base	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,11 @@
+Document: openev
+Title: Debian openev Manual
+Author: <insert document author here>
+Abstract: This manual describes what openev is
+ and how it can be used to
+ manage online manuals on Debian systems.
+Section: unknown
+
+Format: HTML
+Index: /usr/share/doc/openev-doc/html/openevmain.html
+Files: /usr/share/doc/openev-doc/html/*.html

Added: packages/openev/trunk/debian/openev-doc.docs
===================================================================
--- packages/openev/trunk/debian/openev-doc.docs	                        (rev 0)
+++ packages/openev/trunk/debian/openev-doc.docs	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,3 @@
+TODO
+debian/README.Debian
+ChangeLog

Added: packages/openev/trunk/debian/openev-doc.install
===================================================================
--- packages/openev/trunk/debian/openev-doc.install	                        (rev 0)
+++ packages/openev/trunk/debian/openev-doc.install	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1 @@
+usr/share/doc/openev-doc/html/*

Added: packages/openev/trunk/debian/openev.dirs
===================================================================
--- packages/openev/trunk/debian/openev.dirs	                        (rev 0)
+++ packages/openev/trunk/debian/openev.dirs	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+usr/share/openev
+usr/bin

Added: packages/openev/trunk/debian/openev.in
===================================================================
--- packages/openev/trunk/debian/openev.in	                        (rev 0)
+++ packages/openev/trunk/debian/openev.in	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,44 @@
+#!/bin/sh
+
+OPENEVHOME=/usr/share/openev
+
+if [ ! -d $HOME/openev ]; then
+	mkdir $HOME/openev
+	cd $HOME/openev
+	for DIR in html pics pymod ramps tools symbols ; do
+		if [ ! -d $DIR -a ! -h $DIR ]; then
+			ln -s $OPENEVHOME/$DIR $DIR
+		fi
+	done
+else
+	cd $HOME/openev
+fi
+for DIR in xmlconfig ; do
+	if [ ! -d $DIR -a ! -h $DIR ]; then
+		cp -r $OPENEVHOME/$DIR $HOME/openev/$DIR
+	fi
+done
+
+OPENEVHOME=${HOME}/openev
+PYTHONPATH=${OPENEVHOME}/pymod:${PYTHONPATH}
+export OPENEVHOME PYTHONPATH
+
+if [ ! -d ${OPENEVHOME}/wms/services -a ! -h ${OPENEVHOME}/wms/services ]; then
+	if [ ! -d ${OPENEVHOME}/wms -a ! -h ${OPENEVHOME}/wms ]; then
+		mkdir ${OPENEVHOME}/wms 
+	fi
+	cd ${OPENEVHOME}/wms
+	for file in services.txt maps.dat ; do
+		if [ ! -f $file -a ! -h $file ]; then
+			cat ../tools/$file | awk '{gsub("\r", ""); print;}' > $file
+		fi
+	done
+	if [ -f services.txt -o -h services.txt ]; then
+		PYTHONPATH=${OPENEVHOME}/tools:${PYTHONPATH} python ../tools/wmstool.py services.txt
+	else
+		echo "services.txt not found in ${OPENEVHOME}/wms, nor in ${OPENEVHOME}/tools"
+	fi
+fi
+
+cd ${OPENEVHOME}
+pymod/openev.py "$@"

Added: packages/openev/trunk/debian/openev.install
===================================================================
--- packages/openev/trunk/debian/openev.install	                        (rev 0)
+++ packages/openev/trunk/debian/openev.install	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+usr/share/openev/*
+usr/bin/openev

Added: packages/openev/trunk/debian/openev.menu
===================================================================
--- packages/openev/trunk/debian/openev.menu	                        (rev 0)
+++ packages/openev/trunk/debian/openev.menu	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2 @@
+?package(openev):needs="X11" section="Apps"\
+  title="OpenEv" command="/usr/bin/openev"

Added: packages/openev/trunk/debian/rules
===================================================================
--- packages/openev/trunk/debian/rules	                        (rev 0)
+++ packages/openev/trunk/debian/rules	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,177 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+#
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+#
+# Modified to make a template file for a multi-binary package with separated
+# build-arch and build-indep targets  by Bill Allombert 2001
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+# This has to be exported to make some magic below work.
+export DH_OPTIONS
+
+include version.config
+
+prefix=/usr
+
+version=$(major).$(minor).$(micro)
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+DESTDIR=$(CURDIR)/debian/tmp
+OPENEVHOME=usr/share/openev
+AWK_INC_GVIEW=\
+{\
+    if ($$1=="\#include")\
+    {\
+        gsub("\"","",$$2); $$2="<gview/" $$2 ">";\
+    }\
+    else if ($$1=="\#" && $$2=="include")\
+    {\
+        gsub("\"","",$$3); $$3="<gview/" $$3 ">";\
+    }\
+    print;\
+}
+CURDIR:=`pwd`
+
+CFLAGS = -Wall -g
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+	CFLAGS += -O0
+else
+	CFLAGS += -O2
+endif
+
+config.status: configure
+	dh_testdir
+	# Add here commands to configure the package.
+	#CFLAGS="$(CFLAGS) -Wl,-z,defs"
+	autoconf2.50
+	CFLAGS=-DATLANTIS_BUILD ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --with-render-plugin=no --prefix=$(prefix) --mandir=$(prefix)/share/man --infodir=$(prefix)/share/info --with-ogr --with-gdal=$(prefix) #--with-double-geocoord
+
+#Architecture 
+build: build-arch build-indep
+
+build-arch: build-arch-stamp
+build-arch-stamp:  config.status
+
+	# Add here commands to compile the arch part of the package.
+	$(MAKE) 
+	touch build-arch-stamp
+
+build-indep: build-indep-stamp
+build-indep-stamp:  config.status
+
+	# Add here commands to compile the indep part of the package.
+#	#making doc needs transfig and latex2html (huge and non-free)
+#	$(MAKE) -C doc html
+	touch build-indep-stamp
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
+
+	# Add here commands to clean up after the build process.
+	-$(MAKE) distclean
+#ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+#	cp -f /usr/share/misc/config.sub config.sub
+#endif
+#ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+#	cp -f /usr/share/misc/config.guess config.guess
+#endif
+	dh_clean 
+
+install: install-indep install-arch
+
+# Must not depend on anything. This is to be called by
+# install-arch/install-indep
+# in another 'make' thread.
+install-common:
+	# Add here commands to install the files of the package into debian/tmp.
+	$(MAKE) install INST_PREFIX=$(DESTDIR)/$(OPENEVHOME)
+	mkdir -p $(DESTDIR)/usr
+	mv $(DESTDIR)/$(OPENEVHOME)/bin/ $(DESTDIR)/usr
+	install --mode=755 debian/openev.in $(DESTDIR)/usr/bin/openev
+	mv $(DESTDIR)/$(OPENEVHOME)/lib/ $(DESTDIR)/usr
+	mkdir -p $(DESTDIR)/usr/include/gview
+	cp *.h $(DESTDIR)/usr/include/gview
+	rm -f $(DESTDIR)/usr/include/gview/gview.h
+	cat gview.h | awk '$(AWK_INC_GVIEW)' > $(DESTDIR)/usr/include/gview.h
+	mkdir -p $(DESTDIR)/usr/share/doc/openev-doc
+	mv $(DESTDIR)/$(OPENEVHOME)/html/ $(DESTDIR)/usr/share/doc/openev-doc
+	ln -sf /usr/share/doc/openev-doc/html $(DESTDIR)/$(OPENEVHOME)
+
+install-indep: build-indep
+	dh_testdir
+	dh_testroot
+	dh_clean -k -i 
+	$(MAKE) -f debian/rules DH_OPTIONS=-a install-common
+	dh_installdirs -i
+
+	# Add here commands to install the indep part of the package into
+	# debian/<package>-doc.
+	#INSTALLDOC#
+
+	dh_install -i --sourcedir=$(CURDIR)/debian/tmp
+
+install-arch: build-arch
+	dh_testdir
+	dh_testroot
+	dh_clean -k -s 
+	$(MAKE) -f debian/rules DH_OPTIONS=-a install-common
+	dh_installdirs -s
+
+	dh_install -s --sourcedir=$(CURDIR)/debian/tmp
+# Must not depend on anything. This is to be called by
+# binary-arch/binary-indep
+# in another 'make' thread.
+binary-common:
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs
+	dh_installdocs
+#	dh_installexamples
+#	dh_installmenu
+#	dh_installdebconf	
+#	dh_installlogrotate	
+#	dh_installemacsen
+#	dh_installpam
+#	dh_installmime
+#	dh_installinit
+#	dh_installcron
+#	dh_installinfo
+#	dh_installman
+	dh_link
+	dh_strip
+	dh_compress -Xhtml
+	dh_fixperms
+#	dh_perl
+#	dh_python
+	dh_makeshlibs
+	dh_installdeb
+	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+# Build architecture independant packages using the common target.
+binary-indep: build-indep install-indep
+	$(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
+
+# Build architecture dependant packages using the common target.
+binary-arch: build-arch install-arch
+	$(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
+
+binary: binary-arch binary-indep
+	find debian -name CVS -exec rm -d '{}' ';'
+
+.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch 


Property changes on: packages/openev/trunk/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Added: packages/openev/trunk/debian/watch.ex
===================================================================
--- packages/openev/trunk/debian/watch.ex	                        (rev 0)
+++ packages/openev/trunk/debian/watch.ex	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,9 @@
+# Example watch control file for uscan
+# Rename this file to "watch" and then you can run the "uscan" command
+# to check for upstream updates and more.
+# See uscan(1) for format
+
+# Compulsory line, this is a version 3 file
+version=3
+
+#see README.Debian for details on getting upstream source.

Modified: packages/openev/trunk/gvshapeslayer.c
===================================================================
--- packages/openev/trunk/gvshapeslayer.c	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/gvshapeslayer.c	2007-06-23 22:27:39 UTC (rev 919)
@@ -504,6 +504,7 @@
 {
     gvgeocoord x_offset; /* for shadow and halo effects */
     gvgeocoord y_offset;
+	
 /* -------------------------------------------------------------------- */
 /*      Apply any offsets.                                              */
 /* -------------------------------------------------------------------- */
@@ -1885,7 +1886,6 @@
 
     if (bAntialiased)
         glEnable( GL_LINE_SMOOTH );
-
 /* -------------------------------------------------------------------- */
 /*      Draw all shapes that are not scale dependent, potentially       */
 /*      using a display list.                                           */

Modified: packages/openev/trunk/gvviewarea.c
===================================================================
--- packages/openev/trunk/gvviewarea.c	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/gvviewarea.c	2007-06-23 22:27:39 UTC (rev 919)
@@ -1582,11 +1582,13 @@
 {
     gint     font;
     GvBMFontInfo new_finfo;
+	gchar *name1 = name;
 
+    name = bmfontmap[0].gvname;
     /* translate aliases */
     for (font=0; bmfontmap[font].gvname != NULL; font++)
     {
-    if (strcmp(name, bmfontmap[font].gvname) == 0)
+    if (strcmp(name1, bmfontmap[font].gvname) == 0)
     {
             name = bmfontmap[font].gdkname;
         break;
@@ -1610,7 +1612,7 @@
         return -1;
     }
 
-    new_finfo.listbase = glGenLists(96);
+    new_finfo.listbase = glGenLists(127);
     if (new_finfo.listbase == 0)
     {
         g_warning("gv_view_area_bmfont_load(): font allocation failed");
@@ -1652,7 +1654,7 @@
 {
     GvBMFontInfo    *finfo;
 
-    if (font < 0 || font >= view->bmfonts->len )
+    if (text == NULL || font < 0 || font >= view->bmfonts->len )
         return;
 
     finfo = &(g_array_index( view->bmfonts, GvBMFontInfo, font ));

Added: packages/openev/trunk/pymod/Makefile
===================================================================
--- packages/openev/trunk/pymod/Makefile	                        (rev 0)
+++ packages/openev/trunk/pymod/Makefile	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,44 @@
+all: _gvmodule.so _gtkmissing.so
+
+CC	=	i486-linux-gnu-gcc
+CXX	=	i486-linux-gnu-g++
+
+OPTFLAGS = -O2 -g
+CFLAGS = $(OPTFLAGS) -Wall -I.. -I/usr/ogr/ogrsf_frmts   -I/usr/include/gtk-1.2 -I/usr/include/glib-1.2 -I/usr/lib/glib/include -D_REENTRANT -DATLANTIS_BUILD -I/usr/local/include     -I/usr/include/python2.3 -I/usr/include/python2.3
+
+LIBS =  -lgdal -L/usr/lib  -lgtkgl  -lGLU -lGL -L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmodule -lgthread -lglib -lpthread -ldl -lXi -lXext -lX11 -lm -ldl  -L/usr/local/lib -L.. -lgview
+
+PYLINK =  -o $@
+
+%.o : %.c
+	$(CC) $(CFLAGS) -c $<
+
+gvmodule.o: gvmodule.c gvmodule_impl.c gv_ciet.c
+
+_gvmodule.so: gvmodule.o
+	$(CC) -shared -o $@ $^ $(LIBS)
+
+_gtkmissing.so: gtkmissing.o
+	$(CC) -shared -o $@ $^ $(LIBS)
+
+gvmodule_impl.c: gv.defs mkgv.py
+	python mkgv.py
+
+clean:
+	rm -f *.o gvmodule_*.c *.so *.pyc
+
+doc:
+	@if test \! -d html ; then \
+	  mkdir html; \
+	else \
+	  rm -f html/*; \
+	fi 
+	pythondoc -f HTML4 -i -d html _gv gview gvbitlayerlut
+
+install-doc: doc
+	@if test -d ~/wwwgv/gv_python ; then \
+	  cp html/* ~/wwwgv/gv_python; \
+	  echo cp html/* ~/wwwgv/gv_python; \
+	else \
+	  echo "~/wwwgv/gv_python doesn't exist ... install fails."; \
+	fi

Modified: packages/openev/trunk/pymod/Makefile.in
===================================================================
--- packages/openev/trunk/pymod/Makefile.in	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/Makefile.in	2007-06-23 22:27:39 UTC (rev 919)
@@ -6,7 +6,7 @@
 OPTFLAGS = @OPTFLAGS@
 CFLAGS = $(OPTFLAGS) @C_WFLAGS@ -I.. @CFLAGS@ @PYTHON_INCLUDES@
 
-LIBS = @LDFLAGS@ @LIBS@ 
+LIBS = @LDFLAGS@ @LIBS@ -L.. -lgview
 
 PYLINK = @PYTHON_LINK@
 
@@ -15,11 +15,11 @@
 
 gvmodule.o: gvmodule.c gvmodule_impl.c gv_ciet.c
 
-_gvmodule.so: gvmodule.o ../libgv.a 
-	$(CXX) -shared -o $@ $^ $(LIBS)
+_gvmodule.so: gvmodule.o
+	$(CC) -shared -o $@ $^ $(LIBS)
 
 _gtkmissing.so: gtkmissing.o
-	$(CXX) -shared -o $@ $^ $(LIBS)
+	$(CC) -shared -o $@ $^ $(LIBS)
 
 gvmodule_impl.c: gv.defs mkgv.py
 	python mkgv.py

Modified: packages/openev/trunk/pymod/filedlg.py
===================================================================
--- packages/openev/trunk/pymod/filedlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/filedlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -185,6 +185,12 @@
 #
 
 import os
+
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import TRUE, FALSE
 from gvsignaler import Signaler

Modified: packages/openev/trunk/pymod/gtkmissing.py
===================================================================
--- packages/openev/trunk/pymod/gtkmissing.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gtkmissing.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -1,3 +1,8 @@
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk; _gtk = gtk; del gtk
 import _gtkmissing
 import _gv

Modified: packages/openev/trunk/pymod/gvclassification.py
===================================================================
--- packages/openev/trunk/pymod/gvclassification.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvclassification.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -792,7 +792,6 @@
 
             class_id = class_id + 1
 
-        
     ###########################################################################
     def set_title(self, title):
           """Set new title (for Legend)

Modified: packages/openev/trunk/pymod/gvclassifydlg.py
===================================================================
--- packages/openev/trunk/pymod/gvclassifydlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvclassifydlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -128,6 +128,11 @@
 
 import gview
 import gvutils
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import GDK
 from gvsignaler import Signaler
@@ -770,7 +775,8 @@
 
     def apply_ramp_cb(self, n, color):
         self.classification.set_color(n, color)
-        self.color_buttons[n].set_color(color)
+        if len(self.color_buttons) > n:
+            self.color_buttons[n].set_color(color)
 
     def apply_ramp(self, ramp, *args):
         ramp.apply_ramp(self.apply_ramp_cb, self.classification.count)

Modified: packages/openev/trunk/pymod/gvhtml.py
===================================================================
--- packages/openev/trunk/pymod/gvhtml.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvhtml.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -73,6 +73,11 @@
 import os.path
 import string
 import _gv
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import GDK
 import gview

Modified: packages/openev/trunk/pymod/gview.py
===================================================================
--- packages/openev/trunk/pymod/gview.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gview.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -310,6 +310,11 @@
 #  added get_height and build_skirt on GvRasterLayer
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk; _gtk = gtk; del gtk
 import _gtkmissing
 import _gv

Modified: packages/openev/trunk/pymod/gviewapp.py
===================================================================
--- packages/openev/trunk/pymod/gviewapp.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gviewapp.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -130,6 +130,11 @@
 #
 
 from gvsignaler import Signaler
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import FALSE, TRUE
 from GDK import *

Modified: packages/openev/trunk/pymod/gvlabeledit.py
===================================================================
--- packages/openev/trunk/pymod/gvlabeledit.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvlabeledit.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -52,6 +52,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview
 import string

Modified: packages/openev/trunk/pymod/gvlegenddlg.py
===================================================================
--- packages/openev/trunk/pymod/gvlegenddlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvlegenddlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -93,6 +93,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview
 import gvclassification

Modified: packages/openev/trunk/pymod/gvmaptools.py
===================================================================
--- packages/openev/trunk/pymod/gvmaptools.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvmaptools.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -39,6 +39,11 @@
 
 import gview
 import Numeric
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import os
 import gvogrfs

Modified: packages/openev/trunk/pymod/gvogrdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvogrdlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvogrdlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -45,6 +45,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview
 import os.path

Modified: packages/openev/trunk/pymod/gvogrfsgui.py
===================================================================
--- packages/openev/trunk/pymod/gvogrfsgui.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvogrfsgui.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -46,6 +46,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 from string import *
 from gvsignaler import *
@@ -160,6 +165,7 @@
         table.attach(self.field_label, 0, 1, 0, 1,
                 xoptions=SHRINK, yoptions=SHRINK)
         self.label_field = pgucombo.pguCombo()
+
         self.label_field.set_popdown_strings( fnlist )
         self.label_field.entry.connect('changed', self.label_change_cb)
         table.attach(self.label_field, 1, 3, 0, 1,

Modified: packages/openev/trunk/pymod/gvpquerypropdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvpquerypropdlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvpquerypropdlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -47,6 +47,11 @@
 #  added standard headers
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 from string import *
 

Modified: packages/openev/trunk/pymod/gvprint.py
===================================================================
--- packages/openev/trunk/pymod/gvprint.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvprint.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -73,6 +73,11 @@
 #  added standard headers
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 from gvconst import *

Modified: packages/openev/trunk/pymod/gvrasterpropdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvrasterpropdlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvrasterpropdlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -124,6 +124,11 @@
 #  don't show scaling min for complex layers
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 from string import *
 import gvutils

Modified: packages/openev/trunk/pymod/gvsdsdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvsdsdlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvsdsdlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -42,6 +42,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview
 import os.path

Modified: packages/openev/trunk/pymod/gvselbrowser.py
===================================================================
--- packages/openev/trunk/pymod/gvselbrowser.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvselbrowser.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -40,6 +40,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 from string import *
 from gvsignaler import *

Modified: packages/openev/trunk/pymod/gvutils.py
===================================================================
--- packages/openev/trunk/pymod/gvutils.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvutils.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -118,6 +118,11 @@
 #  added standard headers
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk; _gtk = gtk; del gtk
 import GtkExtra
 import string

Modified: packages/openev/trunk/pymod/gvvectorpropdlg.py
===================================================================
--- packages/openev/trunk/pymod/gvvectorpropdlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvvectorpropdlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
 #  added standard headers
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 from string import *
 import gvutils

Modified: packages/openev/trunk/pymod/gvviewwindow.py
===================================================================
--- packages/openev/trunk/pymod/gvviewwindow.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/gvviewwindow.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -103,6 +103,11 @@
 #  Fix goto dialog for raw layer case with row/col coordinates.
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import FALSE, TRUE
 from GDK import *

Modified: packages/openev/trunk/pymod/ibrowse.py
===================================================================
--- packages/openev/trunk/pymod/ibrowse.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/ibrowse.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -2,6 +2,11 @@
 
 import gviewapp
 import gview
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import FALSE, TRUE
 import GDK

Modified: packages/openev/trunk/pymod/layerdlg.py
===================================================================
--- packages/openev/trunk/pymod/layerdlg.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/layerdlg.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -92,6 +92,11 @@
 #  added standard headers
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview
 import os.path

Modified: packages/openev/trunk/pymod/oe_about.py
===================================================================
--- packages/openev/trunk/pymod/oe_about.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/oe_about.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -32,6 +32,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import FALSE, TRUE
 from GDK import *

Modified: packages/openev/trunk/pymod/oeattedit.py
===================================================================
--- packages/openev/trunk/pymod/oeattedit.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/oeattedit.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview
 import string           

Modified: packages/openev/trunk/pymod/openev.py
===================================================================
--- packages/openev/trunk/pymod/openev.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/openev.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -79,6 +79,11 @@
 
 import gviewapp
 import gview
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import sys
 import os

Modified: packages/openev/trunk/pymod/pgu.py
===================================================================
--- packages/openev/trunk/pymod/pgu.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgu.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk; _gtk = gtk; del gtk
 from string import *
 

Modified: packages/openev/trunk/pymod/pgucolor.py
===================================================================
--- packages/openev/trunk/pymod/pgucolor.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucolor.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -68,6 +68,11 @@
 MIN_COLOR=0
 MAX_COLOR = 65535
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import TRUE, FALSE
 import GDK

Modified: packages/openev/trunk/pymod/pgucolorsel.py
===================================================================
--- packages/openev/trunk/pymod/pgucolorsel.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucolorsel.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 from string import *
 import pgu

Modified: packages/openev/trunk/pymod/pgucolourswatch.py
===================================================================
--- packages/openev/trunk/pymod/pgucolourswatch.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucolourswatch.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -39,6 +39,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gvsignaler import Signaler
 

Modified: packages/openev/trunk/pymod/pgucombo.py
===================================================================
--- packages/openev/trunk/pymod/pgucombo.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgucombo.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -49,6 +49,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 try:
     from pygtkextra import GtkComboBox

Modified: packages/openev/trunk/pymod/pguentry.py
===================================================================
--- packages/openev/trunk/pymod/pguentry.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pguentry.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -1,3 +1,8 @@
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 
 class pguEntry( gtk.GtkEntry ):

Modified: packages/openev/trunk/pymod/pgufilesel.py
===================================================================
--- packages/openev/trunk/pymod/pgufilesel.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgufilesel.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk; _gtk = gtk; del gtk
 from string import *
 import os.path

Modified: packages/openev/trunk/pymod/pgufont.py
===================================================================
--- packages/openev/trunk/pymod/pgufont.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgufont.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -40,6 +40,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import TRUE, FALSE
 import gview

Modified: packages/openev/trunk/pymod/pgugrid.py
===================================================================
--- packages/openev/trunk/pymod/pgugrid.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgugrid.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -128,6 +128,11 @@
 # THIS SHOULD BE REVISITED IF OPENEV IS UPGRADED TO GTK2, AS GTK2 MAY
 # NOT SUFFER THESE PROBLEMS.
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import gvsignaler
 import Numeric

Modified: packages/openev/trunk/pymod/pgumenu.py
===================================================================
--- packages/openev/trunk/pymod/pgumenu.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgumenu.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -37,6 +37,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import TRUE, FALSE
 import string

Modified: packages/openev/trunk/pymod/pguprogress.py
===================================================================
--- packages/openev/trunk/pymod/pguprogress.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pguprogress.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -31,6 +31,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 class PGUProgressDialog(GtkDialog):

Modified: packages/openev/trunk/pymod/pgushapesgrid.py
===================================================================
--- packages/openev/trunk/pymod/pgushapesgrid.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgushapesgrid.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
 
 """
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk,GDK
 import gview
 import Numeric

Modified: packages/openev/trunk/pymod/pgutextarea.py
===================================================================
--- packages/openev/trunk/pymod/pgutextarea.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgutextarea.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -82,6 +82,11 @@
 documentation ;)
 """
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 
 class pguTextArea( gtk.GtkTable ):

Modified: packages/openev/trunk/pymod/pgutogglebutton.py
===================================================================
--- packages/openev/trunk/pymod/pgutogglebutton.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pgutogglebutton.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
 #  new file
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 from gtk import TRUE, FALSE
 import gview

Modified: packages/openev/trunk/pymod/pyshell.py
===================================================================
--- packages/openev/trunk/pymod/pyshell.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/pyshell.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -79,6 +79,11 @@
 MAX_COMMAND_PATHS = 15
 MAX_MODULE_PATHS = 15
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import GtkExtra, GDK
 import code, string, sys, os

Modified: packages/openev/trunk/pymod/testmain.py
===================================================================
--- packages/openev/trunk/pymod/testmain.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/testmain.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -1,4 +1,9 @@
 #!/usr/bin/env python
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk, gtkmissing, gview
 import layerdlg
 

Modified: packages/openev/trunk/pymod/toolexample.py
===================================================================
--- packages/openev/trunk/pymod/toolexample.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/toolexample.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -5,6 +5,11 @@
 # roi and poi tools, a layer manager, and view manager.
 
 import gviewapp
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import os
 import gdal, gdalnumeric

Modified: packages/openev/trunk/pymod/vecplot.py
===================================================================
--- packages/openev/trunk/pymod/vecplot.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/pymod/vecplot.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -99,6 +99,11 @@
 
 import gview
 import Numeric
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import GtkExtra
 import os

Modified: packages/openev/trunk/tools/Tool_DriverList.py
===================================================================
--- packages/openev/trunk/tools/Tool_DriverList.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_DriverList.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -36,6 +36,11 @@
 import gviewapp
 import gdal
 import gvhtml
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 
 class ToolDriverList(gviewapp.Tool_GViewApp):

Modified: packages/openev/trunk/tools/Tool_Export.py
===================================================================
--- packages/openev/trunk/tools/Tool_Export.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_Export.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -49,6 +49,11 @@
 #
 #
         
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import gview, gdal, gdalconst, layerdlg, gvutils
 import GtkExtra

Modified: packages/openev/trunk/tools/Tool_ShapesGrid.py
===================================================================
--- packages/openev/trunk/tools/Tool_ShapesGrid.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_ShapesGrid.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -48,6 +48,11 @@
 
 
 import gviewapp
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import gview
 import pgugrid

Modified: packages/openev/trunk/tools/Tool_autopan.py
===================================================================
--- packages/openev/trunk/tools/Tool_autopan.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/Tool_autopan.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -65,6 +65,11 @@
 
 import gviewapp
 import Numeric
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import time
 import gview

Modified: packages/openev/trunk/tools/calculator.py
===================================================================
--- packages/openev/trunk/tools/calculator.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/calculator.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -42,6 +42,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 import Numeric

Modified: packages/openev/trunk/tools/compose.py
===================================================================
--- packages/openev/trunk/tools/compose.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/compose.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -54,6 +54,11 @@
 #
 
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import gview
 import string

Modified: packages/openev/trunk/tools/fft.py
===================================================================
--- packages/openev/trunk/tools/fft.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/fft.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -33,6 +33,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 import gview

Added: packages/openev/trunk/tools/fusion.py
===================================================================
--- packages/openev/trunk/tools/fusion.py	                        (rev 0)
+++ packages/openev/trunk/tools/fusion.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,465 @@
+##############################################################################
+# fusion.py, v2.2b 2005/06/07
+#
+# Project:  OpenEV
+# Purpose:  Perform fusion (aka:pan merging, pansharpening) of panchromatic and RGB.
+# Author:  Mario Beauchamp
+# TODO: add preview window, fix progress, use the NIR band
+###############################################################################
+#
+#  Version 2.2b 2005/06/07
+#  Now works with Quickbird imagery.
+#  Removed ROI support.
+#  Warped VRT replaced with gdal.ReprojectImage()
+#  Added block read/write support (enabled by default)
+#
+#  Version 2.11b 2005/04/29
+#  Fixed prob when recent_directory is None.
+#
+#  Version 2.1b 2005/04/27
+#  Replaced R,G,B blend with single blend.
+#  Added Grain Merge Blending.
+#  Added Create Options Entry.
+#  Added a few tooltips.
+#
+#  Version 2.0b 2005/04/24
+#  This will be the "official" version... forget about previous ones :)
+#
+###############################################################################
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
+import gtk
+from gtk import TRUE,FALSE
+import gview
+import gvutils
+import gviewapp
+import gdal
+import pguprogress
+import time
+import os
+import vrtutils
+
+# set to 1 to save pan filtered VRT
+saveVrt = 0
+
+def getLayersDict():
+    dict = {}
+    for curview in gview.app.view_manager.view_list:
+        for curlayer in curview.viewarea.list_layers():
+            curname = curlayer.get_name()
+            dict[curname] = (curview,curlayer) 
+        if dict is None:
+            return None
+    return dict
+
+class FusionTool(gviewapp.Tool_GViewApp):
+    def __init__(self,app=None):
+        gviewapp.Tool_GViewApp.__init__(self,app)
+        self.init_menu()
+
+    def launch_dialog(self,*args):
+        self.win = FusionDialog()
+        if self.win is None:
+            return
+        else:
+            self.win.show()
+
+    def init_menu(self):
+        self.menu_entries.set_entry("Image/Fusion",4,self.launch_dialog)
+
+class FusionDialog(gtk.GtkWindow):
+    def __init__(self,app=None):
+        gtk.GtkWindow.__init__(self)
+        self.set_title('Image Fusion')
+        self.set_policy(FALSE, TRUE, TRUE)
+        self.layersDict = getLayersDict()
+        self.layersKeys = self.layersDict.keys()
+        self.XSize = 0
+        self.YSize = 0
+        self.blockX = 0
+        self.blockY = 0
+        self.tips = gtk.GtkTooltips()
+
+        gui_OK = self.createGUI()
+        if gui_OK is FALSE:
+            return None
+        else:
+            self.show_all()
+
+    def close(self,*args):
+        rgbx = os.path.join(os.curdir,'rgbx.tif')
+        if os.path.exists(rgbx):
+            os.remove(rgbx)
+        self.destroy()
+        return TRUE
+
+    def createGUI(self):
+        mainbox = gtk.GtkVBox(spacing=5)
+        mainbox.set_border_width(5)
+        self.add(mainbox)
+
+        # RGB source
+        frame = gtk.GtkFrame("Select Layers")
+        mainbox.add(frame,expand=FALSE)
+
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('RGB Source:'),expand=FALSE)
+        self.rgbOM = gvutils.GvOptionMenu(self.layersKeys)
+        box.add(self.rgbOM)
+
+        # Pan source
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Pan Source:'),expand=FALSE)
+
+        self.panOM = gvutils.GvOptionMenu(self.layersKeys)
+        box.add(self.panOM)
+
+        # output
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Output file:'),expand=FALSE)
+        self.outTE = gtk.GtkEntry()
+        txt = 'fused.tif'
+        curdir = gview.get_preference('recent_directory')
+        if curdir is not None:
+            txt = os.path.join(curdir,txt)
+        else:
+            txt = os.path.join(os.curdir,txt)
+        self.outTE.set_text(txt)
+        box.add(self.outTE)
+
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Create options:'),expand=FALSE)
+        self.coptTE = gtk.GtkEntry()
+        self.coptTE.set_text('tiled=yes')
+        box.add(self.coptTE)
+
+        # Params
+        frame = gtk.GtkFrame('Fusion Method')
+        mainbox.add(frame,expand=FALSE)
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box)
+
+        self.met0RB = gtk.GtkRadioButton(label='IHS')
+        tipTxt = 'Standard Intensity-Hue-Saturation merging. '
+        tipTxt+='Blend setting has no effect. '
+        tipTxt+='Not recommended for Landsat and Quickbird imagery.'
+        self.tips.set_tip(self.met0RB,tipTxt)
+        box.add(self.met0RB)
+
+        self.met1RB = gtk.GtkRadioButton(label='Kernel Blend',group=self.met0RB)
+        tipTxt = 'Pan is run through a convolution kernel and blended with RGB. '
+        tipTxt+='A blend setting of 0.7 is recommended. '
+        tipTxt+='Used for Landsat imagery.'
+        self.tips.set_tip(self.met1RB,tipTxt)
+        box.add(self.met1RB)
+        self.met1RB.set_active(TRUE)
+
+        self.met2RB = gtk.GtkRadioButton(label='Kernel Grain Merge',group=self.met0RB)
+        tipTxt = 'Same kernel filtering but with Grain Merge blend. '
+        tipTxt+='A blend setting of 0.5 is recommended. '
+        tipTxt+='Used for Landsat and Quickbird imagery.'
+        self.tips.set_tip(self.met2RB,tipTxt)
+        box.add(self.met2RB)
+
+        # blend params
+        vbox2 = gtk.GtkVBox(spacing=5)
+        vbox2.set_border_width(5)
+        vbox.add(vbox2)
+
+        box = gtk.GtkHBox(spacing=5)
+        vbox2.add(box)
+        box.add(gtk.GtkLabel('Blend:'),expand=FALSE)
+        self.adjBlend = gtk.GtkAdjustment(0.7,0.0,1.0,0.01,0.1)
+        slider = gtk.GtkHScale(self.adjBlend)
+        slider.set_digits(2)
+        box.add(slider)
+
+        box = gtk.GtkHBox(spacing=5)
+        vbox2.add(box)
+
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box)
+
+        self.sat0RB = gtk.GtkRadioButton(label='Landsat')
+        box.add(self.sat0RB)
+        self.sat1RB = gtk.GtkRadioButton(label='Quickbird',group=self.sat0RB)
+        box.add(self.sat1RB)
+
+        # Not working yet...
+        self.satRGB = gtk.GtkCheckButton('Replace Saturated RGB with Pan')
+        self.satRGB.set_state(gtk.STATE_INSENSITIVE)
+        vbox.add(self.satRGB,expand=FALSE)
+
+        # Buttons
+        box = gtk.GtkHBox(homogeneous=1,spacing=5)
+        mainbox.add(box,expand=FALSE)
+
+        mergeBT = gtk.GtkButton("Merge")
+        mergeBT.connect("clicked",self.compute)
+        self.tips.set_tip(mergeBT,'Proceed with merging')
+        box.add(mergeBT)
+
+        closeBT = gtk.GtkButton("Close")
+        closeBT.connect("clicked",self.close)
+        box.add(closeBT)
+
+        return TRUE
+
+    def constructFilteredVRT(self,ds):
+        vrtStr = '<VRTDataset rasterXSize=\"'+str(self.XSize)+'\" rasterYSize=\"'+str(self.YSize)+'\">\n'
+        vrtStr += '  <VRTRasterBand dataType="Float32" band="1">\n'
+        vrtStr += '    <KernelFilteredSource>\n      <SourceFilename relativeToVRT=\"0\">'
+        vrtStr += ds.GetDescription()+'</SourceFilename>\n      <SourceBand>1</SourceBand>\n'
+        vrtStr += '      <Kernel normalized=\"0\">\n        <Size>3</Size>\n'
+        vrtStr += '        <Coefs>-1 -1 -1 -1 8 -1 -1 -1 -1</Coefs>\n      </Kernel>'
+        vrtStr += '    </KernelFilteredSource>\n  </VRTRasterBand>\n</VRTDataset>\n'
+
+        return gdal.Open(vrtStr,gdal.GA_Update)
+
+    def compute(self,*args):
+        rgbName = self.layersKeys[self.rgbOM.get_history()]
+        panName = self.layersKeys[self.panOM.get_history()]
+        if rgbName == panName:
+            gvutils.error("RGB Source and Pan Source have to differ!")
+            return FALSE
+
+        # uncomment to time
+        # t0 = time.clock()
+        self.progress = pguprogress.PGUProgressDialog('Merging images',cancel=TRUE)
+        rgbLayer = self.layersDict[rgbName][1]
+        panLayer = self.layersDict[panName][1]
+
+        srcpan = panLayer.get_parent().get_dataset()
+        geoTr = srcpan.GetGeoTransform()
+        xRez = geoTr[1]
+        yRez = geoTr[5]
+        self.XSize = srcpan.RasterXSize
+        self.YSize = srcpan.RasterYSize
+        ulx = geoTr[0]
+        uly = geoTr[3]
+
+        # create Pan Vrt
+        if self.met0RB.active:
+            panDS = srcpan
+        else:
+            panDS = self.constructFilteredVRT(srcpan)
+
+        if self.satRGB.active:
+            origPanDS = srcpan
+        else:
+            origPanDS = None
+        
+        panDS.SetProjection(srcpan.GetProjection())
+        panDS.SetGeoTransform(srcpan.GetGeoTransform())
+
+        if saveVrt:
+            drv = panDS.GetDriver()
+            ds = drv.CreateCopy(os.path.join(os.curdir,'panfiltered.vrt'),panDS)
+            del ds
+        # create warped RGB
+        srcrgb = rgbLayer.get_parent().get_dataset()
+        rgbGeoTr = srcrgb.GetGeoTransform()
+        ratio = rgbGeoTr[1]/xRez
+        if ratio == 1:
+            rgbDS = srcrgb
+        else:
+            prog = self.progress.ProgressCB(0.0,'resized (progress not working...)')
+            xfile = os.path.join(os.curdir,'rgbx.tif')
+            if os.path.exists(xfile):
+                os.remove(xfile)
+            dtype = srcrgb.GetRasterBand(1).DataType
+            rgbDS = gdal.GetDriverByName('GTiff').Create(xfile,self.XSize,self.YSize,bands=3,datatype=dtype,options=['tiled=yes'])
+            rgbDS.SetProjection(srcrgb.GetProjection())
+            rgbDS.SetGeoTransform((ulx,xRez,0,uly,0,yRez))
+            gdal.ReprojectImage(srcrgb,rgbDS,eResampleAlg=gdal.GRA_CubicSpline)
+            rgbDS.FlushCache()
+
+        # create output DS and initialize
+        outfile = self.outTE.get_text()
+        drv = gdal.GetDriverByName('GTiff')
+        copts = [self.coptTE.get_text()]
+        if 'tiled=yes' in copts:
+            self.blockX = 256
+            self.blockY = 256
+        outDS = drv.Create(outfile,self.XSize,self.YSize,bands=3,datatype=gdal.GDT_Byte,options=copts)
+        outDS.SetGeoTransform(panDS.GetGeoTransform())
+        outDS.SetProjection(panDS.GetProjection())
+
+        result = self.fuseBands(rgbDS,panDS,outDS,origPanDS)
+        # uncomment to time
+        # print time.clock() - t0
+
+        del outDS
+        if result:
+            gview.app.open_gdal_dataset(gdal.Open(outfile))
+        else:
+            os.remove(outfile)
+            gvutils.error("Error merging images.")
+            return FALSE
+
+    def fuseBands(self,rgbDS,panDS,outDS,origPanDS=None):
+        from Numeric import clip,maximum
+
+        if self.sat1RB.active:
+            redBand = rgbDS.GetRasterBand(3)
+            blueBand = rgbDS.GetRasterBand(1)
+        else:
+            redBand = rgbDS.GetRasterBand(1)
+            blueBand = rgbDS.GetRasterBand(3)
+        greenBand = rgbDS.GetRasterBand(2)
+        panBand = panDS.GetRasterBand(1)
+        if origPanDS is not None:
+            origPanBand = origPanDS.GetRasterBand(1)
+        redBandOut = outDS.GetRasterBand(1)
+        greenBandOut = outDS.GetRasterBand(2)
+        blueBandOut = outDS.GetRasterBand(3)
+        blend = self.adjBlend.value
+
+        def ihsMergePix(R,G,B,I):
+            I = clip(I+128.0,0.0,255.0)
+            scale = 3.0*I/(R+G+B+1.0)
+            return R*scale, G*scale, B*scale
+
+        def ihsMergePixQB(R,G,B,I):
+            scale = 3.0*I/(R+G+B+1.0)
+            return R*scale*0.124573, G*scale*0.124573, B*scale*0.124573
+
+        def blendPix(R,G,B,I):
+            I = clip(I+128.0,0.0,255.0)
+            I = I*(1-blend)
+            return I+R*blend, I+G*blend, I+B*blend
+
+        def blendPixQB(R,G,B,I): # not working... why??
+            I = clip(I+128.0,0.0,2047.0)
+            I = I*(1.0-blend)
+            return I+R*blend*0.124573, I+G*blend*0.124573, I+B*blend*0.124573
+
+        def grainMergePix(R,G,B,I):
+            I = clip(I+128.0,0.0,255.0)
+            I = maximum(I,I+128.0)*blend
+            return I+R-128.0, I+G-128.0, I+B-128.0
+
+        def grainMergePixQB(R,G,B,I):
+            I = clip(I+128.0,0.0,2047.0)
+            I = maximum(I,I+128.0)*blend
+            return (I+R-128.0)*0.124573, (I+G-128.0)*0.124573, (I+B-128.0)*0.124573
+
+        def getMask(r,g,b): # not used for now
+            from Numeric import equal,logical_and
+            mskR = equal(r,255)
+            mskG = equal(g,255)
+            mskB = equal(b,255)
+            return logical_and(logical_and(mskR,mskG),mskB)
+            
+        def mergePan(pan,r,g,b,outR,outG,outB): # not used for now
+            from Numeric import putmask
+            whiteMsk = getMask(r,g,b)
+##            mrgR,mrgG,mrgB = mergePix(r,g,b,pan)
+            putmask(outR,whiteMsk,pan*0.7+r*0.3)
+            putmask(outG,whiteMsk,pan*0.7+g*0.3)
+            putmask(outB,whiteMsk,pan*0.7+b*0.3)
+            
+        def writeBands(outR,outG,outB,xoff,yoff):
+            redBandOut.WriteArray(clip(outR,0,255).astype('b'),xoff,yoff)
+            greenBandOut.WriteArray(clip(outG,0,255).astype('b'),xoff,yoff)
+            blueBandOut.WriteArray(clip(outB,0,255).astype('b'),xoff,yoff)
+
+        def readBands(xoff,yoff,xsz,ysz):
+            red = redBand.ReadAsArray(xoff,yoff,xsz,ysz).astype('f')
+            green = greenBand.ReadAsArray(xoff,yoff,xsz,ysz).astype('f')
+            blue = blueBand.ReadAsArray(xoff,yoff,xsz,ysz).astype('f')
+            pan = panBand.ReadAsArray(xoff,yoff,xsz,ysz)
+            return red,green,blue,pan
+
+        def processBands(xoff,yoff,xsz,ysz):
+            red,green,blue,pan = readBands(xoff,yoff,xsz,ysz)
+            outR,outG,outB = mergeFn(red,green,blue,pan)
+            writeBands(outR,outG,outB,xoff,yoff)
+
+
+        if self.met0RB.active:
+            if self.sat1RB.active:
+                mergeFn = ihsMergePixQB
+            else:
+                mergeFn = ihsMergePix
+        elif self.met1RB.active:
+            if self.sat1RB.active:
+                mergeFn = blendPixQB
+            else:
+                mergeFn = blendPix
+        elif self.met2RB.active:
+            if self.sat1RB.active:
+                mergeFn = grainMergePixQB
+            else:
+                mergeFn = grainMergePix
+
+        self.progress.SetDefaultMessage("merged")
+        prog = 1
+        if self.blockX == 0:
+            denom = self.YSize - 1
+            for line in range(self.YSize):
+                processBands(0,line,self.XSize,1)
+                prog = self.progress.ProgressCB(float(line)/denom,'')
+                if prog == 0:
+                    progress.destroy()
+                    return 0
+        else:
+            fullX = int(self.XSize/self.blockX)
+            fullY = int(self.YSize/self.blockY)
+            for yblk in range(0,fullY):
+                ybloff = yblk*self.blockY
+                for xblk in range(0,fullX):
+                    xbloff = xblk*self.blockX
+                    processBands(xbloff,ybloff,self.blockX,self.blockY)
+
+                # deal with last Xblock, if any
+                xbloff = fullX*self.blockX
+                if self.XSize > xbloff:
+                    xsz = self.XSize - xbloff
+                    ysz = max(self.blockY,self.YSize - fullY*self.blockY)
+                    processBands(xbloff,ybloff,xsz,ysz)
+
+                prog = self.progress.ProgressCB(float(ybloff)/self.YSize,'')
+                if prog == 0:
+                    self.progress.destroy()
+                    return 0
+
+            # deal with last Yblock, if any
+            ybloff = fullY*self.blockY
+            if self.YSize > ybloff:
+                ysz = self.YSize - ybloff
+                for xblk in range(0,fullX):
+                    xbloff = xblk*self.blockX
+                    processBands(xbloff,ybloff,self.blockX,ysz)
+
+                # deal with last Xblock, if any
+                xbloff = fullX*self.blockX
+                if self.XSize > xbloff:
+                    xsz = self.XSize - xbloff
+                    processBands(xbloff,ybloff,xsz,ysz)
+
+                prog = self.progress.ProgressCB(float(ybloff)/self.YSize,'')
+                if prog == 0:
+                    self.progress.destroy()
+                    return 0
+
+        self.progress.destroy()
+        return 1
+
+TOOL_LIST = ['FusionTool']

Modified: packages/openev/trunk/tools/gvrastertools.py
===================================================================
--- packages/openev/trunk/tools/gvrastertools.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/gvrastertools.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -44,6 +44,11 @@
 #
 
 import gviewapp
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 import gtk
 import os
 import gdal

Added: packages/openev/trunk/tools/histoEnhance.py
===================================================================
--- packages/openev/trunk/tools/histoEnhance.py	                        (rev 0)
+++ packages/openev/trunk/tools/histoEnhance.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,679 @@
+###############################################################################
+# histoEnhance.py,v 1.21 2005/05/31
+#
+# Project:  OpenEV
+# Purpose:  Interactive tool for layer scaling with histogram(s)
+# Author:   Mario Beauchamp
+# Functions: Left-Click in the markers display to set the min scale. 
+#            Right-Click to set the max scale.
+#            'Refresh': rebuilds the histogram (from layer, not file).
+#            '+'/'-': zoomin/zoomout y axis from 10 preset zooms (10.0 to 0.001).
+#            'Load': load histogram from file.
+#            'Save': save histogram to file. Name of the file defaults to layer's
+#                    file name with '.his' extension.
+#            If an histogram file already exists for the layer when the window
+#               is launched, it's loaded automatically. The tool will check in image
+#               dir and in dir defined by histos_directory preference.
+#            'Autoscale': automatic scaling.
+#            'Min tail'/'Max tail': adjust the amount of tail trimming.
+#            Scaling algorithms can be selected in Combo.
+# Caution: building histograms for large images may take a while...
+# TODO: add histogram manipulation functions
+# Thanks to Frank W. for helping me with the drawing w/colors!
+###############################################################################
+#
+#  Revision 1.21 2005/05/31
+#  Added primary support for dynamic range 0-2047.
+#  Added histos_directory preference. Directories scanned for histofiles also
+#    include current image directory.
+#
+#  Version 1.20 2005/04/26
+#  Changed module name to histoEnhance and tool name to HistoEnhance.
+#  Changed default scaling to 'None'.
+#  Added statistics (mean, std dev).
+#  Added scaled histogram display.
+#  Removed bug that was causing rescaling.
+#  More internal maintenance.
+#
+#  Version 1.10 2005/04/05
+#  Moved the min/max markers under the histogram display.
+#  Added an extra zoom level (2.5).
+#  Added no enhancement option.
+#  Added option to remove blacks and whites.
+#  Removed Auto-Refresh as it was too slow to be of any use.
+#  Lot of internal maintenance to improve efficiency and readability.
+#
+#  Revision 1.02  2005/03/30
+#  Moved the percentages building code into a method so it can be reused.
+#  Added drawing in black when raster is grayscale.
+###############################################################################
+
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
+import gtk
+from gtk import TRUE,FALSE
+import gview
+import gviewapp
+import os
+from Numeric import array,add
+from math import sqrt
+
+hisDir = gview.get_preference('histos_directory')
+zooms = [10.0,5.0,2.5,1.0,0.5,0.1,0.05,0.01,0.005,0.001]
+class HistoEnhance(gviewapp.Tool_GViewApp):
+    def __init__(self,app=None):
+        gviewapp.Tool_GViewApp.__init__(self,app)
+        self.init_menu()
+
+    def launch_window(self,*args):
+        layer = gview.app.active_layer()
+        if layer is None:
+            return
+
+        self.win = HistogramWindow(layer)
+        if self.win is None:
+            return
+        else:
+            self.win.show()
+
+    def init_menu(self):
+        self.menu_entries.set_entry("Image/Histogram Enhance",1,self.launch_window)
+
+class HistogramFrame(gtk.GtkFrame):
+    def __init__(self,name,srcIdx,hisSrc,master):
+        gtk.GtkFrame.__init__(self,name)
+        self.name = name
+        self.srcIdx = srcIdx
+        self.master = master
+        self.updating = TRUE
+        self.connect('destroy',self.cleanup)
+
+        self.min = self.master.layer.min_get(srcIdx)
+        self.max = self.master.layer.max_get(srcIdx)
+
+        self.createGUI()
+        self.setHisto(hisSrc)
+        self.scaledHisSrc = []
+
+        self.updating = FALSE
+
+    def createGUI(self):
+        vbox = gtk.GtkVBox()
+        vbox.set_border_width(3)
+        self.add(vbox)
+
+        self.histoDA = gtk.GtkDrawingArea()
+        self.histoDA.size(256,100)
+        self.histoDA.connect('expose-event',self.exposeHisto)
+        vbox.add(self.histoDA,expand=FALSE)
+
+        self.markersDA = gtk.GtkDrawingArea()
+        self.markersDA.size(256,8)
+        self.markersDA.set_events(gtk.GDK.BUTTON_PRESS_MASK)
+        self.markersDA.connect('expose-event',self.exposeMarkers)
+        self.markersDA.connect('button-press-event',self.click)
+        vbox.add(self.markersDA,expand=FALSE)
+
+        vbox.add(gtk.GtkHSeparator())
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box)
+
+        box.add(gtk.GtkLabel('Mean:'),expand=FALSE)
+        self.meanLB = gtk.GtkLabel()
+        box.add(self.meanLB,expand=FALSE)
+        box.add(gtk.GtkLabel(' Std Dev:'),expand=FALSE)
+        self.stdLB = gtk.GtkLabel()
+        box.add(self.stdLB,expand=FALSE)
+
+    def cleanup(self,*args):
+        # is that really necessary?
+        self.hisSrc = None
+
+    def refreshHisto(self,*args):
+        self.drawHisto()
+        self.buildPercents()
+
+    def buildPercents(self):
+        self.hiPct = []
+        self.hisSrc.reverse()
+        tot = 0
+        start = 0
+        lo = self.master.lo
+        if self.master.hi == 254:
+            self.hiPct.append(0)
+            start = 1
+        for bin in self.hisSrc[start:-1]:
+            tot+=bin
+            self.hiPct.append(tot/self.master.pixCnt*100)
+        self.hiPct.append(0)
+        self.hiPct.reverse()
+
+        self.hisSrc.reverse()
+        tot = 0
+        start = 0
+        self.lowPct = []
+        if self.master.lo == 1:
+            self.lowPct.append(0)
+            start = 1
+        for bin in self.hisSrc[start:-1]:
+            tot+=bin
+            self.lowPct.append(tot/self.master.pixCnt*100)
+        self.lowPct.append(0)
+
+    def drawHisto(self):
+        if self.get_window() is None:
+            return
+            
+        gc = self.get_window().new_gc()
+        cm = self.histoDA.get_colormap()
+        style = self.histoDA.get_style()
+        w,h = self.histoDA.size_request()
+        self.histoDA.draw_rectangle(style.white_gc,TRUE,0,0,w,h)
+        zoom = zooms[self.master.zoomindex]
+        if len(self.scaledHisSrc) > 0:
+            if self.name == "Red":
+                gc.foreground = cm.alloc(65535,49150,49150)
+            elif self.name == "Green":
+                gc.foreground = cm.alloc(49150,65535,49150)
+            elif self.name == "Blue":
+                gc.foreground = cm.alloc(49150,49150,65535)
+            else:
+                gc.foreground = cm.alloc(49150,49150,49150)
+
+            self.histoDA.draw_lines(gc,self.getScaledBins(zoom))
+            
+        if self.name == "Red":
+            gc.foreground = cm.alloc(65535,0,0)
+        elif self.name == "Green":
+            gc.foreground = cm.alloc(0,65535,0)
+        elif self.name == "Blue":
+            gc.foreground = cm.alloc(0,0,65535)
+        else:
+            gc = style.black_gc
+
+        self.histoDA.draw_lines(gc,self.getBins(zoom))
+
+    def exposeHisto(self,*args):
+        self.drawHisto()
+
+    def drawMarkers(self):
+        min = int(self.min)
+        max = int(self.max)
+        style = self.markersDA.get_style()
+        self.markersDA.draw_rectangle(style.bg_gc[gtk.STATE_NORMAL],TRUE,0,0,256,8)
+        self.markersDA.draw_string(style.font,style.black_gc,min-1,6,'|')
+        self.markersDA.draw_string(style.font,style.black_gc,max-1,6,'|')
+
+    def exposeMarkers(self,*args):
+        self.drawMarkers()
+
+    def updateStats(self,mean,std):
+        self.meanLB.set_text(str(mean))
+        self.stdLB.set_text(str(std))
+
+    def getHisto(self):
+        return self.hisSrc
+
+    def setHisto(self,histo):
+        self.hisSrc = histo
+        self.buildPercents()
+
+    def setScaledHisto(self,histo):
+        self.scaledHisSrc = histo
+        self.drawHisto()
+
+    def click(self, widget, event):
+        value = event.x
+        if event.button == 3:
+            self.max = value
+            pct = self.hiPct[int(value)]
+            self.master.setMax(self.srcIdx,value,pct)
+        else:
+            self.min = value
+            pct = self.lowPct[int(value)]
+            self.master.setMin(self.srcIdx,value,pct)
+
+        self.drawMarkers()
+
+    def getMinMax(self,tail=None):
+        if self.updating:
+            return
+
+        if tail == 'min':
+            self.min = self.getMinBin()
+        elif tail == 'max':
+            self.max = self.getMaxBin()
+        elif tail == 'both':
+            self.min = self.getMinBin()
+            self.max = self.getMaxBin()
+        else:
+            self.min = 0.0
+            self.max = 255.0
+
+        self.drawMarkers()
+##        print self.lowPct[int(self.min)],self.hiPct[int(self.max)]
+        return self.min,self.max
+
+    def getMinBin(self):
+        for pct in self.lowPct[1:]:
+            if pct > self.master.mintail:
+                return self.lowPct.index(pct)
+        return 0
+
+    def getMaxBin(self):
+        for pct in self.hiPct[1:]:
+            if pct < self.master.maxtail:
+                return self.hiPct.index(pct)
+        return 255
+
+    def getBins(self,zoom):
+        bins = []
+        w,h = self.histoDA.size_request()
+        lo = self.master.lo
+        hi = self.master.hi
+        maxVal = max(self.hisSrc[lo:hi+1]) * zoom
+        if lo == 1:
+            bins.append((0,99))
+        for x in range(lo,hi+1):
+            y = min(int(h - h * self.hisSrc[x]/maxVal),h-1)
+            y = max(0,y)
+            bins.append((x,y))
+        if hi == 254:
+            bins.append((255,99))
+        return bins
+
+    def getScaledBins(self,zoom):
+        bins = []
+        w,h = self.histoDA.size_request()
+        maxVal = max(self.scaledHisSrc[1:]) * zoom
+        bins.append((0,99))
+        for x in range(1,256):
+            y = min(int(h - h * self.scaledHisSrc[x]/maxVal),h-1)
+            y = max(0,y)
+            bins.append((x,y))
+        return bins
+
+class HistogramWindow(gtk.GtkWindow):
+    def __init__(self,layer):
+        gtk.GtkWindow.__init__(self)
+        self.layer = layer
+        self.gdt = self.layer.get_data(0).get_band().DataType
+        self.teardown_id = self.layer.connect('teardown',self.close)
+
+        self.zoomindex = 3
+        self.mintail = 0.1
+        self.maxtail = 1.0
+        self.lo = 1
+        self.hi = 254
+        self.lut = None
+        self.histoDisplays = []
+
+        self.updating = TRUE
+        self.createGUI()
+        self.show_all()
+        self.updating = FALSE
+        self.autoScale()
+
+    def createGUI(self):
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        self.add(vbox)
+        histoBox = gtk.GtkVBox(spacing=3)
+        vbox.add(histoBox)
+        histoList = []
+
+        hisdir,f = os.path.split(self.layer.get_parent().get_dataset().GetDescription())
+        name,ext = os.path.splitext(f)
+        self.set_title(name+' Histogram')
+        hisfile = os.path.join(hisdir,name+'.his')
+        if os.path.exists(hisfile): # histofile is in same dir
+            histoList = self.loadHistos(hisfile)
+        elif hisDir is not None:
+            hisfile = os.path.join(hisDir,name+'.his')
+            if os.path.exists(hisfile): # histofile is in histos dir
+                histoList = self.loadHistos(self.hisFile)
+        self.hisFile = hisfile
+
+        if self.layer.get_mode() == gview.RLM_RGBA:
+            if len(histoList) == 0:
+                for isrc in range(3):
+                    histoList.append(self.buildHisto(isrc))
+
+            self.pixCnt = self.getPixCount(histoList)
+            histoDisp = HistogramFrame('Red',0,histoList[0],self)
+            histoBox.add(histoDisp,expand=FALSE)
+            self.histoDisplays.append(histoDisp)
+
+            histoDisp = HistogramFrame('Green',1,histoList[1],self)
+            histoBox.add(histoDisp,expand=FALSE)
+            self.histoDisplays.append(histoDisp)
+
+            histoDisp = HistogramFrame('Blue',2,histoList[2],self)
+            histoBox.add(histoDisp,expand=FALSE)
+            self.histoDisplays.append(histoDisp)
+        else:
+            if len(histoList) == 0:
+                histoList.append(self.buildHisto(0))
+            self.pixCnt = self.getPixCount(histoList)
+            histoDisp = HistogramFrame('Raster',0,histoList[0],self)
+            histoBox.add(histoDisp,expand=FALSE)
+            self.histoDisplays.append(histoDisp)
+
+        ctrlbox = gtk.GtkHBox(homogeneous=1,spacing=3)
+        vbox.add(ctrlbox,expand=FALSE)
+
+        refreshBT = gtk.GtkButton("Refresh")
+        refreshBT.connect("clicked",self.refresh)
+        ctrlbox.add(refreshBT)
+        zoominBT = gtk.GtkButton("+")
+        zoominBT.connect("clicked",self.zoom,'in')
+        ctrlbox.add(zoominBT)
+        zoomoutBT = gtk.GtkButton("-")
+        zoomoutBT.connect("clicked",self.zoom,'out')
+        ctrlbox.add(zoomoutBT)
+        loadBT = gtk.GtkButton("Load")
+        loadBT.connect("clicked",self.load)
+        ctrlbox.add(loadBT)
+        saveBT = gtk.GtkButton("Save")
+        saveBT.connect("clicked",self.save)
+        ctrlbox.add(saveBT)
+
+        scalefrm = gtk.GtkFrame('Autoscale')
+        vbox.add(scalefrm,expand=FALSE)
+        scalebox = gtk.GtkVBox(spacing=5)
+        scalebox.set_border_width(5)
+        scalefrm.add(scalebox)
+
+        box = gtk.GtkHBox(spacing=5)
+        scalebox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Remove: '),expand=FALSE)
+        blackCK = gtk.GtkCheckButton('Black')
+        blackCK.set_active(TRUE)
+        blackCK.connect('toggled',self.setLimits,'lo')
+        box.add(blackCK,expand=FALSE)
+        whiteCK = gtk.GtkCheckButton('White')
+        whiteCK.set_active(TRUE)
+        whiteCK.connect('toggled',self.setLimits,'hi')
+        box.add(whiteCK,expand=FALSE)
+
+        box = gtk.GtkHBox(spacing=5)
+        scalebox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Min tail:'),expand=FALSE)
+        minAdj = gtk.GtkAdjustment(self.mintail,0.0,99.9,0.01,0.1)
+        self.minSpin = gtk.GtkSpinButton(minAdj,0.1,2)
+        self.minSpin.set_usize(55,-1)
+        self.minSpin.connect('changed',self.adjustMin)
+        box.add(self.minSpin,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Max tail:'),expand=FALSE)
+        maxAdj = gtk.GtkAdjustment(self.maxtail,0.0,99.9,0.01,0.1)
+        self.maxSpin = gtk.GtkSpinButton(maxAdj,0.1,2)
+        self.maxSpin.set_usize(55,-1)
+        self.maxSpin.connect('changed',self.adjustMax)
+        box.add(self.maxSpin,expand=FALSE)
+
+        algCB = gtk.GtkCombo()
+        algCB.set_popdown_strings(['None','linear','log','root','square'])
+        algCB.entry.connect('changed',self.setAlg)
+        algCB.set_usize(70,-1)
+        scalebox.add(algCB,expand=FALSE)
+
+    def close(self, *args):
+        self.layer.disconnect(self.teardown_id)
+
+        del self.histoDisplays
+        self.layer = None
+        self.destroy()
+
+    def refresh(self,bt):
+        histoList = []
+        for histoDisp in self.histoDisplays:
+            histo = self.buildHisto(histoDisp.srcIdx)
+            histoDisp.setHisto(histo)
+            histoList.append(histo)
+
+        self.pixCnt = self.getPixCount(histoList)
+        self.update()
+        self.autoScale()
+
+    def update(self):
+        for histoDisp in self.histoDisplays:
+            histoDisp.refreshHisto()
+
+    def updateSpins(self,lo=None,hi=None):
+        self.updating = TRUE
+        if lo is not None:
+            self.minSpin.set_value(lo)
+        if hi is not None:
+            self.maxSpin.set_value(hi)
+        self.updating = FALSE
+
+    def updateScaled(self,histoDisp):
+        scaledHisto = self.buildScaledHisto(histoDisp)
+        histoDisp.setScaledHisto(scaledHisto)
+        mean,std = self.getStats(scaledHisto)
+        histoDisp.updateStats(round(mean,1),round(std,1))
+        
+    def zoom(self,bt,id):
+        if id == 'in':
+            self.zoomindex = min(self.zoomindex+1,8)
+        else:
+            self.zoomindex = max(self.zoomindex-1,0)
+
+        for histoDisp in self.histoDisplays:
+            histoDisp.drawHisto()
+
+    def load(self,bt):
+        import filedlg
+        hisdir,hisfile = os.path.split(self.hisFile)
+        dlg = filedlg.FileDialog('Open Histogram',cwd=hisdir,filter='Histogram files|*.his',multiselect=0)
+        dlg.ok_button.connect('clicked',self.loadHistoFile,dlg)
+        dlg.set_filename(hisfile)
+        dlg.show()
+
+    def loadHistoFile(self,bt,dlg):
+        hisFile = dlg.get_filename()
+        histoList = self.loadHistos(hisFile)
+        
+        self.pixCnt = self.getPixCount(histoList)
+        for histoDisp in self.histoDisplays:
+            histoDisp.setHisto(histoList[histoDisp.srcIdx])
+            histoDisp.drawHisto()
+
+        self.autoScale()
+        self.hisFile = hisFile
+
+    def loadHistos(self,filename):
+        import pickle
+        f = file(filename,'r')
+        histoList = pickle.load(f)
+        f.close()
+        return histoList
+
+    def save(self,*args):
+        import filedlg
+        hisdir,hisfile = os.path.split(self.hisFile)
+        dlg = filedlg.FileDialog('Save Histogram as...',cwd=hisdir,dialog_type=filedlg.FILE_SAVE,filter='Histogram files|*.his')
+        dlg.ok_button.connect('clicked', self.saveHistoFile, dlg)
+        dlg.set_filename(hisfile)
+        dlg.show()
+
+    def saveHistoFile(self,bt,dlg):
+        import pickle
+        histoList = []
+        for histoDisp in self.histoDisplays:
+            histoList.append(histoDisp.getHisto())
+        hisFile = dlg.get_filename()
+        f = file(hisFile,'w')
+        pickle.dump(histoList, f)
+        f.close()
+        self.hisFile = hisFile
+
+    def setAlg(self,entry):
+        alg = entry.get_text()
+        self.lut = self.getLut(alg)
+        if alg == 'None':
+            self.autoScale()
+            alg = 'none_lut'
+        else:
+            self.autoScale('both')
+
+        self.layer.set_property('last_stretch',alg)
+
+    def adjustMin(self,spin):
+        if self.updating:
+            return
+        self.mintail = spin.get_value_as_float()
+        self.autoScale('min')
+
+    def adjustMax(self,spin):
+        if self.updating:
+            return
+        self.maxtail = spin.get_value_as_float()
+        self.autoScale('max')
+
+    def setMin(self,isrc,value,pct):
+        if self.gdt == 2:
+            value/=0.124573
+        self.layer.min_set(isrc,value)
+        self.updateSpins(lo=pct)
+        self.mintail = pct
+        self.updateScaled(self.histoDisplays[isrc])
+
+    def setMax(self,isrc,value,pct):
+        if self.gdt == 2:
+            value/=0.124573
+        self.layer.max_set(isrc,value)
+        self.updateSpins(hi=pct)
+        self.maxtail = pct
+        self.updateScaled(self.histoDisplays[isrc])
+
+    def setLimits(self,ck,id):
+        if id == 'hi':
+            if ck.active:
+                self.hi = 254
+            else:
+                self.hi = 255
+        else:
+            if ck.active:
+                self.lo = 1
+            else:
+                self.lo = 0
+
+        histoList = []
+        for histoDisp in self.histoDisplays:
+            histoList.append(histoDisp.getHisto())
+        self.pixCnt = self.getPixCount(histoList)
+        self.update()
+        self.autoScale('both')
+        self.updateSpins(self.mintail,self.maxtail)
+
+    def buildHisto(self,isrc):
+        band = self.layer.get_data(isrc).get_band()
+        if self.gdt == 2:
+            return band.GetHistogram(min=-0.5,max=2047.5,buckets=256)
+        else:
+            return band.GetHistogram()
+
+    def buildScaledHisto(self,histoDisp):
+        histo = histoDisp.getHisto()
+        ratio = 255.0/(histoDisp.max-histoDisp.min)
+        offset = -(histoDisp.min*ratio)
+        scaledHisto = []
+        for i in range(256):
+            scaledHisto.append(0)
+        for i in range(256):
+            value = int(i*ratio+offset)
+            if self.lut is not None:
+                if value < 0:
+                    value = 0
+                elif value > 255:
+                    value = 255
+                scaled = ord(self.lut[value])
+            else:
+                scaled = value
+            if scaled < 0:
+                scaledHisto[0] += histo[i]
+            elif scaled > 255:
+                scaledHisto[255] += histo[i]
+            else:
+                scaledHisto[scaled] += histo[i]
+
+        return scaledHisto
+
+    def autoScale(self,tail=None):
+        for histoDisp in self.histoDisplays:
+            min,max = histoDisp.getMinMax(tail)
+            if self.gdt == 2:
+                min/=0.124573
+                max/=0.124573
+            isrc = histoDisp.srcIdx
+
+            self.layer.set_source(isrc,self.layer.get_data(isrc),min,max,
+                                    self.layer.get_const_value(isrc),self.lut,
+                                    self.layer.nodata_get(isrc))
+
+            self.updateScaled(histoDisp)
+
+    def getLut(self,alg):
+        from math import log,pow
+        def root(value):
+            return int(255 * sqrt(i/255.0))
+        def loga(value):
+            return int((255 * (log(1.0+i) / log(256.0)))+0.5)
+        def square(value):
+            return int(255 * pow(i/255.0,2.0))
+
+        if alg == 'root':
+            fn = root
+        elif alg == 'log':
+            fn = loga
+        elif alg == 'square':
+            fn = square
+        else:
+            return None
+
+        lut = ''
+        for i in range(256):
+            value = fn(i)
+            if value < 0 :
+                value = 0
+            elif value >= 255:
+                value = 255
+            lut = lut + chr(value)
+
+        return lut
+
+    def getPixCount(self,hisLst):
+        from operator import add
+        cnt = reduce(add,hisLst[0])
+        if self.lo == 1:
+            blkLst = []
+            for histo in hisLst:
+                blkLst.append(histo[0])
+            cnt -= min(blkLst)
+        elif self.hi == 254:
+            whtLst = []
+            for histo in hisLst:
+                whtLst.append(histo[255])
+            cnt -= min(whtLst)
+
+        return float(cnt)
+
+    def getStats(self,histo):
+        m = array(histo[1:])
+        sum = 0.0
+        sum2 = 0.0
+        n = float(add.reduce(m))
+        for j in range(len(m)):
+            sum = sum + j * m[j]
+            sum2 = sum2 + (j ** 2) * float(m[j])
+        var = (sum2-(sum**2.0)/n)/n
+        return sum/n,sqrt(var)
+
+TOOL_LIST = ['HistoEnhance']

Modified: packages/openev/trunk/tools/imgproctemplate.py
===================================================================
--- packages/openev/trunk/tools/imgproctemplate.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/imgproctemplate.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -30,6 +30,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 import gview

Modified: packages/openev/trunk/tools/isodata.py
===================================================================
--- packages/openev/trunk/tools/isodata.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/isodata.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -33,6 +33,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 from Numeric import *

Added: packages/openev/trunk/tools/maps.dat
===================================================================
--- packages/openev/trunk/tools/maps.dat	                        (rev 0)
+++ packages/openev/trunk/tools/maps.dat	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,213 @@
+(dp0
+S'Daily MODIS'
+p1
+(dp2
+S'URL'
+p3
+S'http://wms.jpl.nasa.gov/wms.cgi?LAYERS=daily_terra&STYLES=default&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.1&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p4
+sS'Server'
+p5
+S'OnEarth'
+p6
+sS'Name'
+p7
+S'modis_daily'
+p8
+sS'Title'
+p9
+g1
+ssS'SRTM30Plus auto'
+p10
+(dp11
+g3
+S'http://maps.gdal.org/cgi-bin/mapserv_dem?LAYERS=srtmplus_autoscale&STYLES=&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p12
+sg5
+S'GDAL SRTM30Plus'
+p13
+sg7
+S'srtm30_auto'
+p14
+sg9
+g10
+ssS'Blue Marble Modis'
+p15
+(dp16
+g3
+S'http://wms.jpl.nasa.gov/wms.cgi?LAYERS=modis&STYLES=default&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.1&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p17
+sg5
+S'OnEarth'
+p18
+sg7
+S'modis'
+p19
+sg9
+g15
+ssS'GNIS Civil'
+p20
+(dp21
+g3
+S'http://gisdata.usgs.net:80/servlet/com.esri.wms.Esrimap/EDC_GNIS?LAYERS=GNIS_CIVIL%2CGNIS_CIVIL_Labels&STYLES=%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p22
+sg5
+S'EDC GNIS'
+p23
+sg7
+S'gnis_civil'
+p24
+sg9
+g20
+ssS'True Color Landsat'
+p25
+(dp26
+S'URL'
+p27
+S'http://wms.jpl.nasa.gov/wms.cgi?VERSION=1.1.1&LAYERS=global_mosaic_base&STYLES=visual&FORMAT=image%2Fpng&REQUEST=GetMap&SERVICE=WMS&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p28
+sS'Title'
+p29
+g25
+sS'Name'
+p30
+S'Landsat321'
+p31
+sS'Server'
+p32
+S'OnEarth'
+p33
+ssS'Atlas of Canada 2M'
+p34
+(dp35
+g27
+S'http://atlas.gc.ca:80/cgi-bin/atlaswms_en?LAYERS=can_7.5m%2Cnat_bounds%2Cwa_2m%2Cdrain_2m%2Croads_2m%2Cplaces_symb_2m%2Cplaces_labels_7.5m%2Ccap_symb_e&STYLES=%2C%2C%2C%2C%2C%2C%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.0.8&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p36
+sg29
+g34
+sg30
+S'atlas_can2m'
+p37
+sg32
+S'Atlas of Canada'
+p38
+ssS'NRN Quebec'
+p39
+(dp40
+g3
+S'http://www.geographynetwork.ca/wmsconnector/com.esri.wsit.WMSServlet/Geobase_NRN_Quebec_I?LAYERS=allroads&STYLES=&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p41
+sg5
+S'NRN Quebec'
+p42
+sg7
+S'nrn_qc'
+p43
+sg9
+g39
+ssS'GMap demo'
+p44
+(dp45
+g3
+S'http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?LAYERS=fedlimit%2Cprov_bound%2Cdrain_fn%2Cdrainage%2Croad%2Crail%2Cpopplace&STYLES=%2C%2C%2C%2C%2C%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.0.8&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p46
+sg5
+S'DM Solutions Demo'
+p47
+sg7
+S'gmap'
+p48
+sg9
+g44
+ssS'LIBC 250K'
+p49
+(dp50
+g3
+S'http://libcwms.gov.bc.ca/wmsconnector/com.esri.wsit.WMSServlet/ogc_layer_service?LAYERS=NTS_BC_LANDCOVER_LINES_125M%2CNTS_BC_LANDFORM_LINES_125M%2CNTS_BC_RIV_LAKE_WET_POLYS_125M%2CNTS_BC_TRANSPORT_LINES_125M%2CNTS_BC_MANMADE_POINTS_125M&STYLES=%2C%2C%2C%2C&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_xml'
+p51
+sg5
+S'LIBC'
+p52
+sg7
+S'libc_250k'
+p53
+sg9
+g49
+ssS'Los Angeles Ortho'
+p54
+(dp55
+g3
+S'http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Ortho_133Urban?LAYERS=Laglendale01%2CLaglendale02&STYLES=%2C&SERVICE=WMS&FORMAT=image%2Fjpeg&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p56
+sg5
+S'USGS Ortho'
+p57
+sg7
+S'la_ortho'
+p58
+sg9
+g54
+ssS'Mars'
+p59
+(dp60
+g3
+S'http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&LAYERS=SHADEDRED%3AMARS_DATA&STYLES=default&SERVICE=WMS&FORMAT=image%2Fpng%3B+PhotometricInterpretation%3DRGB&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p61
+sg5
+S'Cubewerx Mars'
+p62
+sg7
+S'mars'
+p63
+sg9
+g59
+ssS'BTS Roads'
+p64
+(dp65
+g27
+S'http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Trans_BTS_Roads?LAYERS=Roads_BTS&STYLES=&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p66
+sg29
+g64
+sg30
+S'bts_roads'
+p67
+sg32
+S'BTS Roads'
+p68
+ssS'CGNS'
+p69
+(dp70
+g27
+S'http://cgns.nrcan.gc.ca/wfs/cubeserv.cgi?LAYERS=GEONAMES%3Acgns&STYLES=GeoBase+Portal+Nameset&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p71
+sg29
+g69
+sg30
+S'cgns'
+p72
+sg32
+S'Canadian Geographical Names'
+p73
+ssS'GLOBE Cloud Cover'
+p74
+(dp75
+g3
+S'http://globe.digitalearth.gov/viz-bin/wmt.cgi?LAYERS=COCOV&STYLES=CONTOURS&SERVICE=WMS&FORMAT=image%2Fpng&REQUEST=GetMap&VERSION=1.1.0&EXCEPTIONS=application%2Fvnd.ogc.se_inimage'
+p76
+sg5
+S'GLOBE'
+p77
+sS'Extents'
+p78
+(dp79
+S'time'
+p80
+S'2005-03-17'
+p81
+ssg7
+S'globe_clouds'
+p82
+sg9
+g74
+ss.
\ No newline at end of file

Modified: packages/openev/trunk/tools/mil_symbols.py
===================================================================
--- packages/openev/trunk/tools/mil_symbols.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/mil_symbols.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -41,6 +41,11 @@
 #
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 import gview

Modified: packages/openev/trunk/tools/open_raw.py
===================================================================
--- packages/openev/trunk/tools/open_raw.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/open_raw.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -62,6 +62,11 @@
 #   (which describe the whole file) plus line/pixel offsets and
 #   sizes for the subwindow.
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import GtkExtra
 

Modified: packages/openev/trunk/tools/open_subarea.py
===================================================================
--- packages/openev/trunk/tools/open_subarea.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/open_subarea.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -38,6 +38,11 @@
 #  New.
 #
  
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 import gview, gdal, gdalconst, gvutils
 import gviewapp

Added: packages/openev/trunk/tools/projection.py
===================================================================
--- packages/openev/trunk/tools/projection.py	                        (rev 0)
+++ packages/openev/trunk/tools/projection.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,704 @@
+##############################################################################
+# projection.py, v0.0b 2005/06/15
+#
+# Project:  OpenEV
+# Purpose:  Projection support for OpenEV.
+# Author:  Mario Beauchamp
+# Comments: Very preliminary version... only works with EPSG codes for now
+###############################################################################
+
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
+import gtk
+from gtk import TRUE,FALSE
+import os
+import gdal
+import gvutils
+import gview
+import gviewapp
+import osr
+
+# those are the only drivers that work cleanly...
+drivers = ['GTiff','HFA','MEM','PCIDSK','VRT']
+
+class ProjectionTool(gviewapp.Tool_GViewApp):
+    def __init__(self,app=None):
+        gviewapp.Tool_GViewApp.__init__(self,app)
+        self.init_menu()
+        # uncomment this line if you want to create an icon entry
+##        self.init_icon()
+
+    def launch_window(self,*args):
+        self.win = ProjectionDialog()
+        if self.win is None:
+            return
+        else:
+            self.win.show()
+
+    def init_menu(self):
+        self.menu_entries.set_entry("Image/Projection",1,self.launch_window)
+
+    def init_icon(self):
+        self.icon_entries.set_entry("worldrgb.xpm","Projection",1,self.launch_window)
+
+class ProjectionDialog(gtk.GtkWindow):
+    def __init__(self):
+        gtk.GtkWindow.__init__(self)
+        self.set_title('Projection Tool')
+        self.dstSRS = osr.SpatialReference()
+        self.updating = TRUE
+        self.viewwin = gview.app.view_manager.get_active_view_window()
+        self.active_change_id = self.viewwin.viewarea.connect("active-changed",self.activeChanged)
+        self.createGUI()
+        self.updating = FALSE
+        self.initParams()
+        self.initGUI()
+        self.show_all()
+
+    def initParams(self):
+        layer = self.viewwin.viewarea.active_layer()
+        if layer is None:
+            return
+        self.layer = layer
+        self.srcDrv = layer.get_parent().get_dataset().GetDriver()
+        self.dstDrv = 'GTiff'
+        self.srcSRS = self.getSRS(self.layer)
+        prj = self.layer.get_projection()
+        if prj is not None:
+            self.dstSRS.ImportFromWkt(prj)
+        self.src = self.getInfoFromLayer()
+        self.dst = self.compute()
+        self.dst.epsg = self.src[6]
+
+    def createGUI(self):
+        self.tips = gtk.GtkTooltips()
+        mainbox = gtk.GtkVBox(spacing=5)
+        mainbox.set_border_width(5)
+        self.add(mainbox)
+
+# Src params
+        frame = gtk.GtkFrame('Source')
+        mainbox.add(frame,expand=FALSE)
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        # Upper left corner
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('UL '),expand=FALSE)
+        box.add(gtk.GtkLabel('X:'),expand=FALSE)
+        self.srcULxTE = GeoEntry()
+        box.add(self.srcULxTE,expand=FALSE)
+        box.add(gtk.GtkLabel('Y:'),expand=FALSE)
+        self.srcULyTE = GeoEntry()
+        box.add(self.srcULyTE,expand=FALSE)
+
+        # Resolution
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Pixel size'),expand=FALSE)
+        box.add(gtk.GtkLabel('X:'),expand=FALSE)
+        self.srcRezxTE = gtk.GtkEntry()
+        self.srcRezxTE.set_usize(100,-1)
+        box.add(self.srcRezxTE,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Y:'), expand=FALSE)
+        self.srcRezyTE = gtk.GtkEntry()
+        self.srcRezyTE.set_usize(100,-1)
+        box.add(self.srcRezyTE,expand=FALSE)
+
+        # Size
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Width: '),expand=FALSE)
+        self.srcWidthTE = gtk.GtkEntry()
+        self.srcWidthTE.set_name('srcw')
+        self.srcWidthTE.set_usize(50,-1)
+        box.add(self.srcWidthTE,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Height:'),expand=FALSE)
+        self.srcHeightTE = gtk.GtkEntry()
+        self.srcHeightTE.set_name('srch')
+        self.srcHeightTE.set_usize(50,-1)
+        box.add(self.srcHeightTE,expand=FALSE)
+
+        # SRS
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('EPSG:'),expand=FALSE)
+        self.srcEpsgTE = gtk.GtkEntry()
+        self.srcEpsgTE.set_usize(50,-1)
+        self.srcEpsgTE.connect('activate',self.epsgSrcChanged)
+        box.add(self.srcEpsgTE,expand=FALSE)
+
+# Dst params
+        frame = gtk.GtkFrame('Destination')
+        mainbox.add(frame,expand=FALSE)
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        # Upper left corner
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('UL '),expand=FALSE)
+        box.add(gtk.GtkLabel('X:'),expand=FALSE)
+        self.dstULxTE = GeoEntry()
+        box.add(self.dstULxTE,expand=FALSE)
+        box.add(gtk.GtkLabel('Y:'),expand=FALSE)
+        self.dstULyTE = GeoEntry()
+        box.add(self.dstULyTE,expand=FALSE)
+
+        # Resolution
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Pixel size'),expand=FALSE)
+        box.add(gtk.GtkLabel('X:'),expand=FALSE)
+        self.dstRezxTE = gtk.GtkEntry()
+        self.dstRezxTE.set_usize(100,-1)
+        self.dstRezxTE.connect('activate',self.updateFromEntry,'dstx')
+        box.add(self.dstRezxTE,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Y:'), expand=FALSE)
+        self.dstRezyTE = gtk.GtkEntry()
+        self.dstRezyTE.set_usize(100,-1)
+        self.dstRezyTE.connect('activate',self.updateFromEntry,'dsty')
+        box.add(self.dstRezyTE,expand=FALSE)
+
+        # Size
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Width: '),expand=FALSE)
+        self.dstWidthTE = gtk.GtkEntry()
+        self.dstWidthTE.set_usize(50,-1)
+        self.dstWidthTE.connect('activate',self.updateFromEntry,'dstw')
+        box.add(self.dstWidthTE,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Height:'),expand=FALSE)
+        self.dstHeightTE = gtk.GtkEntry()
+        self.dstHeightTE.set_usize(50,-1)
+        self.dstHeightTE.connect('activate',self.updateFromEntry,'dsth')
+        box.add(self.dstHeightTE,expand=FALSE)
+
+        # SRS
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('EPSG:'),expand=FALSE)
+        self.dstEpsgTE = gtk.GtkEntry()
+        self.dstEpsgTE.set_usize(50,-1)
+        self.dstEpsgTE.connect('activate',self.epsgDstChanged)
+        box.add(self.dstEpsgTE,expand=FALSE)
+
+# resampling and file create options
+        frame = gtk.GtkFrame('Options')
+        mainbox.add(frame,expand=FALSE)
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        # warp options
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Resampling'),expand=FALSE)
+        self.algCB = gtk.GtkCombo()
+        box.add(self.algCB,expand=FALSE)
+        self.algCB.set_popdown_strings(['Nearest Neighbor','Bilinear','Cubic','Cubic spline'])
+
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Error threshold'),expand=FALSE)
+        self.etTE = gtk.GtkEntry()
+        self.etTE.set_text('0.125')
+        box.add(self.etTE,expand=FALSE)
+
+        # file options
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Format'),expand=FALSE)
+        self.formatCB = gtk.GtkCombo()
+##        wDrvs = filter(lambda d: 'DCAP_CREATE' in d.GetMetadata(),gdal.GetDriverList())
+##        drivers = map(lambda d: d.ShortName,wDrvs)
+        self.formatCB.set_popdown_strings(drivers)
+        self.formatCB.entry.connect('changed',self.formatChanged)
+        box.add(self.formatCB,expand=FALSE)
+
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Filename'),expand=FALSE)
+        self.fileTE = gtk.GtkEntry()
+        box.add(self.fileTE)
+
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box,expand=FALSE)
+        box.add(gtk.GtkLabel('Create options'),expand=FALSE)
+        self.coptTE = gtk.GtkEntry()
+        box.add(self.coptTE)
+
+        box = gtk.GtkHBox(homogeneous=1,spacing=5)
+        box.set_border_width(5)
+        vbox.add(box,expand=FALSE)
+        self.viewopt0RB = gtk.GtkRadioButton(label='Current view')
+        box.add(self.viewopt0RB,expand=FALSE)
+        self.viewopt1RB = gtk.GtkRadioButton(label='New view',group=self.viewopt0RB)
+        box.add(self.viewopt1RB,expand=FALSE)
+        self.viewopt2RB = gtk.GtkRadioButton(label='Save only',group=self.viewopt0RB)
+        box.add(self.viewopt2RB,expand=FALSE)
+        
+# Buttons
+        box = gtk.GtkHBox(homogeneous=1,spacing=5)
+        mainbox.add(box,expand=FALSE)
+
+        assignBT = gtk.GtkButton("Assign")
+        assignBT.connect("clicked",self.assign)
+        box.add(assignBT)
+
+        reprojBT = gtk.GtkButton("Reproject")
+        reprojBT.connect("clicked",self.reproject)
+        box.add(reprojBT)
+
+        closeBT = gtk.GtkButton("Close")
+        closeBT.connect("clicked",self.close)
+        box.add(closeBT)
+
+    def initGUI(self):
+        self.updating = TRUE
+        self.updateSrcGUI()
+        self.updateDstGUI()
+        self.formatCB.entry.set_text(self.dstDrv)
+        self.setFilename()
+        self.updating = FALSE
+
+    def close(self,*args):
+        self.viewwin.viewarea.disconnect(self.active_change_id)
+        self.destroy()
+        return TRUE
+
+    def activeChanged(self,*args):
+        if self.updating:
+            return
+        self.initParams()
+        if self.layer is None:
+            return
+        self.initGUI()
+
+    def epsgDstChanged(self,entry):
+        if self.updating:
+            return
+        epsg = int(entry.get_text())
+        self.dstSRS.ImportFromEPSG(epsg)
+        self.dst = self.compute()
+        self.dst.epsg = epsg
+        self.updateDstGUI()
+
+    def epsgSrcChanged(self,entry):
+        epsg = int(entry.get_text())
+        self.srcSRS.ImportFromEPSG(epsg)
+        self.src[6] = epsg
+        self.updateSrcGUI()
+
+    def formatChanged(self,entry):
+        self.dstDrv = entry.get_text()
+        self.setFilename()
+        
+    def updateSrcGUI(self):
+        self.setEntryMode(src=1)
+        parm = map(lambda p:str(p),self.src[2:])
+        self.srcULxTE.setValue(self.src[0])
+        self.srcULyTE.setValue(self.src[1])
+        self.srcRezxTE.set_text(parm[0])
+        self.srcRezyTE.set_text(parm[1])
+        self.srcWidthTE.set_text(parm[2])
+        self.srcHeightTE.set_text(parm[3])
+        self.srcEpsgTE.set_text(parm[4])
+
+    def updateDstGUI(self):
+        self.setEntryMode()
+        self.dstULxTE.setValue(self.dst.minX)
+        self.dstULyTE.setValue(self.dst.maxY)
+        self.dstRezxTE.set_text(str(self.dst.rezX))
+        self.dstRezyTE.set_text(str(self.dst.rezY))
+        self.dstWidthTE.set_text(str(self.dst.width))
+        self.dstHeightTE.set_text(str(self.dst.height))
+        self.dstEpsgTE.set_text(str(self.dst.epsg))
+
+    def updateFromEntry(self,entry,id):
+        if self.updating:
+            return
+        self.updating = TRUE
+        if id == 'dstw':
+            txt = self.dstWidthTE.get_text()
+            if not len(txt): return
+            self.dst.setRezX(int(txt))
+            self.dstRezxTE.set_text(str(self.dst.rezX))
+        elif id == 'dsth':
+            txt = self.dstHeightTE.get_text()
+            if not len(txt): return
+            self.dst.setRezY(int(txt))
+            self.dstRezyTE.set_text(str(self.dst.rezY))
+        elif id == 'dstx':
+            txt = self.dstRezxTE.get_text()
+            if not len(txt): return
+            self.dst.setWidth(float(txt))
+            self.dstWidthTE.set_text(str(self.dst.width))
+        elif id == 'dsty':
+            txt = self.dstRezyTE.get_text()
+            if not len(txt): return
+            self.dst.setHeight(float(txt))
+            self.dstHeightTE.set_text(str(self.dst.height))
+
+        self.updating = FALSE
+
+    def getInfoFromLayer(self):
+        params = [0,0,1,1,0,0,0]
+        if self.layer is None:
+            return params
+        ds = self.layer.get_parent().get_dataset()
+        if ds is None: # unlikely...
+            return params
+        params[4] = ds.RasterXSize
+        params[5] = ds.RasterYSize
+        geoTr = ds.GetGeoTransform()
+        params[0] = geoTr[0]
+        params[1] = geoTr[3]
+        params[2] = geoTr[1]
+        params[3] = abs(geoTr[5])
+        params[6] = self.getEPSG(self.srcSRS)
+        return params
+
+    def reproject(self,but):
+        Dset = self.layer.get_parent().get_dataset()
+
+        ulx = self.dstULxTE.getValue()
+        uly = self.dstULyTE.getValue()
+        rezX = float(self.dstRezxTE.get_text())
+        rezY = float(self.dstRezyTE.get_text())
+        w = int(self.dstWidthTE.get_text())
+        h = int(self.dstHeightTE.get_text())
+
+        fname = self.fileTE.get_text()
+        dstprj = self.dstSRS.ExportToWkt()
+        if self.dstDrv == 'VRT': # not working... possible bug in AutoCreateWarpedVRT
+            projDset = gdal.AutoCreateWarpedVRT(Dset,
+                                                dst_wkt=dstprj,
+                                                eResampleAlg=self.getResamplingAlg(),
+                                                maxerror=float(self.etTE.get_text()))
+            projDset.SetDescription(fname)
+        else:
+            drv = gdal.GetDriverByName(self.dstDrv)
+            projDset = drv.Create(fname,w,h,
+                                  bands=Dset.RasterCount,
+                                  datatype=int(self.layer.type_get(0)),
+                                  options=[self.coptTE.get_text()])
+            if projDset is None:
+                gvutils.error('Output file could not be created')
+                return
+
+        projDset.SetProjection(dstprj)
+        projDset.SetGeoTransform((ulx,rezX,0.0,uly,0.0,-rezY))
+
+        if self.dstDrv != 'VRT':
+            err = gdal.ReprojectImage(Dset,projDset,
+                                      dst_wkt=dstprj,
+                                      eResampleAlg=self.getResamplingAlg(),
+                                      maxerror=float(self.etTE.get_text()))
+            if err:
+                gvutils.error('Reprojection failed')
+                del projDset
+                return
+            projDset.FlushCache()
+
+        self.openProjected(projDset)
+
+    def assign(self,but):
+##        self.updating = TRUE
+        Dset = self.layer.get_parent().get_dataset()
+
+        ulx = self.srcULxTE.getValue()
+        uly = self.srcULyTE.getValue()
+        rezX = float(self.srcRezxTE.get_text())
+        rezY = float(self.srcRezyTE.get_text())
+        w = int(self.srcWidthTE.get_text())
+        h = int(self.srcHeightTE.get_text())
+
+##        self.viewwin.viewarea.remove_layer(self.layer)
+        if self.srcDrv.ShortName == self.dstDrv:
+##            projDset = Dset
+##            self.layer.set_read_only(FALSE)
+##            else:
+                fname = Dset.GetDescription()
+##                del Dset
+                projDset = gdal.OpenShared(fname,gdal.GA_Update)
+        else:
+            drv = gdal.GetDriverByName(self.dstDrv)
+            fname = self.fileTE.get_text()
+            projDset = drv.CreateCopy(fname,Dset,
+                                      options=[self.coptTE.get_text()])
+##            del Dset
+
+        projDset.SetProjection(self.srcSRS.ExportToWkt())
+        projDset.SetGeoTransform((ulx,rezX,0.0,uly,0.0,-rezY))
+
+##        self.updating = FALSE
+        self.openProjected(projDset)
+
+    def openProjected(self,projDset):
+        if self.viewopt0RB.active:
+            viewwin = self.viewwin
+            viewwin.viewarea.remove_layer(self.layer)
+            self.layer = None
+        elif self.viewopt1RB.active:
+            viewwin = self.viewwin.app.new_view()
+        else:
+            del projDset
+            return
+
+        viewwin.open_gdal_dataset(projDset)
+        del projDset
+
+    def compute(self):
+        ulx = self.src[0]
+        uly = self.src[1]
+        rezX = self.src[2]
+        rezY = self.src[3]
+        width = self.src[4]
+        height = self.src[5]
+        rx = ulx+width*rezX
+        ly = uly-height*rezY
+        corners = [(ulx,uly),(ulx,ly),(rx,uly),(rx,ly)]
+
+        if self.dstSRS.IsSame(self.srcSRS):
+            prjCorners = corners
+        else:
+            ct = osr.CoordinateTransformation(self.srcSRS,self.dstSRS)
+            prjCorners = ct.TransformPoints(corners)
+
+        return GeoInfo(prjCorners,width,height)
+
+    def getSRS(self,layer=None):
+        if layer is None:
+            return
+        srs = osr.SpatialReference()
+        prj = layer.get_projection()
+        if prj is not None:
+            srs.ImportFromWkt(prj)
+        return srs
+
+    def getEPSG(self,srs):
+        if srs.IsGeographic():
+            epsg = srs.GetAuthorityCode('GEOGCS')
+        else:
+            epsg = srs.GetAuthorityCode('PROJCS')
+        return epsg
+
+    def getResamplingAlg(self):
+        algStr = self.algCB.entry.get_text()
+        if algStr == 'Bilinear':
+            alg = gdal.GRA_Bilinear
+        elif algStr == 'Cubic':
+            alg = gdal.GRA_Cubic
+        elif algStr == 'Cubic spline':
+            alg = gdal.GRA_CubicSpline
+        else:
+            alg = gdal.GRA_NearestNeighbour
+
+        return alg
+
+    def setEntryMode(self,src=0):
+        if src:
+            isgeo = self.srcSRS.IsGeographic()
+            self.srcULxTE.setMode(isgeo)
+            self.srcULyTE.setMode(isgeo)
+        else:
+            isgeo = self.dstSRS.IsGeographic()
+            self.dstULxTE.setMode(isgeo)
+            self.dstULyTE.setMode(isgeo)
+
+    def setFilename(self):
+        meta = gdal.GetDriverByName(self.dstDrv).GetMetadata()
+        srcFname = os.path.splitext(self.layer.get_name())[0]
+        if 'DMD_EXTENSION' in meta:
+            projfn = srcFname + '-prj' + os.path.extsep + meta.get('DMD_EXTENSION')
+        else:
+            projfn = srcFname
+        self.fileTE.set_text(projfn)
+
+class GeoEntry(gtk.GtkHBox):
+    def __init__(self,dgsz=33,mnsz=22,scsz=40,mtsz=125):
+        gtk.GtkHBox.__init__(self,spacing=3)
+        self.degsz = dgsz
+        self.metsz = mtsz
+        self.minsz = mnsz
+        self.secsz = scsz
+        self.round = 2
+
+    def connect(self,signal,callback,data):
+        if self.isGeo:
+            self.degTE.connect(signal,callback,data)
+            self.minTE.connect(signal,callback,data)
+            self.secTE.connect(signal,callback,data)
+        else:
+            self.metersTE.connect(signal,callback,data)
+
+    def setRound(self,value):
+        self.round = value
+
+    def setGeoMode(self):
+        self.degTE = self.createEntry(self.degsz,'d')
+        self.minTE = self.createEntry(self.minsz,'m')
+        self.secTE = self.createEntry(self.secsz,'s')
+        self.isGeo = TRUE
+
+    def setMode(self,geo):
+        if len(self.children()):
+            for child in self.children():
+                child.destroy()
+
+        if geo:
+            self.setGeoMode()
+        else:
+            self.setProjMode()
+
+        self.show_all()
+
+    def setProjMode(self):
+        self.metersTE = self.createEntry(self.metsz,'m')
+        self.isGeo = FALSE
+
+    def createEntry(self,size,lbl):
+        te = gtk.GtkEntry()
+        te.set_usize(size,-1)
+        self.add(te,expand=FALSE)
+        self.add(gtk.GtkLabel(lbl),expand=FALSE)
+        return te
+
+    def getDegrees(self):
+        txt = self.degTE.get_text()
+        return self.validateInt(txt)
+
+    def getMinutes(self):
+        txt = self.minTE.get_text()
+        return self.validateInt(txt)
+
+    def getSeconds(self):
+        txt = self.secTE.get_text()
+        return self.validateFloat(txt)
+
+    def getMeters(self):
+        txt = self.metersTE.get_text()
+        return self.validateFloat(txt)
+
+    def validateInt(self,txt):
+        if len(txt) and txt != '-':
+            value = int(txt)
+        else:
+            value = 0
+
+        return value
+
+    def validateFloat(self,txt):
+        if len(txt) and txt != '-':
+            value = float(txt)
+        else:
+            value = 0.0
+
+        return value
+
+    def setDegrees(self,value):
+        self.degTE.set_text(str(value))
+
+    def setMinutes(self,value):
+        self.minTE.set_text(str(value))
+
+    def setSeconds(self,value):
+        self.secTE.set_text(str(round(value,self.round)))
+
+    def setMeters(self,value):
+        self.metersTE.set_text(str(value))
+
+    def setValue(self,value):
+        if self.isGeo:
+            dms = self.deg2dms(value)
+            self.setDegrees(dms[0])
+            self.setMinutes(dms[1])
+            self.setSeconds(dms[2])
+        else:
+            self.setMeters(value)
+
+    def set_text(self,txt):
+        self.setValue(float(txt))
+
+    def getValue(self):
+        dms = []
+        if self.isGeo:
+            dms.append(self.getDegrees())
+            dms.append(self.getMinutes())
+            dms.append(self.getSeconds())
+            return self.dms2deg(dms)
+        else:
+            return self.getMeters()
+
+    def get_text(self):
+        value = self.getValue()
+        return str(value)
+
+    def deg2dms(self,dd):
+        deg = int(dd)
+        dec = abs(dd-deg)
+        mn = int(dec*60)
+        sec = (dec*60 - mn)*60
+        if round(sec,self.round) >= 60.0:
+            sec = 0.0
+            mn+=1
+        return (deg,mn,sec)
+
+    def dms2deg(self,dms):
+        dd = abs(dms[0])+dms[1]/60.0+dms[2]/3600.0
+        if dms[0] < 0:
+            return -dd
+        else:
+            return dd
+
+class GeoInfo:
+    def __init__(self,pts,w,h):
+        self.minX = min(pts[0][0],pts[1][0])
+        self.maxX = max(pts[2][0],pts[3][0])
+        self.minY = min(pts[1][1],pts[3][1])
+        self.maxY = max(pts[0][1],pts[2][1])
+        self.width = w
+        self.height = h
+        self.epsg = 0
+        self.setRezX()
+        self.setRezY()
+
+    def setRezX(self,w=None):
+        if w == None:
+            w = self.width
+        self.rezX = (self.maxX-self.minX)/w
+
+    def setRezY(self,h=None):
+        if h == None:
+            h = self.height
+        self.rezY = (self.maxY-self.minY)/h
+
+    def setWidth(self,rez):
+        self.width = int((self.maxX-self.minX)/rez)
+
+    def setHeight(self,rez):
+        self.height = int((self.maxY-self.minY)/rez)
+
+TOOL_LIST = ['ProjectionTool']

Modified: packages/openev/trunk/tools/rendertest.py
===================================================================
--- packages/openev/trunk/tools/rendertest.py	2007-06-23 22:27:06 UTC (rev 918)
+++ packages/openev/trunk/tools/rendertest.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -68,6 +68,11 @@
 #  New
 #
 
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
 from gtk import *
 
 import gview

Added: packages/openev/trunk/tools/services.txt
===================================================================
--- packages/openev/trunk/tools/services.txt	                        (rev 0)
+++ packages/openev/trunk/tools/services.txt	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,13 @@
+Atlas of Canada,http://atlas.gc.ca:80/cgi-bin/atlaswms_en?
+BTS Roads,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Trans_BTS_Roads?
+Canadian Geographical Names,http://cgns.nrcan.gc.ca/wfs/cubeserv.cgi?
+Cubewerx Mars,http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=mars&VERSION=1.1&REQUEST=GetCapabilities
+DM Solutions Demo,http://dev1.dmsolutions.ca/cgi-bin/mswms_gmap?
+EDC GNIS,http://gisdata.usgs.net:80/servlet/com.esri.wms.Esrimap/EDC_GNIS?
+EDC Hydro,http://gisdata.usgs.net:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Hydro_RAD?
+GDAL SRTM30Plus,http://maps.gdal.org/cgi-bin/mapserv_dem?
+LIBC,http://libcwms.gov.bc.ca/wmsconnector/com.esri.wsit.WMSServlet/ogc_layer_service?
+NRN Quebec,http://www.geographynetwork.ca/wmsconnector/com.esri.wsit.WMSServlet/Geobase_NRN_Quebec_I?
+USGS Ortho,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_EDC_Ortho_133Urban?
+USGS Reference,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/USGS_WMS_REF?
+USGS World,http://ims.cr.usgs.gov:80/servlet/com.esri.wms.Esrimap/world?

Added: packages/openev/trunk/tools/wmstool.py
===================================================================
--- packages/openev/trunk/tools/wmstool.py	                        (rev 0)
+++ packages/openev/trunk/tools/wmstool.py	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,2206 @@
+##############################################################################
+# wmstool.py, v1.07b 2005/09/14
+#
+# Project:  OpenEV
+# Purpose:  WMS Client support for OpenEV, tool version.
+# Author:  Mario Beauchamp
+# Comments: Beta release for testing.
+# TODO: Cache management dialog. Better handling of exceptions.
+###############################################################################
+#
+#  Revision 1.07b 2005/09/14
+#  Added Help button.
+#  Fixed for Python 2.2.
+#
+#  Revision 1.06b 2005/08/16
+#  Fixed proxies support so it works with Python <2.3 as well.
+#
+#  Revision 1.05b 2005/06/15
+#  Added support for http proxy.
+#  Changed datatype in vrt files from 'Byte' to datatype of returned images.
+#    This will ensure correct interpretation of elevation data, for example.
+#  Service exception reports now displayed.
+#
+#  Revision 1.04b 2005/03/30
+#  Fixed failure to return the proper SRS in getSRS().
+#
+#  Revision 1.03b 2005/03/26
+#  Corrected problem when saving a new map.
+#
+#  Revision 1.02b 2005/03/25
+#  Fixed a problem when deleting a map or saving an existing one after edits.
+#  Changed the name of the default map to "landsat321" instead of "Landsat321".
+#  Added a way to put the tool in the icon bar.
+#  Added a way to set a more suitable background color.
+#
+#  Revision 1.01b 2005/03/25
+#  Corrected a few bugs. Added way to select layers without opening Props window.
+#  Added ServiceCaps.validateURL().
+#
+#  Revision 1.00b 2005/03/24
+#  Beta release.
+#
+###############################################################################
+try:
+    import pygtk
+    pygtk.require("1.2")
+except:
+    pass
+import gtk
+from gtk import TRUE,FALSE # for convenience...
+import os
+import osr
+import vrtutils
+import gdal
+import gvutils
+import gview
+import pickle
+import urllib
+import gvsignaler
+import pgucolor
+import gviewapp
+
+wms_dir = os.path.join(gview.home_dir,'wms')
+cachepath = os.path.join(wms_dir,'cache')
+srv_dir = os.path.join(wms_dir,'services')
+
+global servDic
+
+# set desired proxy in prefs file (.openev) as such:
+# http_proxy=http://170.222.120.200:8000/
+proxy = gview.get_preference('http_proxy')
+if proxy != None:
+    proxyDic = {'http':proxy}
+else:
+    proxyDic = None
+
+def loadServices():
+    global servDic
+    servDic = {}
+    hosts = os.listdir(srv_dir)
+    for host in hosts:
+        srvnames = os.listdir(os.path.join(srv_dir,host))
+        for name in srvnames:
+            servDic[name[:-4]] = host
+
+def openService(srvname):
+    host = servDic[srvname]
+    path = os.path.join(srv_dir,host,srvname+'.xml')
+    if servCaps.open(path):
+        # we don't need the buffer here
+        del servCaps.buffer
+        servCaps.buffer = None
+        return 1
+    else: # unlikely but just in case...
+        gvutils.error(path+' does not appear to be a valid GetCapabilities response.')
+        return 0
+
+
+def createCapsEntry(srvname,path=srv_dir):
+    host,p = urllib.splithost(urllib.splittype(servCaps.href)[1])
+    hname = host.split(':')[0]
+    newhost = os.path.join(path,hname)
+
+    if not os.path.exists(newhost):
+        os.mkdir(newhost)
+
+    newcaps = os.path.join(newhost,srvname+'.xml')
+    fd = file(newcaps,'w')
+    fd.write(servCaps.buffer)
+    fd.close()
+    return hname
+
+def buildServicesDir(lst,path=srv_dir):
+    for line in lst:
+        if not line.startswith('#'):
+            srvname,url = line.split(',')
+            if servCaps.open(url):
+                if createCapsEntry(srvname,path) is None:
+                    print "Service "+url+" not saved"
+                    outfile = os.path.join(path,srvname+'-tmp.xml')
+                    fd = file(outfile,'w')
+                    fd.write(servCaps.buffer)
+                    fd.close()
+                else:
+                    print "Service "+servCaps.title+" saved"
+
+                del servCaps.buffer
+                servCaps.buffer = None
+            else:
+                print "Service "+url+" not saved"
+                print "Server responded:"
+                print servCaps.buffer
+                del servCaps.buffer
+                servCaps.buffer = None
+
+def fixCaps(xmlStr):
+    idx = xmlStr.find('[')
+    if idx > 0:
+        idx2 = xmlStr.find(']>') + 1
+        return xmlStr.replace(xmlStr[idx:idx2],'')
+    return xmlStr
+
+def Element(tag, attrib={}, **extra):
+    attrib = attrib.copy()
+    attrib.update(extra)
+    return _ElementInterface(tag, attrib)
+
+def makeElement(node):
+    if hasattr(node, "tag"):
+        return node
+    attrib = {}
+    tag = ''
+    text = ''
+    children = []
+    element = None
+    if node[0] == gdal.CXT_Element:
+        tag = node[1]
+        for subnode in node[2:]:
+            if subnode[0] == gdal.CXT_Attribute:
+                attrib[subnode[1]] = subnode[2][1]
+            elif subnode[0] == gdal.CXT_Element:
+                children.append(subnode)
+            elif subnode[0] == gdal.CXT_Text:
+                text = subnode[1]
+
+        element = Element(tag,attrib)
+        element.text = text
+        element._children = children
+
+    return element
+
+class _ElementInterface:
+    tag = None
+    attrib = None
+    text = None
+    def __init__(self, tag, attrib):
+        self.tag = tag
+        self.attrib = attrib
+        self._children = []
+
+    def __getitem__(self,index):
+        return self._children[index]
+
+    def __len__(self):
+        return len(self._children)
+
+    def _find(self,path,all=0):
+        foundLst=[]
+        splitted = path.split('/',1)
+        if len(splitted) == 2:
+            component, remainder = splitted
+        else:
+            component, remainder = splitted[0], None
+        for subnode in self._children:
+            if subnode[1] == component:
+                if remainder is None:
+                    foundLst.append(subnode)
+                    if not all:
+                        break
+                else:
+                    subElem = makeElement(subnode)
+                    subLst = subElem._find(remainder,all)
+                    if subLst is not None:
+                        if all == 1:
+                            foundLst.extend(subLst)
+                        else:
+                            foundLst.append(subLst)
+ 
+        if len(foundLst) == 0:
+            return None
+        elif all == 1:
+            return foundLst
+        else:
+            return foundLst[0]
+
+    def append(self,element):
+        self._children.append(element)
+
+    def get(self,key,default=None):
+        return self.attrib.get(key,default)
+
+    def find(self,path):
+        result = self._find(path)
+        if result is None:
+            return None
+
+        return makeElement(result)
+
+    def findall(self,path):
+        result = self._find(path,all=1)
+        if result is None:
+            return None
+
+        foundLst = []
+        for child in result:
+            foundLst.append(makeElement(child))
+
+        return foundLst
+
+    def findtext(self,path,default=None):
+        result = self.find(path)
+        if result is None:
+            return default
+
+        return result.text
+
+    def getiterator(self,tag=None):
+        nodes = []
+        for node in self._children:
+            elem = makeElement(node)
+            if tag is None or elem.tag == tag:
+                nodes.append(elem)
+        return nodes
+
+    def items(self):
+        return self.attrib.items()
+
+    def keys(self):
+        return self.attrib.keys()
+
+class ElementTree:
+    def __init__(self, element=None):
+        self._root = element # first node
+
+    def getroot(self):
+        return self._root
+
+    def parse(self,capsBuf):
+        rawXML = fixCaps(capsBuf)
+        try:
+            tree = gdal.ParseXMLString(rawXML)
+        except:
+            return None
+
+        element = makeElement(tree[len(tree)-1])
+        if element is None:
+            return None
+
+        self._root = element
+
+        return rawXML
+
+    def find(self,path):
+        return self._root.find(path)
+
+    def findall(self,path):
+        return self._root.findall(path)
+
+    def findtext(self,path,default=None):
+        return self._root.findtext(path,default)
+
+    def getiterator(self,tag=None):
+        return self._root.getiterator(tag)
+
+class ServiceCaps(ElementTree):
+    def __init__(self):
+        ElementTree.__init__(self)
+        self.title = None
+        self.buffer = None
+
+    def open(self,url):
+        del self._root
+        self._root = None
+        capsBuf = self.getCapabilities(url)
+        # checks
+        if capsBuf is None:
+            self.buffer = ''
+            return 0
+        self.buffer = self.parse(capsBuf)
+        if self._root is None:
+            return 0
+        if self._root.tag != 'WMT_MS_Capabilities':
+            return 0
+
+        self.version = self._root.get('version')
+        servTree = self.find('Service')
+        self.name = servTree.findtext('Name')
+        self.abstract = servTree.findtext('Abstract')
+        self.title = servTree.findtext('Title')
+        self.layer = self.find('Capability/Layer')
+        self.layer.title = self.layer.findtext('Title')
+        res = self.find('Capability/Request/GetMap/DCPType/HTTP/Get/OnlineResource')
+        self.href = res.get('xlink:href')
+        if not '?' in self.href:
+            self.href+='?'
+        # we got here so everything is ok.
+        return 1
+
+    def getCapabilities(self,url):
+        type,path = urllib.splittype(url)
+        if path.endswith('?'):
+            # 1.1.x only
+            url+='VERSION=1.1&SERVICE=WMS&REQUEST=GetCapabilities'
+        if type == 'http':
+            try:
+                opener = urllib.URLopener(proxies=proxyDic)
+                fp = opener.open(url)
+            except:
+                return None
+        else:
+            try:
+                fp = file(url,'r')
+            except:
+                return None
+
+        return fp.read()
+
+    def getTitles(self,tree):
+        keys = []
+        for node in tree:
+            keys.append(node.findtext('Title'))
+
+        keys.sort()
+        return keys
+
+    def getLayerNode(self,title=None,name=None):
+        # check if we have the root layer
+        if name is None:
+            if title == self.layer.title:
+                return self.layer
+        else:
+            layname = self.layer.findtext('Name')
+            if layname is not None and layname == name:
+                return self.layer
+
+        # else iterate the root tree
+        rootTree = self.layer.findall('Layer')
+        return self.findLayer(rootTree,title,name)
+
+    def findLayer(self,tree,title,name):
+        if name is None:
+            laynode = self.findByTitle(tree,title)
+        else:
+            laynode = self.findByName(tree,name)
+        if laynode is not None:
+            return laynode
+        for layer in tree:
+            if layer.find('Layer'):
+                layerTree = layer.findall('Layer')
+                laynode = self.findLayer(layerTree,title,name)
+                if laynode is not None:
+                    return laynode
+
+    def findByTitle(self,tree,title):
+        for node in tree:
+            ntitle = node.findtext('Title')
+            if ntitle == title:
+                return node
+
+    def findByName(self,tree,name):
+        for node in tree:
+            nname = node.findtext('Name')
+            if nname == name:
+                return node
+
+    def getPropList(self,path):
+        propTree = self.findall(path)
+        propLst = []
+        for prop in propTree:
+            propLst.append(prop.text)
+
+        propLst.sort()
+        return propLst
+
+    def getSRSList(self,tree):
+        srsLst = []
+        srsTree = tree.find('SRS')
+        if srsTree is None:
+            return None
+
+        lst = srsTree.text.split(' ')
+        if len(lst) == 1:
+            for srsElem in tree.findall('SRS'):
+                srsLst.append(srsElem.text)
+        else:
+            for srsTxt in lst:
+                srsLst.append(srsTxt)
+
+        srsLst.sort()
+        return srsLst
+
+    def sortLayerTree(self,laynode):
+        titles = []
+        layerTree = laynode.getiterator('Layer')
+        for node in layerTree:
+            titles.append(node.findtext('Title'))
+        
+        titles.sort()
+        sorted = []
+        for title in titles:
+            sorted.append(self.findByTitle(layerTree,title))
+
+        return sorted
+
+    def encodeURL(self,parmDic,url=None):
+        parms = {}
+        if url is None:
+            url = self.href
+
+        for parm,value in parmDic.items():
+            if parm == 'STYLES' or parm == 'map':
+                pass
+            elif parm == 'LAYERS':
+                layerLst = []
+                styleLst = []
+                for title in parmDic['LAYERS']:
+                    node = self.getLayerNode(title)
+                    name = node.findtext('Name')
+                    layerLst.append(name)
+                    idx = parmDic['LAYERS'].index(title)
+                    stitle = parmDic['STYLES'][idx]
+                    if len(stitle):
+                        style = self.findByTitle(node.findall('Style'),stitle)
+                        sname = style.findtext('Name')
+                    else:
+                        sname = ''
+                    styleLst.append(sname)
+                parms['LAYERS'] = ','.join(layerLst)
+                parms['STYLES'] = ','.join(styleLst)
+            elif type(value) == type([]):
+                parms[parm] = ','.join(parmDic[parm])
+            else:
+                parms[parm] = parmDic[parm]
+
+        return url + urllib.urlencode(parms)
+
+    def decodeURL(self,url):
+        splitLst = url.split('?')
+        parmLst = splitLst[1].split('&')
+        parmDic = {}
+        for parmStr in parmLst:
+            parmLst = parmStr.split('=')
+            parmDic[parmLst[0]] = urllib.unquote_plus(parmLst[1])
+        
+        layerLst = parmDic['LAYERS'].split(',')
+        styleLst = parmDic['STYLES'].split(',')
+        laytitles = []
+        stytitles = []
+        for name in layerLst:
+            node = self.getLayerNode(name=name)
+            title = node.findtext('Title')
+            laytitles.append(title)
+            idx = layerLst.index(name)
+            if len(styleLst[idx]):
+                style = self.findByName(node.findall('Style'),styleLst[idx])
+                stitle = style.findtext('Title')
+            else:
+                stitle = ''
+            stytitles.append(stitle)
+            
+        parmDic['LAYERS'] = laytitles
+        parmDic['STYLES'] = stytitles
+
+        return parmDic
+
+    def validateSRS(self,srs):
+        srsLst = self.getSRSList(self.layer)
+        for srsTxt in srsLst:
+            if srsTxt == srs:
+                return 1
+
+        return 0
+
+    def validateURL(self,url):
+        try:
+            params = self.decodeURL(url)
+        except:
+            return 'Invalid URL'
+
+    def getMap(self,url):
+        opener = urllib.URLopener(proxies=proxyDic)
+        f = opener.open(url)
+        h = f.info()
+        if h.getheader('Content-Type') == 'application/vnd.ogc.se_xml':
+            print 'Exception occured'
+        return f
+
+servCaps = ServiceCaps()
+
+class WMSTool(gviewapp.Tool_GViewApp):
+    def __init__(self,app=None):
+        gviewapp.Tool_GViewApp.__init__(self,app)
+        self.init_menu()
+        # uncomment this line if you want to create an icon entry
+##        self.init_icon()
+
+    def launch_window(self,*args):
+        self.win = WMSDialog()
+        if self.win is None:
+            return
+        else:
+            self.win.show()
+
+    def init_menu(self):
+        self.menu_entries.set_entry("Tools/WMS maps",1,self.launch_window)
+
+    def init_icon(self):
+        self.icon_entries.set_entry("worldrgb.xpm","WMS maps",1,self.launch_window)
+
+class WMSDialog(gtk.GtkWindow):
+    def __init__(self):
+        gtk.GtkWindow.__init__(self,title='WMS Tool')
+        self.set_policy(FALSE,TRUE,TRUE)
+        self.tips = gtk.GtkTooltips()
+        self.updating = TRUE
+        loadServices()
+        self.curServ = None
+        self.loadMaps()
+        self.setMap(self.mapKeys[0])
+        self.rezX = 1.0
+        self.rezY = 1.0
+        self.extentBX = None
+        self.viewwin = gview.app.view_manager.get_active_view_window()
+        self.srs = self.getSRS()
+        # uncomment this line if you want to set the view's BG color to yellow
+##        self.viewwin.viewarea.set_background_color((1,1,0.8,1))
+        self.display_change_id = self.viewwin.viewarea.connect("view-state-changed",self.viewChanged)
+        self.active_changed_id = self.viewwin.viewarea.connect("active-changed",self.layerChanged)
+
+        gui_OK = self.createGUI()
+        if gui_OK is FALSE:
+            return None
+        else:
+            self.updateGUI()
+            self.updateExtentGUI()
+            self.updating = FALSE
+            self.show_all()
+
+    def createGUI(self):
+        mainbox = gtk.GtkVBox(spacing=5)
+        mainbox.set_border_width(5)
+        self.add(mainbox)
+
+        frame = gtk.GtkFrame("Map")
+        mainbox.add(frame,expand=FALSE)
+
+# Map ctrl
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        frame.add(box)
+        self.mapCB = gtk.GtkCombo()
+        self.mapCB.set_popdown_strings(self.mapKeys)
+        self.mapCB.list.connect('selection-changed',self.mapSelected)
+        box.add(self.mapCB,expand=FALSE)
+        box.add(gtk.GtkLabel('Background color'),expand=FALSE)
+        self.colorBT = pgucolor.ColorButton((0,0,0,0))
+        box.add(self.colorBT,expand=FALSE)
+
+# Map params
+        mainbox.add(self.createCornersGUI(),expand=FALSE)
+# Resolution
+        mainbox.add(self.createResolutionGUI(),expand=FALSE)
+# Size
+        mainbox.add(self.createSizeGUI(),expand=FALSE)
+
+# Extent
+        frame = gtk.GtkFrame("Extent")
+        mainbox.add(frame,expand=FALSE)
+        self.extentBX = gtk.GtkHBox(spacing=3)
+        self.extentBX.set_border_width(3)
+        frame.add(self.extentBX)
+# Controls
+        frame = gtk.GtkFrame("Controls")
+        mainbox.add(frame,expand=FALSE)
+        vbox = gtk.GtkVBox(spacing=1)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box,expand=FALSE)
+        self.autoTO = gtk.GtkCheckButton(label='Update from')
+        self.autoTO.set_active(TRUE)
+        self.autoTO.connect('toggled',self.autoUpdateChanged)
+        box.add(self.autoTO,expand=FALSE)
+
+        self.viewModeRB = gtk.GtkRadioButton(label='view')
+        self.viewModeRB.set_active(TRUE)
+        self.viewModeRB.connect('toggled',self.autoUpdateChanged)
+        box.add(self.viewModeRB,expand=FALSE)
+        self.layerModeRB = gtk.GtkRadioButton(label='layer',group=self.viewModeRB)
+        self.layerModeRB.connect('toggled',self.autoUpdateChanged)
+        box.add(self.layerModeRB,expand=FALSE)
+
+        box.add(gtk.GtkLabel('EPSG:'),expand=FALSE)
+        self.epsgTE = gtk.GtkEntry()
+        self.epsgTE.set_usize(50,-1)
+        self.epsgTE.set_text(self.getEPSG())
+        self.epsgTE.connect('activate',self.epsgChanged)
+        box.add(self.epsgTE,expand=FALSE)
+
+
+# Buttons
+        box = gtk.GtkHBox(spacing=5)
+        mainbox.add(box,expand=FALSE)
+        getBT = gtk.GtkButton('Get map')
+        getBT.connect('clicked',self.addLayer)
+        box.add(getBT)
+
+        validBT = gtk.GtkButton('Validate')
+        self.tips.set_tip(validBT,'Validate map')
+        validBT.connect('clicked',self.validateMap)
+        box.add(validBT)
+
+        setupBT = gtk.GtkButton('Setup')
+        self.tips.set_tip(setupBT,'Setup maps and services')
+        setupBT.connect('clicked',self.setup)
+        box.add(setupBT)
+
+        closeBT = gtk.GtkButton('Close')
+        closeBT.connect('clicked',self.close)
+        box.add(closeBT)
+
+        helpBT = gtk.GtkButton('Help')
+        helpBT.connect('clicked',self.help)
+        box.add(helpBT)
+
+    def createCornersGUI(self):
+        frame = gtk.GtkFrame("Corners")
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        # create entries
+        isgeo = self.srs.IsGeographic()
+        self.ulxGE = GeoEntry(isgeo)
+        self.ulyGE = GeoEntry(isgeo)
+        self.lrxGE = GeoEntry(isgeo)
+        self.lryGE = GeoEntry(isgeo)
+
+# Upper left corner
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box)
+
+        box.add(gtk.GtkLabel('UL '))
+        box.add(gtk.GtkLabel('X:'))
+        self.ulxGE.connect('changed',self.updateFromEntry,'ulx')
+        box.add(self.ulxGE)
+
+        box.add(gtk.GtkLabel('Y:'))
+        self.ulyGE.connect('changed',self.updateFromEntry,'uly')
+        box.add(self.ulyGE)
+
+# Lower right corner
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box)
+
+        box.add(gtk.GtkLabel('LR '))
+        box.add(gtk.GtkLabel('X:'))
+        self.lrxGE.connect('changed',self.updateFromEntry,'lrx')
+        box.add(self.lrxGE)
+
+        box.add(gtk.GtkLabel('Y:'))
+        self.lryGE.connect('changed',self.updateFromEntry,'lry')
+        box.add(self.lryGE)
+
+        return frame
+
+    def createResolutionGUI(self):
+        frame = gtk.GtkFrame("Resolution")
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box)
+
+        # create entries
+        isgeo = self.srs.IsGeographic()
+        self.rezxGE = GeoEntry(isgeo,dgsz=15,scsz=48,mtsz=125)
+        self.rezxGE.setRound(3)
+        self.rezyGE = GeoEntry(isgeo,dgsz=15,scsz=48,mtsz=125)
+        self.rezyGE.setRound(3)
+        box.add(gtk.GtkLabel('X:'))
+        self.rezxGE.connect('changed',self.setResolution,'rezX')
+        box.add(self.rezxGE)
+
+        box.add(gtk.GtkLabel('-'))
+        self.linkTO = gtk.GtkCheckButton(label='-')
+        self.linkTO.set_active(TRUE)
+        box.add(self.linkTO,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Y:'))
+        self.rezyGE.connect('changed',self.setResolution,'rezY')
+        box.add(self.rezyGE)
+
+        return frame
+
+    def createSizeGUI(self):
+        frame = gtk.GtkFrame("Size")
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box,expand=FALSE)
+
+        box.add(gtk.GtkLabel('Width: '),expand=FALSE)
+        self.wTE = gtk.GtkEntry()
+        self.wTE.set_usize(50,-1)
+        self.wTE.connect('changed',self.updateFromEntry,'w')
+        box.add(self.wTE,expand=FALSE)
+        box.add(gtk.GtkLabel('px   '),expand=FALSE)
+
+        isgeo = self.srs.IsGeographic()
+        self.xGE = GeoEntry(isgeo)
+        self.xGE.connect('changed',self.updateFromEntry,'x')
+        box.add(self.xGE)
+
+        box = gtk.GtkHBox(spacing=3)
+        vbox.add(box)
+
+        box.add(gtk.GtkLabel('Height:'),expand=FALSE)
+        self.hTE = gtk.GtkEntry()
+        self.hTE.set_usize(50,-1)
+        self.hTE.connect('changed',self.updateFromEntry,'h')
+        box.add(self.hTE,expand=FALSE)
+        box.add(gtk.GtkLabel('px   '),expand=FALSE)
+
+        self.yGE = GeoEntry(isgeo)
+        self.yGE.connect('changed',self.updateFromEntry,'y')
+        box.add(self.yGE)
+
+        return frame
+
+    def updateExtentGUI(self):
+        children = self.extentBX.children()
+        if len(children):
+            for child in children:
+                child.destroy()
+
+        if 'Extents' in self.curMap:
+            vbox = gtk.GtkVBox(spacing=3)
+            self.extentBX.add(vbox)
+            for parm,value in self.curMap['Extents'].items():
+                box = gtk.GtkHBox(spacing=2)
+                vbox.add(box,expand=FALSE)
+                box.add(gtk.GtkLabel(parm+': '),expand=FALSE)
+                box.add(gtk.GtkLabel(value),expand=FALSE)
+            editBT = gtk.GtkButton('Edit')
+            editBT.set_usize(40,18)
+            editBT.connect('clicked',self.editExtentClicked)
+            self.extentBX.add(editBT,expand=FALSE)
+        else:
+            self.extentBX.add(gtk.GtkLabel('No extents defined'))
+
+        self.extentBX.show_all()
+
+    def colorClicked(self,bt):
+        self.bgColor = bt.get_color()
+
+    def help(self,bt):
+        from gvhtml import LaunchHTML
+        LaunchHTML('http://pages.infinit.net/starged/openev/wmstool/home.htm')
+
+    def layerChanged(self,view):
+        if not self.autoTO.active or self.updating:
+            return
+
+        layer = view.active_layer()
+        if layer is None or gvutils.is_of_class(layer.__class__,'GvRasterLayer' ) == 0:
+            return
+
+        srs = self.getSRS()
+        if not srs.IsSame(self.srs):
+            self.srs = srs
+            self.epsgTE.set_text(self.getEPSG())
+            self.updateModeGUI()
+
+        self.updateGUI()
+
+    def viewChanged(self,view):
+        if not self.autoTO.active or self.updating or self.layerModeRB.active:
+            return
+
+        self.updateGUI()
+
+    def editExtentClicked(self,*args):
+        self.showEditExtentGUI()
+
+    def mapSelected(self,*args):
+        if self.updating:
+            return
+        mapKey = self.mapCB.entry.get_text()
+        self.setMap(mapKey)
+        self.updateExtentGUI()
+
+    def extentChanged(self,entry,name):
+        if self.updating: return
+        self.curMap['Extents'][name] = entry.get_text()
+
+    def autoUpdateChanged(self,*args):
+        if not self.autoTO.active:
+            return
+        if self.layerModeRB.active:
+            layer = self.viewwin.viewarea.active_layer()
+            if layer is None or gvutils.is_of_class(layer.__class__,'GvRasterLayer' ) == 0:
+                return
+
+        srs = self.getSRS()
+        if not srs.IsSame(self.srs):
+            self.srs = srs
+            self.epsgTE.set_text(self.getEPSG())
+            self.updateModeGUI()
+
+        self.updateGUI()
+
+    def epsgChanged(self,*args):
+        espgTxt = self.epsgTE.get_text()
+        self.srs = self.getSRS(int(espgTxt))
+        self.updateModeGUI()
+        self.updateGUI()
+
+    def showEditExtentGUI(self):
+        for child in self.extentBX.children():
+            child.destroy()
+        parms = servCaps.decodeURL(self.curMap['URL'])
+        layerNode = servCaps.getLayerNode(parms['LAYERS'][0])
+        extentTree = layerNode.findall('Extent')
+        vbox = gtk.GtkVBox(spacing=3)
+        self.extentBX.add(vbox,expand=FALSE)
+        for extent in extentTree:
+            name = extent.get('name')
+            extentTE = ExtentEntry(extent)
+            extentTE.connect('changed',self.extentChanged,name)
+            vbox.add(extentTE,expand=FALSE)
+            value = extent.text
+            if name in self.curMap['Extents']:
+                value = self.curMap['Extents'][name]
+            extentTE.entry.set_text(value)
+
+        self.extentBX.show_all()
+
+    def updateGUI(self,*args):
+        self.updating = TRUE
+        if self.viewModeRB.active:
+            params = self.getInfoFromView()
+        elif self.layerModeRB.active:
+            params = self.getInfoFromLayer()
+        else:
+            return
+        self.ulxGE.setValue(params[0])
+        self.ulyGE.setValue(params[1])
+        self.lrxGE.setValue(params[2])
+        self.lryGE.setValue(params[3])
+        self.rezxGE.setValue(self.rezX)
+        self.rezyGE.setValue(abs(self.rezX))
+        self.wTE.set_text(str(params[4]))
+        self.hTE.set_text(str(params[5]))
+        self.xGE.setValue(params[6])
+        self.yGE.setValue(params[7])
+        self.updating = FALSE
+
+    def updateModeGUI(self):
+        self.updating = TRUE
+        isgeo = self.srs.IsGeographic()
+        self.ulxGE.setMode(isgeo)
+        self.ulyGE.setMode(isgeo)
+        self.lrxGE.setMode(isgeo)
+        self.lryGE.setMode(isgeo)
+        self.rezxGE.setMode(isgeo)
+        self.rezyGE.setMode(isgeo)
+        self.xGE.setMode(isgeo)
+        self.yGE.setMode(isgeo)
+        self.updating = FALSE
+
+    def updateFromEntry(self,entry,id):
+        if self.updating:
+            return
+        self.updating = TRUE
+        rezX = self.rezX
+        rezY = self.rezY
+        if id == 'lrx':
+            lrx = self.lrxGE.getValue()
+            ulx = self.ulxGE.getValue()
+            x = abs(ulx - lrx)
+            self.xGE.setValue(x)
+            w = int(x/rezX)
+            self.wTE.set_text(str(w))
+        elif id == 'lry':
+            lry = self.lryGE.getValue()
+            uly = self.ulyGE.getValue()
+            y = abs(uly - lry)
+            self.yGE.setValue(y)
+            h = int(y/abs(rezY))
+            self.hTE.set_text(str(h))
+        elif id == 'w' or id == 'ulx':
+            txt = self.wTE.get_text()
+            if not len(txt): return
+            w = int(txt)
+            x = w*rezX
+            self.xGE.setValue(x)
+            ulx = self.ulxGE.getValue()
+            lrx = ulx+x
+            self.lrxGE.setValue(lrx)
+        elif id == 'h' or id == 'uly':
+            txt = self.hTE.get_text()
+            if not len(txt): return
+            h = int(txt)
+            y = h*rezY
+            self.yGE.setValue(abs(y))
+            uly = self.ulyGE.getValue()
+            lry = uly+y
+            self.lryGE.setValue(lry)
+        elif id == 'x':
+            x = self.xGE.getValue()
+            w = int(x/rezX)
+            self.wTE.set_text(str(w))
+            ulx = self.ulxGE.getValue()
+            lrx = ulx+x
+            self.lrxGE.setValue(lrx)
+        elif id == 'y':
+            y = self.yGE.getValue()
+            h = int(y/abs(rezY))
+            self.hTE.set_text(str(h))
+            uly = self.ulyGE.getValue()
+            lry = uly-y
+            self.lryGE.setValue(lry)
+
+        self.updating = FALSE
+
+    def getInfoFromView(self):
+        view = self.viewwin.viewarea
+        bbox = view.get_extents()
+        w = view.get_width()
+        h = view.get_height()
+        ulx = bbox[0]
+        uly = bbox[3]
+        lrx = bbox[2]
+        lry = bbox[1]
+        dx = abs(ulx - lrx)
+        dy = abs(uly - lry)
+        self.rezX = dx/w
+        self.rezY = -dy/h
+        return (ulx,uly,lrx,lry,w,h,dx,dy)
+
+    def getInfoFromLayer(self):
+        layer = self.viewwin.viewarea.active_layer()
+        if layer is None:
+            return
+        ds = layer.get_parent().get_dataset()
+        w = ds.RasterXSize
+        h = ds.RasterYSize
+        geoTr = ds.GetGeoTransform()
+        ulx = geoTr[0]
+        uly = geoTr[3]
+        self.rezX = geoTr[1]
+        self.rezY = geoTr[5]
+        lrx = ulx + w*self.rezX
+        lry = uly + h*self.rezY
+        dx = abs(ulx - lrx)
+        dy = abs(uly - lry)
+        return (ulx,uly,lrx,lry,w,h,dx,dy)
+
+    def addLayer(self,*args):
+        mapfn = self.checkCache(self.curMap['Name'])
+        self.updateMapURL()
+
+        wmsFile = servCaps.getMap(self.curMapURL)
+        h = wmsFile.info()
+        if h.getheader('Content-Type') == 'application/vnd.ogc.se_xml':
+##            wmsFile = file('c:\\FWTools\\wms\\cache\\landsat321_23-exception.xml')
+            excepStr = ''
+            line = wmsFile.readline()
+            while len(line):
+                if line.find('<ServiceException code')>0:
+                    excepStr += wmsFile.readline()
+                line = wmsFile.readline()
+            wmsFile.close()
+            gvutils.error("Error getting map. Server responded:\n\n"+excepStr)
+##            excepFile = open(mapfn+'-exception.xml','wb')
+##            excepFile.write(buf)
+##            excepFile.close()
+            return
+            
+        layerFile = open(mapfn+'.tmp','wb')
+        layerFile.write(wmsFile.read())
+        layerFile.close()
+        wmsFile.close()
+
+        ds = gdal.Open(mapfn+'.tmp',gdal.GA_ReadOnly)
+        if ds is None:
+            gvutils.error("Error opening image")
+            return
+
+        w = ds.RasterXSize
+        h = ds.RasterYSize
+        mapVrt = vrtutils.VRTDatasetConstructor(w, h)
+
+        mapVrt.SetSRS(self.srs.ExportToWkt())
+        mapVrt.SetGeoTransform(self.getGeoTransform())
+
+        nBands = ds.RasterCount
+        fname = ds.GetDescription()
+        if nBands == 1:
+            band = ds.GetRasterBand(1)
+            nodata = band.GetNoDataValue()
+            ci = band.GetRasterColorInterpretation()
+            dtype = gdal.GetDataTypeName(band.DataType)
+            if ci == gdal.GCI_PaletteIndex:
+                ct = band.GetRasterColorTable()
+                mapVrt.AddSimpleBand(fname,1,dtype,NoDataValue=nodata,ColorInterp='Palette',colortable=ct)
+            else:
+                mapVrt.AddSimpleBand(fname,1,dtype,NoDataValue=nodata,ColorInterp='Grey')
+        else:
+            for bandno in range(1,nBands+1):
+                band = ds.GetRasterBand(bandno)
+                nodata = band.GetNoDataValue()
+                dtype = gdal.GetDataTypeName(band.DataType)
+                mapVrt.AddSimpleBand(fname,bandno,dtype,NoDataValue=nodata)
+
+        mapFile = open(mapfn+'.vrt','w')
+        mapFile.writelines(mapVrt.GetVRTString())
+        mapFile.close()
+
+        self.viewwin.open_gdal_dataset(gdal.Open(mapfn+'.vrt'))
+
+    def checkCache(self,mapname):
+        count = 1
+        filtLst = filter(lambda n:n.startswith(mapname) and n.endswith('vrt'),
+                         os.listdir(cachepath))
+        inLst = TRUE
+        while inLst:
+            name = mapname+'_'+str(count)
+            if name+'.vrt' in filtLst:
+                count+=1
+            else:
+                inLst = FALSE
+
+        return os.path.join(cachepath,name)
+
+    def setup(self,*args):
+        SetupDialog(self)
+
+    def loadMaps(self):
+        try:
+            maps = pickle.load(open(os.path.join(wms_dir,'maps.dat'),'r'))
+        except:
+            maps = {'True Color Landsat': {'Name':"landsat321",
+                                            'Title':"True Color Landsat",
+                                            'Server':'OnEarth',
+                                            'URL':"http://wms.jpl.nasa.gov/wms.cgi?VERSION=1.1.1&LAYERS=global_mosaic_base"+ \
+                                                    "&STYLES=visual&FORMAT=image%2Fpng&REQUEST=GetMap&SERVICE=WMS" + \
+                                                    "&EXCEPTIONS=application%2Fvnd.ogc.se_xml"
+                                           }
+                    }
+
+        self.maps = maps
+        self.mapKeys = self.maps.keys()
+        self.mapKeys.sort()
+
+    def setMap(self,mapKey):
+        self.updating = TRUE
+        self.curMap = self.maps[mapKey]
+        srvname = self.curMap['Server']
+        if self.curServ is not None:
+            if self.curServ == srvname: # don't open if it is already
+                self.updating = FALSE
+                return
+        if openService(srvname):
+            self.curServ = srvname
+        self.updating = FALSE
+
+    def validateMap(self,*args):
+        # will eventually have more checks, only SRS for now
+        result = ''
+        parms = self.addParms()
+        self.updateMapURL(parms)
+        check = servCaps.validateURL(self.curMapURL)
+        if check is not None:
+            result+=check
+        elif not servCaps.validateSRS(parms['SRS']):
+           result+='Invalid SRS\n'
+        if len(result):
+            result+='Map is invalid. Verify parameters above.\nURL:'
+        else:
+            result+='Map is valid.\nLocal file:'
+            result+=self.checkCache(self.curMap['Name'])
+            result+='\nURL:'
+
+        showValidateMapResult(result,self.curMapURL)
+
+    def addParms(self):
+        bbox = []
+        parms = {}
+        bbox.append(self.ulxGE.get_text())
+        bbox.append(self.lryGE.get_text())
+        bbox.append(self.lrxGE.get_text())
+        bbox.append(self.ulyGE.get_text())
+        parms['BBOX'] = bbox
+        parms['WIDTH'] = self.wTE.get_text()
+        parms['HEIGHT'] = self.hTE.get_text()
+        parms['SRS'] = 'EPSG:'+self.epsgTE.get_text()
+        color = self.colorBT.get_color()
+        if color[3] == 0.0:
+            parms['TRANSPARENT'] = 'TRUE'
+        else:
+            color = int(color[0]*16711425)+int(color[1]*65535)+int(color[2]*255)
+            parms['BGCOLOR'] = hex(color)
+            parms['TRANSPARENT'] = 'FALSE'
+        if 'Extents' in self.curMap:
+            for extent,value in self.curMap['Extents'].items():
+                if extent in ['time','elevation']:
+                    parms[extent] = value
+                else:
+                    parms['dim_'+extent] = value
+        return parms
+
+    def updateMapURL(self,parms=None):
+        if parms is None:
+            parms = self.addParms()
+        self.curMapURL = servCaps.encodeURL(parms,self.curMap['URL']+'&')
+
+    def getGeoTransform(self):
+        ulx = self.ulxGE.getValue()
+        uly = self.ulyGE.getValue()
+        rezX = self.rezX
+        rezY = self.rezY
+        return [ulx,rezX,0,uly,0,rezY]
+
+    def getSRS(self,epsg=None):
+        srs = osr.SpatialReference()
+        if epsg is None:
+            view = self.viewwin.viewarea
+            proj = view.get_projection()
+            if proj is not None:
+                srs.ImportFromWkt(proj)
+                return srs
+
+        try: # in case of epsg not recognised
+            srs.ImportFromEPSG(epsg)
+        except:
+            srs.ImportFromEPSG(4326) # default: WGS84 GEOGCS
+
+        return srs
+
+    def getEPSG(self):
+        if self.srs.IsGeographic():
+            epsg = self.srs.GetAuthorityCode('GEOGCS')
+        else:
+            epsg = self.srs.GetAuthorityCode('PROJCS')
+
+        return str(epsg)
+
+    def setResolution(self,entry,id):
+        if self.updating:
+            return
+        if id == 'rezX':
+            self.rezX = self.rezxGE.getValue()
+            self.updateFromEntry(entry,'w')
+            if self.linkTO.active:
+                self.rezY = -self.rezX
+                self.rezyGE.setValue(self.rezX)
+        elif id == 'rezY':
+            self.rezY = -self.rezyGE.getValue()
+            self.updateFromEntry(entry,'h')
+
+    def close(self,*args):
+        self.viewwin.viewarea.disconnect(self.active_changed_id)
+        self.viewwin.viewarea.disconnect(self.display_change_id)
+        self.destroy()
+
+class SetupDialog(gtk.GtkWindow):
+    def __init__(self,mapwin):
+        gtk.GtkWindow.__init__(self,title='Setup')
+        self.set_policy(FALSE,TRUE,TRUE)
+        self.tips = gtk.GtkTooltips()
+        self.curServ = None
+        self.mapDic = mapwin.maps
+        self.mapKeys = mapwin.mapKeys
+        self.mapWin = mapwin
+        self.curMap = None
+        self.updating = TRUE
+        self.editingMap = FALSE
+        self.editingSrv = FALSE
+        self.layerDlg = None
+        self.connect('delete-event',self.close)
+
+        gui_OK = self.createGUI()
+        if gui_OK is FALSE:
+            return None
+        else:
+            self.updateServiceInfo()
+            self.updateMapInfo()
+            self.show_all()
+
+        self.updating = FALSE
+        self.mapCB.entry.set_text(mapwin.curMap['Title'])
+
+    def createGUI(self):
+        mainbox = gtk.GtkVBox(spacing=5)
+        mainbox.set_border_width(5)
+        self.add(mainbox)
+
+# Maps
+        frame = gtk.GtkFrame("Maps")
+        mainbox.add(frame, expand=FALSE)
+        vbox = gtk.GtkVBox()
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box, expand=FALSE)
+        self.mapCB = gtk.GtkCombo()
+        self.mapCB.disable_activate()
+        self.mapCB.entry.connect('changed',self.mapSelected)
+        box.add(self.mapCB,expand=FALSE)
+        box.add(gtk.GtkLabel('Name:'),expand=FALSE)
+        self.mapnameTE = gtk.GtkEntry()
+        self.mapnameTE.set_usize(100,-1)
+        box.add(self.mapnameTE,expand=FALSE)
+
+        delBT = gtk.GtkButton("Del")
+        self.tips.set_tip(delBT,'Delete map')
+        delBT.connect("clicked", self.delMap)
+        box.add(delBT)
+        newBT = gtk.GtkButton("New")
+        self.tips.set_tip(newBT,'New map')
+        newBT.connect("clicked", self.enterMap)
+        box.add(newBT)
+        self.saveBT = gtk.GtkButton("Save")
+        self.tips.set_tip(self.saveBT,'Save map')
+        self.saveBT.connect("clicked", self.saveMap)
+        box.add(self.saveBT)
+
+        self.selectedCL = gtk.GtkCList(cols=2, titles=['Layer','Style'])
+        self.selectedCL.set_column_width(0,270)
+        self.selectedCL.set_column_resizeable(0,TRUE)
+        self.selectedCL.set_column_resizeable(1,TRUE)
+        self.selectedCL.connect('select-row',self.selectedRow)
+        swin = gtk.GtkScrolledWindow()
+        swin.set_usize(-1,150)
+        swin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+        swin.add_with_viewport(self.selectedCL)
+        vbox.add(swin, expand=FALSE)
+
+# Services
+        frame = gtk.GtkFrame("Services")
+        mainbox.add(frame, expand=FALSE)
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        box = gtk.GtkHBox(spacing=5)
+        box.set_border_width(5)
+        vbox.add(box, expand=FALSE)
+        self.servCB = gtk.GtkCombo()
+        self.servCB.set_usize(250,-1)
+        self.servCB.disable_activate()
+        self.servCB.entry.connect('activate',self.newService)
+        self.servCB.entry.connect('changed',self.serviceSelected)
+        box.add(self.servCB)
+
+        delBT = gtk.GtkButton("Del")
+        self.tips.set_tip(delBT,'Delete service')
+        delBT.connect("clicked", self.delService)
+        box.add(delBT)
+        newBT = gtk.GtkButton("New")
+        self.tips.set_tip(newBT,'Add new service')
+        newBT.connect("clicked", self.enterService)
+        box.add(newBT)
+        saveBT = gtk.GtkButton("Save")
+        self.tips.set_tip(saveBT,'Save service entry')
+        saveBT.connect("clicked", self.saveService)
+        box.add(saveBT)
+
+# Service caps
+        box = gtk.GtkHBox(spacing=3)
+        box.set_border_width(5)
+        vbox.add(box, expand=FALSE)
+# Image formats
+        box.add(gtk.GtkLabel('Format:'),expand=FALSE)
+        self.formatCB = gtk.GtkCombo()
+        box.add(self.formatCB)
+# Exception formats
+        box.add(gtk.GtkLabel('Except:'),expand=FALSE)
+        self.exceptCB = gtk.GtkCombo()
+        self.exceptCB.set_usize(205,-1)
+        box.add(self.exceptCB)
+
+# Layers
+        lframe = gtk.GtkFrame('Available Layers')
+        mainbox.add(lframe)
+        lboxfr = gtk.GtkVBox(spacing=5)
+        lboxfr.set_border_width(5)
+        lframe.add(lboxfr)
+        lwin = gtk.GtkScrolledWindow()
+        lwin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+        lwin.set_usize(-1,300)
+        lboxfr.add(lwin)
+        self.layersTR = gtk.GtkTree()
+        lwin.add_with_viewport(self.layersTR)
+
+# Buttons
+        box = gtk.GtkHBox(spacing=5)
+        mainbox.add(box, expand=FALSE)
+
+        getBT = gtk.GtkButton("Get map")
+        self.tips.set_tip(getBT,'Get map')
+        getBT.connect("clicked", self.getMap)
+        box.add(getBT)
+
+        validBT = gtk.GtkButton('Validate')
+        self.tips.set_tip(validBT,'Validate map')
+        validBT.connect('clicked',self.validateMap)
+        box.add(validBT)
+
+        cancelBT = gtk.GtkButton("Cancel")
+        self.tips.set_tip(cancelBT,'Exit without saving')
+        cancelBT.connect("clicked", self.close)
+        box.add(cancelBT)
+
+        doneBT = gtk.GtkButton("Done")
+        self.tips.set_tip(doneBT,'Save maps and exit')
+        doneBT.connect("clicked", self.doneClicked)
+        box.add(doneBT)
+
+        return TRUE
+
+    def doneClicked(self,*args):
+        self.saveData()
+        # update map window before closing
+        self.updateMapWindow()
+        self.close()
+
+    def selectedRow(self,lst,row,col,event):
+        if self.updating:
+            return
+        
+        title = lst.get_text(row,0)
+        index = self.curMapParms['LAYERS'].index(title)
+        self.showLayerDialog(title,index)
+
+    def layerItemSelected(self,item,event):
+        self.updating = TRUE
+        title = item.children()[0].get()
+        if event.button == 3:
+            item.toggle()
+            self.showLayerDialog(title)
+        elif event.button == 1:
+            self.selectLayer(title)
+            self.updateSelectedGUI()
+            if self.layerDlg is not None:
+                if self.layerDlg.flags() & gtk.VISIBLE:
+                    self.showLayerDialog(title)
+
+        self.updating = FALSE
+
+    def showLayerDialog(self,title,index=None):
+        if self.checkMap() and index is None:
+            if title in self.curMapParms['LAYERS']:
+                index = self.curMapParms['LAYERS'].index(title)
+
+        if self.layerDlg is None:
+            self.layerDlg = LayerDialog(title,self.curMapParms,index)
+            self.layerDlg.subscribe('param-changed',self.updateSelectedGUI)
+        else:
+            self.layerDlg.get_window()._raise()
+            self.layerDlg.create(title,self.curMapParms,index)
+        
+    def updateServiceInfo(self):
+        self.updating = TRUE
+        servKeys = servDic.keys()
+        servKeys.sort()
+        self.servCB.set_popdown_strings(servKeys)
+        self.updating = FALSE
+
+    def updateMapInfo(self):
+        self.updating = TRUE
+        self.mapKeys = self.mapDic.keys()
+        self.mapKeys.sort()
+        self.mapCB.set_popdown_strings(self.mapKeys)
+        self.updating = FALSE
+
+    def updateMapGUI(self):
+        self.formatCB.entry.set_text(self.curMapParms['FORMAT'])
+        self.exceptCB.entry.set_text(self.curMapParms['EXCEPTIONS'])
+
+    def updateMapWindow(self):
+        self.mapWin.updating = TRUE
+        self.mapWin.mapKeys = self.mapKeys
+        self.mapWin.maps = self.mapDic
+        self.mapWin.mapCB.set_popdown_strings(self.mapWin.mapKeys)
+        self.mapWin.mapCB.entry.set_text(self.curMap['Title'])
+        self.mapWin.setMap(self.curMap['Title'])
+        self.mapWin.updating = FALSE
+
+    def mapSelected(self,*args):
+        if self.updating or self.editingMap:
+            return
+        key = self.mapCB.entry.get_text()
+        self.setMap(key)
+
+    def setMap(self,key):
+        self.updating = TRUE
+        self.curMap = self.mapDic[key]
+        self.mapnameTE.set_text(self.curMap['Name'])
+        skey = self.curMap['Server']
+        self.servCB.entry.set_text(skey)
+        self.setService(skey)
+        self.curMapParms = servCaps.decodeURL(self.curMap['URL'])
+        if 'Extents' in self.curMap:
+            self.curMapParms['Extents'] = self.curMap['Extents']
+
+        self.updateMapGUI()
+        self.updateSelectedGUI()
+        self.updating = FALSE
+        if self.layerDlg is not None:
+            if self.layerDlg.flags() & gtk.VISIBLE:
+                self.selectedCL.select_row(0,0)
+
+    def checkMap(self):
+        return self.curMap['Server'] == self.curServ \
+               and not self.curMap['Server'] == 'None'
+
+    def validateMap(self,*args):
+        if self.checkMap():
+            exmap = self.mapWin.curMap
+            self.mapWin.curMap = self.makeMap()
+            self.mapWin.validateMap()
+            self.mapWin.curMap = exmap
+
+    def enterMap(self,*args):
+        self.updating = TRUE
+        self.editingMap = TRUE
+        self.mapCB.entry.set_text('New map')
+        self.mapnameTE.set_text('newmap')
+        self.servCB.entry.set_text('Select service')
+        self.newMap()
+        self.updateSelectedGUI()
+        self.updating = FALSE
+
+    def newMap(self):
+        self.setService('Select service')
+        map = {}
+        parms = {}
+        parms['SERVICE'] = 'WMS'
+        parms['REQUEST'] = "GetMap"
+        parms['LAYERS'] = []
+        parms['STYLES'] = []
+        map['Name'] = 'newmap'
+        map['Title'] = 'New map'
+        map['Server'] = 'None'
+        self.curMap = map
+        self.curMapParms = parms
+
+    def saveMap(self,*args):
+        self.updating = TRUE
+        map = self.makeMap()
+        if 'Extents' in self.curMapParms:
+            map['Extents'] = self.curMapParms.get('Extents')
+            del self.curMapParms['Extents']
+        map['URL'] = servCaps.encodeURL(self.curMapParms)
+        mapKey = map['Title']
+        self.mapDic[mapKey] = map
+        self.updateMapInfo()
+        self.mapCB.entry.set_text(mapKey)
+        self.setMap(mapKey)
+        self.updateMapWindow()
+        self.updating = FALSE
+        self.editingMap = FALSE
+
+    def delMap(self,*args):
+        self.updating = TRUE
+        del self.mapDic[self.curMap['Title']]
+        self.updateMapInfo()
+        self.setMap(self.mapKeys[0])
+        self.updateMapWindow()
+        self.updating = FALSE
+
+    def getMap(self,*args):
+        self.mapWin.curMap = self.makeMap()
+        self.mapWin.addLayer()
+
+    def makeMap(self):
+        map = {}
+        map['Title'] = self.mapCB.entry.get_text()
+        map['Name'] = self.mapnameTE.get_text()
+        map['Server'] = self.servCB.entry.get_text()
+        self.curMapParms['FORMAT'] = self.formatCB.entry.get_text()
+        self.curMapParms['EXCEPTIONS'] = self.exceptCB.entry.get_text()
+        if 'Extents' in self.curMapParms:
+            map['Extents'] = self.curMapParms['Extents']
+        params = self.curMapParms.copy()
+        map['URL'] = servCaps.encodeURL(params)
+
+        return map
+
+    def serviceSelected(self,*args):
+        if self.updating or self.editingSrv:
+            return
+        skey = self.servCB.entry.get_text()
+        self.setService(skey)
+        if not self.curMap['Title'] in self.mapDic:
+            self.curMapParms['EXCEPTIONS'] = self.exceptCB.entry.get_text()
+            self.curMapParms['FORMAT'] = self.formatCB.entry.get_text()
+            self.curMapParms['VERSION'] = servCaps.version
+            self.curMap['Server'] = skey
+            self.curMap['URL'] = servCaps.encodeURL(self.curMapParms)
+            if servCaps.layer.find('Dimension') is not None:
+                self.curMapParms['Extents'] = {}
+
+    def setService(self,skey):
+        self.updating = TRUE
+        if skey == 'Select service':
+            self.updateServiceGUI(skey)
+            self.curServ = None
+            self.updating = FALSE
+            return
+        if skey != self.curServ:
+            if openService(skey):
+                self.curServ = skey
+                self.updateServiceGUI(skey)
+                self.updateLayersList()
+
+        self.updating = FALSE
+
+    def enterService(self,*args):
+        self.updating = TRUE
+        self.editingSrv = TRUE
+        self.servCB.entry.set_text('')
+        self.tips.set_tip(self.servCB.entry,'Enter service filename/url and hit <Return>')
+        self.updateServiceGUI('New service')
+        self.updating = FALSE
+
+    def newService(self,cb):
+        self.updating = TRUE
+        pathname = cb.get_text()
+        fname = None
+        type,p = urllib.splittype(pathname)
+        if type is None:
+            fname = pathname
+            url = os.path.join(wms_dir,pathname)
+        else:
+            url = pathname
+
+        if not servCaps.open(url):
+            txt = 'Could not open ' + url+'.\nServer responded:\n'
+            txt+=servCaps.buffer
+            message(txt,title='GetCapabilities Result')
+            del servCaps.buffer
+            servCaps.buffer = None
+            self.updating = FALSE
+            self.editingSrv = FALSE
+            return
+
+        self.curServ = servCaps.title
+        self.servCB.entry.set_text(servCaps.title)
+        self.updateServiceGUI(self.curServ)
+        self.updateLayersList()
+        self.updating = FALSE
+
+    def delService(self,*args):
+        self.updating = TRUE
+        srvname = self.servCB.entry.get_text()
+        host = servDic.get(srvname)
+        del servDic[srvname]
+        os.remove(os.path.join(srv_dir,host,srvname+'.xml'))
+        self.updateServiceInfo()
+        self.updating = FALSE
+
+    def saveService(self,*args):
+        self.updating = TRUE
+        srvKey = self.servCB.entry.get_text()
+        try:
+            host = createCapsEntry(srvKey)
+            servDic[srvKey] = host
+            self.updateServiceInfo()
+        except:
+            outfile = os.path.join(wms_dir,'caps-tmp.xml')
+            fd = file(outfile,'w')
+            fd.write(servCaps.buffer)
+            fd.close()
+            gvutils.error('The Service entry could not be created.\nSaved as '+outfile)
+            srvKey = servDic.keys()[0]
+        
+        del servCaps.buffer
+        servCaps.buffer = None
+        self.editingSrv = FALSE
+        self.updating = FALSE
+        self.servCB.entry.set_text(srvKey)
+
+    def updateServiceGUI(self,key):
+        if key == 'Select service' or key == 'New service':
+            self.formatCB.entry.set_text('')
+            self.exceptCB.entry.set_text('')
+            if key == 'Select service':
+                self.tips.set_tip(self.servCB.entry,'Select the service for this map. \n Only one service per map.')
+            self.layersTR.clear_items(0,-1)
+            if key == 'New service':
+                self.selectedCL.freeze()
+                self.selectedCL.clear()
+                self.selectedCL.thaw()
+            return
+
+        frmtLst = servCaps.getPropList('Capability/Request/GetMap/Format')
+        self.formatCB.set_popdown_strings(frmtLst)
+        excLst = servCaps.getPropList('Capability/Exception/Format')
+        self.exceptCB.set_popdown_strings(excLst)
+
+        try:
+            self.tips.set_tip(self.servCB.entry,servCaps.abstract.encode('latin_1'))
+        except:
+            self.tips.set_tip(self.servCB.entry,servCaps.title)
+
+    def updateLayersList(self):
+        self.layersTR.clear_items(0,-1)
+        item = gtk.GtkTreeItem(servCaps.layer.title)
+        self.layersTR.append(item)
+        mainTree = gtk.GtkTree()
+        item.set_subtree(mainTree)
+        item.connect('button-press-event',self.layerItemSelected)
+        self.addLayerTree(servCaps.layer,mainTree)
+        item.expand()
+        item.show()
+
+    def updateSelectedGUI(self,*args):
+        self.updating = TRUE
+        self.selectedCL.freeze()
+        self.selectedCL.clear()
+        for laytitle in self.curMapParms['LAYERS']:
+            if len(self.curMapParms['STYLES']):
+                idx = self.curMapParms['LAYERS'].index(laytitle)
+                stitle = self.curMapParms['STYLES'][idx]
+            self.selectedCL.insert(0,(laytitle,stitle))
+        self.selectedCL.thaw()
+        self.updating = FALSE
+
+    def addLayerTree(self,laynode,tree):
+        for node in servCaps.sortLayerTree(laynode):
+            layItem = gtk.GtkTreeItem(node.findtext('Title'))
+            tree.append(layItem)
+            if node.find('Layer'):
+                layTree = gtk.GtkTree()
+                layItem.set_subtree(layTree)
+                layItem.connect('expand',self.expandLayerTree,node)
+
+            layItem.connect('button-press-event',self.layerItemSelected)
+            layItem.show()
+
+
+    def expandLayerTree(self,item,node):
+        tree = item.subtree
+        if len(tree.children()):
+            return
+        self.addLayerTree(node,tree)
+
+    def selectLayer(self,title):
+        if not self.checkMap():
+            return
+        layerNode = servCaps.getLayerNode(title)
+        if layerNode.find('Name') is None:
+            return
+        if title in self.curMapParms['LAYERS']:
+            index = self.curMapParms['LAYERS'].index(title)
+            del self.curMapParms['LAYERS'][index]
+            del self.curMapParms['STYLES'][index]
+            if 'Extents' in self.curMapParms and len(self.curMapParms['LAYERS']) == 0:
+                self.curMapParms['Extents'] = {}
+        else:
+            self.curMapParms['LAYERS'].append(title)
+            styleNode = layerNode.find('Style')
+            if styleNode:
+                style = styleNode.findtext('Title')
+            else:
+                style = ''
+            self.curMapParms['STYLES'].append(style)
+            if layerNode.find('Extent') is not None:
+                extents = layerNode.findall('Extent')
+                for extent in extents:
+                    self.curMapParms['Extents'][extent.get('name')] = extent.get('default')
+
+    def saveData(self,*args):
+        pickle.dump(self.mapDic,open(os.path.join(wms_dir,'maps.dat'),'w'))
+
+    def close(self,*args):
+        if self.layerDlg is not None:
+            self.layerDlg.unsubscribe('param-changed',self.updateSelectedGUI)
+            self.layerDlg.destroy()
+
+        self.destroy()
+
+
+class LayerDialog(gtk.GtkWindow,gvsignaler.Signaler):
+    def __init__(self,title,params,index=None):
+        gtk.GtkWindow.__init__(self,title='Layer Properties')
+        self.set_policy(FALSE,TRUE,TRUE)
+        self.connect('delete-event',self.close)
+        self.publish('param-changed')
+        self.create(title,params,index)
+
+    def create(self,title,params,index=None):
+        self.updating = TRUE
+        self.layerNode = servCaps.getLayerNode(title)
+        self.params = params
+        self.index = index
+        self.curStyle = None
+        self.extentDic = {}
+        if len(self.children()):
+            for child in self.children():
+                child.destroy()
+        self.createGUI()
+        self.show_all()
+        self.updating = FALSE
+
+    def createGUI(self):
+        srsflag = TRUE
+        mainbox = gtk.GtkVBox(spacing=5)
+        mainbox.set_border_width(5)
+        self.add(mainbox)
+        frame = gtk.GtkFrame("Information")
+        mainbox.add(frame)
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        if self.layerNode.find('Name') is not None:
+            self.selectedTO = gtk.GtkCheckButton(label='Selected')
+            vbox.add(self.selectedTO,expand=FALSE)
+            if self.index is not None:
+                self.selectedTO.set_active(TRUE)
+            self.selectedTO.connect('toggled',self.selectedToggled)
+        for node in self.layerNode.getiterator():
+            tag = node.tag
+            if tag in ['Name','Title']:
+                box = gtk.GtkHBox()
+                vbox.add(box)
+                box.add(gtk.GtkLabel(tag+': '+node.text),expand=FALSE)
+            elif tag == 'Abstract':
+                box = gtk.GtkHBox()
+                vbox.add(box)
+                label = gtk.GtkLabel(node.text)
+                label.set_justify(gtk.JUSTIFY_FILL)
+                label.set_line_wrap(TRUE)
+                label.set_usize(400,-1)
+                box.add(label)
+            elif tag == 'SRS' and srsflag:
+                srsLst = servCaps.getSRSList(self.layerNode)
+                vbox.add(gtk.GtkHSeparator())
+                box = gtk.GtkHBox(spacing=3)
+                vbox.add(box)
+                box.add(gtk.GtkLabel('SRS:'),expand=FALSE)
+                srsCB = gtk.GtkCombo()
+                srsCB.set_usize(110,-1)
+                srsCB.set_popdown_strings(srsLst)
+                tips = gtk.GtkTooltips()
+                tips.set_tip(srsCB.entry,'For information only. Not selectable')
+                box.add(srsCB,expand=FALSE)
+                srsflag = FALSE
+            elif tag in ['LatLonBoundingBox','BoundingBox']:
+                vbox.add(self.createBBoxLabel(node),expand=FALSE)
+            elif tag in ['Dimension','ScaleHint','MetadataURL','DataURL', \
+                         'KeywordList','Attribution','AuthorityURL','Identifier','FeatureListURL']:
+                vbox.add(self.createAttrLabel(node),expand=FALSE)
+
+        vbox.add(self.createAttrLabel(self.layerNode))
+        if self.layerNode.find('Style') is not None:
+            mainbox.add(self.createStylesGUI())
+        if self.layerNode.find('Extent') is not None:
+            mainbox.add(self.createExtentGUI())
+
+    def createStylesGUI(self):
+        frame = gtk.GtkFrame("Style")
+        vbox = gtk.GtkVBox(spacing=5)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        box = gtk.GtkHBox(spacing=5)
+        vbox.add(box, expand=FALSE)
+        self.stylesCB = gtk.GtkCombo()
+        box.add(self.stylesCB)
+
+        styleTree = self.layerNode.findall('Style')
+        styleLst = servCaps.getTitles(styleTree)
+        self.stylesCB.set_popdown_strings(styleLst)
+        self.styleTX = gtk.GtkLabel()
+        vbox.add(self.styleTX,expand=FALSE)
+        if self.index is None:
+            self.setStyle(styleLst[0])
+        else:
+            self.setStyle(self.params['STYLES'][self.index])
+        self.stylesCB.entry.set_text(self.curStyle)
+        self.stylesCB.entry.connect('changed',self.styleChanged)
+
+        legend = self.getStyle(self.curStyle).find('LegendURL')
+        if legend:
+            vbox.add(gtk.GtkLabel(legend.tag+'...'),expand=FALSE)
+        return frame
+
+    def createExtentGUI(self):
+        extentTree = self.layerNode.findall('Extent')
+        frame = gtk.GtkFrame("Extent")
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.set_border_width(5)
+        frame.add(vbox)
+        for extent in extentTree:
+            extentTE = ExtentEntry(extent)
+            vbox.add(extentTE,expand=FALSE)
+            name = extent.get('name')
+            extentTE.connect('changed',self.extentChanged,name)
+            self.extentDic[name] = extentTE.entry
+            if self.index is not None:
+                extentTE.entry.set_text(self.params['Extents'][name])
+        return frame
+
+    def createBBoxLabel(self,elem):
+        vbox = gtk.GtkVBox(spacing=3)
+        vbox.add(gtk.GtkHSeparator())
+        if elem.tag == 'BoundingBox':
+            vbox.add(gtk.GtkLabel(elem.tag+' '+elem.get('SRS')),expand=FALSE)
+        else:
+            vbox.add(gtk.GtkLabel(elem.tag),expand=FALSE)
+        label = gtk.GtkLabel('maxy'+':'+elem.get('maxy'))
+        vbox.add(label,expand=FALSE)
+        box = gtk.GtkHBox(spacing=10)
+        vbox.add(box)
+        lbox = gtk.GtkHBox()
+        box.add(lbox)
+        rbox = gtk.GtkHBox()
+        box.add(rbox)
+        label = gtk.GtkLabel('minx'+':'+elem.get('minx'))
+        label.set_justify(gtk.JUSTIFY_LEFT)
+        lbox.add(label)
+        label = gtk.GtkLabel('maxx'+':'+elem.get('maxx'))
+        label.set_justify(gtk.JUSTIFY_RIGHT)
+        rbox.add(label)
+        label = gtk.GtkLabel('miny'+':'+elem.get('miny'))
+        vbox.add(label,expand=FALSE)
+        return vbox
+
+    def createAttrLabel(self,elem):
+        tag = elem.tag
+        vbox = gtk.GtkVBox(spacing=3)
+        if len(elem.items()) == 0 and tag == 'Layer':
+            return vbox
+        vbox.add(gtk.GtkHSeparator())
+        if tag in ['DataURL','MetadataURL','KeywordList','Attribution','AuthorityURL','Identifier','FeatureListURL']:
+            vbox.add(gtk.GtkLabel(tag+'...'),expand=FALSE)
+            return vbox
+        vbox.add(gtk.GtkLabel(tag),expand=FALSE)
+        for attr,value in elem.items():
+            box = gtk.GtkHBox()
+            vbox.add(box,expand=FALSE)
+            label = gtk.GtkLabel(attr+': '+value)
+            box.add(label,expand=FALSE)
+        return vbox
+
+    def selectedToggled(self,chk):
+        if self.updating:
+            return
+        self.selectLayer(chk.active)
+
+    def selectLayer(self,select):
+        title = self.layerNode.findtext('Title')
+        if select:
+            self.params['LAYERS'].append(title)
+            if self.curStyle is None:
+                style = ''
+            else:
+                style = self.curStyle
+            self.params['STYLES'].append(style)
+            if 'Extents' in self.params:
+                for extent,entry in self.extentDic.items():
+                    self.params['Extents'][extent] = entry.get_text()
+            self.index = self.params['LAYERS'].index(title)
+        else:
+            del self.params['LAYERS'][self.index]
+            del self.params['STYLES'][self.index]
+            if 'Extents' in self.params and len(self.params['LAYERS']) == 0:
+                self.params['Extents'] = {}
+            self.index = None
+
+        self.notify('param-changed')
+
+    def styleChanged(self,entry):
+        if self.updating:
+            return
+        sel = entry.get_text()
+        if len(sel):
+            self.setStyle(sel)
+    
+    def extentChanged(self,entry,name):
+        if self.updating:
+            return
+        sel = entry.get_text()
+        if len(sel):
+            self.params['Extents'][name] = sel
+
+    def setStyle(self,title):
+        self.curStyle = title
+        if self.index is not None:
+            self.params['STYLES'][self.index] = title
+            self.notify('param-changed')
+
+        self.updateStyleGUI()
+
+    def getStyle(self,title):
+        for style in self.layerNode.findall('Style'):
+            if style.findtext('Title') == title:
+                return style
+
+    def updateStyleGUI(self):
+        style = self.getStyle(self.curStyle)
+        abstract = style.find('Abstract')
+        if abstract is not None:
+            self.styleTX.set_text(abstract.text)
+
+    def close(self,*args):
+        self.updating = TRUE
+        self.hide()
+        return TRUE
+
+# custom widgets and dialogs
+class GeneralDialog(gtk.GtkDialog):
+    def __init__(self, widgets=[],buttons=[]):
+        gtk.GtkDialog.__init__(self)
+        self.connect("destroy", self.quit)
+        self.connect("delete_event", self.quit)
+        gtk.grab_add(self)
+        for widget in widgets:
+            hbox = gtk.GtkHBox()
+            hbox.set_border_width(3)
+            self.vbox.add(hbox)
+            hbox.add(widget)
+
+        for button in buttons:
+            self.action_area.add(button)
+
+        button = gtk.GtkButton('Close')
+        self.action_area.add(button,expand=FALSE)
+        button.connect("clicked", self.quit)
+
+    def quit(self, *args):
+        self.hide()
+        self.destroy()
+        gtk.mainquit()
+
+def message(text,title="Message Box"):
+    label = gtk.GtkLabel(text)
+    label.set_justify(gtk.JUSTIFY_LEFT)
+    label.set_line_wrap(TRUE)
+    win = GeneralDialog(widgets=[label])
+    win.set_title(title)
+    win.show_all()
+    gtk.mainloop()
+
+def showValidateMapResult(result,url):
+    label = gtk.GtkLabel(result)
+    label.set_justify(gtk.JUSTIFY_LEFT)
+
+    # just a trick to get the text length
+    urltxt = gtk.GtkLabel(url)
+    w,h = urltxt.size_request()
+
+    urlTE = gtk.GtkEntry()
+    urlTE.set_usize(w+10,-1)
+    urlTE.set_text(url)
+    urlwin = gtk.GtkScrolledWindow()
+    urlwin.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+    urlwin.set_usize(-1,50)
+    urlwin.add_with_viewport(urlTE)
+    win = GeneralDialog(widgets=[label,urlwin])
+    win.set_title('Map Validation')
+    win.show_all()
+    # do this last, just in case...
+    urlTE.select_region(0,-1)
+    urlTE.copy_clipboard()
+    gtk.mainloop()
+
+class GeoEntry(gtk.GtkHBox):
+    def __init__(self,geo,dgsz=33,mnsz=22,scsz=40,mtsz=125):
+        gtk.GtkHBox.__init__(self,spacing=3)
+        self.degsz = dgsz
+        self.metsz = mtsz
+        self.minsz = mnsz
+        self.secsz = scsz
+        self.round = 2
+        self.setMode(geo)
+
+    def connect(self,signal,callback,data):
+        if self.isGeo:
+            self.degTE.connect(signal,callback,data)
+            self.minTE.connect(signal,callback,data)
+            self.secTE.connect(signal,callback,data)
+        else:
+            self.metersTE.connect(signal,callback,data)
+
+    def setRound(self,value):
+        self.round = value
+
+    def setGeoMode(self):
+        self.degTE = self.createEntry(self.degsz,'d')
+        self.minTE = self.createEntry(self.minsz,'m')
+        self.secTE = self.createEntry(self.secsz,'s')
+        self.isGeo = TRUE
+
+    def setMode(self,geo):
+        if len(self.children()):
+            for child in self.children():
+                child.destroy()
+
+        if geo:
+            self.setGeoMode()
+        else:
+            self.setProjMode()
+
+        self.show_all()
+
+    def setProjMode(self):
+        self.metersTE = self.createEntry(self.metsz,'m')
+        self.isGeo = FALSE
+
+    def createEntry(self,size,lbl):
+        te = gtk.GtkEntry()
+        te.set_usize(size,-1)
+        self.add(te,expand=FALSE)
+        self.add(gtk.GtkLabel(lbl),expand=FALSE)
+        return te
+
+    def getDegrees(self):
+        txt = self.degTE.get_text()
+        return self.validateInt(txt)
+
+    def getMinutes(self):
+        txt = self.minTE.get_text()
+        return self.validateInt(txt)
+
+    def getSeconds(self):
+        txt = self.secTE.get_text()
+        return self.validateFloat(txt)
+
+    def getMeters(self):
+        txt = self.metersTE.get_text()
+        return self.validateFloat(txt)
+
+    def validateInt(self,txt):
+        if len(txt) and txt != '-':
+            value = int(txt)
+        else:
+            value = 0
+
+        return value
+
+    def validateFloat(self,txt):
+        if len(txt) and txt != '-':
+            value = float(txt)
+        else:
+            value = 0.0
+
+        return value
+
+    def setDegrees(self,value):
+        self.degTE.set_text(str(value))
+
+    def setMinutes(self,value):
+        self.minTE.set_text(str(value))
+
+    def setSeconds(self,value):
+        self.secTE.set_text(str(round(value,self.round)))
+
+    def setMeters(self,value):
+        self.metersTE.set_text(str(value))
+
+    def setValue(self,value):
+        if self.isGeo:
+            dms = self.deg2dms(value)
+            self.setDegrees(dms[0])
+            self.setMinutes(dms[1])
+            self.setSeconds(dms[2])
+        else:
+            self.setMeters(value)
+
+    def set_text(self,txt):
+        self.setValue(float(txt))
+
+    def getValue(self):
+        dms = []
+        if self.isGeo:
+            dms.append(self.getDegrees())
+            dms.append(self.getMinutes())
+            dms.append(self.getSeconds())
+            return self.dms2deg(dms)
+        else:
+            return self.getMeters()
+
+    def get_text(self):
+        value = self.getValue()
+        return str(value)
+
+    def deg2dms(self,dd):
+        deg = int(dd)
+        dec = abs(dd-deg)
+        mn = int(dec*60)
+        sec = (dec*60 - mn)*60
+        if round(sec,self.round) >= 60.0:
+            sec = 0.0
+            mn+=1
+        return (deg,mn,sec)
+
+    def dms2deg(self,dms):
+        dd = abs(dms[0])+dms[1]/60.0+dms[2]/3600.0
+        if dms[0] < 0:
+            return -dd
+        else:
+            return dd
+
+class ExtentEntry(gtk.GtkHBox):
+    def __init__(self,extent):
+        gtk.GtkHBox.__init__(self,spacing=3)
+        name = extent.get('name')
+        label = gtk.GtkLabel(name+': ')
+        self.add(label,expand=FALSE)
+        extLst = extent.text.split(',')
+        if len(extLst) > 1:
+            extentCB = gtk.GtkCombo()
+            extentCB.entry.set_usize(75,-1)
+            self.add(extentCB,expand=FALSE)
+            extentCB.set_popdown_strings(extLst)
+            extentCB.entry.set_text(extent.get('default'))
+            self.entry = extentCB.entry
+            dimTree = servCaps.layer.findall('Dimension')
+            for elem in dimTree:
+                if elem.get('name') == name:
+                    units = elem.get('unitSymbol')
+                    break
+            if units is not None:
+                self.add(gtk.GtkLabel(units),expand=FALSE)
+        else:
+            extLst = extent.text.split('/')
+            if len(extLst) == 1:
+                label = gtk.GtkLabel(extent.text)
+                self.add(label,expand=FALSE)
+                self.entry = label
+            else:
+                extentTE = gtk.GtkEntry()
+                extentTE.set_text(extent.get('default'))
+                extentTE.set_usize(75,-1)
+                self.add(extentTE,expand=FALSE)
+                self.entry = extentTE
+                label = ' from '+extLst[0]+' to '+extLst[1]+' by '+extLst[2][1:]
+                self.add(gtk.GtkLabel(label),expand=FALSE)
+
+    def connect(self,signal,callback,data):
+        self.entry.connect(signal,callback,data)
+
+TOOL_LIST = ['WMSTool']
+if __name__ == '__main__':
+    import sys
+    if not os.path.exists(wms_dir):
+        os.mkdir(wms_dir)
+    if not os.path.exists(cachepath):
+        os.mkdir(cachepath)
+    if not os.path.exists(srv_dir):
+        os.mkdir(srv_dir)
+    
+    if len(sys.argv)>1:
+        intxt = file(sys.argv[1],'r').read()
+        lst = intxt.splitlines()
+    else:
+        lst = ['OnEarth,http://wms.jpl.nasa.gov/wms.cgi?','GLOBE,http://globe.digitalearth.gov/viz-bin/wmt.cgi?']
+
+    if len(sys.argv)>2:
+        srvDir = os.path.join(wms_dir,sys.argv[2])
+    else:
+        srvDir = srv_dir
+    if not os.path.exists(srvDir):
+        os.mkdir(srvDir)
+
+    print "Processing list..."
+    buildServicesDir(lst,srvDir)
+    sys.exit(0)

Added: packages/openev/trunk/version.config
===================================================================
--- packages/openev/trunk/version.config	                        (rev 0)
+++ packages/openev/trunk/version.config	2007-06-23 22:27:39 UTC (rev 919)
@@ -0,0 +1,3 @@
+major=1
+minor=9
+micro=0-cvs20051112




More information about the Pkg-grass-devel mailing list