home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1999 mARCH
/
PCWK3A99.iso
/
Linux
/
DDD331
/
DDD-3_1_.000
/
DDD-3_1_
/
ddd-3.1.1
/
ddd
/
print.C
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-29
|
27KB
|
1,031 lines
// $Id: print.C,v 1.48 1998/11/29 16:42:53 zeller Exp $ -*- C++ -*-
// Printing dialog
// Copyright (C) 1996-1998 Technische Universitaet Braunschweig, Germany.
// Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
//
// This file is part of DDD.
//
// DDD is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// DDD is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with DDD -- see the file COPYING.
// If not, write to the Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// DDD is the data display debugger.
// For details, see the DDD World-Wide-Web page,
// `http://www.cs.tu-bs.de/softech/ddd/',
// or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
char print_rcsid[] =
"$Id: print.C,v 1.48 1998/11/29 16:42:53 zeller Exp $";
#ifdef __GNUG__
#pragma implementation
#endif
#include "print.h"
#include "AppData.h"
#include "DataDisp.h"
#include "DestroyCB.h"
#include "DispGraph.h"
#include "GraphEdit.h"
#include "Graph.h"
#include "LiterateA.h"
#include "TimeOut.h"
#include "Command.h"
#include "cook.h"
#include "cwd.h"
#include "file.h"
#include "filetype.h"
#include "post.h"
#include "regexps.h"
#include "status.h"
#include "string-fun.h"
#include "verify.h"
#include "wm.h"
#include "charsets.h"
#include "MakeMenu.h"
#include "LessTifH.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <fstream.h>
#include <string.h> // strerror()
#include <errno.h>
#include <unistd.h>
#include <Xm/Xm.h>
#include <Xm/ToggleB.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include <Xm/SelectioB.h>
#include <Xm/MessageB.h>
#include <Xm/Text.h>
#include <Xm/TextF.h>
#include <Xm/PushB.h>
#include <Xm/FileSB.h>
#ifndef R_OK
/* 3b2 doesn't define these according to jthomas@nmsu.edu. */
#define R_OK 04
#define W_OK 02
#endif
//-----------------------------------------------------------------------------
// Printing Dialog
//-----------------------------------------------------------------------------
static string msg(string path, bool displays, bool to_file)
{
string m = "Printing ";
if (displays)
m += "graph ";
else
m += "plots ";
if (to_file)
m += "to ";
m += quote(path);
if (!to_file)
m += " to printer";
return m;
}
// Print to FILENAME according to given PrintGC
static int print_to_file(string filename, PrintGC& gc,
bool selectedOnly, bool displays)
{
string path = filename;
if (!filename.contains('/', 0))
path.prepend(cwd() + '/');
StatusDelay delay(msg(path, displays, true));
// Get the graph
Graph *_graph = graphEditGetGraph(data_disp->graph_edit);
DispGraph *graph = ptr_cast(DispGraph, _graph);
if (graph->firstNode() == 0)
{
post_error("No displays to print.", "print_empty_graph_error",
data_disp->graph_edit);
delay.outcome = "failed";
return -1;
}
// Get and set the GC
GraphGC graphGC = graphEditGetGraphGC(data_disp->graph_edit);
graphGC.printGC = &gc;
graphGC.printSelectedNodesOnly = selectedOnly;
ofstream os(filename);
if (os.bad())
{
FILE *fp = fopen(filename, "w");
post_error(string("Cannot open ")
+ quote(filename) + ": " + strerror(errno),
"print_failed_error", data_disp->graph_edit);
if (fp)
fclose(fp);
delay.outcome = strerror(errno);
return -1;
}
if (displays)
{
// Print displays
graph->print(os, graphGC);
}
else
{
// Print plots
os.close();
graph->print_plots(filename, graphGC);
}
return 0;
}
static void deletePrintAgent(XtPointer client_data, XtIntervalId *)
{
// Delete agent after use
Agent *edit_agent = (Agent *)client_data;
delete edit_agent;
}
static void unlinkPrintFile(XtPointer client_data, XtIntervalId *)
{
// Delete temp file after use
string *tempfile = (string *)client_data;
unlink(*tempfile);
delete tempfile;
}
static string output_buffer;
static void printDoneHP(Agent *print_agent, void *client_data, void *)
{
// Don't get called again
print_agent->removeAllHandlers(InputEOF);
print_agent->removeAllHandlers(Died);
// Printing is done: remove temporary file
XtAppAddTimeOut(XtWidgetToApplicationContext(gdb_w), 0, deletePrintAgent,
XtPointer(print_agent));
XtAppAddTimeOut(XtWidgetToApplicationContext(gdb_w), 0, unlinkPrintFile,
XtPointer(client_data));
if (output_buffer != "")
set_status("");
}
static void printOutputHP(Agent *, void *, void *call_data)
{
DataLength *input = (DataLength *)call_data;
output_buffer += string(input->data, input->length);
while (output_buffer.contains('\n'))
{
set_status(output_buffer.before('\n'));
output_buffer = output_buffer.after('\n');
}
if (output_buffer != "")
set_status(output_buffer);
}
// Print according to given PrintGC
static int print_to_printer(string command, PrintGC& gc,
bool selectedOnly, bool displays)
{
string tempfile = tmpnam(0);
int ret = print_to_file(tempfile, gc, selectedOnly, displays);
if (ret)
return ret;
StatusDelay delay(msg(tempfile, displays, false));
command = command + " " + tempfile;
LiterateAgent *print_agent =
new LiterateAgent(XtWidgetToApplicationContext(gdb_w), command);
output_buffer = "";
string *sp = new string(tempfile);
print_agent->removeAllHandlers(Died);
print_agent->addHandler(InputEOF, printDoneHP, (void *)sp);
print_agent->addHandler(Died, printDoneHP, (void *)sp);
print_agent->addHandler(Input, printOutputHP);
print_agent->addHandler(Error, printOutputHP);
print_agent->start();
return 0;
}
// Local state of print dialog
enum PrintType { PRINT_POSTSCRIPT, PRINT_FIG };
enum PrintTarget { TARGET_FILE, TARGET_PRINTER };
static bool print_selected_only = false;
static bool print_displays = true;
static bool print_target = TARGET_PRINTER;
static PostScriptPrintGC print_postscript_gc;
static FigPrintGC print_xfig_gc;
static PrintType print_type = PRINT_POSTSCRIPT;
static Widget print_dialog = 0;
static Widget print_command_field = 0;
static Widget print_file_name_field = 0;
static Widget print_file_name_box = 0;
static Widget paper_size_dialog = 0;
static Widget a4_paper_size;
static Widget a3_paper_size;
static Widget letter_paper_size;
static Widget legal_paper_size;
static Widget executive_paper_size;
static Widget custom_paper_size;
// Go and print according to local state
void PrintAgainCB(Widget w, XtPointer client_data, XtPointer)
{
const bool unmanage = ((int)(long)client_data & 1);
const bool override = ((int)(long)client_data & 2);
switch (print_target)
{
case TARGET_PRINTER:
{
static string command;
command = app_data.print_command;
if (print_command_field != 0)
{
String c = XmTextFieldGetString(print_command_field);
command = c;
XtFree(c);
}
app_data.print_command = command;
if (print_to_printer(command, print_postscript_gc,
print_selected_only, print_displays) == 0)
{
if (unmanage && print_dialog != 0)
XtUnmanageChild(print_dialog);
}
break;
}
case TARGET_FILE:
{
PrintGC *gc_ptr = 0;
switch (print_type)
{
case PRINT_POSTSCRIPT:
gc_ptr = &print_postscript_gc;
break;
case PRINT_FIG:
gc_ptr = &print_xfig_gc;
break;
}
PrintGC& gc = *gc_ptr;
String file = XmTextFieldGetString(print_file_name_field);
string f = file;
XtFree(file);
strip_trailing_space(f);
if (f == "")
return;
if (access(f, W_OK) || !is_regular_file(f) || override)
{
// File does not exist, is special, or override is on
if (print_to_file(f, gc, print_selected_only, print_displays) == 0)
{
if (unmanage && print_dialog != 0)
XtUnmanageChild(print_dialog);
}
}
else
{
// File exists - request confirmation
static Widget confirm_overwrite_dialog = 0;
if (confirm_overwrite_dialog)
DestroyWhenIdle(confirm_overwrite_dialog);
confirm_overwrite_dialog =
verify(XmCreateQuestionDialog(find_shell(w),
"confirm_overwrite_dialog",
NULL, 0));
Delay::register_shell(confirm_overwrite_dialog);
XtAddCallback(confirm_overwrite_dialog,
XmNokCallback, PrintAgainCB,
XtPointer((int)(long)client_data | 2));
XtAddCallback(confirm_overwrite_dialog,
XmNhelpCallback, ImmediateHelpCB, 0);
MString question = rm("Overwrite existing file "
+ quote(f) + "?");
XtVaSetValues (confirm_overwrite_dialog, XmNmessageString,
question.xmstring(), NULL);
manage_and_raise(confirm_overwrite_dialog);
}
break;
}
}
}
static string suffix(PrintType print_type)
{
switch (print_type)
{
case PRINT_POSTSCRIPT:
return ".ps";
case PRINT_FIG:
return ".fig";
}
return "";
}
static void set_print_file_name(const string& name)
{
XmTextFieldSetString(print_file_name_field, (String)name);
XmTextPosition last_pos =
XmTextFieldGetLastPosition(print_file_name_field);
XmTextFieldSetInsertionPosition(print_file_name_field, last_pos);
XmTextFieldShowPosition(print_file_name_field, 0);
XmTextFieldShowPosition(print_file_name_field, last_pos);
}
static void SetPrintTypeCB(Widget w, XtPointer client_data, XtPointer)
{
if (!XmToggleButtonGetState(w))
return;
string old_suffix = suffix(print_type);
print_type = PrintType((int)(long)client_data);
string new_suffix = suffix(print_type);
String file_name_s = XmTextFieldGetString(print_file_name_field);
string file_name(file_name_s);
XtFree(file_name_s);
if (file_name.contains(old_suffix, -1))
{
int idx = file_name.index(old_suffix, -1);
file_name = file_name.before(idx) + new_suffix;
set_print_file_name(file_name);
}
}
static void SetSensitiveCB(Widget w, XtPointer client_data, XtPointer)
{
if (XmToggleButtonGetState(w))
set_sensitive(Widget(client_data), True);
}
static void TakeFocusCB(Widget w, XtPointer client_data, XtPointer)
{
if (XmToggleButtonGetState(w))
XmProcessTraversal(Widget(client_data), XmTRAVERSE_CURRENT);
}
static void UnsetSensitiveCB(Widget w, XtPointer client_data, XtPointer)
{
if (XmToggleButtonGetState(w))
set_sensitive(Widget(client_data), False);
}
static void SetPrintDisplaysCB(Widget w, XtPointer, XtPointer)
{
print_displays = XmToggleButtonGetState(w);
}
static void SetPrintSelectedNodesCB(Widget w, XtPointer, XtPointer)
{
print_selected_only = XmToggleButtonGetState(w);
}
static void SetPrintTargetCB(Widget w, XtPointer, XtPointer)
{
print_target = XmToggleButtonGetState(w) ? TARGET_PRINTER : TARGET_FILE;
}
static void set_paper_size_string(string s)
{
Widget text = XmSelectionBoxGetChild(paper_size_dialog, XmDIALOG_TEXT);
XmTextSetString(text, s);
static string current_paper_size;
current_paper_size = s;
app_data.paper_size = current_paper_size;
}
static void SetGCColorCB(Widget w, XtPointer, XtPointer)
{
print_postscript_gc.color = XmToggleButtonGetState(w);
}
static void SetGCA3(Widget w, XtPointer, XtPointer)
{
if (XmToggleButtonGetState(w))
{
PostScriptPrintGC a4;
print_postscript_gc.hsize = a4.vsize;
print_postscript_gc.vsize = a4.hsize * 2;
set_paper_size_string("297mm x 420mm");
}
}
static void SetGCA4(Widget w, XtPointer, XtPointer)
{
if (XmToggleButtonGetState(w))
{
PostScriptPrintGC a4;
print_postscript_gc.hsize = a4.hsize;
print_postscript_gc.vsize = a4.vsize;
set_paper_size_string("210mm x 297mm");
}
}
static void SetGCLetter(Widget w, XtPointer, XtPointer)
{
PostScriptPrintGC gc;
if (XmToggleButtonGetState(w))
{
print_postscript_gc.hsize = 72 * 8 + 72 / 2 - gc.hoffset * 2;
print_postscript_gc.vsize = 72 * 11 - gc.voffset * 2;
set_paper_size_string("8.5in x 11in");
}
}
static void SetGCLegal(Widget w, XtPointer, XtPointer)
{
PostScriptPrintGC gc;
if (XmToggleButtonGetState(w))
{
print_postscript_gc.hsize = 72 * 8 + 72 / 2 - gc.hoffset * 2;
print_postscript_gc.vsize = 72 * 14 - gc.voffset * 2;
set_paper_size_string("8.5in x 14in");
}
}
static void SetGCExecutive(Widget w, XtPointer, XtPointer)
{
PostScriptPrintGC gc;
if (XmToggleButtonGetState(w))
{
print_postscript_gc.hsize = 72 * 7 + 72 / 2 - gc.hoffset * 2;
print_postscript_gc.vsize = 72 * 10 - gc.voffset * 2;
set_paper_size_string("7.5in x 10in");
}
}
// Convert single unit to points
static int points(string s)
{
int points = 0;
while (s != "")
{
char *start = s;
char *tailptr;
double value = strtod(start, &tailptr);
int value_len = (int)(tailptr - start);
if (value_len == 0)
{
// No size
return -1;
}
s = s.from(value_len);
// Read unit
string unit = s;
if (unit.contains(rxdouble))
unit = unit.before(rxdouble);
strip_space(unit);
unit.downcase();
if (unit.contains("es", -1))
unit = unit.before("es");
if (unit.contains("s", -1))
unit = unit.before("s");
double factor = 0.0;
if (unit == "point" || unit == "pt")
factor = 1.0;
else if (unit == "inch" || unit == "in" || unit == "\"")
factor = 72.0;
else if (unit == "foot" || unit == "feet"
|| unit == "ft" || unit == "\'")
factor = 72.0 * 12;
else if (unit == "yard" || unit == "yd")
factor = 72.0 * 12 * 3;
else if (unit == "mile" || unit == "mi")
factor = 72.0 * 12 * 5280;
else if (unit == "mm" || unit == "millimeter")
factor = 72.0 * 1/2.54 * 1/10;
else if (unit == "cm" || unit == "centimeter")
factor = 72.0 * 1/2.54;
else if (unit == "m" || unit == "meter")
factor = 72.0 * 1/2.54 * 100;
else if (unit == "km" || unit == "kilometer")
factor = 72.0 * 1/2.54 * 100000;
else if (unit == "parsec") // ;-)
factor = 72.0 * 1/2.54 * 100000 * 3.085678e+13;
else
{
// Invalid unit
return -1;
}
if (s.contains(rxdouble))
s = s.from(rxdouble);
else
s = "";
if (double(points) + factor * value > double(INT_MAX))
{
// Too large
return -1;
}
points += int(factor * value);
}
if (points <= 0)
{
// Too small
return -1;
}
return points;
}
inline bool near(int i, int j)
{
return abs(i - j) <= 2;
}
static void get_paper_size(string s, int& hsize, int& vsize)
{
char delim = '\0';
if (s.contains('\327')) // \327 is the times symbol
delim = '\327';
else if (s.contains('x'))
delim = 'x';
else if (s.contains('X'))
delim = 'X';
if (delim == '\0')
{
// Bad spec
hsize = -1;
vsize = -1;
return;
}
string s_hsize = s.before(delim);
string s_vsize = s.after(delim);
hsize = points(s_hsize);
vsize = points(s_vsize);
}
static bool set_paper_size(string s)
{
int hsize, vsize;
get_paper_size(s, hsize, vsize);
if (hsize <= 0 || vsize <= 0)
return false; // Error
PostScriptPrintGC gc;
print_postscript_gc.hsize = hsize - gc.hoffset * 2;
print_postscript_gc.vsize = vsize - gc.voffset * 2;
if (near(hsize, 594) && near(vsize, 840))
XmToggleButtonSetState(a4_paper_size, True, True);
else if (near(hsize, 840) && near(vsize, 1188))
XmToggleButtonSetState(a3_paper_size, True, True);
else if (hsize == 72 * 8 + 72 / 2 && vsize == 72 * 11)
XmToggleButtonSetState(letter_paper_size, True, True);
else if (hsize == 72 * 8 + 72 / 2 && vsize == 72 * 14)
XmToggleButtonSetState(legal_paper_size, True, True);
else if (hsize == 72 * 7 + 72 / 2 && vsize == 72 * 10)
XmToggleButtonSetState(executive_paper_size, True, True);
else
{
XmToggleButtonSetState(a4_paper_size, False, False);
XmToggleButtonSetState(a3_paper_size, False, False);
XmToggleButtonSetState(letter_paper_size, False, False);
XmToggleButtonSetState(legal_paper_size, False, False);
XmToggleButtonSetState(executive_paper_size, False, False);
XmToggleButtonSetState(custom_paper_size, True, False);
}
set_paper_size_string(s);
return true;
}
static void SetPaperSizeCB(Widget w, XtPointer, XtPointer call_data)
{
XmFileSelectionBoxCallbackStruct *cbs =
(XmFileSelectionBoxCallbackStruct *)call_data;
string s = "";
char *value = 0;
if (XmStringGetLtoR(cbs->value, MSTRING_DEFAULT_CHARSET, &value)
&& value != 0)
{
s = value;
XtFree(value);
}
int ok = true;
if (s != "")
ok = set_paper_size(s);
if (ok)
XtUnmanageChild(w);
}
static void CheckPaperSizeCB(Widget text, XtPointer client_data, XtPointer)
{
Widget ok_button = Widget(client_data);
String value;
XtVaGetValues(text, XmNvalue, &value, NULL);
string size(value);
XtFree(value);
int hsize, vsize;
get_paper_size(size, hsize, vsize);
set_sensitive(ok_button, hsize >= 0 && vsize >= 0);
}
static void ResetPaperSizeCB(Widget w, XtPointer, XtPointer)
{
set_paper_size(app_data.paper_size);
XtUnmanageChild(w);
}
static void SetGCCustom(Widget w, XtPointer, XtPointer)
{
if (!XmToggleButtonGetState(w))
return;
manage_and_raise(paper_size_dialog);
}
static void SetGCOrientation(Widget w, XtPointer, XtPointer)
{
if (XmToggleButtonGetState(w))
print_postscript_gc.orientation = PostScriptPrintGC::PORTRAIT;
else
print_postscript_gc.orientation = PostScriptPrintGC::LANDSCAPE;
}
static void NopCB(Widget, XtPointer, XtPointer)
{}
static void SetPrintFileNameCB(Widget w,
XtPointer client_data,
XtPointer call_data)
{
string target = get_file(w, client_data, call_data);
if (target != "")
{
set_print_file_name(target);
XtUnmanageChild(w);
}
}
static void BrowseNameCB(Widget w, XtPointer, XtPointer)
{
Delay delay;
static Widget dialog = 0;
static MString pattern;
String file = XmTextFieldGetString(print_file_name_field);
string f = file;
XtFree(file);
if (f.contains('.'))
pattern = "*" + f.from('.', -1);
else
{
switch (print_type)
{
case PRINT_POSTSCRIPT:
pattern = "*.ps";
break;
case PRINT_FIG:
pattern = "*.fig";
break;
}
}
Arg args[10];
Cardinal arg = 0;
if (dialog == 0)
{
XtSetArg(args[arg], XmNpattern, pattern.xmstring()); arg++;
dialog =
verify(XmCreateFileSelectionDialog(find_shell(w),
"browse_print", args, arg));
Delay::register_shell(dialog);
XtAddCallback(dialog, XmNokCallback, SetPrintFileNameCB, 0);
XtAddCallback(dialog, XmNcancelCallback, UnmanageThisCB,
XtPointer(dialog));
XtAddCallback(dialog, XmNhelpCallback, ImmediateHelpCB, XtPointer(0));
}
else
{
XtSetArg(args[arg], XmNpattern, pattern.xmstring()); arg++;
XtSetValues(dialog, args, arg);
}
manage_and_raise(dialog);
}
static void PrintCB(Widget parent, bool displays)
{
print_displays = displays;
static Widget print_displays_w;
static Widget print_plots_w;
static Widget print_selected_w;
if (print_dialog != 0)
{
// Dialog already created -- pop it up again
XmToggleButtonSetState(print_plots_w, !displays, True);
XmToggleButtonSetState(print_displays_w, displays, True);
XmToggleButtonSetState(print_selected_w,
data_disp->have_selection(), True);
manage_and_raise(print_dialog);
return;
}
Arg args[10];
Cardinal arg = 0;
XtSetArg(args[arg], XmNautoUnmanage, False); arg++;
print_dialog =
verify(XmCreatePromptDialog(find_shell(parent), "print", args, arg));
Delay::register_shell(print_dialog);
if (lesstif_version <= 79)
XtUnmanageChild(XmSelectionBoxGetChild(print_dialog,
XmDIALOG_APPLY_BUTTON));
XtAddCallback(print_dialog, XmNokCallback,
PrintAgainCB, XtPointer(1));
XtAddCallback(print_dialog, XmNapplyCallback,
PrintAgainCB, XtPointer(0));
XtAddCallback(print_dialog, XmNcancelCallback,
UnmanageThisCB, XtPointer(print_dialog));
XtAddCallback(print_dialog, XmNhelpCallback,
ImmediateHelpCB, XtPointer(0));
// Remove old prompt
XtUnmanageChild(XmSelectionBoxGetChild(print_dialog, XmDIALOG_TEXT));
XtUnmanageChild(XmSelectionBoxGetChild(print_dialog,
XmDIALOG_SELECTION_LABEL));
// Create menu
static Widget print_to_printer_w;
static Widget print_to_file_w;
static MMDesc print_to_menu[] =
{
{"printer", MMToggle,
{ SetPrintTargetCB, 0 }, NULL, &print_to_printer_w, 0, 0},
{"file", MMToggle, { NopCB, 0 }, NULL, &print_to_file_w, 0, 0 },
MMEnd
};
static Widget postscript_w;
static Widget fig_w;
static MMDesc type2_menu[] =
{
{"postscript", MMToggle,
{ SetPrintTypeCB, XtPointer(PRINT_POSTSCRIPT) },
0, &postscript_w, 0, 0 },
{"xfig", MMToggle,
{ SetPrintTypeCB, XtPointer(PRINT_FIG) }, 0, &fig_w, 0, 0},
MMEnd
};
static Widget print_color_w;
static MMDesc type_menu[] =
{
{"type2", MMRadioPanel | MMUnmanagedLabel,
MMNoCB, type2_menu, 0, 0, 0 },
{"color", MMToggle, { SetGCColorCB, 0 },
NULL, &print_color_w, 0, 0 },
MMEnd
};
static MMDesc what2_menu[] =
{
{"displays", MMToggle, { SetPrintDisplaysCB, 0 }, NULL,
&print_displays_w, 0, 0 },
{"plots", MMToggle, { NopCB, 0 }, NULL, &print_plots_w, 0, 0 },
MMEnd
};
static MMDesc what_menu[] =
{
{"what2", MMRadioPanel | MMUnmanagedLabel,
MMNoCB, what2_menu, 0, 0, 0 },
{"selected", MMToggle, { SetPrintSelectedNodesCB, 0 },
NULL, &print_selected_w, 0, 0 },
MMEnd
};
static Widget print_portrait_w;
static MMDesc orientation_menu[] =
{
{"portrait", MMToggle,
{ SetGCOrientation, 0 }, NULL, &print_portrait_w, 0, 0},
{"landscape", MMToggle, { NopCB, 0 }, 0, 0, 0, 0},
MMEnd
};
static MMDesc paper_menu[] =
{
{"a4", MMToggle,
{SetGCA4, 0}, NULL, &a4_paper_size, 0, 0},
{"a3", MMToggle,
{SetGCA3, 0}, NULL, &a3_paper_size, 0, 0},
{"letter", MMToggle,
{SetGCLetter, 0}, NULL, &letter_paper_size, 0, 0},
{"legal", MMToggle,
{SetGCLegal, 0}, NULL, &legal_paper_size, 0, 0},
{"executive", MMToggle,
{SetGCExecutive, 0}, NULL, &executive_paper_size, 0, 0},
{"custom", MMToggle,
{SetGCCustom, 0}, NULL, &custom_paper_size, 0, 0},
MMEnd
};
static MMDesc name_menu[] =
{
{"name", MMTextField | MMUnmanagedLabel, MMNoCB,
0, &print_file_name_field, 0, 0},
{"browse", MMPush, { BrowseNameCB, 0 }, 0, 0, 0, 0 },
MMEnd
};
static MMDesc menu[] =
{
{"to", MMRadioPanel, MMNoCB, print_to_menu, 0, 0, 0 },
{"command", MMTextField, MMNoCB, 0, &print_command_field, 0, 0 },
{"name", MMPanel, MMNoCB, name_menu,
&print_file_name_box, 0, 0},
MMSep,
{"type", MMPanel, MMNoCB, type_menu, 0, 0, 0 },
{"what", MMPanel, MMNoCB, what_menu, 0, 0, 0 },
{"orientation", MMRadioPanel, MMNoCB, orientation_menu, 0, 0, 0 },
{"size", MMRadioPanel, MMNoCB, paper_menu, 0, 0, 0 },
MMEnd
};
Widget panel = MMcreatePanel(print_dialog, "options", menu);
(void) panel; // Use it
MMadjustPanel(menu);
// Add callbacks
MMaddCallbacks(menu);
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
SetSensitiveCB, XtPointer(print_command_field));
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
SetSensitiveCB, XtPointer(menu[1].label));
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
UnsetSensitiveCB, XtPointer(print_file_name_box));
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
UnsetSensitiveCB, XtPointer(menu[2].label));
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
UnsetSensitiveCB, XtPointer(postscript_w));
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
UnsetSensitiveCB, XtPointer(fig_w));
XtAddCallback(print_to_printer_w, XmNvalueChangedCallback,
TakeFocusCB, XtPointer(print_command_field));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
UnsetSensitiveCB, XtPointer(print_command_field));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
UnsetSensitiveCB, XtPointer(menu[1].label));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
SetSensitiveCB, XtPointer(print_file_name_box));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
SetSensitiveCB, XtPointer(menu[2].label));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
SetSensitiveCB, XtPointer(postscript_w));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
SetSensitiveCB, XtPointer(fig_w));
XtAddCallback(print_to_file_w, XmNvalueChangedCallback,
TakeFocusCB, XtPointer(print_file_name_field));
// Create size dialog
arg = 0;
XtSetArg(args[arg], XmNautoUnmanage, False); arg++;
paper_size_dialog =
verify(XmCreatePromptDialog(find_shell(parent), "paper_size_dialog",
args, arg));
Delay::register_shell(paper_size_dialog);
if (lesstif_version <= 79)
XtUnmanageChild(XmSelectionBoxGetChild(paper_size_dialog,
XmDIALOG_APPLY_BUTTON));
XtAddCallback(paper_size_dialog, XmNokCallback,
SetPaperSizeCB, XtPointer(0));
XtAddCallback(paper_size_dialog, XmNcancelCallback,
ResetPaperSizeCB, XtPointer(0));
XtAddCallback(paper_size_dialog, XmNhelpCallback,
ImmediateHelpCB, XtPointer(0));
Widget size = XmSelectionBoxGetChild(paper_size_dialog,
XmDIALOG_TEXT);
Widget ok_button = XmSelectionBoxGetChild(paper_size_dialog,
XmDIALOG_OK_BUTTON);
XtAddCallback(size, XmNvalueChangedCallback,
CheckPaperSizeCB, XtPointer(ok_button));
// Set initial state
XmToggleButtonSetState(print_to_printer_w, True, True);
XmToggleButtonSetState(postscript_w, True, True);
XmToggleButtonSetState(print_color_w, False, True);
XmToggleButtonSetState(print_selected_w, False, True);
XmToggleButtonSetState(print_portrait_w, True, True);
XmToggleButtonSetState(print_plots_w, !displays, True);
XmToggleButtonSetState(print_displays_w, displays, True);
XmToggleButtonSetState(print_selected_w,
data_disp->have_selection(), True);
bool ok = set_paper_size(app_data.paper_size);
if (!ok)
XmToggleButtonSetState(a4_paper_size, True, True);
string command = string(app_data.print_command) + " ";
XmTextFieldSetString(print_command_field, command);
// Gofer it!
manage_and_raise(print_dialog);
}
void PrintGraphCB(Widget w, XtPointer, XtPointer)
{
PrintCB(w, true);
}
void PrintPlotCB(Widget w, XtPointer, XtPointer)
{
PrintCB(w, false);
}