diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /vendor/x11iraf/ximtool/OLD/ximtool-mag | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'vendor/x11iraf/ximtool/OLD/ximtool-mag')
-rwxr-xr-x | vendor/x11iraf/ximtool/OLD/ximtool-mag | 5494 |
1 files changed, 5494 insertions, 0 deletions
diff --git a/vendor/x11iraf/ximtool/OLD/ximtool-mag b/vendor/x11iraf/ximtool/OLD/ximtool-mag new file mode 100755 index 00000000..8e051fc8 --- /dev/null +++ b/vendor/x11iraf/ximtool/OLD/ximtool-mag @@ -0,0 +1,5494 @@ +#!/bin/csh -f +# +# XIMTOOL-ALT -- Script wrapper to start XImtool using the alternate GUI. +# The GUI file is contained is this script which is created when the system +# is built, it may be used to run any alternate GUI by simply replacing the +# Tcl script making up the GUI at the end of this script or by using the +# "-gui" command line flag. The only configurable item is the path to the +# XImtool binary to be used, by default the one found in the user's path will +# be used. +# Arguments specific to this GUI include: +# +# -displayMagnifier <bool> show magnifier marker on startup +# -showToolBar <bool> show toolbar on startup +# -showPanelBar <bool> show panelbar on startup +# +#---------------------------------------------------------------------------- + +# Configurable parameters +set XIMTOOL = ximtool # Path to default ximtool binary + + +#------------------------------------------------------------------ +#--------------- Do not modify below this line -------------------- +#------------------------------------------------------------------ +unset noclobber +onintr cleanup + +set SKIP = 106 # offset to GUI file + +# Dump the GUI from this script file. +tail +$SKIP $0 > /tmp/_gui.$$ + +# Check for no arguments. +set q = '"' +set cmd = "-gui /tmp/_gui.$$ -title $q XImtool Experimental GUI $q" + +# Process the script arguments, quoting args when necessary. +if ($#argv > 0) then + while ("$1" != "") + if ("$1" == "-xrm") then + if ("$2" != "") then + shift + else + echo "missing argument to '-xrm <resource>' switch" + exit 1 + endif + set cmd = "$cmd -xrm $q$1$q" + else if ("$1" == "-help") then + $XIMTOOL -help + exit 0 + else if ("$1" == "-defgui") then + tail +$SKIP $0 + exit 0 + else if ("$1" == "-displayMagnifier") then + if ("$2" != "") then + shift + else + echo "missing argument to '-displayMagnifier <bool>' switch" + exit 1 + endif + set cmd = "$cmd -xrm $q XImtool.displayMagnifier:$1$q" + else if ("$1" == "-showToolBar") then + if ("$2" != "") then + shift + else + echo "missing argument to '-showToolBar <bool>' switch" + exit 1 + endif + set cmd = "$cmd -xrm $q XImtool.showToolBar:$1$q" + else if ("$1" == "-showPanelBar") then + if ("$2" != "") then + shift + else + echo "missing argument to '-showPanelBar <bool>' switch" + exit 1 + endif + set cmd = "$cmd -xrm $q XImtool.showPanelBar:$1$q" + else + set cmd = "$cmd $1" + endif + + if ("$2" == "") then + break + else + shift + endif + end +endif + +# Run the command. +echo "$XIMTOOL $cmd ; /bin/rm -f /tmp/_gui*.$$" > /tmp/_gui.cmds.$$ +sh /tmp/_gui.cmds.$$ + +cleanup: + /bin/rm -f /tmp/_gui*.$$ + exit 0 + +#-------------------------------------------------------------------------- +#-------------------------- XIMTOOL-ALT.GUI ------------------------------- +#------ ------ +#------ To change the GUI run by this script just delete everything ------ +#------ below here and replace with the new GUI Tcl script. ------ +#------ ------ +#-------------------------------------------------------------------------- +#-------------------------------------------------------------------------- + +#!/usr/local/bin/obmsh +# +# XIMTOOL-MAG.GUI -- Default GUI for the Ximtool-mag image display server. +# +# Version 1.2 -- Released 4/30/2000 + + +reset-server +appInitialize ximtool XImtool { + *objects:\ + toplevel Layout display \ + display Layout menubar \ + menubar MenuButton fileButton \ + menubar MenuButton viewButton \ + menubar MenuButton optionsButton \ + menubar TextBox imageTitle \ + menubar Toggle panelButton \ + menubar Toggle xflipButton \ + menubar Toggle yflipButton \ + menubar Command prevButton \ + menubar MenuButton frameButton \ + menubar Command nextButton \ + menubar Toggle helpButton \ + display Gterm imagewin \ + display Gterm colorbar \ +\ + toplevel TopLevelShell info \ + info Paned infoPanel \ + infoPanel Box infoBox \ + infoBox Command infoDone \ + infoBox Command infoDown \ + infoBox Command infoUp \ + infoBox Command infoSave \ + infoBox Command infoUpdate \ + infoBox Command infoClear \ + infoPanel AsciiText infoText \ +\ + toplevel TopLevelShell controlShell \ + controlShell Layout controlPanel \ + controlPanel Group viewBox \ + controlPanel Group enhancementBox \ + controlPanel Group blinkBox \ + controlPanel Group optionsBox \ + controlPanel Frame controlBox \ +\ + viewBox Layout view \ + view Group frameSelect \ + frameSelect Layout frameBox \ + frameBox TextToggle frame1 \ + frameBox TextToggle frame2 \ + frameBox TextToggle frame3 \ + frameBox TextToggle frame4 \ + frameBox Command prevFrame \ + frameBox Command nextFrame \ + view Frame frameDataBox \ + frameDataBox TextBox frameData \ + view Group zoomBox \ + zoomBox Layout zoom \ + zoom TextButton toggleZoom \ + zoom TextButton zoomIn \ + zoom Command x1 \ + zoom Command z2 \ + zoom Command z3 \ + zoom Command z4 \ + zoom Command z5 \ + zoom Command z8 \ + zoom TextButton zoomOut \ + zoom TextButton centerFrame \ + zoom Command d2 \ + zoom Command d3 \ + zoom Command d4 \ + zoom Command d5 \ + zoom Command d8 \ + view Layout viewButtons \ + viewButtons Command aspect \ + viewButtons Command flipX \ + viewButtons Command flipY \ + viewButtons Command flipXY \ + viewButtons Command clearFrame \ + viewButtons Command fitFrame \ +\ + enhancementBox Layout enhance \ + enhance Scrollbar2 colorlistScroll \ + enhance Frame colorlistFrame \ + colorlistFrame Porthole colorlistPort \ + colorlistPort MultiList colorlist \ + enhance Frame colordataFrame \ + colordataFrame TextBox colordata \ + enhance Label contrastLabel \ + enhance Slider2d contrastSlider \ + enhance Label brightnessLabel \ + enhance Slider2d brightnessSlider \ + enhance Command invertButton \ + enhance Command optimizeButton \ +\ + blinkBox Layout blink \ + blink Label blinkFramesLabel \ + blink Command blinkFrame1 \ + blink Command blinkFrame2 \ + blink Command blinkFrame3 \ + blink Command blinkFrame4 \ + blink Command blinkReset \ + blink Label blinkRateLabel \ + blink Frame BRframe \ + BRframe Layout BRlayout \ + BRlayout Arrow BRdecrease \ + BRlayout TextBox BRtext \ + BRlayout Arrow BRincrease \ + blink Command registerButton \ + blink Command matchButton \ + blink Toggle blinkButton \ +\ + optionsBox TextToggle pannerButton \ + optionsBox TextToggle magnifierButton \ + optionsBox TextToggle coordsBoxButton \ + optionsBox TextToggle autoscaleButton \ + optionsBox TextToggle antialiasButton \ + optionsBox TextToggle tileFramesButton \ + optionsBox TextToggle warningsButton \ +\ + controlBox Layout control \ + control Command initializeButton \ + control Command normalizeButton \ + control Command doneButton \ +\ + toplevel TopLevelShell tclShell\ + tclShell Paned tclPanel\ + tclPanel Box tclForm\ + tclForm Label tclLabel\ + tclForm Command tclClear\ + tclForm Command tclExecute\ + tclForm Command tclcloseButton\ + tclPanel AsciiText tclEntry\ +\ + toplevel TransientShell warning \ + warning Layout warn \ + warn Frame warnFrame \ + warnFrame Layout WFlayout \ + WFlayout Icon warnIcon \ + WFlayout TextBox warnText \ + warn TextButton warnOk \ + warn TextButton warnCancel \ + warn TextButton warnHelp \ +\ + toplevel TopLevelShell print_panel\ + print_panel Layout printLayout\ +\ + printLayout Group printCmdGroup\ + printLayout Group optGroup\ + printLayout Group cmdGroup\ +\ + printCmdGroup Layout printCmdLayout\ + printCmdLayout Layout labelLayout\ + labelLayout Label toLabel\ + labelLayout Label printerLabel\ + printCmdLayout Layout inputLayout\ + inputLayout TextToggle toPrinter\ + inputLayout TextToggle toFile\ + inputLayout Frame printcmdFrame\ + printcmdFrame AsciiText printcmd\ +\ + optGroup Layout optLayout\ + optLayout Group epsPageGroup\ + optLayout Group optionsGroup\ + optLayout Group printColorGroup\ + optLayout Group printerGroup\ +\ + epsPageGroup Layout epsPage\ + epsPage Label epsOrientLabel\ + epsPage TextToggle epsPortButton\ + epsPage TextToggle epsLandButton\ + epsPage Label epsSizeLabel\ + epsPage TextToggle epsLetterButton\ + epsPage TextToggle epsLegalButton\ + epsPage TextToggle epsA4Button\ + epsPage Label epsScaleLabel\ + epsPage Frame ScaleFrame \ + ScaleFrame Layout ScaleLayout \ + ScaleLayout Arrow SCdecrease \ + ScaleLayout TextBox SCtext \ + ScaleLayout Arrow SCincrease \ +\ + optionsGroup Layout options\ + options TextToggle epsscaleButton\ + options TextToggle autorotateButton\ + options TextToggle aspectButton\ + options TextToggle annotateButton\ + options TextToggle compressButton\ +\ + printColorGroup Layout printColor\ + printColor TextToggle prGrayButton\ + printColor TextToggle prPseudoButton\ + printColor TextToggle prRGBButton\ +\ + printerGroup Layout printers \ + printers Scrollbar2 printlistScroll \ + printers Frame printlistFrame \ + printlistFrame Porthole printlistPort \ + printlistPort MultiList printlist \ +\ + cmdGroup Layout cmdLayout\ + cmdLayout TextButton okayPrint\ + cmdLayout Label printStatus\ + cmdLayout TextButton donePrint\ +\ + toplevel TopLevelShell save_panel\ + save_panel Layout saveLayout\ +\ + saveLayout Group saveNameGroup\ + saveLayout Group saveOptGroup\ + saveLayout Group saveCmdGroup\ +\ + saveNameGroup Layout saveNameLayout\ + saveNameLayout Label saveLabel\ + saveNameLayout Frame fnameFrame\ + fnameFrame AsciiText saveFile\ +\ + saveOptGroup Layout saveOptLayout\ + saveOptLayout Group fmtGroup\ + saveOptLayout Group saveColorGroup\ + saveOptLayout Frame saveDataBox \ + saveDataBox TextBox saveData \ +\ + fmtGroup Layout formats\ + formats TextToggle rasButton\ + formats TextToggle gifButton\ + formats TextToggle jpegButton\ + formats TextToggle tiffButton\ + formats TextToggle fitsButton\ + formats TextToggle x11Button\ + formats TextToggle pnmButton\ + formats TextToggle rawButton\ +\ + saveColorGroup Layout saveColor\ + saveColor TextToggle svGrayButton\ + saveColor TextToggle svPseudoButton\ + saveColor TextToggle svRGBButton\ +\ + saveCmdGroup Layout saveCmdLayout\ + saveCmdLayout TextButton okaySave\ + saveCmdLayout Label saveStatus\ + saveCmdLayout TextButton doneSave\ +\ + toplevel TopLevelShell load_panel \ + load_panel Layout filesLayout \ + filesLayout Group imagesGroup \ + imagesGroup Layout imagesLayout \ + imagesLayout Label imtemplateLabel \ + imagesLayout Frame imtemplateFrame \ + imtemplateFrame AsciiText imtemplateText \ + imagesLayout Scrollbar2 imlistScrollbar \ + imagesLayout Frame imlistFrame \ + imlistFrame Porthole imlistPorthole \ + imlistPorthole MultiList imageList \ + imagesLayout TextButton rootButton \ + imagesLayout TextButton homeButton \ + imagesLayout TextButton upButton \ + imagesLayout TextButton rescanButton \ + imagesLayout TextToggle grayToggle \ + imagesLayout TextToggle browseToggle \ + imagesLayout Label dirLabel \ + imagesLayout Label fnameLabel \ + imagesLayout Frame filnamFrame \ + imagesLayout Label frameLabel \ + imagesLayout Command frameFrame \ + filnamFrame AsciiText fnameText \ +\ + filesLayout Group fbuttonsGroup \ + fbuttonsGroup Layout fbuttonsLayout \ + fbuttonsLayout Command filesLoadButton \ + fbuttonsLayout Label filesStatus \ + fbuttonsLayout Command filesCloseButton \ +\ + toplevel TopLevelShell help_panel \ + help_panel Layout helpLayout \ + helpLayout Layout helpMenuLayout \ + helpLayout Layout helpInfoLayout \ +\ + helpMenuLayout Command helpBack \ + helpMenuLayout Command helpForward \ + helpMenuLayout Command helpHome \ + helpMenuLayout Command helpClose \ +\ + helpLayout Frame helpTextFrame\ + helpTextFrame HTML helpText \ +\ + helpInfoLayout Label helpIRAFLogo \ + helpInfoLayout Label helpInfo1 \ + helpInfoLayout Label helpInfo2 \ + helpInfoLayout Label helpInfo3 \ + helpInfoLayout Label helpNOAOLogo \ +\ + toplevel Parameter ximtool\ + ximtool Parameter alert\ + ximtool Parameter initialize\ + ximtool Parameter resize\ + ximtool Parameter frame\ + ximtool Parameter nframes\ + ximtool Parameter frameSize\ + ximtool Parameter frameRegion\ + ximtool Parameter frameView\ + ximtool Parameter frameTitle\ + ximtool Parameter frameFit\ + ximtool Parameter enhancement\ + ximtool Parameter colortables\ + ximtool Parameter autoscale\ + ximtool Parameter antialias\ + ximtool Parameter tileFrames\ + ximtool Parameter cursorMode\ + ximtool Parameter xflip\ + ximtool Parameter yflip\ + ximtool Parameter printerList\ + ximtool Parameter printOptions\ + ximtool Parameter loadOptions\ + ximtool Parameter saveOptions\ + ximtool Parameter filelist\ + ximtool Parameter help + + + ! Main image window resources. + ! ------------------------------- + *allowShellResize: True + *beNiceToColormap: False + *menuLabel.foreground: Gold + *markerMenu.foreground: Black + *markerMenu.background: SteelBlue + *markerMenu*SimpleMenu.foreground: Black + *markerMenu*SimpleMenu.background: SteelBlue + *markerColor.SmeBSB.leftMargin: 64 + *markerColor.SmeBSB.rightMargin: 0 + *markerColor.menuLabel.leftMargin: 5 + *markerColor.menuLabel.rightMargin: 5 + + *display.background: gray + *display.borderWidth: 0 + + *display.debug: False + *display.layout: horizontal { \ + -1 \ + vertical { \ + 3 \ + menubar < +inf -inf * > \ + 3 \ + imagewin < +inf -inf * +inf - inf > \ + 3 \ + colorbar < +inf -inf * > \ + } \ + -1 \ + } + + *menubar.layout: horizontal { \ + 1 < -1 > \ + fileButton 1 < -1 > viewButton 1 < -1 > optionsButton \ + 1 < -1 > \ + imageTitle < +inff -inff * > \ + 1 < -1 > \ + panelButton 1 < -1 > \ + 1 < -1 > \ + xflipButton 1 < -1 > yflipButton \ + 1 < -1 > \ + prevButton 1 < -1 > frameButton 1 < -1 > nextButton \ + 1 < -1 > \ + helpButton \ + 1 < -1 > \ + } + + *menubar*SimpleMenu.foreground: Black + *menubar*SimpleMenu.background: gray65 + *menubar*SimpleMenu.borderColor: Black + *menubar*SimpleMenu.borderWidth: 1 + *SmeBSB.vertSpace: 10 + + *SimpleMenu*font: -adobe-times-bold-r-normal-*-12-*-*-*-*-*-iso8859-1 + *fileButton.font: -adobe-times-bold-i-normal-*-12-*-*-*-*-*-iso8859-1 + *optionsButton.font: -adobe-times-bold-i-normal-*-12-*-*-*-*-*-iso8859-1 + *viewButton.font: -adobe-times-bold-i-normal-*-12-*-*-*-*-*-iso8859-1 + + *menubar.width: 512 + *menubar*background: gray + *menubar*foreground: black + *menubar*borderWidth: 0 + *menubar*Command.label: x + *menubar*Command.internalWidth: 0 + *menubar*Command.borderWidth: 0 + *menubar*Toggle.label: x + *menubar*Toggle.internalWidth: 0 + *menubar*Toggle.borderWidth: 0 + + *fileButton.label: File + *fileButton.menuName: fileMenu + *viewButton.label: View + *viewButton.menuName: viewMenu + *optionsButton.label: Options + *optionsButton.menuName: optionsMenu + *imageTitle*font: *times-bold-r*12* + *imageTitle.width: 40 + *imageTitle.height: 20 + *frameButton.menuName: frameMenu + *frameButton.label: 1 + *frameButton.width: 20 + + *Gterm.cmapName: image + *Gterm.basePixel: 64 + *imagewin.warpCursor: true + *imagewin.raiseWindow: true + *imagewin.deiconifyWindow: true + *imagewin.ginmodeCursor: circle + *imagewin.ginmodeBlinkInterval: 500 + *imagewin.resizable: true + *imagewin.copyOnResize: false + *imagewin.width: 512 + *imagewin.height: 512 + *imagewin.color8: #7c8498 + *imagewin.color9: steelblue + + *imagewin.translations: \ + None<Key>Left: call(move_cursor,-1,0) \n\ + None<Key>Down: call(move_cursor,0,1) \n\ + None<Key>Up: call(move_cursor,0,-1) \n\ + None<Key>Right: call(move_cursor,1,0) \n\ + !Shift <Key>Left: call(move_cursor,-10,0) \n\ + !Shift <Key>Down: call(move_cursor,0,10) \n\ + !Shift <Key>Up: call(move_cursor,0,-10) \n\ + !Shift <Key>Right: call(move_cursor,10,0) \n\ + !Ctrl <Key>h: call(move_cursor,-1,0) \n\ + !Ctrl <Key>j: call(move_cursor,0,1) \n\ + !Ctrl <Key>k: call(move_cursor,0,-1) \n\ + !Ctrl <Key>l: call(move_cursor,1,0) \n\ + !Ctrl Shift <Key>h: call(move_cursor,-10,0) \n\ + !Ctrl Shift <Key>j: call(move_cursor,0,10) \n\ + !Ctrl Shift <Key>k: call(move_cursor,0,-10) \n\ + !Ctrl Shift <Key>l: call(move_cursor,10,0) \n\ + !Alt <Key>1: call(cpSetFrame,frame1) \n\ + !Alt <Key>2: call(cpSetFrame,frame2) \n\ + !Alt <Key>3: call(cpSetFrame,frame3) \n\ + !Alt <Key>4: call(cpSetFrame,frame4) \n\ + !Ctrl <Key>1: call(cpZoom,1,1,fixed) \n\ + !Ctrl <Key>2: call(cpZoom,2,2,fixed) \n\ + !Ctrl <Key>3: call(cpZoom,3,3,fixed) \n\ + !Ctrl <Key>4: call(cpZoom,4,4,fixed) \n\ + !Ctrl <Key>5: call(cpZoom,5,5,fixed) \n\ + !Ctrl <Key>6: call(cpZoom,6,6,fixed) \n\ + !Ctrl <Key>7: call(cpZoom,7,7,fixed) \n\ + !Ctrl <Key>8: call(cpZoom,8,8,fixed) \n\ + !Ctrl <Key>9: call(cpZoom,9,9,fixed) \n\ + !Ctrl <Key>b: call(prevFrame,$name) \n\ + !Ctrl <Key>c: call(cpZoomAction,centerFrame) \n\ + !Ctrl <Key>f: call(nextFrame,$name) \n\ + !Ctrl <Key>i: call(cpInvert) \n\ + !Ctrl <Key>n: call(normalize) \n\ + !Ctrl <Key>m: call(toggleMagnifier) \n\ + !Ctrl <Key>p: call(togglePanner) \n\ + !Ctrl Alt <Key>q: call(Quit) \n\ + !Ctrl <Key>r: call(cpRegisterFrames) \n\ + !Ctrl <Key>s: call(cpMatchFrames) \n\ + !Ctrl <Key>t: call(tileFramesToggle) \n\ + !Ctrl <Key>u: call(cpZoom,1,1,fixed) \n\ + !Ctrl <Key>x: call(cpFrameAction,flipX) \n\ + !Ctrl <Key>y: call(cpFrameAction,flipY) \n\ + !Ctrl Alt <Key>=: call(Print) \n\ + Ctrl <Key>+: call(cpZoom,2.0,2.0,relative) \n\ + Ctrl <Key>-: call(cpZoom,0.5,0.5,relative) \n\ + Ctrl <Key>\<: call(cpSetBlinkRate,BRdecrease) \n\ + Ctrl <Key>\>: call(cpSetBlinkRate,BRincrease) \n\ + !Alt <Key>b: call(toggleBlink) \n\ + !Alt <Key>c: call(panel) \n\ + !Ctrl Alt <Key>f: call(fitFrame) \n\ + !Alt <Key>h: call(Help) \n\ + !Alt <Key>i: call(infoPanel) \n\ + !Alt <Key>l: call(loadPanel) \n\ + !Alt <Key>p: call(printPanel) \n\ + !Alt <Key>s: call(savePanel) \n\ + !Alt <Key>t: call(tclPanel) \n\ + !Shift<Btn1Down>: call(setDynamicMagnifier,1) \n\ + !Shift<Btn1Up>: call(setDynamicMagnifier,0) \n\ + !<Btn1Down>: call(makeMarker,$name,$x,$y) m_create() \n\ + !Shift <Btn2Down>: crosshair(on) \n\ + !Shift <Btn2Motion>: crosshair(on) \n\ + !Shift<Btn2Up>: crosshair(off) \n\ + !<Btn2Up>: crosshair(off) \n\ + !<Btn2Down>: call(zoom,$x,$y) \n\ + !<Btn3Down>: call(windowColormap,$x,$y) \n\ + !<Btn3Motion>: call(windowColormap,$x,$y) \n\ + <EnterWindow>: enter-window() \n\ + <LeaveWindow>: leave-window() \n\ + <KeyPress>: graphics-input() \n\ + <Motion>: track-cursor() call(wcsUpdate,$x,$y) call(magnifierMapImage,$x,$y) + +! The following translations can be used to enable windowing of the +! individual RGB components of the colormap. It's not very useful but +! included here for those that may wish to use it. +!-------------------------------------------------------------------------- +! !Ctrl <Btn1Down>: call(windowRGB,1,$x,$y,0) \n\ +! !Ctrl <Btn1Motion>: call(windowRGB,1,$x,$y,0) \n\ +! !Ctrl <Btn1Up>: call(windowRGB,1,$x,$y,1) \n\ +! !Ctrl <Btn2Down>: call(windowRGB,2,$x,$y,0) \n\ +! !Ctrl <Btn2Motion>: call(windowRGB,2,$x,$y,0) \n\ +! !Ctrl <Btn2Up>: call(windowRGB,2,$x,$y,1) \n\ +! !Ctrl <Btn3Down>: call(windowRGB,3,$x,$y,0) \n\ +! !Ctrl <Btn3Motion>: call(windowRGB,3,$x,$y,0) \n\ +! !Ctrl <Btn3Up>: call(windowRGB,3,$x,$y,1) \n\ + + *colorbar.maxRasters: 1 + *colorbar.maxMappings: 1 + *colorbar.width: 512 + *colorbar.height: 10 + + ! INFO box resources. + ! ------------------------------ + *info.geometry: 420x240 + *info.title: Information Panel + *info*Command.font: 7x13bold + *infoPanel*background: gray + *infoDone.label: Done + *infoDown.label: Down + *infoDown.sensitive: False + *infoUp.label: Up + *infoUp.sensitive: False + *infoSave.label: Save + *infoSave.sensitive: False + *infoUpdate.label: Update + *infoClear.label: Clear + *infoText*scrollVertical: always + *infoText*scrollHorizontal: whenNeeded + *infoText*displayCaret: False + *infoText*editType: append + *info*ScrollbarBackground: #c0c0c0 + *info*Scrollbar*background: #c0c0c0 + *info*Scrollbar*width: 17 + *info*Scrollbar*height: 17 + *info*Scrollbar*shadowWidth: 2 + *info*Scrollbar*cursorName: top_left_arrow + *info*Scrollbar*pushThumb: true + + + ! Main Control Panel. + ! ------------------------------ + *controlShell.title: XImtool Control + *controlShell.iconName: XimCon + *controlPanel*background: gray + *controlPanel*foreground: black + *controlPanel*TextBox.background: gray63 + *controlPanel*internalWidth: 0 + *controlPanel*borderWidth: 0 + *controlPanel*Command.highlightThickness: 0 + + *TextBox.font: 7x13bold + *TextToggle.font: -adobe-times-medium-r-normal-*-12-*-*-*-*-*-iso8859-1 + *Command.font: -adobe-times-medium-r-normal-*-12-*-*-*-*-*-iso8859-1 + *Toggle.font: -adobe-times-medium-r-normal-*-12-*-*-*-*-*-iso8859-1 + *Label.font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *MultiList.font: -adobe-times-medium-r-normal-*-12-*-*-*-*-*-iso8859-1 + *toggleZoom.font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *centerFrame.font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *zoom*Command.font: 7x13bold + *blinkFrame1.font: 7x13bold + *blinkFrame2.font: 7x13bold + *blinkFrame3.font: 7x13bold + *blinkFrame4.font: 7x13bold + + *controlPanel.debug: False + *controlPanel.layout: vertical { \ + 5 < -5 > \ + horizontal { \ + -1 \ + viewBox < +inf -inf * > \ + -1 \ + } \ + 5 < -5 > \ + horizontal { \ + -1 \ + enhancementBox < +inf -inf * +inf -inf > \ + -1 \ + vertical { \ + -1 \ + blinkBox < * +inf - inf > \ + 1 \ + optionsBox < * +inff -inff > \ + -1 \ + } \ + -1 \ + } \ + controlBox < +inf * > \ + } + + ! VIEW + ! ------------------ + *viewBox.label: View + *viewBox.location: 0 0 410 0 + *viewBox.shrinkToFit: True + *viewBox.outerOffset: 5 + + *view.debug: False + *view.layout: vertical { \ + 5 < +inf -5 > \ + horizontal { \ + -1 \ + frameSelect \ + -1 \ + vertical { \ + 5 < -5 > \ + frameDataBox < +inff -100% * +inff -100% > \ + 5 < -5 > \ + } \ + -1 \ + zoomBox \ + -1 \ + } \ + 1 < +inf > \ + viewButtons < +inf -inf * +inf -inf > \ + 5 < +inf -5 > \ + } + + *frameDataBox.frameType: sunken + *frameDataBox.frameWidth: 2 + *frameData.width: 130 + *frameData.height: 50 + + *frameSelect.location: 0 0 72 0 + *frameSelect.shrinkToFit: True + *frameSelect.outerOffset: 5 + *frameSelect.innerOffset: 5 + *frameSelect.frameWidth: 2 + *frameSelect*offIcon: diamond0s + *frameSelect*onIcon: diamond1s + *frameSelect*highlightColor: blue + *frameSelect.label: Frame: + + *frameBox.debug: False + *frameBox.layout: vertical { \ + frame1 < +inf * > \ + frame2 < +inf * > \ + frame3 < +inf * > \ + frame4 < +inf * > \ + 10 < +inf -10 > \ + horizontal { \ + -1 \ + prevFrame \ + 10 < +inf -5 > \ + nextFrame \ + -1 \ + } \ + -1 \ + } + + *frameBox*location: 0 0 10 20 + *frameBox*alignment: left + *frameBox*frameWidth: 0 + *frameBox*highlightThickness: 0 + *frameBox*frame1.label: \ 1\ \ + *frameBox*frame2.label: \ 2\ \ + *frameBox*frame3.label: \ 3\ \ + *frameBox*frame4.label: \ 4\ \ + *frameBox*Command.width: 24 + *frameBox*prevFrame.label: xx + *frameBox*nextFrame.label: xx + + *zoomBox.label: Zoom: + *zoomBox.location: 0 0 160 127 + *zoomBox.outerOffset: 5 + *zoomBox.shrinkToFit: True + + *zoom.debug: False + *controlPanel*zoom*internalWidth: 4 + *zoom.layout: vertical { \ + space = ((50% of width zoom) - (50% of width z5)) \ + 1 < +inf > \ + horizontal { \ + vertical { \ + toggleZoom < +inf * +inf > \ + 2 \ + } \ + 2 \ + vertical { \ + 2 < +inf > \ + z5 \ + 1 < +inf > \ + z3 \ + 0 < +inf > \ + } \ + 2 \ + vertical { \ + zoomIn < +inf * +inf > \ + 2 \ + } \ + } \ + 1 < +inf > \ + horizontal { \ + 2 < +inf > \ + d8 d4 d2 x1 z2 z4 z8 \ + 2 < +inf > \ + } \ + 1 < +inf > \ + horizontal { \ + vertical { \ + 2 \ + zoomOut < +inf * +inf > \ + } \ + 2 \ + vertical { \ + 0 < +inf > \ + d3 \ + 1 < +inf > \ + d5 \ + 2 < +inf > \ + } \ + 2 \ + vertical { \ + 2 \ + centerFrame < +inf * +inf > \ + } \ + } \ + 1 < +inf > \ + } + + *toggleZoom.label: Toggle\nZoom + *toggleZoom.outerOffset: 0 + *toggleZoom.width: 30 + *toggleZoom.height: 25 + + *zoomIn.label: Zoom\nIn + *zoomIn.outerOffset: 0 + *zoomIn.width: 30 + *zoomIn.height: 25 + + *x1.label: 1 + *z2.label: 2 + *z3.label: 3 + *z4.label: 4 + *z5.label: 5 + *z8.label: 8 + + *controlPanel*zoomIn.foreground: royalBlue3 + *controlPanel*z4.foreground: royalBlue3 + *controlPanel*z5.foreground: royalBlue3 + *controlPanel*z8.foreground: royalBlue3 + *controlPanel*z2.foreground: royalBlue3 + *controlPanel*z3.foreground: royalBlue3 + + *zoomOut.label: Zoom\nOut + *zoomOut.outerOffset: 0 + *zoomOut.width: 30 + *zoomOut.height: 25 + + *centerFrame.label: Center + *centerFrame.outerOffset: 0 + *centerFrame.width: 30 + *centerFrame.height: 25 + + *d2.label: 2 + *d3.label: 3 + *d4.label: 4 + *d5.label: 5 + *d8.label: 8 + + *controlPanel*zoomOut.foreground: mediumVioletRed + *controlPanel*d2.foreground: mediumVioletRed + *controlPanel*d3.foreground: mediumVioletRed + *controlPanel*d4.foreground: mediumVioletRed + *controlPanel*d5.foreground: mediumVioletRed + *controlPanel*d8.foreground: mediumVioletRed + + *viewButtons.location: 0 0 100 80 + *viewButtons.debug: False + *viewButtons.layout: horizontal { \ + 5 < -2 > \ + aspect < +inf * > \ + 5 < -2 > \ + flipX < +inf * > \ + 5 < -2 > \ + flipY < +inf * > \ + 5 < -2 > \ + flipXY < +inf * > \ + 5 < -2 > \ + clearFrame < +inf * > \ + 5 < -2 > \ + fitFrame < +inf * > \ + 5 < -2 > \ + } + + *nextFrame.label: Next Frame + *prevFrame.label: Previous Frame + *fitFrame.label: Fit Frame + *aspect.label: Aspect + *clearFrame.label: Clear Frame + *flipX.label: Flip X + *flipY.label: Flip Y + *flipXY.label: Flip XY + + + ! ENHANCEMENT + ! ------------------ + *enhancementBox.label: Enhancement + *enhancementBox.location: 0 0 110 0 + *enhancementBox.shrinkToFit: True + *enhancementBox.outerOffset: 5 + + *enhance.debug: False + *enhance.layout: vertical { \ + 3 < -3 > \ + horizontal { \ + 2 < -2 > \ + colorlistScroll < * +inff -inff > \ + -1 \ + colorlistFrame < +inf -inf * +inff -inff > \ + 2 < -2 > \ + } \ + -1 \ + horizontal { \ + 2 < -2 > \ + colordataFrame < +inf -inf * +inf -inf > \ + 2 < -2 > \ + } \ + 5 < -5 > \ + horizontal { \ + 2 < -2 > \ + vertical { \ + -1 \ + contrastLabel \ + 3 < -3 > \ + brightnessLabel \ + -1 \ + } \ + 3 < -3 > \ + vertical { \ + -1 \ + contrastSlider < +inf -inf * > \ + 3 < -3 > \ + brightnessSlider < +inf -inf * > \ + -1 \ + } \ + 2 < -2 > \ + } \ + 5 < -5 > \ + horizontal { \ + 3 < -3 > \ + invertButton < +inf -inf * > \ + 5 < -5 > \ + optimizeButton < +inf -inf * > \ + 3 < -3 > \ + } \ + 3 < -3 > \ + } + + *enhance*FrameType: sunken + *enhance*FrameWidth: 2 + *enhance*BorderWidth: 0 + *enhance*Label.ShadowWidth: 0 + *enhance*thumbColor: gray + + *colorlistScroll.location: 0 0 20 10 + *colorlistScroll.vertical: True + *colorlistScroll*minsize: 10 + *colorlist.width: 100 + *colorlist.height: 78 + *colordata.width: 100 + *colordata.height: 45 + *enhance*colordata.frameWidth: 0 + *contrastLabel.label: x + *contrastSlider.location: 0 0 100 20 + *brightnessLabel.label: x + *brightnessSlider.location: 0 0 100 20 + *invertButton.label: Invert + *optimizeButton.label: Optimize + + ! BLINK + ! --------------------- + *blinkBox.label: Blink + *blinkBox.location: 0 0 230 0 + *blinkBox.shrinkToFit: True + *blinkBox.outerOffset: 5 + + + *blink.debug: False + *blink.layout: vertical { \ + space = (width blinkFramesLabel - width blinkRateLabel) \ + 3 < -3 > \ + horizontal { \ + 0 \ + blinkFramesLabel \ + 3 < +inf > \ + blinkFrame1 < -50% * > \ + blinkFrame2 < -50% * > \ + blinkFrame3 < -50% * > \ + blinkFrame4 < -50% * > \ + 4 < +inf > \ + blinkReset \ + 2 \ + } \ + 5 < -5 > \ + horizontal { \ + $space \ + blinkRateLabel \ + 2 \ + BRframe < +inf * > \ + } \ + 5 < +inf -100% > \ + horizontal { \ + 3 \ + registerButton < +inf * > \ + 5 < -5 > \ + matchButton < +inf * > \ + 5 < -5 > \ + blinkButton < +inf * > \ + 2 \ + } \ + 3 < -3 > \ + } + + *BRlayout.layout: horizontal { \ + BRdecrease \ + BRtext < +inf -100% * > \ + BRincrease \ + } + + *blink.Label.borderWidth: 0 + *blink.Label.shadowWidth: 0 + *controlPanel*blink*internalWidth: 4 + *controlPanel*blink*Arrow.foreground: gray + *controlPanel*blink*Arrow.background: gray63 + *blink*Arrow.width: 16 + *blink*Arrow.height: 25 + + *blinkFramesLabel.label: Blink Frames: + *blinkFrame1.label: 1 + *blinkFrame2.label: 2 + *blinkFrame3.label: 3 + *blinkFrame4.label: 4 + *blinkReset.label: Reset + + *blinkRateLabel.label: Blink Rate: + *BRframe.frameType: sunken + *BRframe.frameWidth: 2 + *BRtext.width: 40 + *BRtext.height: 25 + *BRdecrease.direction: left + *BRincrease.direction: right + *registerButton.label: Register + *matchButton.label: Match LUTs + *blinkButton.label: Blink + + ! OPTIONS + ! --------------------- + *optionsBox.label: Options + *optionsBox.location: 0 0 220 0 + *optionsBox.shrinkToFit: False + *optionsBox.outerOffset: 5 + *optionsBox*offIcon: square0s + *optionsBox*onIcon: square1s + *optionsBox*selectionStyle: multi + *optionsBox*highlightColor: yellow + *optionsBox.TextToggle.location: 0 0 102 25 + *optionsBox.TextToggle.frameWidth: 0 + *optionsBox*alignment: left + + *pannerButton.label: Panner + *magnifierButton.label: Magnifier + *coordsBoxButton.label: Coords Box + *autoscaleButton.label: Autoscale + *antialiasButton.label: Antialias + *tileFramesButton.label: Tile Frames + *warningsButton.label: Warnings + + + ! CONTROL + ! ---------------------- + *controlBox.frameType: chiseled + *controlBox.frameWidth: 2 + *controlBox.outerOffset: 5 + *controlBox.innerOffset: 5 + *controlBox.height: 30 + + *control.debug: False + *control.layout: horizontal { \ + 1 \ + initializeButton < +inf * > \ + 5 < -5 > \ + normalizeButton < +inf * > \ + 80 < +inf -100% > \ + doneButton < +inf * > \ + 1 \ + } + + *initializeButton.label: Initialize + *normalizeButton.label: Normalize + *doneButton.label: Done + + ! WARNING dialog. + ! --------------------- + *warning.geometry: +400+300 + *warning*background: gray + *warning*borderWidth: 0 + *warning*TextBox.frameWidth: 0 + *warning*TextButton.frameWidth: 2 + *warning*TextButton.width: 40 + *warning*TextButton.height: 25 + + *warn.layout: vertical { \ + 5 < -5 > \ + horizontal { \ + 5 < -5 > \ + warnFrame < +inf * +inf > \ + 5 < -5 > \ + } \ + 1 < -1 > \ + horizontal { \ + 5 < -5 > \ + warnOk < +inf * > \ + 5 < +inf -5 > \ + warnCancel < +inf * > \ + 5 < +inf -5 > \ + warnHelp < +inf * > \ + 5 < -5 > \ + } \ + 1 < -1 > \ + } + + *WFlayout.layout: horizontal { \ + 5 < -5 > \ + vertical { \ + 5 < +inf -5 > \ + warnIcon \ + 5 < +inf -5 > \ + } \ + 5 < -5 > \ + warnText < +inf -inf * +inf -inf > \ + 5 < -5 > \ + } + + *warnLabel.label: Warning + *warnLabel.width: 300 + *warnLabel.height: 20 + *warnFrame.frameType: sunken + *warnFrame.frameWidth: 2 + *warnIcon.location: 0 0 40 40 + *warnIcon.image: WARNING + *warnText.label: generic warning text + *warnText.width: 270 + *warnText.height: 60 + *warnOk.label: OK + *warnCancel.label: Cancel + *warnHelp.label: Help + *warnHelp.sensitive: False + + + !===================================== + ! Print Setup Panel resources. ! + !===================================== + *print_panel.title: Printer Setup + *print_panel.highlightThickness: 1 + *print_panel*background: gray + *print_panel*TextBox.background: gray63 + *print_panel*TextBox.foreground: black + *print_panel*TextToggle.alignment: left + *print_panel*Arrow.background: gray63 + *print_panel*Arrow.foreground: gray + *print_panel*Arrow.width: 16 + *print_panel*Arrow.height: 25 + *print_panel*TextToggle.frameWidth: 0 + *print_panel*TextToggle.height: 20 + *print_panel*Label.borderWidth: 0 + *print_panel*Label.shadowWidth: 0 + *print_panel*Label.background: gray + *print_panel*TextButton.width: 40 + *print_panel*TextButton.height: 25 + + *printLayout.borderWidth: 0 + *printLayout.layout: vertical { \ + -1 \ + printCmdGroup < +inf * > \ + -1 \ + optGroup < +inf -inf * +inf -inf > \ + -1 \ + cmdGroup < +inf * > \ + -1\ + } + + + ! Print Group resources. + !---------------------------------- + *printCmdGroup.borderWidth: 0 + *printCmdGroup.outerOffset: 5 + *printCmdGroup.label: + *printCmdGroup.location: 0 0 400 85 + *printCmdGroup*offIcon: diamond0s + *printCmdGroup*onIcon: diamond1s + *printCmdGroup*highlightColor: cyan + *printCmdGroup*Frame.frameType: sunken + *printCmdGroup*Frame.frameWidth: 2 + *printCmdGroup*Frame.width: 300 + *printCmdGroup*Label.justify: right + *printCmdGroup*Text*editType: edit + *printCmdGroup*TextToggle.width: 70 + *printCmdGroup*shadowWidth: 0 + *printCmdGroup*borderWidth: 0 + *printCmdLayout.borderWidth: 0 + *printCmdLayout*Label.font: 7x13bold + *printCmdLayout.layout: horizontal { \ + -1 \ + labelLayout \ + 5 < -5 > \ + inputLayout < +inf -inf * +inf > \ + 2 \ + } + + *labelLayout.borderWidth: 0 + *labelLayout.layout: vertical { \ + 5 \ + toLabel \ + 11 \ + printerLabel \ + -3 \ + } + *printerLabel.label: Print Command: + *toLabel.label: Print To: + *toPrinter.label: Printer + *toPrinter.on: True + *toFile.label: File + + + *inputLayout*Text*font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *inputLayout.borderWidth: 0 + *inputLayout.layout: horizontal { \ + 3 \ + vertical { \ + 5 \ + horizontal { \ + 5 < -5 > \ + toPrinter \ + 5 < -5 > \ + toFile \ + 5 < +inf -inf > \ + } \ + 5 \ + printcmdFrame < +inf -inf * > \ + 5 \ + } \ + 3 \ + } + *printcmd*string: lpr + *printcmd*height: 22 + *printcmd*Text*editType: edit + *printcmd*Text*font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + + ! Main options groups layout resources. + !--------------------------------------- + *optGroup.frameWidth: 2 + *optGroup.frameType: chiseled + *optGroup.label: + *optGroup.location: 0 0 400 265 + *optGroup.outerOffset: 5 + *optGroup.innerOffset: 0 + *optLayout*borderWidth: 0 + *optLayout.layout: horizontal { \ + -1 \ + vertical { \ + 5 < -5 > \ + epsPageGroup < +inf -inf * > \ + 0 < -0 > \ + optionsGroup < +inf -inf * +inf -inf > \ + -1 \ + } \ + 0 < -0 > \ + vertical { \ + 5 < -5 > \ + printColorGroup < +inf -inf * > \ + 0 < -0 > \ + printerGroup < +inf * +inf > \ + -1 \ + } \ + -1 \ + } + + + ! Postscript Options group resources. + ! ----------------------------------- + *epsPageGroup.label: Postscript Options + *epsPageGroup.outerOffset: 5 + *epsPageGroup.innerOffset: 5 + *epsPageGroup.location: 0 0 250 150 + *epsPageGroup*offIcon: diamond0s + *epsPageGroup*onIcon: diamond1s + *epsPageGroup*highlightColor: cyan + *epsPage*Label.justify: left + *epsPage*Label.font: 7x13bold + *epsPage.layout: vertical { \ + -1 \ + epsOrientLabel \ + 4 < -4 > \ + horizontal { \ + 10 \ + epsPortButton \ + epsLandButton \ + -1 \ + } \ + 4 < -4 > \ + epsSizeLabel \ + -1 \ + horizontal { \ + 10 \ + epsLetterButton \ + epsLegalButton \ + epsA4Button \ + -1 \ + } \ + 5 < -5 > \ + horizontal { \ + -1 \ + epsScaleLabel \ + 4 < -4 > \ + ScaleFrame \ + } \ + -1 \ + } + + + ! Page Layout resources. + ! ------------------------------- + *epsOrientLabel.label: Orientation: + *epsPortButton.label: Portrait + *epsPortButton.width: 90 + *epsLandButton.label: Landscape + *epsLandButton.width: 90 + + *epsSizeLabel.label: Paper Size: + *epsLetterButton.label: Letter + *epsLetterButton.width: 75 + *epsLegalButton.label: Legal + *epsLegalButton.width: 75 + *epsA4Button.label: A4 + *epsA4Button.width: 75 + + ! Image scale box resources. + ! ------------------------------- + *epsScaleLabel.label: Image Scale: + *ScaleFrame.frameType: sunken + *ScaleFrame.frameWidth: 2 + *ScaleFrame*shadowWidth: 0 + *ScaleLayout.location: 0 0 100 50 + *ScaleLayout.label: + *ScaleLayout.layout: horizontal { \ + SCdecrease \ + SCtext < +inf -100% * > \ + SCincrease \ + } + *SCdecrease.direction: left + *SCtext.width: 75 + *SCtext.height: 25 + *SCtext.label: 100 % + *SCincrease.direction: right + + + ! Miscellaneous print options box resources. + ! ------------------------------------ + *optionsGroup.outerOffset: 5 + *optionsGroup.innerOffset: 5 + *optionsGroup*onIcon: square1s + *optionsGroup*offIcon: square0s + *optionsGroup.label: Processing Options + *optionsGroup*TextToggle.width: 100 + *optionsGroup*TextToggle.highlightColor: yellow + *options.frameWidth: 2 + *options.location: 0 0 250 75 + *options.layout: horizontal { \ + 10 \ + vertical { \ + -1 \ + epsscaleButton \ + 2 \ + autorotateButton \ + 2 \ + aspectButton \ + -1 \ + } \ + 3 \ + vertical { \ + -1 \ + annotateButton \ + 2 \ + compressButton \ + 25 \ + -1 \ + } \ + -1 \ + } + *epsscaleButton.label: Auto Scale + *autorotateButton.label: Auto Rotate + *annotateButton.label: Annotate + *aspectButton.label: Max Aspect + *compressButton.label: Compress + *compressButton.sensitive: False + +! *epsscaleButton.on: True +! *autorotateButton.on: False +! *spectButton.on: False +! *annotateButton.on: True +! *compressButton.on: False + + + ! Output color box resources. + ! ------------------------------ + *printColorGroup.location: 0 0 150 90 + *printColorGroup.outerOffset: 5 + *printColorGroup.frameWidth: 2 + *printColorGroup*offIcon: diamond0s + *printColorGroup*onIcon: diamond1s + *printColorGroup*highlightColor: cyan + *printColorGroup.innerOffset: 5 + *printColorGroup.label: Output Color + *printColorGroup*TextToggle.width: 100 + *printColor.frameWidth: 2 + *printColor.location: 0 0 250 75 + *printColor.layout: horizontal { \ + 15 \ + vertical { \ + -1 \ + prGrayButton \ + 2 \ + prPseudoButton \ + 2 \ + prRGBButton \ + -1 \ + } \ + -1 \ + } + *prGrayButton.label: Grayscale + *prPseudoButton.label: PseudoColor + *prRGBButton.label: RGB + + ! Printer Selection. + ! -------------------------- + *printerGroup.label: Printers + *printerGroup.location: 0 0 110 100 + *printerGroup.shrinkToFit: True + *printerGroup.outerOffset: 5 + + *printers.debug: False + *printers.layout: vertical { \ + 3 < -3 > \ + horizontal { \ + 2 < -2 > \ + printlistFrame < +inf -inf * +inff -inff > \ + -1 \ + printlistScroll < * +inff -inff > \ + 2 < -2 > \ + } \ + 3 < -3 > \ + } + + *printers*FrameType: sunken + *printers*FrameWidth: 2 + *printers*BorderWidth: 0 + *printers*Label.ShadowWidth: 0 + *printers*thumbColor: gray + + *printlistScroll.location: 0 0 20 10 + *printlistScroll.vertical: True + *printlistScroll*minsize: 10 + *printlist.width: 100 + *printlist.height: 78 + + + ! Panel command resources. + ! ------------------------------ + *cmdGroup.frameType: chiseled + *cmdGroup.frameWidth: 2 + *cmdGroup.outerOffset: 5 + *cmdGroup.innerOffset: 5 + *cmdGroup.label: + *cmdGroup.location: 0 0 150 54 + *cmdGroup*Command.font: 7x13bold + *cmdLayout.borderWidth: 0 + *cmdLayout.layout: horizontal { \ + -1 \ + okayPrint \ + 1 < +inf -1 > \ + printStatus < +inf -inf * +inf -inf > \ + 1 < +inf -1 > \ + donePrint \ + -1 \ + } + *cmdGroup*TextButton*location: 0 0 80 0 + *okayPrint.label: Print + *donePrint.label: Done + + + !===================================== + ! Save Setup Panel resources. ! + !===================================== + *save_panel.title: Save to Disk... + *save_panel*background: gray + *save_panel*TextBox.background: gray63 + *save_panel*TextToggle.alignment: left + *save_panel*AsciiText*background: gray63 + *save_panel*Arrow.background: gray63 + *save_panel*Arrow.foreground: gray + *save_panel*Arrow.width: 16 + *save_panel*Arrow.height: 25 + *save_panel*TextToggle.frameWidth: 0 + *save_panel*TextToggle.height: 20 + *save_panel*Label.borderWidth: 0 + *save_panel*Label.shadowWidth: 0 + *save_panel*TextButton.width: 80 + + + *save_panel*debug: False + *saveLayout.borderWidth: 0 + *saveLayout.layout: vertical { \ + -1 \ + saveNameGroup < +inf * > \ + -1 \ + saveOptGroup < +inf -inf * +inf -inf > \ + -1 \ + saveCmdGroup < +inf * > \ + -1\ + } + + ! Save Name Group resources. + !---------------------------------- + *saveNameGroup.borderWidth: 0 + *saveNameGroup.outerOffset: 5 + *saveNameGroup.label: + *saveNameGroup.location: 0 0 400 60 + *saveNameGroup*offIcon: diamond0s + *saveNameGroup*onIcon: diamond1s + *saveNameGroup*highlightColor: cyan + *saveNameGroup*Frame.frameType: sunken + *saveNameGroup*Frame.frameWidth: 2 + *saveNameGroup*Label.justify: right + *saveNameGroup*Text*editType: edit + *saveNameGroup*Text*font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *saveNameGroup*TextBox*font:-*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *saveNameGroup*shadowWidth: 0 + *saveNameGroup*borderWidth: 0 + *saveNameLayout.borderWidth: 0 + *saveNameLayout*Label.font: 7x13bold + *saveNameLayout.layout: vertical { \ + 5 \ + horizontal { \ + 5 \ + saveLabel \ + 5 \ + fnameFrame < +inf -inf * > \ + 5 \ + } \ + 5 \ + } + *saveLabel.label: File Name: + *saveFile.height: 22 +! *save_panel*saveFile*background: gray63 + + ! Main options groups layout resources. + !--------------------------------------- + *saveOptGroup.frameWidth: 2 + *saveOptGroup.frameType: chiseled + *saveOptGroup.label: + *saveOptGroup.location: 0 0 400 145 + *saveOptGroup.outerOffset: 5 + *saveOptGroup.innerOffset: 0 + *saveOptLayout*borderWidth: 0 + *saveOptLayout.layout: horizontal { \ + -1 \ + vertical { \ + 5 < -5 > \ + fmtGroup < +inf * +inf > \ + -1 \ + } \ + -1 \ + vertical { \ + 10 < -10 > \ + saveDataBox < +inff -100% * +inff -100% > \ + 5 < -5 > \ + } \ + -1 \ + vertical { \ + 5 < -5 > \ + saveColorGroup < +inf * +inf > \ + -1 \ + } \ + -1 \ + } + + ! Output color box resources. + ! ------------------------------ + *saveColorGroup.location: 0 0 125 120 + *saveColorGroup.outerOffset: 5 + *saveColorGroup.frameWidth: 2 + *saveColorGroup*offIcon: diamond0s + *saveColorGroup*onIcon: diamond1s + *saveColorGroup*highlightColor: cyan + *saveColorGroup.innerOffset: 5 + *saveColorGroup.label: Output Color + *saveColorGroup*TextToggle.width: 100 + *saveColor.frameWidth: 2 + *saveColor.layout: horizontal { \ + 3 \ + vertical { \ + 5 \ + svGrayButton \ + 2 \ + svPseudoButton \ + 2 \ + svRGBButton \ + -1 \ + } \ + -1 \ + } + *svGrayButton.label: Grayscale + *svPseudoButton.label: PseudoColor + *svPseudoButton.on: true + *svRGBButton.label: RGB + + *saveDataBox*TextBox.background: gray63 + *saveDataBox.frameType: sunken + *saveDataBox.frameWidth: 2 + + + ! Output format box resources. + ! ----------------------------------- + *fmtGroup.location: 0 0 140 120 + *fmtGroup.outerOffset: 5 + *fmtGroup.frameWidth: 2 + *fmtGroup*offIcon: diamond0s + *fmtGroup*onIcon: diamond1s + *fmtGroup*TextToggle.width: 55 + *fmtGroup*highlightColor: cyan + *fmtGroup.label: File Format + *formats.layout: horizontal { \ + 3 \ + vertical { \ + 7 \ + fitsButton \ + 2 \ + gifButton \ + 2 \ + x11Button \ + 2 \ + rawButton \ + -1 \ + } \ + 2 < -2 > \ + vertical { \ + 7 \ + rasButton \ + 2 \ + tiffButton \ + 2 \ + jpegButton \ + 2 \ + pnmButton \ + -1 \ + } \ + -1 \ + } + *rasButton.label: RAS + *gifButton.label: GIF + *jpegButton.label: JPEG + *tiffButton.label: TIFF + *fitsButton.label: FITS + *x11Button.label: X11 + *pnmButton.label: PNM + *rawButton.label: Raw + + ! Change the sensitivity once these formats are implemented. ! + !------------------------------------------------------------- + *jpegButton.sensitive: false + *x11Button.sensitive: false + *pnmButton.sensitive: false + *rawButton.sensitive: false + + ! Panel command resources. + ! ------------------------------ + *saveCmdLayout.borderWidth: 0 + *saveCmdGroup.frameType: chiseled + *saveCmdGroup.frameWidth: 2 + *saveCmdGroup.outerOffset: 5 + *saveCmdGroup.innerOffset: 5 + *saveCmdGroup.label: + *saveCmdGroup.location: 0 0 400 54 +! *saveCmdLayout*Command.font: 7x13bold + *saveCmdLayout.layout: horizontal { \ + -1 \ + okaySave \ + 1 < +inf -1 > \ + saveStatus \ + 1 < +inf -1 > \ + doneSave \ + -1 \ + } + *okaySave.label: Save + *doneSave.label: Done + + ! File Load Control Panel. + !------------------------------- + *load_panel.geometry: 400x320 + *load_panel.title: File Load Panel + *filesLayout*borderWidth: 0 + *filesLayout*highlightThickness: 0 + *filesLayout*background: gray + *filesLayout*Group.outerOffset: 7 + *filesLayout*Group.shrinkToFit: True + *filesLayout*Group.frameType: chiseled + *filesLayout*Frame*frameType: sunken + *filesLayout*Frame*frameWidth: 2 + *filesLayout*Text*background: gray63 + *filesLayout*Text*font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *filesLayout*TextBox*font: -*-helvetica-medium-r-normal-*-12-*-iso8859-1 + *filesLayout*TextToggle.frameWidth: 0 + *filesLayout*TextToggle.height: 28 + *filesLayout*TextToggle.width: 80 + *filesLayout*TextToggle.alignment: left + *filesLayout*Scrollbar2*background: gray63 + *filesLayout*scrollbarForeground: gray + *filesLayout*Scrollbar2*location: 0 0 20 10 + *filesLayout*Scrollbar2*vertical: True + *filesLayout*Scrollbar2*minsize: 20 + *filesLayout*MultiList*background: gray63 + *filesLayout*MultiList*foreground: black + *filesLayout*MultiList*shadeSurplus: False + *filesLayout*MultiList*width: 120 + *filesLayout*MultiList.font: 7x13bold + *filesLayout*Label.font: 7x13bold + *filesLayout*Label.borderWidth: 0 + *filesLayout*Label.shadowWidth: 0 + *filesLayout.layout: vertical { \ + 5 < +0 -5 > \ + horizontal { \ + 0 < +0 -0 > \ + imagesGroup < +inf -inf * +inf -inf > \ + 0 < +0 -0 > \ + } \ + 0 < +0 -0 > \ + horizontal { \ + 0 < +0 -0 > \ + fbuttonsGroup < +inf -inf * > \ + 0 < +0 -0 > \ + } \ + 0 < +0 -0 > \ + } + + *imagesGroup.label: Images + *imagesGroup.frameWidth: 2 +! *imagesGroup.outerOffset: 5 + *imagesGroup*offIcon: square0s + *imagesGroup*onIcon: square1s + *imagesGroup*highlightColor: yellow + *imagesLayout*Label.shadowWidth: 0 + *imagesLayout*Label.justify: left + *imagesLayout*Command.width: 90 + *imagesLayout*TextButton.width: 90 + *imagesLayout*TextButton.height: 23 + *imagesLayout*TextButton.font: *times*medium*r*normal*-12-* + *imagesLayout.layout: vertical { \ + 7 < +0 -7 > \ + horizontal { \ + 5 \ + rootButton < +inf -inf * > \ + 2 \ + homeButton < +inf -inf * > \ + 2 \ + upButton < +inf -inf * > \ + 2 \ + rescanButton < +inf -inf * > \ + 5 \ + } \ + 7 \ + horizontal { \ + 5 < +0 -5 > \ + vertical { \ + 5 \ + imtemplateLabel < * > \ + 5 \ + imtemplateFrame < +inf -inf * > \ + 10 < +inf -inf > \ + grayToggle < * > \ + 5 \ + browseToggle < * > \ + 5 \ + } \ + 5 \ + horizontal { \ + 5 < +0 -5 > \ + imlistFrame < +inf -inf * +inf -inf > \ + 3 < +0 -3 > \ + imlistScrollbar < * +inf - inf > \ + 0 < +0 -0 > \ + } \ + 5 < +0 -5 > \ + } \ + 5 \ + horizontal { \ + 5 \ + dirLabel < +inf -inf * > \ + 5 \ + } \ + 10 \ + horizontal { \ + 5 < +0 -5 > \ + fnameLabel < * > \ + 5 < +0 -5 > \ + filnamFrame < +inf -inf * > \ + 5 < +0 -5 > \ + frameLabel < * > \ + 5 < +0 -5 > \ + frameFrame < -50% * > \ + 5 < +0 -5 > \ + } \ + 5 < +0 -5 > \ + } + *imtemplateLabel.label: File Pattern: + *imtemplateText*editType: edit + *imtemplateText.height: 20 + *imageList.width: 100 + *upButton.label: Up + *rootButton.label: Root + *homeButton.label: Home + *rescanButton.label: Rescan + *browseToggle.label: Browse + *browseToggle.on: True + *grayToggle.label: Greyscale + *dirLabel.label: Directory: + *dirLabel.alignment: left + *fnameLabel.label: Load File: + *fnameText*editType: edit + *fnameText.height: 20 + *frameLabel.label: Frame: + *frameFrame.label: 1 + + *fbuttonsGroup.label: + *fbuttonsGroup*frameWidth: 2 + *fbuttonsGroup*outerOffset: 5 + *fbuttonsGroup*innerOffset: 5 + *fbuttonsGroup.frameType: sunken + *fbuttonsGroup*Command.font: 7x13bold + *fbuttonsLayout*Command.height: 50 + *fbuttonsLayout*Command.width: 70 + *fbuttonsLayout.layout: horizontal { \ + -1 \ + filesLoadButton \ + 1 < +inf -1 > \ + filesStatus \ + 1 < +inf -1 > \ + filesCloseButton \ + -1 \ + } + + *filesLoadButton.label: Load + *filesStatus.label: + *filesCloseButton.label: Done + + ! Help panel resources. + !---------------------- + *help_panel.title: XImtool Help Summary + *help_panel.width: 450 + *help_panel.height: 525 + *helpLayout*borderWidth: 0 + *helpLayout.background: gray + *helpLayout*Frame*frameType: sunken + *helpLayout*Frame*frameWidth: 2 + *helpLayout*Frame.background: gray + *helpLayout*Layout.background: gray + *helpLayout*ScrollbarBackground: #c0c0c0 + *helpLayout*Scrollbar*background: #c0c0c0 + *helpLayout*Scrollbar*width: 17 + *helpLayout*Scrollbar*height: 17 + *helpLayout*Scrollbar*shadowWidth: 2 + *helpLayout*Scrollbar*cursorName: top_left_arrow + *helpLayout*Scrollbar*pushThumb: true + + + *helpLayout.layout: vertical { \ + -1 \ + horizontal { \ + 0 < +0 -0 > \ + helpMenuLayout < +inf -inf * > \ + 0 < +0 -0 > \ + } \ + 0 < +0 -0 > \ + horizontal { \ + 0 < +0 -0 > \ + helpTextFrame < +inf -inf * +inf -inf > \ + 0 \ + } \ + 0 < +0 -0 > \ + horizontal { \ + 0 < +0 -0 > \ + helpInfoLayout < +inf -inf * > \ + 0 < +0 -0 > \ + } \ + -1 \ + } + *helptext*background: white + *helptext*foreground: black + + *helpMenuLayout*background: gray + *helpMenuLayout*Command.highlightThickness: 2 + *helpMenuLayout*Command.internalHeight: 2 + *helpMenuLayout*Command.font: -*-helvetica-bold-r-normal-*-12-*-*-* + *helpMenuLayout.layout: vertical { \ + 5 \ + horizontal { \ + 5 < +0 -5 > \ + helpBack \ + 2 < +0 -2 > \ + helpForward \ + 2 < +0 -2 > \ + helpHome \ + 20 < +inf -20 > \ + helpClose \ + 5 < +0 -5 > \ + } \ + 5 \ + } + *helpBack.label: Back + *helpBack.sensitive: False + *helpForward.label: Forward + *helpForward.sensitive: False + *helpHome.label: Home + *helpClose.label: Done + + *helpInfoLayout*background: gray + *helpInfoLayout*Label.justify: center + *helpInfoLayout*Label.internalHeight: 0 + *helpInfoLayout.layout: horizontal { \ + 5 \ + vertical { \ + 5 \ + helpIRAFLogo \ + 5 \ + } \ + 1 \ + vertical { \ + 5 \ + horizontal { \ + 0 < +inf -inf > \ + helpInfo1 \ + 0 < +inf -inf > \ + } \ + 0 < +inf -0 > \ + horizontal { \ + 0 < +inf -inf > \ + helpInfo2 \ + 0 < +inf -inf > \ + } \ + 0 < +inf -0 > \ + horizontal { \ + 0 < +inf -inf > \ + helpInfo3 \ + 0 < +inf -inf > \ + } \ + 5 \ + } \ + 1 \ + vertical { \ + 5 \ + helpNOAOLogo \ + 5 \ + } \ + 5 \ + } + *helpInfo1.label: XImtool V1.2 -- Released: 4/30/2000 + *helpInfo2.label: iraf@noao.edu (520) 318-8160 + *helpInfo3.label: NOAO is operated by AURA under cooperative agreement with the NSF + *helpInfoLayout*helpInfo1.font: -*-helvetica-medium-r-normal-*-12-*-*-* + *helpInfoLayout*helpInfo2.font: -*-helvetica-medium-r-normal-*-12-*-*-* + *helpInfoLayout*helpInfo3.font: -*-helvetica-medium-r-normal-*-10-*-*-* + *helpInfoLayout.helpIRAFLogo.internalWidth: 0 + *helpInfoLayout.helpIRAFLogo.internalheight: 0 + *helpInfoLayout.helpIRAFLogo.foreground: steelblue + *helpInfoLayout.helpIRAFLogo.background: white + *helpInfoLayout.helpNOAOLogo.internalWidth: 0 + *helpInfoLayout.helpNOAOLogo.internalheight: 0 + *helpInfoLayout.helpNOAOLogo.foreground: steelblue + *helpInfoLayout.helpNOAOLogo.background: white + + *helpText.width: 450 + *helpText.height: 500 + *helpText.anchorUnderlines: 1 + *helpText.visitedAnchorUnderlines: 1 + *helpText.verticalScrollOnRight: true + *helpText.plainFont: 6x13 + + + ! Define a debug Tcl shell. + !-------------------------------- + *tclShell.title: Interactive Tcl Shell + *tclForm.background: gray + *tclForm*Label.background: gray + *tclForm*Label.borderWidth: 0 + *tclForm*Label.resize: False + *tclForm*Command.resize: False + *tclForm*Command.background: grey75 + *tclForm*Command.font: 7x13bold + *tclLabel.label: Server Command Entry + *tclClear.label: Clear + *tclExecute.label: Execute + *tclEntry*Text.font: 7x13 + *tclEntry*width: 500 + *tclEntry*borderWidth: 1 + *tclEntry*height: 150 + *tclEntry*editType: edit + *tclEntry*scrollHorizontal: whenNeeded + *tclEntry*scrollVertical: never + *tclEntry*displayCaret: True + *tclcloseButton.label: Done + + + ! GUI resources. + ! ------------------------------ + *autoscale: True + *zoomfactors: 1 2 4 8 + *displayCoords: True + *displayPanner: True + *displayMagnifier: False + *blinkRate: 1.0 + *pannerArea: 150*150 + *pannerGeom: -5+5 + *magnifierArea: 100*100 + *magnifierGeom: +5+5 + *wcsboxGeom: -5-5 + *maxContrast: 5.0 + *warnings: True +} + +# Start up the GUI. +createObjects +send colorbar setGterm ; send colorbar activate +send imagewin setGterm ; send imagewin activate +activate + +# Utility procedure to test True/False strings in resources. +proc true {v} {expr {$v == "true" || $v == "True" || $v == "TRUE"}} + +# Utility functions. +proc min {a b} { expr {($a < $b) ? $a : $b} } +proc max {a b} { expr {($a > $b) ? $a : $b} } + +# Global variables. +set version "NOAO/IRAF XImtool Version 1.2" + +set winWidth [send imagewin get width] ;# display window width +set winHeight [send imagewin get height] ;# display window height +set marker none ;# selected marker +set markno 0 ;# used to name new markers +set blinkFrames "1 2" ;# list of blink/tile frames + +set loadP_up 0 +set saveP_up 0 +set printP_up 0 +set infoP_up 0 +set panel_up 0 +set helpP_up 0 + + +proc winResize {w width height} \ + { global winWidth winHeight; set winWidth $width; set winHeight $height} +send imagewin addCallback winResize resize + +# Additional global variables, taking default values from resources. +getResources { + { zoomfactors } + { displayCoords } + { displayPanner } + { displayMagnifier } + { blinkRate } + { pannerArea } + { pannerGeom } + { magnifierArea } + { magnifierGeom } + { wcsboxGeom } + { maxContrast } + { warnings } +} + +set warnings [true $warnings] +set defaultBlinkRate $blinkRate + +# Client state variables (UI parameter objects). Certain of these parameters +# we mirror in Tcl variables here, updating the values with a callback when +# the parameter value changes. Others require special callbacks. + +set frame 1 ;# current display frame +set nframes 0 ;# number of frame buffers +set frames {1 2 3 4} ;# list of image frames +set frameWidth 0 ;# frame buffer width, pixels +set frameHeight 0 ;# frame buffer height, pixels +set frameDepth 8 ;# frame buffer pixel size, bits +set cursorMode 0 ;# true when cursor read pending + +foreach i $frames { + set frameZoomX($i) 0 ;# X zoom factor + set frameZoomY($i) 0 ;# Y zoom factor + set frameCenterX($i) 0 ;# X center of field + set frameCenterY($i) 0 ;# Y center of field + set frameScaleX($i) 0 ;# X scale factor + set frameScaleY($i) 0 ;# Y scale factor + set enhancement($i) none ;# colortable enhancement +} + +# Called when the number of frames changes. +proc setNFrames {param old new} { + global frameMenuDescription nframes frames + set nframes $new + if {$old != $new} { + foreach i {prevButton nextButton} { + send $i set sensitive [expr "$nframes > 1"] + } + editMenu frameMenu frameButton $frameMenuDescription + } + foreach i $frames { + if {$i <= $nframes} { + send frameBox manage frame$i + } else { + send frameBox unmanage frame$i + } + } +}; send nframes addCallback setNFrames + +set frameMenuDescription { + { 1 f.exec "send client setFrame 1" sensitive {[expr "$nframes >= 1"]} } + { 2 f.exec "send client setFrame 2" sensitive {[expr "$nframes >= 2"]} } + { 3 f.exec "send client setFrame 3" sensitive {[expr "$nframes >= 3"]} } + { 4 f.exec "send client setFrame 4" sensitive {[expr "$nframes >= 4"]} } +}; createMenu frameMenu frameButton $frameMenuDescription + +# Called when the frame being displayed changes. +proc frameChanged {param old new} { + global frame + set frame $new + send frameButton set label $frame +}; send frame addCallback frameChanged + +# Called when the frame buffer configuration changes. +proc setFrameSize {param old new} { + global frameWidth frameHeight frameDepth + set frameWidth [lindex $new 0] + set frameHeight [lindex $new 1] + set frameDepth [lindex $new 2] +}; send frameSize addCallback setFrameSize + +# Called when the current frame is zoomed or panned. +proc setFrameView {param old new} { + global frameZoomX frameZoomY frameCenterX frameCenterY + global frameScaleX frameScaleY frame + set frameZoomX($frame) [lindex $new 0] + set frameZoomY($frame) [lindex $new 1] + set frameCenterX($frame) [lindex $new 2] + set frameCenterY($frame) [lindex $new 3] + set frameScaleX($frame) [lindex $new 4] + set frameScaleY($frame) [lindex $new 5] +}; send frameView addCallback setFrameView + +# Called when the color enhancement for a frame changes. +proc setEnhancement {param old new} { + global enhancement + set enhancement([lindex $new 0]) [lrange $new 1 end] +}; send enhancement addCallback setEnhancement + +# Called when the frame title changes (e.g. frame change or new frame loaded). +proc setTitle {param old new} { + send imageTitle set label [string trimright $new] +}; send frameTitle addCallback setTitle + +# Called when the image is flipped in an axis. +proc setFlip {param old new} { + send ${param}Button set state [true $new] +}; foreach i {xflip yflip} { send $i addCallback setFlip } + + +# Various general callbacks. +proc Quit args { send client Quit } +proc nextFrame args { send client nextFrame } +proc prevFrame args { send client prevFrame } +proc setColormap { mapno } { send client setColormap $mapno } +proc xflip args { send client flip x } +proc yflip args { send client flip y } +proc xyflip args { send client flip x y } + +# Initialize bitmaps. +createBitmap xflip 16 16 { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x18, 0x18, + 0x1c, 0x38, 0xfe, 0x7f, 0xfe, 0x7f, 0x1c, 0x38, 0x18, 0x18, 0x10, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +createBitmap yflip 16 16 { + 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xf0, 0x0f, + 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00}; + +createBitmap qmark 16 16 { + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x07, 0xf8, 0x0f, 0x18, 0x0c, 0x18, 0x0c, + 0x18, 0x0e, 0x00, 0x07, 0x80, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, + 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00}; + +createBitmap larrow 16 16 { + 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0xc0, 0x03, 0xe0, 0x1e, 0x70, 0x1e, + 0x38, 0x18, 0x1c, 0x18, 0x1c, 0x18, 0x38, 0x18, 0x70, 0x1e, 0xe0, 0x1e, + 0xc0, 0x03, 0x80, 0x03, 0x00, 0x03, 0x00, 0x00}; + +createBitmap rarrow 16 16 { + 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x03, 0x78, 0x07, 0x78, 0x0e, + 0x18, 0x1c, 0x18, 0x38, 0x18, 0x38, 0x18, 0x1c, 0x78, 0x0e, 0x78, 0x07, + 0xc0, 0x03, 0xc0, 0x01, 0xc0, 0x00, 0x00, 0x00}; + +createBitmap panel 16 16 { + 0x00, 0x00, 0xf8, 0x1f, 0xf8, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x98, 0x19, 0x98, 0x19, 0x98, 0x19, 0x98, 0x19, 0x98, 0x19, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0xf8, 0x1f, 0xf8, 0x1f}; + +createBitmap brightness 15 15 { + 0x00, 0x00, 0x80, 0x00, 0x84, 0x10, 0xe8, 0x0b, 0x10, 0x04, 0x08, 0x08, + 0x08, 0x08, 0x0e, 0x38, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0xe8, 0x0b, + 0x84, 0x10, 0x80, 0x00, 0x00, 0x00}; + +createBitmap contrast 15 15 { + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x30, 0x07, 0x08, 0x0f, 0x08, 0x0f, + 0x04, 0x1f, 0x04, 0x1f, 0x04, 0x1f, 0x08, 0x0f, 0x08, 0x0f, 0x30, 0x07, + 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00}; + +createBitmap solid 64 24 { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +send panelButton "set bitmap panel; addCallback panel" +send xflipButton "set bitmap xflip; addCallback xflip" +send yflipButton "set bitmap yflip; addCallback yflip" +send helpButton "set bitmap qmark; addCallback Help" +send prevButton "set bitmap larrow; addCallback prevFrame" +send nextButton "set bitmap rarrow; addCallback nextFrame" + + +# WINDOW the current frame. +proc windowColormap {x y} \ +{ + global winWidth winHeight maxContrast + + send client windowColormap \ + [expr "double($x) / $winWidth"] \ + [expr "(double($y) - $winHeight / 2.0) / $winHeight * \ + $maxContrast * 2.0"] +} + +# WINDOW the current frame, but only one color at a time. +proc windowRGB {color x y save_flag} \ +{ + global winWidth winHeight maxContrast + + send client windowRGB $color \ + [expr "double($x) / $winWidth"] \ + [expr "(double($y) - $winHeight / 2.0) / $winHeight * \ + $maxContrast * 2.0"] $save_flag +} + + +# ZOOM and PAN. +set xcen 0 +set ycen 0 +foreach i $frames {set zoomindex($i) 0} +set nzoomfactors 0 +foreach i $zoomfactors { + set zoomfactor($nzoomfactors) $i + incr nzoomfactors +} + +# Zoom or pan image at given center. +proc zoom {x y} \ +{ + global xcen ycen frame + global zoomindex zoomfactor + global nzoomfactors + + set rx $x; set ry $y + set raster 0 + + # Convert raw screen coordinates to frame buffer raster coordinates. + send imagewin unmapPixel $x $y raster rx ry + + # Select a pixel. + set rx [expr "int ($rx)"] + set ry [expr "int ($ry)"] + + # If the pointer did not move (much) zoom the image, otherwise + # pan it. + + send imagewin setCursorType busy + if {sqrt(pow($x-$xcen, 2) + pow($y-$ycen, 2)) < 4} { + set zoomindex($frame) [expr [incr zoomindex($frame)] % $nzoomfactors] + set mag $zoomfactor($zoomindex($frame)) + send client zoom $mag $mag $rx $ry + } else { + send client pan $rx $ry + set xcen $x + set ycen $y + } + + # Move the pointer so that it tracks the object feature the user + # selected. + + send imagewin setCursorPos $rx $ry $raster + send imagewin getCursorPos xcen ycen + send imagewin setCursorType idle +} + +# Zoom using a marker to indicate the region to be displayed. +proc zoomMarker {marker aspect} \ +{ + global xcen ycen frame + global winWidth winHeight + global zoomindex nzoomfactors + + # getRegion returns: "rectangle raster x y width height rotangle". + set region [send $marker getRegion unmap] + + set raster [lindex $region 1] + set xcen [expr "int([lindex $region 2]) + 0.5"] + set ycen [expr "int([lindex $region 3]) + 0.5"] + set snx [expr "[lindex $region 4] * 2"] + set sny [expr "[lindex $region 5] * 2"] + + # Compute the magnification ratio. + set xmag [expr "$winWidth / $snx"] + set ymag [expr "$winHeight / $sny"] + if {$aspect == "equal"} { + set mag [expr "($xmag < $ymag) ? $xmag : $ymag"] + set xmag $mag; set ymag $mag + } + + # Zoom the image. + send client zoomAbs $xmag $ymag $xcen $ycen + + # The following causes a button2 to redisplay the full image. + send imagewin setCursorPos $xcen $ycen $raster + send imagewin getCursorPos xcen ycen + set zoomindex($frame) [expr "$nzoomfactors - 1"] +} + +proc resetView {param old new} { + global zoomindex xcen ycen frames + global frameWidth frameHeight + + if {$new == "done"} { + foreach i $frames { + send client setFrame $i + set xcen [expr $frameWidth / 2] + set ycen [expr $frameHeight / 2] + send client zoom 1 1 $xcen $ycen + set zoomindex($i) 0 + send client setColormap Grayscale + normalize + } + send client setFrame 1 + } +}; #send initialize addCallback resetView + + +# CURSOR READ stuff. +proc setCursorMode {param old new} \ +{ + global cursorMode + + if {$new == "on"} { + send imagewin "activate; setCursorType ginMode" + set cursorMode 1 + } elseif {$new == "off"} { + send imagewin "setCursorType idle; deactivate" + set cursorMode 0 + } +} + +proc keyInput {widget event sx sy data} \ +{ + global cursorMode frame + + if {!$cursorMode || $event != "keyPress"} \ + return + if {[lindex $data 0] == "??"} \ + return + + # Convert raw screen coordinates to raster pixel coordinates. + send imagewin unmapPixel $sx $sy raster rx ry + + # Return the cursor value and exit cursor mode. + send client retCursorVal $rx $ry $frame 1 [lindex $data 0] +} + +proc resetCursorMode args { + global cursorMode frame + if {$cursorMode} { + send imagewin getCursorPos x y + send client retCursorVal $x $y $frame 1 ^D + } +}; send initialize addCallback resetCursorMode + +send cursorMode addCallback setCursorMode +send imagewin addCallback keyInput input + + +# MARKER stuff. The active marker is determined by the global variable +# "marker", which is the marker the pointer is in, or which the pointer +# was most recently in. + +# Translations when pointer is inside marker. +set markerTranslations { \ + !Shift <Btn1Motion>: m_rotateResize() + <Btn1Motion>: m_moveResize() + !Shift <Btn1Down>: m_raise() m_markpos() + <Btn1Down>: m_raise() m_markposAdd() + <Btn1Up>: m_redraw() m_destroyNull() + <Btn2Down>: m_lower() + <Btn3Down>: popup(markerMenu) + <Btn3Up>: popdown(markerMenu) + !Ctrl <Key>b: call(prevFrame,$name) + !Ctrl <Key>f: call(nextFrame,$name) + !Ctrl <Key>h: call(move_cursor,-1,0) + !Ctrl <Key>j: call(move_cursor,0,1) + !Ctrl <Key>k: call(move_cursor,0,-1) + !Ctrl <Key>l: call(move_cursor,1,0) + !Ctrl <Key>n: call(normalize) + !Ctrl <Key>m: call(toggleMagnifier) + !Ctrl <Key>p: call(togglePanner) + !Ctrl <Key>c: call(cpZoomAction,centerFrame) + !Ctrl <Key>i: call(cpInvert) + !Ctrl <Key>s: call(cpMatchFrames) + !Ctrl <Key>r: call(cpRegisterFrames) + !Alt <Key>1: call(cpSetFrame,frame1) + !Alt <Key>2: call(cpSetFrame,frame2) + !Alt <Key>3: call(cpSetFrame,frame3) + !Alt <Key>4: call(cpSetFrame,frame4) + !Ctrl <Key>1: call(cpZoom,1,1,fixed) + !Ctrl <Key>2: call(cpZoom,2,2,fixed) + !Ctrl <Key>3: call(cpZoom,3,3,fixed) + !Ctrl <Key>4: call(cpZoom,4,4,fixed) + !Ctrl <Key>5: call(cpZoom,5,5,fixed) + !Ctrl <Key>6: call(cpZoom,6,6,fixed) + !Ctrl <Key>7: call(cpZoom,7,7,fixed) + !Ctrl <Key>8: call(cpZoom,8,8,fixed) + !Ctrl <Key>9: call(cpZoom,9,9,fixed) + <Key>BackSpace: m_deleteDestroy() + <Key>Delete: m_deleteDestroy() + <KeyPress>: m_input() + <Motion>: track-cursor() +} + +# Popup menu in effect when inside marker. +createMenu markerMenu imagewin { + { Marker f.title } + { f.dblline } + { Zoom f.exec { + zoomMarker $marker equal + send $marker destroy + } } + { Fill f.exec { + zoomMarker $marker fill + send $marker destroy + } } + { Print f.exec { + send $marker getRect interior x0 y0 nx ny + setPrintCorners $x0 [expr $y0 + $ny -1] \ + [expr $x0 + $nx -1] $y0 + send client print $x0 $y0 $nx $ny + } } + { Save f.exec { + send imagewin setCursorType busy + send $marker getRect interior x0 y0 nx ny + send client save $x0 $y0 $nx $ny + send imagewin setCursorType idle + } } + { Info f.exec { + send infoText append \ + [format "%s\n" [send $marker getRegion unmap]] + } } + { Unrotate f.exec { + send $marker setAttribute rotangle 0 + } } + { f.line } + { Color f.menu markerColor } + { Type f.menu markerType } + { f.line } + { Destroy f.exec { + send $marker destroy + } } +} + +createMenu markerType markerMenu { + { Type f.title } + { f.dblline } + { Rectangle f.exec "m_setType $marker rectangle" } + { Box f.exec "m_setType $marker box" } + { Circle f.exec "m_setType $marker circle" } + { Ellipse f.exec "m_setType $marker ellipse" } + { Polygon f.exec "m_setType $marker polygon" } +} + +createMenu markerColor markerMenu { + { Color f.title } + { f.dblline } + { "" f.exec "m_setColor $marker black" + bitmap solid foreground black } + { "" f.exec "m_setColor $marker white" + bitmap solid foreground white } + { "" f.exec "m_setColor $marker red" + bitmap solid foreground red } + { "" f.exec "m_setColor $marker green" + bitmap solid foreground green } + { "" f.exec "m_setColor $marker blue" + bitmap solid foreground blue } + { "" f.exec "m_setColor $marker magenta" + bitmap solid foreground magenta } + { "" f.exec "m_setColor $marker cyan" + bitmap solid foreground cyan } + { "" f.exec "m_setColor $marker yellow" + bitmap solid foreground yellow } +} + +proc m_setType {marker type} { + send $marker "markpos; set type $type; redraw" +} +proc m_setColor {marker color} { + send $marker "markpos; + set lineColor $color; set highlightColor $color; redraw" +} + +# Callback executed when a marker gets or loses the focus. +proc selectMarker {active_marker event event_data} \ +{ + global marker + switch $event { + focusIn { set marker $active_marker } + focusOut { } + } +} + +# Create marker action. Makes a new marker. +proc makeMarker {parent x y} \ +{ + global markerTranslations markno + set marker marker$markno; incr markno + + send $parent createMarker $marker \ + type rectangle \ + createMode interactive \ + translations $markerTranslations \ + x $x \ + y $y + + send $marker addCallback selectMarker focusIn focusOut +} + + +# WCSBOX -- Real time coordinate display. +set track_enable 0 + +proc wcsUpdate {x y} \ +{ + global track_enable frame + + # Convert screen coords to raster pixel. + send imagewin unmapPixel $x $y raster rx ry rz + + # Set the current frame to the frame the pointer is within. + if {$frame && $raster} { + set track_frame [send client getFrame $raster] + if {$frame != $track_frame} { + send client setFrame $track_frame + } + } + + # Update coords box. + if {$track_enable} { + if {$raster} { + set text [send client encodewcs $rx $ry $rz] + } else { + set text [format " %7.2f %7.2f %7.1f " $rx $ry $rz] + } + send wcsbox "set text \{$text\}; redraw noerase" + } +} + +proc setTrack {state} \ +{ + global track_enable wcsboxGeom + global winWidth winHeight + + if {$state} { + if {$track_enable} \ + return + + send imagewin createMarker wcsbox { + type text + createMode noninteractive + width 25ch + height 1ch + lineWidth 0 + imageText true + textBgColor black + textColor yellow + visible false + } + + set box_width [send wcsbox get width] + set box_height [send wcsbox get height] + set defGeom [format "%sx%s-5-5" $box_width $box_height] + send imagewin parseGeometry $wcsboxGeom $defGeom x y width height + + send wcsbox setAttributes \ + x $x \ + y $y \ + activated true \ + visible true \ + sensitive true + + send wcsbox { + addCallback wcsboxDestroyCallback destroy + addCallback wcsboxMoved moveResize + } + + send imagewin addCallback wcsboxWindowResize resize + set track_enable 1 + send imagewin getCursorPos x y + wcsUpdate $x $y + magnifierMapImage $x $y + + } elseif {$track_enable} { + set track_enable 0 + send wcsbox destroy + } +} + +proc wcsboxDestroyCallback args { + global track_enable + send imagewin deleteCallback wcsboxWindowResize + set track_enable 0 +} + +# If the window is resized make the wcsbox track the corner. +proc wcsboxWindowResize args { + global track_enable + global wcsboxGeom + + if {$track_enable} { + # Get new location. + set box_width [send wcsbox get width] + set box_height [send wcsbox get height] + set defGeom [format "%sx%s-5-5" $box_width $box_height] + send imagewin parseGeometry $wcsboxGeom $defGeom x y width height + + # Move the marker. + send wcsbox "\ + deleteCallback wcsboxMoved; \ + markpos; setAttributes x $x y $y; redraw; \ + addCallback wcsboxMoved moveResize" + } +} + +proc wcsboxMoved {marker event position} { + global wcsboxGeom + send wcsbox getRect boundary x y width height + set wcsboxGeom [send imagewin getGeometry $x $y $width $height] +} + +proc resetWcsbox {param old new} { + global track_enable wcsboxGeom displayCoords + if {$new == "done"} { + setTrack [true $displayCoords] + } elseif {$track_enable} { + setTrack 0 + if {$new == "restart"} { + set wcsboxGeom -5-5 + } + } +}; send initialize addCallback resetWcsbox + + +# PANNER. The full frame mapped into the main image window is displayed at a +# reduced resolution in a marker (known as the panner window) within the main +# image window. The currently displayed region of the frame is indicated +# using a small marker within the panner window. This small marker may be +# moved or resized to pan or zoom the image in the main display window. + +set panner_x 0 +set panner_y 0 +set panner_width 0 +set panner_height 0 +set prm_width 0 +set prm_height 0 + +set panner_enable 0 +set panner_pan_enable 0 +set panner_region_enable 0 +set panner_mapping 0 + +# Panner window translations. +set pannerWinTranslations { \ + !Shift <Btn1Motion>: m_rotateResize() + <Btn1Motion>: m_moveResize() + !Shift <Btn1Down>: m_raise() m_markpos() + <Btn1Down>: m_raise() m_markposAdd() + <Btn1Up>: m_redraw() m_destroyNull() + <Btn2Down>: m_lower() + !Ctrl <Key>b: call(prevFrame,$name) + !Ctrl <Key>f: call(nextFrame,$name) + !Ctrl <Key>h: call(move_cursor,-1,0) + !Ctrl <Key>j: call(move_cursor,0,1) + !Ctrl <Key>k: call(move_cursor,0,-1) + !Ctrl <Key>l: call(move_cursor,1,0) + !Ctrl <Key>n: call(normalize) + !Ctrl <Key>m: call(toggleMagnifier) + !Ctrl <Key>p: call(togglePanner) + !Ctrl <Key>c: call(cpZoomAction,centerFrame) + !Ctrl <Key>i: call(cpInvert) + !Ctrl <Key>s: call(cpMatchFrames) + !Ctrl <Key>r: call(cpRegisterFrames) + !Alt <Key>1: call(cpSetFrame,frame1) + !Alt <Key>2: call(cpSetFrame,frame2) + !Alt <Key>3: call(cpSetFrame,frame3) + !Alt <Key>4: call(cpSetFrame,frame4) + !Ctrl <Key>1: call(cpZoom,1,1,fixed) + !Ctrl <Key>2: call(cpZoom,2,2,fixed) + !Ctrl <Key>3: call(cpZoom,3,3,fixed) + !Ctrl <Key>4: call(cpZoom,4,4,fixed) + !Ctrl <Key>5: call(cpZoom,5,5,fixed) + !Ctrl <Key>6: call(cpZoom,6,6,fixed) + !Ctrl <Key>7: call(cpZoom,7,7,fixed) + !Ctrl <Key>8: call(cpZoom,8,8,fixed) + !Ctrl <Key>9: call(cpZoom,9,9,fixed) + <Btn2Up>: call(pannerPanXY,$x,$y) + <Key>BackSpace: m_deleteDestroy() + <Key>Delete: m_deleteDestroy() + <KeyPress>: graphics-input() + <Motion>: track-cursor() call(wcsUpdate,$x,$y) +} + + +# setPanner -- Turn the panner on or off. + +proc togglePanner args { + global panner_enable + + if {$panner_enable} { + setPanner 0 + } else { + setPanner 1 + } +} + +proc setPanner {state} \ +{ + global winWidth winHeight frameWidth frameHeight + global frame panner_mapping pannerWinTranslations pannerArea + global panner_enable panner_region_enable panner_pan_enable + global pannerGeom panner_x panner_y panner_width panner_height + + if {$state} { + if {$panner_enable} \ + return + + # Determine where to place the panner. + set scale \ + [expr sqrt(double($pannerArea) / ($frameWidth * $frameHeight))] + set scaled_width [expr int($frameWidth * $scale) / 2 * 2 + 1] + set scaled_height [expr int($frameHeight * $scale) / 2 * 2 + 1] + set defGeom [format "%sx%s-5+5" $scaled_width $scaled_height] + send imagewin parseGeometry $pannerGeom $defGeom x y width height + + # Create the main panner window (marker). + send imagewin createMarker pannerWin \ + type rectangle \ + createMode noninteractive \ + width [expr $width / 2] \ + height [expr $height / 2] \ + x [expr $x + $width / 2] \ + y [expr $y + $height / 2] \ + lineColor 8 \ + highlightColor 8 \ + translations $pannerWinTranslations \ + visible true \ + sensitive true \ + activated true + + # Update the panner window position variables so that it comes up + # in the same place the next time. + + send pannerWin getRect boundary \ + panner_x panner_y panner_width panner_height + set pannerGeom [send imagewin getGeometry \ + $panner_x $panner_y $panner_width $panner_height] + + # Register callbacks. + send frame addCallback pannerMapImage + send frameRegion addCallback pannerSetRegion + send imagewin addCallback pannerImagewinResized resize + send resize addCallback pannerImagewinResized + + send pannerWin { + addCallback pannerMapImage moveResize; + addCallback pannerMoved moveResize; + addCallback pannerDestroy destroy; + addCallback pannerWinConstraint constraint; + } + + # Map display frame to panner window. + set panner_enable 1 + set panner_region_enable 1 + set panner_mapping [send imagewin nextMapping] + pannerMapImage init; send imagewin refreshMapping $panner_mapping + + # Draw a marker in the panner window outlining displayed region. + send imagewin createMarker pannerRegionMarker \ + type box \ + createMode noninteractive \ + translations $pannerWinTranslations \ + lineColor green \ + highlightColor green \ + sensitive true + + # Fire up the panner region marker. + send client getSource raster sx sy snx sny + pannerSetRegion dummy dummy [concat $frame $sx $sy $snx $sny] + send pannerRegionMarker "\ + addCallback pannerPanImage moveResize; \ + addCallback pannerDestroy destroy; \ + addCallback pannerRegionConstraint constraint; \ + setAttributes visible true activated true; \ + redraw" + set panner_pan_enable 1 + + } elseif {$panner_enable} { + pannerDestroy + } +} + + +# pannerDestroy -- Delete the panner. + +proc pannerDestroy args { + global panner_enable panner_region_enable panner_pan_enable + global panner_mapping + + if {$panner_enable} { + set panner_enable 0 + set panner_pan_enable 0 + set panner_region_enable 0 + + send imagewin freeMapping $panner_mapping + send imagewin deleteCallback pannerImagewinResized + send resize deleteCallback pannerImagewinResized + send frame deleteCallback pannerMapImage + send frameRegion deleteCallback pannerSetRegion + + if [send server queryObject pannerRegionMarker] { + send pannerRegionMarker destroy + } + if [send server queryObject pannerWin] { + send pannerWin destroy + } + } +} + + +# pannerMapImage -- Map the current display frame into the panner window. +# Called when the frame changes or the panner window is moved or resized. +# The panner window displays a small dezoomed version of the full frame. + +proc pannerMapImage args { + global panner_enable frame + global panner_mapping + + if {!$panner_enable || $frame == 0} \ + return + + set raster [send client getRaster] + send pannerWin getRect interior dx dy dnx dny + send imagewin queryRaster $raster width height + + if [send imagewin activeMapping $panner_mapping] { + send imagewin raiseMapping $panner_mapping + } + send imagewin setMapping $panner_mapping 0 \ + $raster pixel 0 0 $width $height \ + 0 pixel $dx $dy $dnx $dny +} + + +# pannerSetRegion -- Adjust the pannerWin region marker to outline the +# region displayed in the main display window. This is called in response +# to a frameRegion event when the main display mapping changes, e.g. when +# the frame changes or the user zooms or pans the main window. The region +# marker is moved and resized to reflect the new view. + +proc pannerSetRegion {param old new} { + global panner_enable panner_region_marker + global panner_region_enable panner_pan_enable + global frame frameWidth frameHeight prm_width prm_height + + if {!$panner_enable || !$panner_region_enable || $frame == 0} \ + return + + # new: frame sx sy snx sny + set src_frame [lindex $new 0] + set sx [lindex $new 1]; set snx [lindex $new 3] + set sy [lindex $new 2]; set sny [lindex $new 4] + + if {$src_frame != $frame} \ + return + + send pannerWin getRect interior px py pnx pny + + set x [expr ($sx + $snx/2.0) / $frameWidth * $pnx + $px] + set y [expr ($sy + $sny/2.0) / $frameHeight * $pny + $py] + set width [expr ($snx/2.0) / $frameWidth * $pnx + 1] + set height [expr ($sny/2.0) / $frameHeight * $pny + 1] + + set pan_save $panner_pan_enable; set panner_pan_enable 0 + set panner_region_enable 0 + + send pannerRegionMarker "\ + markpos; \ + setAttributes x $x y $y width $width height $height; \ + redraw; raise" + send pannerRegionMarker getAttributes width prm_width height prm_height + + set panner_region_enable 1 + set panner_pan_enable $pan_save +} + + +# pannerPanImage -- Pan or zoom the image in the main image window. This is +# called when the user moves the region marker within the panner window. + +proc pannerPanImage {marker event position} { + global panner_pan_enable + global winWidth winHeight + global prm_width prm_height + + if {!$panner_pan_enable} \ + return + + # position: x y width height. + set new_width [lindex $position 2] + set new_height [lindex $position 3] + + # region: type raster x y width height. + set region [send pannerRegionMarker getRegion unmap] + set x [expr [lindex $region 2] + 1]; set width [lindex $region 4] + set y [expr [lindex $region 3] + 1]; set height [lindex $region 5] + + set panner_pan_enable 0 + if {$new_width == $prm_width && $new_height == $prm_height} { + send client pan $x $y + } else { + set xscale [expr ($winWidth / 2.0) / $width] + set yscale [expr ($winHeight / 2.0) / $height] + send client zoom $xscale $yscale $x $y + } + set panner_pan_enable 1 +} + + +# pannerPanXY -- Pan to the point X,Y in the panner window coordinate +# system. Called when the user clicks MB2 in the panner window. + +proc pannerPanXY {x y} { + send imagewin unmapPixel $x $y raster rx ry + send client pan $rx $ry +} + + +# pannerMoved -- Called when the user moves the panner window. We need to +# move the region marker to the new window location and record the new location +# so that the window will come up in the same place if closed and reopened. + +proc pannerMoved {marker event position} { + global winWidth winHeight + global frame panner_pan_enable pannerGeom + global panner_x panner_y panner_width panner_height + + # Move the region marker to the new location. + set pan_save $panner_pan_enable; set panner_pan_enable 0 + send client getSource raster sx sy snx sny + pannerSetRegion dummy dummy [concat $frame $sx $sy $snx $sny] + set panner_pan_enable $pan_save + + # Update the panner window position variables so that it comes up + # in the same place the next time. + + send pannerWin getRect boundary \ + panner_x panner_y panner_width panner_height + set pannerGeom [send imagewin getGeometry \ + $panner_x $panner_y $panner_width $panner_height] + + send pannerRegionMarker raise +} + + +# pannerWinConstraint -- Called when the panner window is moved, resized, or +# rotated. Constrain the panner window to remain within the image window; +# rotation is not permitted. + +proc pannerWinConstraint {marker event attributes} { + global winWidth winHeight + global panner_width panner_height + + set width $panner_width + set height $panner_height + set constraints [list {}] + + # Check the width and height first as we need these below. + foreach i $attributes { + set new [lindex $i 2] + switch [lindex $i 0] { + width { set ww [expr $winWidth / 2] + if {$new > $ww} { + lappend constraints "width $ww" + set width $ww + } else { + set width $new + } + } + height { set wh [expr $winHeight / 2] + if {$new > $wh} { + lappend constraints "height $wh" + set height $wh + } else { + set height $new + } + } + rotangle { lappend constraints "rotangle 0" + } + } + } + + # Constrain X and Y. + foreach i $attributes { + set new [lindex $i 2] + switch [lindex $i 0] { + x { set pw [expr $width / 2] + if {$new < $pw} { + lappend constraints "x $pw" + } elseif {$new > $winWidth - $pw} { + lappend constraints "x [expr $winWidth - $pw]" + } + } + y { set ph [expr $height / 2] + if {$new < $ph} { + lappend constraints "y $ph" + } elseif {$new > $winHeight - $ph} { + lappend constraints "y [expr $winHeight - $ph]" + } + } + } + } + + return $constraints +} + + +# pannerRegionConstraint -- Called when the region marker in the panner +# window is moved, resized, or rotated. + +proc pannerRegionConstraint {marker event attributes} { + global winWidth winHeight + + set constraints [list {}] + send pannerWin getRect interior p_x p_y p_width p_height + send pannerRegionMarker getAttributes width rwidth height rheight + + # Since the panner region marker is a box marker x,y and width,height + # will not both change in the same call, so we can process them all + # independently. + + foreach i $attributes { + set new [lindex $i 2] + + switch [lindex $i 0] { + x { set left [expr $p_x + $rwidth + 1] + set right [expr $p_x + $p_width - $rwidth - 1] + if {$new < $left} { + lappend constraints "x $left" + } elseif {$new > $right} { + lappend constraints "x $right" + } + } + y { set top [expr $p_y + $rheight + 1] + set bottom [expr $p_y + $p_height - $rheight - 1] + if {$new < $top} { + lappend constraints "y $top" + } elseif {$new > $bottom} { + lappend constraints "y $bottom" + } + } + width { set ww [expr $winWidth / 2] + if {$new > $ww / 2} { + lappend constraints "width $ww" + } + } + height { set wh [expr $winHeight / 2] + if {$new > $wh / 2} { + lappend constraints "height $wh" + } + } + rotangle { lappend constraints "rotangle 0" + } + } + } + + return $constraints +} + + +# pannerImagewinResized -- If the display window is resized make the panner +# track the corner. + +proc pannerImagewinResized args { + global panner_enable panner_mapping + global pannerGeom panner_x panner_y panner_width panner_height + + if {$panner_enable} { + set old_x $panner_x; set old_width $panner_width + set old_y $panner_y; set old_height $panner_height + + # Get new location of panner window. + set defGeom [format "%sx%s-5+5" $panner_width $panner_height] + send imagewin parseGeometry $pannerGeom $defGeom x y width height + + # Reposition the marker. + send pannerWin "\ + markpos; \ + setAttributes \ + x [expr $x + $width / 2] \ + y [expr $y + $height / 2] \ + width [expr $width / 2] \ + height [expr $height / 2]; \ + redraw" + + # Update the panner window position variables so that it comes up + # in the same place the next time. + send pannerWin getRect boundary \ + panner_x panner_y panner_width panner_height + set pannerGeom [send imagewin getGeometry \ + $panner_x $panner_y $panner_width $panner_height] + + # Make sure the panner window is on top. + send imagewin raiseMapping $panner_mapping + + # Refresh the panner window if it did not move. + if {$panner_x == $old_x && $panner_y == $old_y && + $panner_width == $old_width && $panner_height == $old_height} { + send imagewin refreshMapping $panner_mapping + } + } +} + + +# resetPanner -- Reinitialize the panner. + +proc resetPanner {param old new} { + global pannerGeom displayPanner + if {$new == "done"} { + setPanner [true $displayPanner] + } else { + setPanner 0 + if {$new != "startup"} { + set pannerGeom -5+5 + } + } +}; send initialize addCallback resetPanner + + + +# MAGNIFIER. A subraster around the cursor in the main image window is +# displayed at a high resolution in a marker (known as the magnifier window) +# within the main image window. + +set magnifier_x 0 +set magnifier_y 0 +set magnifier_width 0 +set magnifier_height 0 +set mrm_width 0 +set mrm_height 0 + +set magnifier_enable 0 +set magnifier_mag_enable 0 +set magnifier_mapping 0 + +createMenu magzoomMenu imagewin { + { "Zoom Factors" f.title } + { f.dblline } + { "Zoom 1" f.exec "setMagnifierZoom 1" } + { "Zoom 2" f.exec "setMagnifierZoom 2" } + { "Zoom 4" f.exec "setMagnifierZoom 4" } + { "Zoom 8" f.exec "setMagnifierZoom 8" } + { "Zoom 16" f.exec "setMagnifierZoom 16" } +} + +# Magnifier window translations. +set magnifierWinTranslations { \ + !Shift <Btn1Motion>: m_rotateResize() + <Btn1Motion>: m_moveResize() + !Shift <Btn1Down>: m_raise() m_markpos() + <Btn1Down>: m_raise() m_markposAdd() + <Btn1Up>: m_redraw() m_destroyNull() + <Btn2Down>: m_lower() + <Btn3Down>: popup(magzoomMenu) + <Btn3Up>: popdown(magzoomMenu) + !Ctrl <Key>m: call(toggleMagnifier) + !Ctrl <Key>p: call(togglePanner) + <Key>BackSpace: m_deleteDestroy() + <Key>Delete: m_deleteDestroy() + <KeyPress>: graphics-input() + <Motion>: track-cursor() call(wcsUpdate,$x,$y) +} + + +# setMagnifier -- Turn the magnifier on or off. + +set magAlreadyOn 0 + +proc setDynamicMagnifier {state} \ +{ + global magAlreadyOn magnifier_enable + + if {$state} { + set magAlreadyOn $magnifier_enable + } + if {$magAlreadyOn} { + return + } else { + setMagnifier $state + } +} + + +proc toggleMagnifier args { + global magnifier_enable + + if {$magnifier_enable} { + setMagnifier 0 + send pbMagM set state False + } else { + setMagnifier 1 + send pbMagM set state True + } +} + + +proc setMagnifier {state} \ +{ + global winWidth winHeight frameWidth frameHeight + global frame magnifier_mapping magnifierWinTranslations magnifierArea + global magnifier_enable magnifier_height + global magnifierGeom magnifier_x magnifier_y magnifier_width + + if {$state} { + if {$magnifier_enable} \ + return + + # Determine where to place the magnifier. + set scale [expr sqrt(double($magnifierArea) / (512 * 512))] + set scaled_width [expr int(512 * $scale) / 2 * 2 + 1] + set scaled_height [expr int(512 * $scale) / 2 * 2 + 1] + set defGeom [format "%sx%s-5+5" $scaled_width $scaled_height] + send imagewin parseGeometry $magnifierGeom $defGeom x y width height + + # Create the main magnifier window (marker). + send imagewin createMarker magnifierWin \ + type rectangle \ + createMode noninteractive \ + width [expr $width / 2] \ + height [expr $height / 2] \ + x [expr $x + $width / 2] \ + y [expr $y + $height / 2] \ + lineColor 8 \ + highlightColor 8 \ + translations $magnifierWinTranslations \ + visible true \ + sensitive true \ + activated true + + # Update the magnifier window position variables so that it comes up + # in the same place the next time. + + send magnifierWin getRect boundary \ + magnifier_x magnifier_y magnifier_width magnifier_height + set magnifierGeom [send imagewin getGeometry \ + $magnifier_x $magnifier_y $magnifier_width $magnifier_height] + + # Register callbacks. + send imagewin addCallback magnifierImagewinResized resize + send resize addCallback magnifierImagewinResized + send magnifierWin addCallback magnifierMovedMapImage moveResize + + send magnifierWin { + addCallback magnifierMoved moveResize; + addCallback magnifierDestroy destroy; + addCallback magnifierWinConstraint constraint; + } + + # Map display frame to magnifier window. + set magnifier_enable 1 + set magnifier_mapping [send imagewin nextMapping] + send imagewin refreshMapping $magnifier_mapping + + # create cross-hair + send imagewin createMarker magPointer \ + type rectangle \ + createMode noninteractive \ + width 3 \ + height 3 \ + lineWidth 3 \ + lineColor green \ + highlightcolor green \ + activated true \ + visible true + + # set its position and size + setMagPointerPosition + magnifierMapImage [expr $winWidth / 2] [expr $winHeight / 2] + + } elseif {$magnifier_enable} { + magnifierDestroy + } +} + + +# magnifierDestroy -- Delete the magnifier. + +proc magnifierDestroy args { + global magnifier_enable + global magnifier_mapping + + if {$magnifier_enable} { + set magnifier_enable 0 + + send imagewin freeMapping $magnifier_mapping + send imagewin deleteCallback magnifierImagewinResized + send resize deleteCallback magnifierImagewinResized + send frame deleteCallback magnifierMapImage + + if [send server queryObject magnifierWin] { + send magnifierWin destroy + } + if [send server queryObject magPointer] { + send magPointer destroy + } + } +} + + +# magnifierMoved -- Called when the user moves the magnifier window. We need to +# move the region marker to the new window location and record the new location +# so that the window will come up in the same place if closed and reopened. + +proc magnifierMoved {marker event position} { + global winWidth winHeight magnifierGeom frame + global magnifier_x magnifier_y magnifier_width magnifier_height + + # Move the region marker to the new location. + send client getSource raster sx sy snx sny + + # Update the magnifier window position variables so that it comes up + # in the same place the next time. + + send magnifierWin getRect boundary \ + magnifier_x magnifier_y magnifier_width magnifier_height + set magnifierGeom [send imagewin getGeometry \ + $magnifier_x $magnifier_y $magnifier_width $magnifier_height] +} + + +# magnifierWinConstraint -- Called when the magnifier window is moved, resized, +# or rotated. Constrain the magnifier window to remain within the image window; +# rotation is not permitted. + +proc magnifierWinConstraint {marker event attributes} { + global winWidth winHeight + global magnifier_width magnifier_height + + set width $magnifier_width + set height $magnifier_height + set constraints [list {}] + + # Check the width and height first as we need these below. + foreach i $attributes { + set new [lindex $i 2] + switch [lindex $i 0] { + width { set ww [expr $winWidth / 2] + if {$new > $ww} { + lappend constraints "width $ww" + set width $ww + } else { + set width $new + } + } + height { set wh [expr $winHeight / 2] + if {$new > $wh} { + lappend constraints "height $wh" + set height $wh + } else { + set height $new + } + } + rotangle { lappend constraints "rotangle 0" + } + } + } + + # Constrain X and Y. + foreach i $attributes { + set new [lindex $i 2] + switch [lindex $i 0] { + x { set pw [expr $width / 2] + if {$new < $pw} { + lappend constraints "x $pw" + } elseif {$new > $winWidth - $pw} { + lappend constraints "x [expr $winWidth - $pw]" + } + } + y { set ph [expr $height / 2] + if {$new < $ph} { + lappend constraints "y $ph" + } elseif {$new > $winHeight - $ph} { + lappend constraints "y [expr $winHeight - $ph]" + } + } + } + } + + return $constraints +} + + +# magnifierRegionConstraint -- Called when the region marker in the magnifier +# window is moved, resized, or rotated. + +proc magnifierRegionConstraint {marker event attributes} { + global winWidth winHeight + + set constraints [list {}] + send magnifierWin getRect interior p_x p_y p_width p_height + + # Since the magnifier region marker is a box marker x,y and width,height + # will not both change in the same call, so we can process them all + # independently. + + foreach i $attributes { + set new [lindex $i 2] + + switch [lindex $i 0] { + x { set left [expr $p_x + $rwidth + 1] + set right [expr $p_x + $p_width - $rwidth - 1] + if {$new < $left} { + lappend constraints "x $left" + } elseif {$new > $right} { + lappend constraints "x $right" + } + } + y { set top [expr $p_y + $rheight + 1] + set bottom [expr $p_y + $p_height - $rheight - 1] + if {$new < $top} { + lappend constraints "y $top" + } elseif {$new > $bottom} { + lappend constraints "y $bottom" + } + } + width { set ww [expr $winWidth / 2] + if {$new > $ww / 2} { + lappend constraints "width $ww" + } + } + height { set wh [expr $winHeight / 2] + if {$new > $wh / 2} { + lappend constraints "height $wh" + } + } + rotangle { lappend constraints "rotangle 0" + } + } + } + + return $constraints +} + + +# magnifierImagewinResized -- If the display window is resized make the +# magnifier track the corner. + +proc magnifierImagewinResized args { + global magnifier_enable magnifier_mapping magnifier_height + global magnifierGeom magnifier_x magnifier_y magnifier_width + + if {$magnifier_enable} { + set old_x $magnifier_x; set old_width $magnifier_width + set old_y $magnifier_y; set old_height $magnifier_height + + # Get new location of magnifier window. + set defGeom [format "%sx%s+5+5" $magnifier_width $magnifier_height] + send imagewin parseGeometry $magnifierGeom $defGeom x y width height + + # Reposition the marker. + send magnifierWin "\ + markpos; \ + setAttributes \ + x [expr $x + $width / 2] \ + y [expr $y + $height / 2] \ + width [expr $width / 2] \ + height [expr $height / 2]; \ + redraw" + + # Update the magnifier window position variables so that it comes up + # in the same place the next time. + send magnifierWin getRect boundary \ + magnifier_x magnifier_y magnifier_width magnifier_height + set magnifierGeom [send imagewin getGeometry \ + $magnifier_x $magnifier_y $magnifier_width $magnifier_height] + + # Make sure the magnifier window is on top. + send imagewin raiseMapping $magnifier_mapping + + # Refresh the magnifier window if it did not move. + if {$magnifier_x == $old_x && $magnifier_y == $old_y && + $magnifier_width == $old_width && $magnifier_height == $old_height} { + send imagewin refreshMapping $magnifier_mapping + } + } +} + + +# resetMagnifier -- Reinitialize the magnifier. + +proc resetMagnifier {param old new} { + global magnifierGeom displayMagnifier + if {$new == "done"} { + setMagnifier [true $displayMagnifier] + } else { + setMagnifier 0 + if {$new != "startup"} { + set magnifierGeom +5+5 + } + } +}; send initialize addCallback resetMagnifier + + +set last_mag_x [expr $winWidth / 2] +set last_mag_y [expr $winHeight / 2] + +# magnifierMovedMapImage -- Front end to magnifierMapImage, called when +# magnifier window is moved or resized. + +proc magnifierMovedMapImage args { + global last_mag_x last_mag_y + + magnifierMapImage $last_mag_x $last_mag_y + setMagPointerPosition +} + + +# The following code was borrowed from the SAOtng GUI by Eric Mandel of SAO +#-------------------------------------------------------------------------- + +# globals for magnifier +set mag_w 0 +set mag_h 0 + +# +# setMagnifierZoom -- set the zoom factor for the magnifier +# +proc setMagnifierZoom { zoom } \ +{ + global mag_w mag_h + + send magnifierWin getRect boundary \ + magnifier_x magnifier_y magnifier_width magnifier_height + set mag_w [expr int( ( $magnifier_width + $zoom - 1 ) / $zoom) ] + set mag_h [expr int( ( $magnifier_height + $zoom - 1 ) / $zoom) ] + + #set mw [expr int (($magnifier_width - 1) / ($mag_w * 2))] + #if { $mw < 4 } { set mw 4 } + #set mh [expr int (($magnifier_height - 1) / ($mag_h * 2))] + #if { $mh < 4 } { set mh 4 } + #send magPointer "setAttributes width $mw height $mh; redraw" +} + +# magnifierMapImage -- Map the of the current display frame centered on the +# pointer into the magnifier window. Called when the frame changes, the +# pointer moves in the main image window, or (via magnifierMovedMapImage) +# the magnifier window is moved or resized. + +set magnifierROP 0 + +proc magnifierMapImage {x y} \ +{ + global magnifier_enable frame + global last_mag_x last_mag_y + global magnifier_mapping + global winWidth winHeight + global mag_w mag_h + global magnifierROP + + if {!$magnifier_enable || $frame == 0} \ + return + + if {abs($last_mag_x-$x) != 1 && abs($last_mag_y-$y) != 1} { + # For efficiency we won't compute the sqrt of the distance but instead + # just compare the square. Use a threshold of 6 pixels so when we + # narrow in on the ROI the magnifier is still (mostly) correctly. + set diff [expr (($last_mag_x-$x) * ($last_mag_x-$x)) + \ + (($last_mag_y-$y) * ($last_mag_y-$y))] + if {$diff > 36} { + set last_mag_x $x + set last_mag_y $y + return + } + } + + set last_mag_x $x + set last_mag_y $y + + send magnifierWin getRect interior dx dy dnx dny + if [send imagewin activeMapping $magnifier_mapping] { + send imagewin raiseMapping $magnifier_mapping + } + # initialize the magnifier zoom factor, if necessary + if { !$mag_w || !$mag_h } { + setMagnifierZoom 4 + } + + set sx [expr $x - $mag_w / 2 ] + set sy [expr $y - $mag_h / 2 ] + + # Constrain the source rectangle within the main image window + # (not overlapping an edge or the magnifier window). + + if {$sx > [expr $dx - $mag_w] && $sx < [expr $dx + $dnx] && + $sy > [expr $dy - $mag_h] && $sy < [expr $dy + $dny] } { + + # The source rectangle would overlap the magnifier window; fix that. + + set dist(l) [expr $sx - ($dx - $mag_w)] + set dist(b) [expr $dy + $dny - $sy] + set dist(r) [expr $dx + $dnx - $sx] + set dist(t) [expr $sy - ($dy - $mag_h)] + + # Put the distances in order. + + foreach j [array names dist] { + set alreadyset($j) 0 + } + + for {set i 0} {$i < 4} {incr i} { + set candidate "" + foreach j [array names dist] { + if {!$alreadyset($j)} { + if {$candidate == ""} { + set candidate $j + set minsofar $dist($j) + } elseif {$dist($j) < $minsofar} { + set candidate $j + set minsofar $dist($j) + } + } + } + set order($i) $candidate + set alreadyset($candidate) 1 + } + + # Try the sides in order, using the first one where there's room. + + for {set i 0} {$i < 4} {incr i} { + if {$order($i) == "l"} { + if {$dx >= $mag_w} { + set sx [expr $dx - $mag_w] + break + } + } elseif {$order($i) == "b"} { + if {$winHeight >= $dy + $dny + $mag_h} { + set sy [expr $dy + $dny] + break + } + } elseif {$order($i) == "r"} { + if {$winWidth >= $dx + $dnx + $mag_w} { + set sx [expr $dx + $dnx] + break + } + } elseif {$order($i) == "t"} { + if {$dy >= $mag_h} { + set sy [expr $dy - $mag_h] + break + } + } + } + } + + # Make sure we don't go beyond an edge of the main window. + + if {$sx < 0} { + set sx 0 + } else { + set sxmax [expr $winWidth - $mag_w] + if {$sx > $sxmax} { + set sx $sxmax + } + } + + if {$sy < 0} { + set sy 0 + } else { + set symax [expr $winHeight - $mag_h] + if {$sy > $symax} { + set sy $symax + } + } + + # Map 32 x 32 centered on pointer in main window. + set err [catch {send imagewin setMapping $magnifier_mapping $magnifierROP \ + 0 pixel $sx $sy $mag_w $mag_h \ + 0 pixel $dx $dy $dnx $dny}] + if { $err != 0 } { + Print "There was a problem setting up the magnifier ... recovering" + } +} + + +# set the position of the magnifier marker in the center of the mag window +proc setMagPointerPosition args \ +{ + global magnifier_enable + + if { !$magnifier_enable } { + return + } + + send magnifierWin "getAttributes x x y y" + set xpos [expr $x + 1] + set ypos [expr $y + 1] + + send magPointer "setAttributes x $xpos y $ypos visible true; redraw" +} + + + +# FRAME BLINK. +set blinkId 0 +set blinkIndex 0 + +proc toggleBlink args { + global blinkId blinkRate blinkIndex + global optionsMenuDescription + + if {$blinkId} { + deleteTimedCallback $blinkId + set blinkId 0 + } else { + set blinkId [postTimedCallback blink [expr int($blinkRate * 1000)]] + } + + set blinkIndex 0 + editMenu optionsMenu viewButton $optionsMenuDescription +} + +proc blink args { + global blinkId blinkRate blinkFrames blinkIndex + + send client setFrame [lindex $blinkFrames $blinkIndex] + incr blinkIndex + if {$blinkIndex >= [llength $blinkFrames]} { + set blinkIndex 0 + } + + set blinkId [postTimedCallback blink [expr int($blinkRate * 1000)]] +} + +proc resetBlink args { + global blinkId + if {$blinkId} \ + toggleBlink +}; send initialize addCallback resetBlink + + + +# Normalize -- Reset the view parameters for the current frame. +proc normalize args { + global zoomindex zoomfactor + global frameWidth frameHeight + global xcen ycen frame + + #set zoomindex($frame) 0 + #set xcen [expr $frameWidth / 2] + #set ycen [expr $frameHeight / 2] + #send client zoom 1 1 $xcen $ycen + send client windowColormap 0.5 1.0 +} + + +# Popdown menus. +createMenu fileMenu fileButton { + { "Info" f.exec { + send info map + infoUpdate + } } + { "Load" f.exec { + send client setLoadOption rescan + send load_panel map + set loadP_up 1 + } } + { "Save" f.exec { + Save + } } + { "Save As..." f.exec { + send save_panel map + set saveP_up 1 + } } + { "Print" f.exec { + send imagewin setCursorType busy + Print + send imagewin setCursorType idle + } } + { "Print Setup" f.exec { + send print_panel map + set printP_up 1 + } } + { "TclShell" f.exec { + send tclShell map + } } + { f.line } + { "Reset" f.exec { + # Do a hard reset. + send client Reset + #resetView initialize done done + } } + { "Quit" f.exec Quit } +} + +createMenu viewMenu viewButton { + { "Next frame" f.exec nextFrame } + { "Prev frame" f.exec prevFrame } + { f.line } + { "Colormap" f.menu cmapMenu } + { "Flip" f.menu flipMenu } + { f.line } + { "Equal aspect" f.exec { + set xmag $frameZoomX($frame) + set ymag $frameZoomY($frame) + set zoom [expr ($xmag + $ymag) / 2.0] + cpZoom $zoom $zoom fixed + } } + { "Integer zoom" f.exec { + set xmag [expr round ($frameZoomX($frame))] + set ymag [expr round ($frameZoomY($frame))] + cpZoom $xmag $ymag fixed + } } + { "Toggle zoom" f.exec toggleZoom } + { "Unzoom" f.exec { + set zoomindex($frame) 0 + set mag $zoomfactor($zoomindex($frame)) + send client zoom $mag $mag $xcen $ycen + } } +} + +createMenu cmapMenu viewMenu { + { "Colormaps" f.title } + { f.dblline } + { "Normalize" f.exec normalize } + { "Invert" f.exec cpInvert } + { "Optimize" f.exec cpOptimize sensitive false } + { f.line } + { "Grayscale" f.exec "send client setColormap Grayscale" } + { "Color" f.exec "send client setColormap Color" } + { "Heat" f.exec "send client setColormap Heat" } + { "HSV" f.exec "send client setColormap HSV" } + { "AIPS0" f.exec "send client setColormap AIPS0" } + { "Halley" f.exec "send client setColormap Halley" } + { "Ramp" f.exec "send client setColormap Ramp" } + { "Standard" f.exec "send client setColormap Standard" } + { "Staircase" f.exec "send client setColormap Staircase" } + { "Rainbow1" f.exec "send client setColormap Rainbow1" } + { "Rainbow2" f.exec "send client setColormap Rainbow2" } + { "Random8" f.exec "send client setColormap Random8" } +} + +createMenu flipMenu viewMenu { + { "Flip X" f.exec xflip } + { "Flip Y" f.exec yflip } + { "Flip XY" f.exec xyflip } +} + +set optionsMenuDescription { + { "Autoscale" f.exec { + set value [send autoscaleButton get on] + send autoscaleButton set on [expr !$value] + cpSetAutoscale + } } + { "Antialias" f.exec { + set value [send antialiasButton get on] + send antialiasButton set on [expr !$value] + cpSetAntialias + } } + { "Panner" f.exec { setPanner [expr !$panner_enable] } } + { "Magnifier" f.exec { setMagnifier [expr !$magnifier_enable] }} + { "Coords box" f.exec { setTrack [expr !$track_enable] } } + { "Tile frames" f.exec { + set value [send tileFramesButton get on] + send tileFramesButton set on [expr !$value] + cpSetTileFrames + } } + { "Clear frame" f.exec clearFrame } + { "Fit frame" f.exec fitFrame } + { "Match LUTs" f.exec cpMatchFrames } + { "Register" f.exec cpRegisterFrames } + { {$blinkId ? "Stop blink" : "Blink frames"} + f.exec toggleBlink } + { f.line } + { "Control Panel" f.exec { panel + set panel_up 1 + } } + { "Print Panel" f.exec { send print_panel map + set printP_up 1 + } } + { "Load Panel" f.exec { send client setLoadOption rescan + send load_panel map + set loadP_up 1 + } } + { "Save Panel" f.exec { send save_panel map + set saveP_up 1 + } } +}; createMenu optionsMenu optionsButton $optionsMenuDescription + + +# MAIN CONTROL PANEL +# --------------------------- + + +foreach i $frames {set saveView($i) "1 1"} + +send prevFrame set bitmap larrow +send nextFrame set bitmap rarrow +send contrastLabel set bitmap contrast +send brightnessLabel set bitmap brightness +send contrastSlider resizeThumb 0.1 1.0 +send brightnessSlider resizeThumb 0.1 1.0 + +proc controlPanelDone args { + global panel_up + send controlShell unmap + send panelButton set state 0 + set panel_up 0 +}; send doneButton addCallback controlPanelDone + +# panel -- Toggle control panel display. +proc panel args { + global panel_up + if {$panel_up} { + send controlShell unmap + send panelButton set state 0 + set panel_up 0 + } else { + send controlShell map + send panelButton set state 1 + set panel_up 1 + } +} + +# resetPanel -- Calling during startup or in an initialize, to reset things. +proc resetPanel {param old new} { + global frame nframes frames + global displayPanner displayCoords displayMagnifier + global blinkFrames warnings + + switch $new { + startup { + } + restart { foreach i $frames { + send frame$frame set on 0 + } + } + done { if {$frame} { + send frame$frame set on 1 + } + + cpResetBlink + set button 1 + foreach i $blinkFrames { + send blinkFrame$button set label $i + incr button + } + + cpResetEnhance + send pannerButton set on [true $displayPanner] + send magnifierButton set on [true $displayMagnifier] + send coordsBoxButton set on [true $displayCoords] + send warningsButton set on $warnings + } + } +}; send initialize addCallback resetPanel + + +# Frame selection. +# ------------------------------- +proc cpSetFrame {widget args} { + send $widget set on 0 + send client setFrame [send $widget get label] +} + +proc cpFrameChanged {param old new} { + if {$old > 0} { + send frame$old set on 0 + } + if {$new > 0} { + send frame$new set on 1 + } +} + +send prevFrame addCallback prevFrame +send nextFrame addCallback nextFrame +send frame addCallback cpFrameChanged +foreach i $frames {send frame$i addCallback cpSetFrame} + +# Frame buttons. +proc cpFrameAction {widget args} { + global frameZoomX frameZoomY frame + switch $widget { + aspect { set xmag $frameZoomX($frame) + set ymag $frameZoomY($frame) + set zoom [expr round (($xmag + $ymag) / 2.0)] + cpZoom $zoom $zoom fixed + } + flipX { send client flip x } + flipY { send client flip y } + flipXY { send client flip x y } + clearFrame { clearFrame } + fitFrame { fitFrame } + } +} +foreach widget {aspect flipX flipY flipXY clearFrame fitFrame} { + send $widget addCallback cpFrameAction +} + +# clearFrame -- Clear the current display frame. +proc clearFrame args { + global warnings + if {$warnings} { + Wexec client \ + "Clearing the frame will destroy\n\ + all data in the frame" \ + clearFrame + } else { + send client clearFrame + } +} + +# fitFrame -- Resize the display window to fit the frame buffer. +proc fitFrame args { + global frameWidth frameHeight winWidth winHeight + set dw [expr [send display get width] - $winWidth] + set dh [expr [send display get height] - $winHeight] + send display "resize [expr $frameWidth + $dw] [expr $frameHeight + $dh]" +}; + +proc initFitFrame { param old new } { + if { [lindex $new 0] == "resize"} { + fitFrame + } + pannerMapImage init +}; send frameFit addCallback initFitFrame + + +# Zoom and pan buttons. +# ------------------------------- +proc cpZoomAction {widget args} { + global frameWidth frameHeight + + switch $widget { + x1 { cpZoom 1 1 fixed } + + z2 { cpZoom 2 2 fixed } + z3 { cpZoom 3 3 fixed } + z4 { cpZoom 4 4 fixed } + z5 { cpZoom 5 5 fixed } + z8 { cpZoom 8 8 fixed } + + d2 { cpZoom [expr 1.0/2] [expr 1.0/2] fixed } + d3 { cpZoom [expr 1.0/3] [expr 1.0/3] fixed } + d4 { cpZoom [expr 1.0/4] [expr 1.0/4] fixed } + d5 { cpZoom [expr 1.0/5] [expr 1.0/5] fixed } + d8 { cpZoom [expr 1.0/8] [expr 1.0/8] fixed } + + zoomIn { cpZoom 2.0 2.0 relative } + zoomOut { cpZoom 0.5 0.5 relative } + + centerFrame { send client pan \ + [expr $frameWidth/2.0] \ + [expr $frameHeight/2.0] + } + + toggleZoom { toggleZoom } + } +} + +proc cpZoom {zoom_x zoom_y mode} { + global frameZoomX frameZoomY zoomindex frame + + if {$mode == "fixed"} { + send client zoom $zoom_x $zoom_y + } else { + send client zoom \ + [expr $frameZoomX($frame) * $zoom_x] \ + [expr $frameZoomY($frame) * $zoom_y] + } + + set zoomindex($frame) 0 +} + +proc toggleZoom args { + global frameZoomX frameZoomY frameCenterX frameCenterY + global frameWidth frameHeight saveView frame + + if {$frameZoomX($frame) != 1 && $frameZoomY($frame) != 1} { + set saveView($frame) \ + "$frameZoomX($frame) $frameZoomY($frame) \ + $frameCenterX($frame) $frameCenterY($frame)" + send client zoom 1 1 \ + [expr $frameWidth/2.0] \ + [expr $frameHeight/2.0] + } else { + send client zoom $saveView($frame) + } +} + +foreach widget {toggleZoom centerFrame zoomIn zoomOut \ + x1 z2 z3 z4 z5 z8 d2 d3 d4 d5 d8} { + send $widget addCallback cpZoomAction +} + +# Frame data display. +# ------------------------------- +set cpFrame 0 +set cpXcen 0 +set cpYcen 0 +set cpXmag 0 +set cpYmag 0 +set cpXscale 0 +set cpYscale 0 + +proc cpDisplayFrameData {name old new} { + global cpFrame cpXcen cpYcen + global cpXmag cpYmag cpXscale cpYscale + + set update 0 + switch $name { + frame { if {$new != $cpFrame} { + set cpFrame $new + set update 1 + } + } + frameView { # Parse the frameView input. + set xmag [lindex $new 0]; set ymag [lindex $new 1] + set xcen [lindex $new 2]; set ycen [lindex $new 3] + set xnorm [lindex $new 4]; set ynorm [lindex $new 5] + + # We need client coords and the overall scale factors. + set text [send client encodewcs $xcen $ycen] + set xcen [lindex $text 0] + set ycen [lindex $text 1] + set xscale [expr $xmag * $xnorm] + set yscale [expr $ymag * $ynorm] + + if {$xcen != $cpXcen || $ycen != $cpYcen || + $xmag != $cpXmag || $ymag != $cpYmag || + $xscale != $cpXscale || $yscale != $cpYscale} { + + set cpXcen $xcen; set cpXscale $xscale + set cpYcen $ycen; set cpYscale $yscale + set cpXmag $xmag; set cpYmag $ymag + set update 1 + } + } + } + + if {$update} { + set header [format "-- Frame %d --" $cpFrame] + set center [format "X center: %0.1f\nY center: %0.1f" $cpXcen $cpYcen] + if {int($cpXmag) >= 10} { + set zoom1 [format " X zoom: %0.1f" $cpXmag] + set zoom2 [format " Y zoom: %0.1f" $cpYmag] + } else { + set zoom1 [format "X zoom: %0.1f" $cpXmag] + set zoom2 [format "Y zoom: %0.1f" $cpYmag] + } + if {int($cpXscale) >= 10} { + set scale1 [format "X scale: %0.1f" $cpXscale] + set scale2 [format "Y scale: %0.1f" $cpYscale] + } else { + set scale1 [format "X scale: %0.2f" $cpXscale] + set scale2 [format "Y scale: %0.2f" $cpYscale] + } + send frameData set label [format "%s\n%s\n%s\n%s\n%s\n%s" \ + $header $center $scale1 $scale2 $zoom1 $zoom2] + } +}; foreach p {frame frameView} {send $p addCallback cpDisplayFrameData} + + +# Frame enhancement. +# ------------------------------- +set cpEnhanceDisable 0 +set cpEnhanceId 0 +set cpEnhanceMode none +set cpEnhanceVal 0 +set cpListItem none + +# Windowing the colormap is slow when the mouse is not in the image window, +# so it is necessary to execute the windowColormap in a work procedure. +# This allows any number of slider motion events to be processed for each +# windowColormap, preventing slider events from queueing up. + +proc cpResetEnhance args { + global cpListItem cpEnhanceId + set cpListItem none + set cpEnhanceId 0 +} + +proc cpSetEnhancement {widget cbtype x y} { + global cpEnhanceMode cpEnhanceVal cpEnhanceId cpEnhanceDisable + set cpEnhanceMode $widget + set cpEnhanceVal $x + if {!$cpEnhanceId && !$cpEnhanceDisable} { + set cpEnhanceId [postWorkProc cpEnhanceProc] + } +} +proc cpEnhanceProc args { + global cpEnhanceMode cpEnhanceVal cpEnhanceId + global enhancement frame maxContrast + set val $cpEnhanceVal + + if {$cpEnhanceMode == "contrastSlider"} { + set contrast [lindex $enhancement($frame) 2] + send client windowColormap [lindex $enhancement($frame) 1] \ + [expr (($contrast < 0) ? -$val : $val) * $maxContrast] + } else { + send client windowColormap $val + } + + set cpEnhanceId 0 + return done +} + +proc cpInvert args { + global enhancement frame + set contrast [lindex $enhancement($frame) 2] + send client windowColormap [lindex $enhancement($frame) 1] \ + [expr -1.0 * $contrast] +} + +proc cpDisplayEnhancement {param old new} { + global cpEnhanceId maxContrast cpEnhanceDisable + global cpListItem enhancement frame + + if {!$frame} \ + return + set enhance $enhancement($frame) + if {[llength $enhance] < 3} \ + return + + set colortable [lindex $enhance 0] + set offset [lindex $enhance 1] + set scale [lindex $enhance 2] + + send colordata set label [format "-- %s --\nCon %0.2f Brt %0.2f" \ + $colortable $scale $offset] + + if {$colortable != $cpListItem} { + send colorlist highlight $colortable + set cpListItem $colortable + } + + if {!$cpEnhanceId && !$cpEnhanceDisable} { + set cpEnhanceDisable 1 + send contrastSlider moveThumb [expr abs($scale) / $maxContrast] + send brightnessSlider moveThumb $offset + set cpEnhanceDisable 0 + } +} + +foreach i {enhancement frame} { + send $i addCallback cpDisplayEnhancement +} +send contrastSlider addCallback cpSetEnhancement scroll +send brightnessSlider addCallback cpSetEnhancement scroll +send invertButton addCallback cpInvert + + +# Colortable display and selection. +# ------------------------------- +set cpScrollHeight 0 + +proc cpSetColorList {param old new} { + send colorlist setList $new resize +}; send colortables addCallback cpSetColorList + +proc cpResizeScrollbar {widget cbtype flags x y w h cw ch} { + global cpScrollHeight + set newHeight [expr $ch - $h] + if {$newHeight && $newHeight != $cpScrollHeight} { + send colorlistScroll setScrollbar 0.0 [expr double($h) / $ch] + set rowHeight [send colorlist get rowHeight] + set rowSpacing [send colorlist get rowSpacing] + send colorlistScroll set increment [expr ($ch <= $h) ? 0 : \ + "double ($rowHeight + $rowSpacing) / ($ch - $h)"] + set cpScrollHeight $newHeight + } +}; send colorlistPort addCallback cpResizeScrollbar + +proc cpScrollColorlist {widget cbtype pos} { + global cpScrollHeight + send colorlist set y [expr -int($cpScrollHeight * $pos)] +}; send colorlistScroll addCallback cpScrollColorlist scroll + +proc cpSelectColor {widget cbtype selections indices} { + global colortable + foreach selection $selections { + send client setColormap $selection + } +}; send colorlist addCallback cpSelectColor + + +# Frame blink. +# ------------------------------- +send BRtext set label $blinkRate + +proc cpSetBlinkRate {widget args} { + global blinkRate + if {$widget == "BRincrease"} { + if {$blinkRate < 0.01} { + set blinkRate 0.125 + } else { + set blinkRate [expr $blinkRate * 2.0] + } + } else { + set blinkRate [expr $blinkRate / 2.0] + if {$blinkRate < 0.01} { + set blinkRate 0 + } + } + send BRtext set label $blinkRate +} +foreach widget {BRincrease BRdecrease} { + send $widget addCallback cpSetBlinkRate +} + +proc cpSetBlinkFrame {widget args} { + global blinkFrames nframes + + set frame [send $widget get label] + if {$frame == " "} { + set frame 1 + } else { + incr frame + if {$frame > $nframes} { + set frame " " + } + } + send $widget set label $frame + + set blinkFrames {} + foreach i {1 2 3 4} { + set frame [send blinkFrame$i get label] + if {$frame != " "} { + lappend blinkFrames $frame + } + } +}; foreach i $frames {send blinkFrame$i addCallback cpSetBlinkFrame} + +proc cpBlink {widget args} { + global blinkRate blinkId + + if {$blinkRate < 0.01} { + send $widget set state 0 + blink + } elseif {($blinkId != 0) != [send $widget get state]} { + toggleBlink + } +}; send blinkButton addCallback cpBlink + +proc cpResetBlink args { + global blinkRate blinkFrames blinkIndex frames + global defaultBlinkRate + + foreach i $frames { + send blinkFrame$i set label " " + } + set blinkRate $defaultBlinkRate + send BRtext set label $blinkRate + set blinkIndex 0 +}; send blinkReset addCallback cpResetBlink + +proc cpTraceBlink {name element op} { + upvar $name blinkId + send blinkButton set state [expr $blinkId != 0] +}; trace variable blinkId w cpTraceBlink + +proc cpSetBlinkFrames {param old new} { + global blinkFrames frames + set blinkFrames {} + foreach i $frames { + if {$i <= $new} { + lappend blinkFrames $i + } + } + cpResetBlink + set button 1 + foreach i $blinkFrames { + send blinkFrame$button set label $i + incr button + } +}; send nframes addCallback cpSetBlinkFrames + +proc cpRegisterFrames args { + global blinkFrames + send client registerFrames \{$blinkFrames\} +}; send registerButton addCallback cpRegisterFrames + +proc cpMatchFrames args { + global blinkFrames + send client matchFrames \{$blinkFrames\} +}; send matchButton addCallback cpMatchFrames + + +# Options buttons. +# ------------------------------- +proc cpSetPanner {widget args} { + setPanner [send $widget get on] +}; send pannerButton addCallback cpSetPanner + +proc cpTracePanner {name element op} { + upvar $name panner_enable + send pannerButton set on $panner_enable +}; trace variable panner_enable w cpTracePanner + +proc cpSetMagnifier {widget args} { + setMagnifier [send $widget get on] +}; send magnifierButton addCallback cpSetMagnifier + +proc cpTraceMagnifier {name element op} { + upvar $name magnifier_enable + send magnifierButton set on $magnifier_enable +}; trace variable magnifier_enable w cpTraceMagnifier + +proc cpSetCoordsBox {widget args} { + setTrack [send $widget get on] +}; send coordsBoxButton addCallback cpSetCoordsBox + +proc cpTraceCoordsBox {name element op} { + upvar $name track_enable + send coordsBoxButton set on $track_enable +}; trace variable track_enable w cpTraceCoordsBox + +proc cpSetWarnings args { + global warnings + set warnings [send warningsButton get on] +}; send warningsButton addCallback cpSetWarnings + +proc cpSetAutoscale args { + set value [send autoscaleButton get on] + send client setOption autoscale [expr {$value ? "True" : "False"}] +}; send autoscaleButton addCallback cpSetAutoscale + +proc cpTrackAutoscale {param old new} { + send autoscaleButton set on [true $new] +}; send autoscale addCallback cpTrackAutoscale + +proc cpSetAntialias args { + set value [send antialiasButton get on] + send client setOption antialias [expr {$value ? "True" : "False"}] +}; send antialiasButton addCallback cpSetAntialias + +proc cpTrackAntialias {param old new} { + send antialiasButton set on [true $new] +}; send antialias addCallback cpTrackAntialias + +proc cpSetTileFrames args { + global blinkFrames + set value [send tileFramesButton get on] + send client setOption tileFrames \ + [expr {$value ? "True" : "False"}] \{ $blinkFrames \} +}; send tileFramesButton addCallback cpSetTileFrames + +proc cpTrackTileFrames {param old new} { + send tileFramesButton set on [true $new] +}; send tileFrames addCallback cpTrackTileFrames + +proc tileFramesToggle args { + set value [send tileFramesButton get on] + send tileFramesButton set on [expr !$value] + cpSetTileFrames +} + + +# Warning dialog. This pops up a dialog box with the given warning message, +# and executes the given command if the user pushes OK. +# +# Usage: Wexec object message [ok_action [cancel_action]] +# +# The message text is displayed in a popup and the user hits the ok or +# cancel button to close the popup. If an action has been posted for the +# button selected then it is sent to the named object. Only one alert can +# be in effect at a time; posting another alert before the first has +# completed causes the new alert to override the first. + +set W_object "" +set W_ok_command "" +set W_cancel_command "" + +proc Wexec {object msg args} { + global W_object W_ok_command W_cancel_command + set W_object $object + set W_ok_command [lindex $args 0] + set W_cancel_command [lindex $args 1] + send warnText set label $msg + send warning map +} + +proc Wbutton {widget args} { + global W_object W_ok_command W_cancel_command + switch $widget { + warnOk { if [llength $W_ok_command] { + send $W_object $W_ok_command + } + } + warnCancel { if [llength $W_cancel_command] { + send $W_object $W_cancel_command + } + } + } + send warning unmap +}; foreach w {warnOk warnCancel} {send $w addCallback Wbutton} + +# The parameter "alert" is used to forward alerts from the client. +proc setAlert {param old new} { + Wexec client [lindex $new 0] [lindex $new 1] [lindex $new 2] +}; send alert addCallback setAlert + + +# Global control panel buttons. +# ------------------------------- +proc cpInitialize args { + send imagewin setCursorType busy + send client initialize + send imagewin setCursorType idle +} +send initializeButton addCallback cpInitialize +send normalizeButton addCallback normalize + +# Temporarily deactivate some buttons. +send optimizeButton setSensitive false + + +# INFO box. +#----------- +proc infoDone args { send info unmap } +send infoDone addCallback infoDone +proc infoClear args { send infoText set string "" } +send infoUpdate addCallback infoUpdate +send infoClear addCallback infoClear + +proc infoUpdate args { + global version frame nframes + global frameWidth frameHeight frameDepth + global enhancement + global cpXcen cpYcen + global cpXmag cpYmag cpXscale cpYscale + + if {$frame == 0} { + send infoText set string "initializing display..." + } else { + set line1 $version + set line2 [format "Image:\t\t%s" [send imageTitle get label]] + set line3 [format "Frame %d of %d:\t%d x %d" \ + $frame $nframes $frameWidth $frameHeight] + set cmap [lindex $enhancement($frame) 0] + set brt [lindex $enhancement($frame) 1] + set con [lindex $enhancement($frame) 2] + set line4 [format "Colormap:\t%s" $cmap] + set line5 [format "Enhancement:\tBrt=%s Cont=%s" $brt $con] + + set center [format "X: %0.1f\n\t\tY: %0.1f" $cpXcen $cpYcen] + set line6 [format "Center:\t\t%s" $center] + + set line7 [format "Zoom:\t\tX: %0.2f\n\t\tY: %0.2f" $cpXmag $cpYmag] + set line8 [format "Scale:\t\tX: %0.2f\n\t\tY: %0.2f" $cpXscale $cpYscale] + + send infoText set string [ + format "%s\n\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n\n" \ + $line1 $line2 $line3 $line4 $line5 $line6 $line7 $line8 + ] + } +} +foreach param { frame frameView nframes frameSize frameTitle enhancement } { + send $param addCallback infoUpdate +} + + +# Cursor positioning routines +#---------------------------- + +proc move_cursor { xstep ystep args } { + set raster 0 + send imagewin getCursorPos rx ry + send imagewin setCursorPos [expr $rx + $xstep] [expr $ry + $ystep] $raster +} + + +# Print Panel Functions. +#------------------------ +# Global variables needed for the print setup panel + +set printColor prGrayButton +set orientation epsPortButton +set page_size epsLetterButton +set imageScale 100 + +set epsWidgets { epsPageGroup epsOrientLabel epsSizeLabel + epsPortButton epsLandButton epsLetterButton epsLegalButton epsA4Button + ScaleFrame SCdecrease SCtext SCincrease +} + + +proc psetup_init args { + global printColor orientation page_size imageScale #format + + set_printer toPrinter callback 1 + send SCtext set label [ format "%d %%" $imageScale ] + send $printColor set on true + send $orientation set on true + send $page_size set on true +} + + +proc doPrintOptions { param old new } { + global imageScale page_size orientation imageScale printColor + global warnings + + send printStatus set label {} + set val [join [lrange $new 1 end] " "] + + # print [format "doPrintOptions %s = %s" [lindex $new 0] $val] + switch [lindex $new 0] { + autoscale { if { $val == "True" } { + send epsscaleButton set on true + } elseif { $val == "False" } { + send epsscaleButton set on false + } + } + autorotate { if { $val == "True" } { + send autorotateButton set on true + } elseif { $val == "False" } { + send autorotateButton set on false + } + } + maxaspect { if { $val == "True" } { + send aspectButton set on true + } elseif { $val == "False" } { + send aspectButton set on false + } + } + annotate { if { $val == "True" } { + send annotateButton set on true + } elseif { $val == "False" } { + send annotateButton set on false + } + } + compress { if { $val == "True" } { + send compressButton set on true + } elseif { $val == "False" } { + send compressButton set on false + } + } + orientation { send $orientation set on false + if { $val == "portrait" } { + send epsPortButton set on true + set orientation epsPortButton + } elseif { $val == "landscape" } { + send epsPortButton set on false + set orientation epsLandButton + } + } + papersize { send $page_size set on false + if { $val == "letter" } { + send epsLetterButton set on true + set page_size epsLetterButton + } elseif { $val == "legal" } { + send epsLegalButton set on true + set page_size epsLegalButton + } elseif { $val == "A4" } { + send epsA4Button set on true + set page_size epsA4Button + } + } + imscale { set imageScale $val + send SCtext set label [ format "%d %%" $imageScale ] + } + colortype { send $printColor set on false + if { $val == "gray" } { + send prGrayButton set on true + set printColor prGrayButton + } elseif { $val == "pseudo" } { + send prPseudoButton set on true + set printColor prPseudoButton + } elseif { $val == "rgb" } { + send prRGBButton set on true + set printColor prRGBButton + } + } + printerName { if [send toPrinter get on] { + send printlist highlight $val + } + } + printCmd { if [send toPrinter get on] { + send printcmd set string $val + } + } + printFile { if [send toFile get on] { + send printcmd set string $val + } + } + deviceType { if { $val == "Printer" } { + send printerLabel set label "Print Command:" + send toPrinter set on true + send toFile set on false + } elseif { $val == "File" } { + send printerLabel set label "File Name:" + send toPrinter set on false + send toFile set on true + send printlist unhighlight + } + } + + status { send printStatus set label $val + send server synchronize + } + warning { if {$warnings} { Wexec server $val } + } + } +}; send printOptions addCallback doPrintOptions + + +# Print options procedures. +# ------------------------------- + +set prOptsWidgets { + toPrinter toFile + prGrayButton prPseudoButton prRGBButton + epsLandButton epsPortButton + epsLetterButton epsLegalButton epsA4Button + SCincrease SCdecrease +} +set prSimpleOptions { + epsscaleButton autorotateButton aspectButton annotateButton compressButton +} + +proc prPrintCommand { widget cbtype args } { + if [send toFile get on] { + send client setPrintOption printfile $args + send printStatus set label [format "output file set to %s" $args] + } else { + send client setPrintOption printcmd $args + send printStatus set label [format "print command set to %s" $args] + } +}; send printcmd addCallback prPrintCommand + +proc prOptionToggle { widget cbtype args } { + global imageScale + + # Handle the image scale widgets first. + #print [ format "prOptionToggle %s" $widget ] + switch $widget { + SCincrease { set scale [expr $imageScale + 5] + send client setPrintOption imscale $scale + return + } + SCdecrease { set scale [ expr $imageScale - 5 ] + send client setPrintOption imscale $scale + return + } + } + + # If it's not one of those it must be one of the radio toggles. + set val [ send $widget get on ] + #print [ format "prOptionToggle %s = %s" $widget $val ] + if { $val == 1 } { + switch $widget { + toPrinter { send client setPrintOption devicetype printer } + toFile { send client setPrintOption devicetype file } + + epsLandButton { send client setPrintOption orientation landscape } + epsPortButton { send client setPrintOption orientation portrait } + + epsLetterButton { send client setPrintOption papersize letter } + epsLegalButton { send client setPrintOption papersize legal } + epsA4Button { send client setPrintOption papersize A4 } + + prGrayButton { send client setPrintOption colortype gray } + prPseudoButton { send client setPrintOption colortype pseudo } + prRGBButton { send client setPrintOption colortype rgb } + } + } else { + send $widget set on true + } + +} ; foreach w $prOptsWidgets { send $w addCallback prOptionToggle } + +proc prSimpleOptionToggle { widget args } { + set val [ send $widget get on ] + #print [ format "prSimpleOptionToggle %s = %s" $widget $val ] + + switch $widget { + epsscaleButton { send client setPrintOption autoscale $val } + autorotateButton { send client setPrintOption autorotate $val } + aspectButton { send client setPrintOption maxaspect $val } + annotateButton { send client setPrintOption annotate $val } + compressButton { send client setPrintOption compress $val } + } +} ; foreach w $prSimpleOptions { send $w addCallback prSimpleOptionToggle } + + + +# Printer display and selection. +# ------------------------------- +set psScrollHeight 0 + +proc psSetPrintList {param old new} { + send printlist setList $new resize + send printlist highlight 0 +}; send printerList addCallback psSetPrintList + +proc psResizeScrollbar {widget cbtype flags x y w h cw ch} { + global psScrollHeight + set newHeight [expr $ch - $h] + if {$newHeight && $newHeight != $psScrollHeight} { + send printlistScroll setScrollbar 0.0 [expr double($h) / $ch] + set rowHeight [send printlist get rowHeight] + set rowSpacing [send printlist get rowSpacing] + send printlistScroll set increment [expr ($ch <= $h) ? 0 : \ + "double ($rowHeight + $rowSpacing) / ($ch - $h)"] + set psScrollHeight $newHeight + } +}; send printlistPort addCallback psResizeScrollbar + +proc psScrollPrintlist {widget cbtype pos} { + global psScrollHeight + send printlist set y [expr -int($psScrollHeight * $pos)] +}; send printlistScroll addCallback psScrollPrintlist scroll + +proc psSelectPrint {widget cbtype selections indices} { + global printerlist + foreach selection $selections { + send client setPrintOption printername $selection + } +}; send printlist addCallback psSelectPrint + + +proc printQuit { args } { + send print_panel unmap +} ; send donePrint addCallback printQuit + +proc Print { args } { + global winWidth winHeight + send imagewin setCursorType busy + + # Get the print command or file template if not previous reset. + set val [ send printcmd get string ] + if [send toFile get on] { + send client setPrintOption printfile $val + } else { + send client setPrintOption printcmd $val + } + setPrintCorners 0 [expr $winWidth - 1] [expr $winHeight - 1] 0 + + send client print + send imagewin setCursorType idle +} ; send okayPrint addCallback Print + + +# setPrintCorners -- Tell the client the WCS of the image being printed. + +proc setPrintCorners { lx ly ux uy args } { + global winWidth winHeight + + # Convert raw corner screen coordinates to frame buffer raster coords. + send imagewin unmapPixel $lx $ly raster llx lly + set llx [expr "int ($llx)"] + set lly [expr "int ($lly)"] + set str [send client encodewcs $llx $lly] + scan $str "%g %g %g" llx_r lly_r z + set llx_i [expr "int ($llx_r)"] + set lly_i [expr "int ($lly_r)"] + + send imagewin unmapPixel $ux $uy raster urx ury + set urx [expr "int ($urx)"] + set ury [expr "int ($ury)"] + set str [send client encodewcs $urx $ury] + scan $str "%g %g %g" urx_r ury_r z + set urx_i [expr "int ($urx_r)"] + set ury_i [expr "int ($ury_r)"] + + send client setPrintOption corners $llx_i $lly_i $urx_i $ury_i +} + + +#-------------------------- +# Save panel functions. +#-------------------------- +# Global variables needed for the save setup panel + +set format rasButton +set saveColor svPseudoButton + +set fileFmtButtons { + rasButton gifButton jpegButton tiffButton + fitsButton x11Button pnmButton rawButton +} + + +# Format group procedures. +#--------------------------------- + +# Select a format. + +proc set_format { widget func state args } { + global format saveColor + + send $format set on false + if {$widget == $format} { + send $widget set on true + } else { + switch $widget { + rasButton { send client setSaveOption format ras } + gifButton { send client setSaveOption format gif } + jpegButton { send client setSaveOption format jpeg } + tiffButton { send client setSaveOption format tiff } + fitsButton { send client setSaveOption format fits } + x11Button { send client setSaveOption format x11 } + pnmButton { send client setSaveOption format pnm } + rawButton { send client setSaveOption format raw } + } + } +} ; foreach fmt $fileFmtButtons { send $fmt addCallback set_format } + +proc setSaveFile { widget cbtype args } { + send client setSaveOption fname $args + send saveStatus set label [format "output file set to %s" $args] +}; send saveFile addCallback setSaveFile + + +proc doSaveOptions { param old new } { + global format saveColor + global warnings + + send saveStatus set label {} + set val [join [lrange $new 1 end] " "] + + #print [format "doSaveOptions %s = %s" [lindex $new 0] $val] + switch [lindex $new 0] { + format { + # Now (de)sensitize the color options depending on the format, + # force the color choice when needed. + send $format set on false + switch [lindex $val 0] { + ras { #send svRGBButton setSensitive false + send svPseudoButton setSensitive true + set format rasButton + } + gif { send svRGBButton setSensitive false + send svPseudoButton setSensitive true + if {$saveColor == "svRGBButton"} { + send $saveColor set on false + send svPseudoButton set on true + set saveColor svPseudoButton + } + set format gifButton + } + jpeg { send svRGBButton setSensitive true + send svPseudoButton setSensitive true + set format jpegButton + } + tiff { send svRGBButton setSensitive false + send svPseudoButton setSensitive true + set format tiffButton + } + fits { send svRGBButton setSensitive false + send svPseudoButton setSensitive false + send $saveColor set on false + send svGrayButton set on true + set saveColor svGrayButton + set format fitsButton + } + x11 { send svRGBButton setSensitive true + send svPseudoButton setSensitive true + set format x11Button + } + pnm { send svRGBButton setSensitive true + send svPseudoButton setSensitive true + set format pnmButton + } + raw { send svRGBButton setSensitive true + send svPseudoButton setSensitive true + set format rawButton + } + } + send $format set on true + } + color { send $saveColor set on false + switch [lindex $val 0] { + grayscale { send svGrayButton set on true + set saveColor svGrayButton + } + pseudocolor { send svPseudoButton set on true + set saveColor svPseudoButton + } + rgb { send svRGBButton set on true + set saveColor svRGBButton + } + } + } + fname { send saveFile set string $val + } + status { send saveStatus set label $val + send server synchronize + } + text { send saveData set label $val + } + warning { if {$warnings} { Wexec server $val } + } + } +} ; send saveOptions addCallback doSaveOptions + + +# Color group procedures. +#--------------------------------- +send svGrayButton addCallback "send client setSaveOption color grayscale" +send svPseudoButton addCallback "send client setSaveOption color pseudocolor" +send svRGBButton addCallback "send client setSaveOption color rgb" + +send doneSave addCallback "send save_panel unmap" + +proc Save { args } { + send imagewin setCursorType busy + + # Get the print command or file template if not previous reset. + set val [ send saveFile get string ] + send client setSaveOption fname $val + send saveStatus set label [format "output file set to %s" $args] + + send client save + send imagewin setCursorType idle + #send save_panel unmap +} ; send okaySave addCallback Save + + +# ------------------------------------------ +# Image and objects list display and section +# ------------------------------------------ + +set load_frame 1 + +proc filesTextHighlight { widget event args } { + if { $event == "enterNotify" } { + send $widget set displayCaret True + } elseif { $event == "leaveNotify" } { + send $widget set displayCaret False + } +} +send imtemplateText addEventHandler filesTextHighlight enterWindowMask +send imtemplateText addEventHandler filesTextHighlight leaveWindowMask +send fnameText addEventHandler filesTextHighlight enterWindowMask +send fnameText addEventHandler filesTextHighlight leaveWindowMask + +send rootButton addCallback "send client setLoadOption root" +send homeButton addCallback "send client setLoadOption home" +send upButton addCallback "send client setLoadOption up" +send rescanButton addCallback "send client setLoadOption rescan" + +proc setPattern { widget mode pattern args } { + send client setLoadOption pattern $pattern +} ; send imtemplateText addCallback setPattern + +proc doLoadOptions { param old new } { + global warnings loadP_up + + set val [ join [lrange $new 1 end] " " ] + + #print [format "doLoadOptions %s = %s" [lindex $new 0] $val] + switch [lindex $new 0] { + pattern { send imtemplateText set string [format "%s" $val ] } + curdir { send dirLabel set label [format "Directory: %s" $val ] } + newfile { send fnameText set string $val + if { [ string last / $val ] < 0 } { + if { [send browseToggle get on] == 0 } { + send load_panel unmap + set loadP_up 0 + } + } + } + status { send filesStatus set label $val + if { ! $loadP_up } { send imageTitle set label $val } + send server synchronize + } + warning { if {$warnings} { Wexec server $val } } + gray { send grayToggle set on $val } + } +} ; send loadOptions addCallback doLoadOptions + +proc toggleGraymap { widget args } { + send client setLoadOption gray [ send grayToggle get on ] +} ; send grayToggle addCallback toggleGraymap + +proc fileLoad { widget mode fname args } { + global load_frame loadP_up + send imagewin setCursorType busy + send client load $fname $load_frame + set fpath [format "%s/%s" \ + [string range [send dirLabel get label] 12 end] \ + $fname ] + if { [ string last / $fname ] < 0 && [ file isfile $fpath] == 1 } { + if { [send browseToggle get on] == 0 } { + send load_panel unmap + set loadP_up 0 + } + } + send imagewin setCursorType idle +} ; send fnameText addCallback fileLoad + + +set imlistScrollheight 0 + +proc setFileList {param old new} { + send imageList setList $new resize +}; send filelist addCallback setFileList + +proc flresizeScrollbar { widget cbtype flags x y w h cw ch } { + global imlistScrollheight + set newheight [expr $ch - $h] + if { $newheight != $imlistScrollheight } { + send imlistScrollbar setScrollbar 0.0 [expr double($h) / $ch] + set imlistScrollheight $newheight + } +} ; send imlistPorthole addCallback flresizeScrollbar + +proc flscrollList { widget cbtype pos } { + global imlistScrollheight + send imageList set y [expr -int($imlistScrollheight * $pos)] +} ; send imlistScrollbar addCallback flscrollList scroll + +proc flSelectPrint {widget cbtype selections args} { + global load_frame loadP_up + foreach selection $selections { + send client load $selection $load_frame + if { [ string last / $selection ] < 0 } { + if { [send browseToggle get on] == 0 } { + send load_panel unmap + set loadP_up 0 + } + } + } +}; send imageList addCallback flSelectPrint + +proc fileSetFrame {widget args} { + global nframes load_frame + + set frame [send $widget get label] + if {$frame == $nframes} { + set frame 1 + } else { + incr frame + } + send $widget set label $frame + set load_frame $frame +}; send frameFrame addCallback fileSetFrame + +proc fileLoadB args { + global load_frame loadP_up + send imagewin setCursorType busy + set fname [send fnameText get string] + if {$fname == ""} { + Wexec client "No image name specified" + } else { + send client load $fname $load_frame + set fpath [format "%s/%s" \ + [string range [send dirLabel get label] 12 end] \ + $fname ] + if { [ string last / $fname ] < 0 && [ file isfile $fpath] == 1 } { + if { [send browseToggle get on] == 0 } { + send load_panel unmap + set loadP_up 0 + } + } + send imagewin setCursorType idle + } +} ; send filesLoadButton addCallback fileLoadB + +proc fileQuit args { + send load_panel unmap + set loadP_up 0 +} ; send filesCloseButton addCallback fileQuit + + +# More Panel toggles + +proc infoPanel args { + global infoP_up + if {$infoP_up} { + send info unmap + set infoP_up 0 + } else { + send info map + set infoP_up 1 + } +} + +proc pannerPanel args { + global panner_enable + setPanner [expr !$panner_enable] +} + +proc magnifierPanel args { + global magnifier_enable + setMagnifier [expr !$magnifier_enable] +} + +proc wcsPanel args { + global track_enable + setTrack [expr !$track_enable] +} + +proc loadPanel args { + global loadP_up + if {$loadP_up} { + send load_panel unmap + set loadP_up 0 + } else { + send client setLoadOption rescan + send load_panel map + set loadP_up 1 + } +} + +proc savePanel args { + global saveP_up + if {$saveP_up} { + send save_panel unmap + set saveP_up 0 + } else { + send save_panel map + set saveP_up 1 + } +} + +proc printPanel args { + global printP_up + if {$printP_up} { + send print_panel unmap + set printP_up 0 + } else { + send print_panel map + set printP_up 1 + } +} + + +#------------------------------------ +# Define procedure for the help panel +#------------------------------------ + +# Help Panel Bitmaps +#------------------- +createBitmap iraf_logo 45 45 { +0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xff, 0xff, 0xff, +0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0xff, +0xff, 0x3f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0xff, 0xff, 0xff, +0xff, 0x3f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc0, 0xff, 0xff, 0xff, +0xff, 0x3f, 0x80, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x80, 0xfc, 0xff, 0xff, +0xff, 0x3f, 0x84, 0xf8, 0xff, 0xff, 0xff, 0x1f, 0x84, 0xf4, 0xff, 0xff, +0xff, 0x1b, 0x04, 0x09, 0x00, 0xfc, 0xff, 0x11, 0x04, 0x11, 0xf8, 0xff, +0x7f, 0x10, 0x04, 0x21, 0xc0, 0xff, 0x1f, 0x10, 0x04, 0x41, 0xf0, 0xff, +0x00, 0x18, 0x04, 0x01, 0xe0, 0xff, 0x00, 0x18, 0x00, 0x81, 0xc0, 0xff, +0x00, 0x08, 0x00, 0x01, 0xe0, 0xff, 0x07, 0x08, 0x00, 0x01, 0xf1, 0xff, +0x1f, 0x08, 0x80, 0x21, 0xf0, 0xff, 0xff, 0x08, 0xc0, 0x41, 0xf4, 0xff, +0xff, 0x08, 0xc0, 0x41, 0xf8, 0xff, 0xff, 0x09, 0xc0, 0xc1, 0xf0, 0xff, +0xff, 0x0b, 0x80, 0xc1, 0xf1, 0xff, 0xff, 0x07, 0x80, 0x81, 0xe1, 0xff, +0xff, 0x07, 0x80, 0x01, 0xc1, 0xff, 0xff, 0x07, 0x00, 0x01, 0xc0, 0xff, +0xff, 0x07, 0xc2, 0x05, 0x81, 0xff, 0xff, 0x07, 0xf2, 0x07, 0x81, 0xff, +0xff, 0x07, 0xf2, 0x17, 0x03, 0xff, 0xff, 0x03, 0xfa, 0x7f, 0x02, 0xfe, +0xff, 0x03, 0xfe, 0xff, 0x02, 0xfe, 0xff, 0x03, 0xfe, 0xff, 0x03, 0xfc, +0xff, 0x03, 0xff, 0xff, 0x07, 0xfc, 0xff, 0x83, 0xff, 0xff, 0x0f, 0xf8, +0xff, 0xc1, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xe1, 0xff, 0xff, 0x7f, 0xf8, +0xff, 0xf1, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xe0, +0xff, 0xf8, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xe7, +0xff, 0xfc, 0xff, 0xff, 0xff, 0xef}; send helpIRAFLogo "set bitmap iraf_logo" + +createBitmap noao_logo 45 45 { +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0xff, 0xff, +0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, +0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, +0xff, 0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, +0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, +0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0xff, 0xff, +0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, +0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, +0xff, 0xff, 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0xff, 0xff, +0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, +0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xf0, 0xff, 0xff, +0xff, 0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xe0, 0xff, 0xff, +0xff, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xc0, 0xff, 0xff, +0xff, 0x1f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, +0xff, 0x0f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, +0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, +0xff, 0x01, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfc, 0xff, +0xff, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0xf8, 0xff, +0x7f, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xf0, 0xff, +0x3f, 0x00, 0x00, 0x00, 0xe0, 0xff}; send helpNOAOLogo "set bitmap noao_logo" + +# Stuff for keeping track of visited anchors. +set links { 0 } +set linkIndex 0 +set visited(0) empty + +send helpInfo1 set label $version + +proc Help args { + global helpP_up + if {$helpP_up == 0} { + send client help + } else { + send help_panel unmap + set helpP_up 0 + } +} + +proc helpPanel args { + global helpP_up + if {$helpP_up} { + send help_panel unmap + set helpP_up 0 + } else { + send help_panel map + set helpP_up 1 + } +} + +proc helpQuit args { + global helpP_up + send help_panel unmap + set helpP_up 0 + send helpButton set state 0 + send helpText setText "" +}; send helpClose addCallback helpQuit + +proc getHelpText { param old new } { + send helpText setText $new + helpPanel +}; send help addCallback getHelpText + +proc anchorSelected {widget cbtype event text href args} { + global visited links linkIndex + set anchID [send helpText anchorToId $href] + set visited($href) 1 + if {$linkIndex == 0} { + send helpBack set sensitive True + if {[lindex $links 1] != $anchID} { + set links { 0 } + send helpForward set sensitive False + } + } + if {$linkIndex > 0 && [lindex $links [expr $linkIndex + 1]] != $anchID} { + set links [lrange $links 0 $linkIndex] + } + if {[lindex $links [expr $linkIndex + 1]] != $anchID} { + lappend links $anchID + incr linkIndex + } else { + send helpForward set sensitive False + incr linkIndex + } + if {$linkIndex == [expr [llength $links] - 1]} { + send helpForward set sensitive False + } + send helpText gotoId $anchID + send helpText retestAnchors +}; send helpText addCallback anchorSelected anchor + +proc testAnchor {widget cbtype href} { + global visited + return [info exists visited($href)] +}; send helpText addCallback testAnchor testAnchor + + +# Callbacks to position forwards and backwards in link list. +proc hlpForward args { + global links linkIndex + incr linkIndex + if {$linkIndex <= [llength $links]} { + set anchID [lindex $links $linkIndex] + send helpText gotoId $anchID + send helpText retestAnchors + if {$linkIndex == [expr [llength $links] - 1]} { + send helpForward set sensitive False + send helpBack set sensitive True + } else { + send helpBack set sensitive True + } + } else { + incr linkIndex -1 + } +}; send helpForward addCallback hlpForward + +proc hlpBack args { + global links linkIndex + incr linkIndex -1 + if {$linkIndex >= 0} { + set anchID [lindex $links $linkIndex] + send helpText gotoId $anchID + send helpText retestAnchors + if {$linkIndex == 0} { send helpBack set sensitive False } + if {$linkIndex >= 0} { send helpForward set sensitive True } + } else { + incr linkIndex 1 + } +}; send helpBack addCallback hlpBack + +proc hlpHome args { + global links linkIndex + set links { 0 } + set linkIndex 0 + send helpText gotoId 0 + send helpForward set sensitive False + send helpBack set sensitive False +}; send helpHome addCallback hlpHome + + + +#------------------------------------ +# Define some TCL debug procedures. +#------------------------------------ + +set tclP_up 0 + +proc tclCommandClear {widget args} { send tclEntry set string "" } +proc tclCommandExecute {widget args} { send server [send tclEntry {get string}] +} +proc tclCommand {widget mode command args} { send server $command } +proc tclClose {widget args} { send tclShell unmap } +proc tclOpen { args } { + global tclP_up + send tclShell map + set tclP_up 1 +} + +proc tclPanel args { + global tclP_up + if {$tclP_up} { + send tclShell unmap + set tclP_up 0 + } else { + send tclShell map + set tclP_up 1 + } +} + +send tclClear addCallback tclCommandClear +send tclExecute addCallback tclCommandExecute +send tclEntry addCallback tclCommand +send tclcloseButton addCallback tclClose + |