Ignore:
Timestamp:
05/09/05 10:15:41 (20 years ago)
Author:
tbretz
Message:
*** empty log message ***
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/Mars/mbase/MStatusDisplay.cc

    r7000 r7001  
    3333// To write gif files of C-Macros use SaveAsGif()/SaveAsPNG() or SaveAsC().
    3434// Direct printing to the default printer (via lpr) can be done by
    35 // PrintToLpr().
     35// PrintPS().
    3636//
    3737// It has also to half status lines which can be used to display the status
     
    6464
    6565#include <TH1.h>                  // TH1::AddDirectory
     66#include <TPDF.h>                 // TPDF
     67#include <TSVG.h>                 // TSVG
    6668#include <TEnv.h>                 // TEnv
    6769#include <TLine.h>                // TLine
     
    7476#include <TDatime.h>              // TDatime
    7577#include <TRandom.h>              // TRandom
     78#include <TRegexp.h>              // TRegexp
    7679#include <TThread.h>              // TThread::Self()
    7780#include <TBrowser.h>             // TBrowser
     
    8083#include <TMethodCall.h>          // TMethodCall
    8184
    82 //#include <TRint.h>                // gApplication, TRint::Class()
    8385#include <TInterpreter.h>         // gInterpreter
    8486
     
    9294#include <TGFileDialog.h>         // TGFileDialog
    9395#include <TGProgressBar.h>        // TGHProgressBar
     96#include <TGTextEditDialogs.h>    // TGPrintDialog
    9497#include <TRootEmbeddedCanvas.h>  // TRootEmbeddedCanvas
    9598
     
    245248    //
    246249    MGPopupMenu *filemenu = new MGPopupMenu(gClient->GetRoot());
    247     // filemenu->AddEntry("Save &As...", kFileSaveAs);
    248     filemenu->AddEntry("New Can&vas",   kFileCanvas);
    249     filemenu->AddEntry("New &Browser",  kFileBrowser);
     250    filemenu->AddEntry("New &Canvas",       kFileCanvas);
     251    filemenu->AddEntry("New &Browser",      kFileBrowser);
    250252    filemenu->AddSeparator();
    251     filemenu->AddEntry("Save status.&ps",   kFileSaveAsPS);
    252     filemenu->AddEntry("Save status.&png",  kFileSaveAsPNG);
    253     filemenu->AddEntry("Save status.&gif",  kFileSaveAsGIF);
    254     filemenu->AddEntry("Save status.&jpg",  kFileSaveAsJPG);
    255     filemenu->AddEntry("Save status.&xpm",  kFileSaveAsXPM);
    256     filemenu->AddEntry("Save status.&C",    kFileSaveAsC);
    257     filemenu->AddEntry("Save status.&root", kFileSaveAsRoot);
     253
     254    const TString fname(MString::Form("Save %s.", gROOT->GetName()));
     255    MGPopupMenu *savemenu = new MGPopupMenu(gClient->GetRoot());
     256    savemenu->AddEntry(MString::Form("%s&ps",  fname.Data()),  kFileSaveAsPS);
     257    savemenu->AddEntry(MString::Form("%sp&df", fname.Data()),  kFileSaveAsPDF);
     258    savemenu->AddEntry(MString::Form("%s&svg", fname.Data()),  kFileSaveAsSVG);
     259    savemenu->AddSeparator();
     260    savemenu->AddEntry(MString::Form("%sp&ng", fname.Data()),  kFileSaveAsPNG);
     261    savemenu->AddEntry(MString::Form("%s&gif", fname.Data()),  kFileSaveAsGIF);
     262    savemenu->AddEntry(MString::Form("%s&jpg", fname.Data()),  kFileSaveAsJPG);
     263    savemenu->AddEntry(MString::Form("%s&xpm", fname.Data()),  kFileSaveAsXPM);
     264    //savemenu->AddEntry("Save status.x&cf",  kFileSaveAsXCF);
     265    //savemenu->AddEntry("Save status.&tiff", kFileSaveAsTIFF);
     266    //savemenu->AddEntry("Save status.&bmp",  kFileSaveAsBMP);
     267    savemenu->AddSeparator();
     268    savemenu->AddEntry(MString::Form("%s&C",    fname.Data()), kFileSaveAsC);
     269    savemenu->AddEntry(MString::Form("%s&root", fname.Data()), kFileSaveAsRoot);
     270    savemenu->Associate(this);
     271
     272    filemenu->AddEntry("&Open...",          kFileOpen);
     273    filemenu->AddPopup("&Save", savemenu);
     274    filemenu->AddEntry("Save &As...",       kFileSaveAs);
    258275    filemenu->AddSeparator();
    259     filemenu->AddEntry("&Open...",             kFileOpen);
    260     filemenu->AddEntry("Save &As...",          kFileSaveAs);
     276    filemenu->AddEntry("&Reset",            kFileReset);
    261277    filemenu->AddSeparator();
    262     filemenu->AddEntry("Re&set",               kFileReset);
     278    filemenu->AddEntry("&Print",            kFilePrint);
    263279    filemenu->AddSeparator();
    264     filemenu->AddEntry("Print with &lpr",      kFilePrint);
    265     //filemenu->AddEntry("Set printer &name",    kFilePrinterName);
    266     filemenu->AddSeparator();
    267     filemenu->AddEntry("C&lose", kFileClose);
    268     filemenu->AddEntry("E&xit", kFileExit);
     280    filemenu->AddEntry("C&lose",            kFileClose);
     281    filemenu->AddEntry("E&xit",             kFileExit);
    269282    filemenu->Associate(this);
    270283
     
    273286    //
    274287    MGPopupMenu *tabmenu = new MGPopupMenu(gClient->GetRoot());
    275     tabmenu->AddEntry("Next [&+]",           kTabNext);
    276     tabmenu->AddEntry("Previous [&-]",       kTabPrevious);
     288    tabmenu->AddEntry("Next [&+]",          kTabNext);
     289    tabmenu->AddEntry("Previous [&-]",      kTabPrevious);
    277290    tabmenu->AddSeparator();
    278     tabmenu->AddEntry("Save tab-i.&ps",   kTabSaveAsPS);
    279     tabmenu->AddEntry("Save tab-i.&png",  kTabSaveAsPNG);
    280     tabmenu->AddEntry("Save tab-i.&gif",  kTabSaveAsGIF);
    281     tabmenu->AddEntry("Save tab-i.&jpg",  kTabSaveAsJPG);
    282     tabmenu->AddEntry("Save tab-i.&xpm",  kTabSaveAsXPM);
    283     tabmenu->AddEntry("Save tab-i.&C",    kTabSaveAsC);
    284     tabmenu->AddEntry("Save tab-i.&root", kTabSaveAsRoot);
     291
     292    const TString fname2(MString::Form("Save %s-i.", gROOT->GetName()));
     293    MGPopupMenu *savemenu2 = new MGPopupMenu(gClient->GetRoot());
     294    savemenu2->AddEntry(MString::Form("%s&ps",  fname2.Data()),  kTabSaveAsPS);
     295    savemenu2->AddEntry(MString::Form("%sp&df", fname2.Data()),  kTabSaveAsPDF);
     296    savemenu2->AddEntry(MString::Form("%s&svg", fname2.Data()),  kTabSaveAsSVG);
     297    savemenu2->AddSeparator();
     298    savemenu2->AddEntry(MString::Form("%sp&ng", fname2.Data()),  kTabSaveAsPNG);
     299    savemenu2->AddEntry(MString::Form("%s&gif", fname2.Data()),  kTabSaveAsGIF);
     300    savemenu2->AddEntry(MString::Form("%s&jpg", fname2.Data()),  kTabSaveAsJPG);
     301    savemenu2->AddEntry(MString::Form("%s&xpm", fname2.Data()),  kTabSaveAsXPM);
     302    //savemenu->AddEntry("Save status.x&cf",  kFileSaveAsXCF);
     303    //savemenu->AddEntry("Save status.&tiff", kFileSaveAsTIFF);
     304    //savemenu->AddEntry("Save status.&bmp",  kFileSaveAsBMP);
     305    savemenu2->AddSeparator();
     306    savemenu2->AddEntry(MString::Form("%s&C",    fname2.Data()), kTabSaveAsC);
     307    savemenu2->AddEntry(MString::Form("%s&root", fname2.Data()), kTabSaveAsRoot);
     308    savemenu2->Associate(this);
     309
     310    tabmenu->AddPopup("&Save", savemenu2);
     311    tabmenu->AddEntry("Save tab &As...",    kTabSaveAs);
    285312    tabmenu->AddSeparator();
    286     tabmenu->AddEntry("Save tab &As...",         kTabSaveAs);
     313    tabmenu->AddEntry("&Remove",            kTabRemove);
    287314    tabmenu->AddSeparator();
    288     tabmenu->AddEntry("Re&move",             kTabRemove);
    289     tabmenu->AddSeparator();
    290     tabmenu->AddEntry("Print with &lpr",     kTabPrint);
     315    tabmenu->AddEntry("&Print",             kTabPrint);
    291316    tabmenu->Associate(this);
    292317
     
    326351    logmenu->AddEntry("&Save",          kLogSave);
    327352    logmenu->AddEntry("Save &append",   kLogAppend);
     353    logmenu->AddSeparator();
     354    logmenu->AddEntry("&Print",         kLogPrint);
    328355    logmenu->Associate(this);
    329356
     
    355382    // Add everything to autodel list
    356383    //
     384    fList->Add(savemenu);
     385    fList->Add(savemenu2);
    357386    fList->Add(filemenu);
    358387    fList->Add(loopmenu);
     
    10851114}
    10861115
     1116TString MStatusDisplay::PrintDialog(TString &p, TString &c, TString &t, const char *ext)
     1117{
     1118    // If not in batch mode open a user dialog
     1119    if (!gROOT->IsBatch())
     1120    {
     1121        char *cprinter = StrDup(p);
     1122        char *ccmd     = StrDup(c);
     1123
     1124        Int_t rc=0;
     1125        new TGPrintDialog(fClient->GetRoot(), this, 400, 150, &cprinter, &ccmd, &rc);
     1126        if (rc)
     1127        {
     1128            p = cprinter; // default has been changed
     1129            c = ccmd;
     1130        }
     1131
     1132        delete [] cprinter;
     1133        delete [] ccmd;
     1134
     1135        if (!rc)
     1136            return "";
     1137    }
     1138
     1139
     1140    if (c.Contains("%f") && ext)
     1141    {
     1142        // Get temporary file name
     1143        TString name = "mars";
     1144
     1145        FILE *f = gSystem->TempFileName(name, t);
     1146        if (!f)
     1147        {
     1148            *fLog << warn << "MStatusDisplay::PrintDialog: Couldn't create temporary file in " << t << endl;
     1149            SetStatusLine2("failed!");
     1150            return "";
     1151        }
     1152        fclose(f);
     1153
     1154        // remove temp file
     1155        gSystem->Unlink(name);
     1156        name += ".";
     1157        name += ext;
     1158
     1159        t = name;
     1160    }
     1161
     1162    // compile command
     1163    TString cmd(c);
     1164
     1165    // if sprinter.IsNull we assume that everything around %p can
     1166    // be omitted and the program uses some kind of default
     1167    if (p.IsNull())
     1168    {
     1169        TString sub;
     1170        while (1)
     1171        {
     1172            sub = TString(cmd(TRegexp(" .*%p.* "))).Strip(TString::kBoth);
     1173            if (sub.IsNull())
     1174                break;
     1175
     1176            cmd.ReplaceAll(sub, "");
     1177        }
     1178    }
     1179
     1180    cmd.ReplaceAll("%p", p);
     1181    cmd.ReplaceAll("%f", t);
     1182
     1183    return cmd;
     1184}
     1185
    10871186// --------------------------------------------------------------------------
    10881187//
    10891188// Saves the given canvas (pad) or all pads (num<0) as a temporary
    1090 // postscript file and prints it using 'lpr'. If a printer name is set
    1091 // via SetPrinter 'lpr -Pname' is used.
    1092 //
    1093 Int_t MStatusDisplay::PrintToLpr(Int_t num)
    1094 {
    1095     TString name = "mars";
    1096 
    1097     for (int i=0; i<6; i++)
    1098         name += (char)(gRandom->Uniform(25)+65);
    1099 
    1100     name += ".ps";
    1101 
    1102     const Int_t pages = SaveAsPS(num, name);
    1103 
     1189// postscript file and prints it.
     1190//
     1191// The default command line c is: lpr -P%p %f
     1192//   %p: printer name
     1193//   %f: temporary file name
     1194//
     1195// The default printer name p is: <empty>
     1196//
     1197// Both can be changed in .rootrc by:
     1198//   PrintPS.Printer
     1199//   PrintPS.Command
     1200//
     1201// Ant the location of the temporary file t can by changed by
     1202//   Print.Directory
     1203// the default is the system default directory (normally /tmp)
     1204//
     1205Int_t MStatusDisplay::PrintPS(Int_t num, const char *p, const char *c, const char *t)
     1206{
     1207    static TString sprinter = gEnv->GetValue("PrintPS.Printer", p&&*p?p:"");
     1208    static TString scmd     = gEnv->GetValue("PrintPS.Command", c&&*c?c:"lpr -P%p %f");
     1209
     1210    TString tmp = gEnv->GetValue("Print.Directory", t&&*t?t:gSystem->TempDirectory());
     1211
     1212    TString cmd = PrintDialog(sprinter, scmd, tmp, "ps");
     1213    if (cmd.IsNull())
     1214        return 0;
     1215
     1216    // set status lines
    11041217    SetStatusLine1("Printing...");
    11051218    SetStatusLine2("");
    11061219
     1220    // print to temporary file
     1221    const Int_t pages = SaveAsPS(num, tmp);
     1222
     1223    // check
    11071224    if (!pages)
    11081225    {
    1109         *fLog << warn << "MStatusDisplay::PrintToLpr: Sorry, couldn't save file as temporary postscript!" << endl;
     1226        *fLog << warn << "MStatusDisplay::Print: Sorry, couldn't save file as temporary postscript!" << endl;
    11101227        SetStatusLine2("Failed!");
    11111228        return 0;
    11121229    }
    11131230
    1114     TString cmd="lpr ";
    1115     if (!fPrinter.IsNull())
    1116     {
    1117         cmd += "-P";
    1118         cmd += fPrinter;
    1119         cmd += " ";
    1120     }
    1121     cmd += name;
    1122 
     1231    // execute command
     1232    *fLog << dbg << "Executing: " << cmd << endl;
    11231233    gSystem->Exec(cmd);
    1124     gSystem->Unlink(name);
     1234
     1235    // remove temporary file
     1236    gSystem->Unlink(tmp);
    11251237
    11261238    SetStatusLine2(MString::Form("Done (%dpage(s))", pages));
     
    12261338}
    12271339
     1340Bool_t MStatusDisplay::SaveLogAsPS(const char *n) const
     1341{
     1342    TString name(n);
     1343    AddExtension(name, "ps");
     1344
     1345    // Code taken from TGTextEdit::Print
     1346    const TString pipe = MString::Form("a2ps -o%s", name.Data());
     1347    FILE *p = gSystem->OpenPipe(pipe, "w");
     1348    if (!p)
     1349    {
     1350        *fLog << err << "ERROR - Couldn't open pipe " << pipe << endl;
     1351        return kFALSE;
     1352    }
     1353
     1354    TGText *text = fLogBox->GetText();
     1355
     1356    char   *buf1, *buf2;
     1357    Long_t  len;
     1358    ULong_t i = 0;
     1359    TGLongPosition pos;
     1360
     1361    pos.fX = pos.fY = 0;
     1362    while (pos.fY < text->RowCount())
     1363    {
     1364        len = text->GetLineLength(pos.fY);
     1365        buf1 = text->GetLine(pos, len);
     1366        buf2 = new char[len + 2];
     1367        strncpy(buf2, buf1, (UInt_t)len);
     1368        buf2[len]   = '\n';
     1369        buf2[len+1] = '\0';
     1370        while (buf2[i] != '\0') {
     1371            if (buf2[i] == '\t') {
     1372                ULong_t j = i+1;
     1373                while (buf2[j] == 16 && buf2[j] != '\0')
     1374                    j++;
     1375                strcpy(buf2+i+1, buf2+j);
     1376            }
     1377            i++;
     1378        }
     1379        fwrite(buf2, sizeof(char), strlen(buf2)+1, p);
     1380
     1381        delete [] buf1;
     1382        delete [] buf2;
     1383        pos.fY++;
     1384    }
     1385    gSystem->ClosePipe(p);
     1386    return kTRUE;
     1387}
     1388
     1389// --------------------------------------------------------------------------
     1390//
     1391// Print the log text.
     1392//
     1393// The default command line c is: a2ps -P%p
     1394//   %p: printer name
     1395//
     1396// The default printer name p is: <empty>
     1397//
     1398// Both can be changed in .rootrc by:
     1399//   PrintText.Printer
     1400//   PrintText.Command
     1401//
     1402Bool_t MStatusDisplay::PrintLog(const char *p, const char *c)
     1403{
     1404    static TString sprinter = gEnv->GetValue("PrintText.Printer", p&&*p?p:"");
     1405    static TString scmd     = gEnv->GetValue("PrintText.Command", c&&*c?c:"a2ps -P%p");
     1406
     1407    TString tmp;
     1408    TString cmd = PrintDialog(sprinter, scmd, tmp);
     1409    if (cmd.IsNull())
     1410        return kFALSE;
     1411
     1412    // set status lines
     1413    SetStatusLine1("Printing...");
     1414    SetStatusLine2("");
     1415
     1416    // print to temporary file
     1417    if (!SaveLogAsPS(cmd))
     1418    {
     1419        *fLog << warn << "MStatusDisplay::PrintLog: Sorry, couldn't create postscript!" << endl;
     1420        SetStatusLine2("Failed!");
     1421        return kFALSE;
     1422    }
     1423
     1424    // execute command
     1425    *fLog << dbg << "Executing: " << cmd << endl;
     1426    gSystem->Exec(cmd);
     1427
     1428    SetStatusLine2("Done.");
     1429
     1430    return kTRUE;
     1431}
     1432
    12281433// --------------------------------------------------------------------------
    12291434//
     
    12671472        return kTRUE;
    12681473
     1474    case kFileSaveAsPDF:
     1475        SaveAsPDF();
     1476        return kTRUE;
     1477
     1478    case kFileSaveAsSVG:
     1479        SaveAsSVG();
     1480        return kTRUE;
     1481
    12691482    case kFileSaveAsPNG:
    12701483        SaveAsPNG();
     
    12831496        return kTRUE;
    12841497
     1498    //case kFileSaveAsXCF:
     1499    //    SaveAsXCF();
     1500    //    return kTRUE;
     1501
     1502    //case kFileSaveAsTIFF:
     1503    //    SaveAsTIFF();
     1504    //    return kTRUE;
     1505
     1506    //case kFileSaveAsBMP:
     1507    //    SaveAsBMP();
     1508    //    return kTRUE;
     1509
    12851510    case kFileSaveAsC:
    12861511        SaveAsC();
     
    12921517
    12931518    case kFilePrint:
    1294         PrintToLpr();
     1519        PrintPS();
    12951520        return kTRUE;
    12961521
     
    13031528        return kTRUE;
    13041529
     1530    case kTabSaveAsPDF:
     1531        SaveAsPDF(fTab->GetCurrent());
     1532        return kTRUE;
     1533
     1534    case kTabSaveAsSVG:
     1535        SaveAsSVG(fTab->GetCurrent());
     1536        return kTRUE;
     1537
    13051538    case kTabSaveAsPNG:
    13061539        SaveAsPNG(fTab->GetCurrent());
     
    13191552        return kTRUE;
    13201553
     1554    //case kTabSaveAsXCF:
     1555    //    SaveAsXCF(fTab->GetCurrent());
     1556    //    return kTRUE;
     1557
     1558    //case kTabSaveAsBMP:
     1559    //    SaveAsBMP(fTab->GetCurrent());
     1560    //    return kTRUE;
     1561
     1562    //case kTabSaveAsTIFF:
     1563    //    SaveAsTIFF(fTab->GetCurrent());
     1564    //    return kTRUE;
     1565
    13211566    case kTabSaveAsC:
    13221567        SaveAsC(fTab->GetCurrent());
     
    13281573
    13291574    case kTabPrint:
    1330         PrintToLpr(fTab->GetCurrent());
     1575        PrintPS(fTab->GetCurrent());
    13311576        return kTRUE;
    13321577
     
    13861631        SetStatusLine2("");
    13871632        *fLog << inf << "Saving log... " << flush;
    1388         if (fLogBox->GetText()->Save("statusdisplay.log"))
     1633        if (fLogBox->GetText()->Save(MString::Form("%s.log", gROOT->GetName())))
    13891634        {
    13901635            *fLog << "done." << endl;
     
    14021647        SetStatusLine2("");
    14031648        *fLog << inf << "Appending log... " << flush;
    1404         if (fLogBox->GetText()->Append("statusdisplay.log"))
     1649        if (fLogBox->GetText()->Append(MString::Form("%s.log", gROOT->GetName())))
    14051650        {
    14061651            *fLog << "done." << endl;
     
    14121657            SetStatusLine2("Failed!");
    14131658        }
     1659        return kTRUE;
     1660
     1661    case kLogPrint:
     1662        PrintLog();
    14141663        return kTRUE;
    14151664#ifdef DEBUG
     
    19732222    if (name.IsNull())
    19742223    {
    1975         name = "status";
     2224        name = gROOT->GetName();
    19762225        if (num>0)
    19772226        {
     
    20422291    gSystem->Unlink(name);
    20432292    gSystem->Rename(name+".$$$", name);
    2044 /*
    2045     //
    2046     // Old style algorithm. Shifts blocks inside a single file --- SLOW!
    2047     //
    2048     const Int_t l = newstr.Length();
    2049 
    2050     Long_t t[4]; // { id, size, flags, modtime }
    2051     gSystem->GetPathInfo(name, t, t+1, t+2, t+3);
    2052 
    2053     char *c[2] = { new char[l], new char[l] };
    2054 
    2055     fstream f(name, ios::in|ios::out);
    2056 
    2057     TString str;
    2058     f >> str >> c[0][0];     // Read "%!PS-Adobe-2.0\n" (Mini Header)
    2059     f.read(c[0], l);
    2060     f.seekp(-l, ios::cur);
    2061     f.write(newstr, l);
    2062 
    2063     int i=0;
    2064     while (1)
    2065     {
    2066         f.read(c[(i+1)%2], l);
    2067         f.seekp(-l, ios::cur);
    2068 
    2069         if (f)
    2070         {
    2071             f.write(c[i%2],l);
    2072             i++;
    2073             i%=2;
    2074             continue;
    2075         }
    2076 
    2077         const Int_t ssz   = str.Length()+1;        // Length of Mini-Header
    2078         const Int_t block = t[1]-ssz;              // Length of block to be shifted
    2079         const Int_t size  = block%l;               // Reminder
    2080         const Int_t pos   = (block/l)*l + ssz + 1; // Position to start writing
    2081 
    2082         f.clear();
    2083         f.seekp(pos);
    2084         f.write(c[i%2], l);
    2085         f.write(c[(i+1)%2], size);
    2086         break;
    2087     }
    2088 
    2089     delete c[1];
    2090     delete c[0];
    2091 */
    2092 }
    2093 
    2094 // --------------------------------------------------------------------------
    2095 //
    2096 // In case of num<0 all tabs are written into the PS file. If num>0
     2293}
     2294
     2295void MStatusDisplay::PSToolsRange(TVirtualPS &vps, Float_t psw, Float_t psh) const
     2296{
     2297    if (vps.InheritsFrom(TPostScript::Class()))
     2298        static_cast<TPostScript&>(vps).Range(psw, psh);
     2299    // if (vps.InheritsFrom(TPDF::Class()))
     2300    //     static_cast<TPDF&>(vps).Range(psw/2, psh/2);
     2301    // if (vps.InheritsFrom(TSVG::Class()))
     2302    //     static_cast<TSVG&>(vps).Range(psw, psh);
     2303}
     2304
     2305void MStatusDisplay::PSToolsTextNDC(TVirtualPS &vps, Double_t u, Double_t v, const char *string) const
     2306{
     2307    if (vps.InheritsFrom(TPostScript::Class()))
     2308        static_cast<TPostScript&>(vps).TextNDC(u, v, string);
     2309    // if (vps.InheritsFrom(TPDF::Class()))
     2310    //    static_cast<TPDF&>(vps).TextNDC(u, v, string);
     2311    // if (vps.InheritsFrom(TSVG::Class()))
     2312    //    static_cast<TSVG&>(vps).TextNDC(u, v, string);
     2313}
     2314
     2315// --------------------------------------------------------------------------
     2316//
     2317// Write some VGF (vector graphics format). Currently PS, PDF and SVG
     2318// is available. Specified by ext.
     2319//
     2320// In case of num<0 all tabs are written into the VGF file. If num>0
    20972321// the canvas in the corresponding tab is written to the file.
    20982322// Name is the name of the file (with or without extension).
     
    21002324// Returns the number of pages written.
    21012325//
    2102 // To write all tabs you can also use SaveAsPS(name)
     2326// To write all tabs you can also use SaveAsVGF(name, ext)
    21032327//
    21042328// If the third argument is given a bottom line is drawn with the text
     
    21062330// fTitle (SetTitle) is not empty.
    21072331//
    2108 Int_t MStatusDisplay::SaveAsPS(Int_t num, TString name, const TString addon)
    2109 {
    2110     SetStatusLine1("Writing Postscript file...");
     2332Int_t MStatusDisplay::SaveAsVGF(Int_t num, TString name, const TString addon, const TString ext)
     2333{
     2334    SetStatusLine1(Form("Writing %s file...",ext.Data()));
    21112335    SetStatusLine2("");
    21122336
     
    21172341    }
    21182342
    2119     AddExtension(name, "ps", num);
     2343    AddExtension(name, ext, num);
    21202344
    21212345    if (num<0)
    2122         *fLog << inf << "Open ps-File: " << name << endl;
     2346        *fLog << inf << "Open " << ext << "-File: " << name << endl;
    21232347
    21242348    TPad       *padsav = (TPad*)gPad;
     
    21272351    TDatime d;
    21282352
    2129     TPostScript ps(name, 112);
    2130     ps.SetBit(TPad::kPrintingPS);
    2131     ps.PrintFast(13, "/nan {1} def ");
    2132 
    2133     gVirtualPS = &ps;
     2353    Int_t type = -1;
     2354
     2355    TVirtualPS *ps =0;
     2356    if (!ext.CompareTo("ps", TString::kIgnoreCase))
     2357    {
     2358        ps = new TPostScript(name, 112);
     2359        type = 1;
     2360    }
     2361    if (!ext.CompareTo("pdf", TString::kIgnoreCase))
     2362    {
     2363        ps = new TPDF(name, 112);
     2364        type = 2;
     2365    }
     2366    if (!ext.CompareTo("svg", TString::kIgnoreCase))
     2367    {
     2368        ps = new TSVG(name, 112);
     2369        type = 3;
     2370    }
     2371
     2372    if (!ps)
     2373    {
     2374        *fLog << err << "Extension " << ext << " unknown..." << endl;
     2375        SetStatusLine2("Failed!");
     2376        return 0;
     2377    }
     2378
     2379    ps->SetBit(TPad::kPrintingPS);
     2380    if (type==1)
     2381        ps->PrintFast(13, "/nan {1} def ");
     2382
     2383    gVirtualPS = ps;
    21342384
    21352385    //
     
    21702420        // has the same Aspect Ratio than on the screen.
    21712421        //
    2172         ps.NewPage();
     2422        if (i>from)
     2423            ps->NewPage();
    21732424
    21742425        //
     
    21762427        // such that the page title can be set above the canvas...
    21772428        //
    2178         Float_t psw = 28.0; // A4 - width (29.7)
     2429        Float_t psw = 28.0; // A4 - width  (29.7)
    21792430        Float_t psh = 21.0; // A4 - height (21.0)
    21802431
     
    21872438            psh = ch/cw*psw;
    21882439
    2189         ps.Range(psw, psh); // A4
     2440        PSToolsRange(*ps, psw, psh);
    21902441
    21912442        //
     
    22192470        // Print overlaying text (NDC = %)
    22202471        //
    2221         ps.SetTextColor(kBlack);
    2222         ps.SetTextSize(0.015);
    2223         ps.SetTextFont(22);
    2224         ps.SetTextAlign(11); // left top
    2225         ps.TextNDC(0, 1.015, TString("  ")+n->GetName());
    2226         ps.SetTextAlign(21); // cent top
    2227         ps.TextNDC(0.5, 1.015, TString("MARS - Magic Analysis and Reconstruction Software - ")+d.AsString());
    2228         ps.SetTextAlign(31); // right top
    2229         ps.TextNDC(1, 1.015, MString::Form("Page No.%i (%i)  ", page++, i));
     2472        ps->SetTextColor(kBlack);
     2473        ps->SetTextSize(0.015);
     2474        ps->SetTextFont(22);
     2475        ps->SetTextAlign(11); // left top
     2476        PSToolsTextNDC(*ps, 0, 1.015, TString("  ")+n->GetName());
     2477        ps->SetTextAlign(21); // cent top
     2478        PSToolsTextNDC(*ps, 0.5, 1.015, TString("MARS - Magic Analysis and Reconstruction Software - ")+d.AsString());
     2479        ps->SetTextAlign(31); // right top
     2480        PSToolsTextNDC(*ps, 1, 1.015, MString::Form("Page No.%i (%i)  ", page++, i));
    22302481        line.PaintLineNDC(0, 1.01, 1, 1.01);
    22312482
     
    22342485        {
    22352486            line.PaintLineNDC(0, -0.00, 1, -0.00);
    2236             ps.SetTextAlign(11); // left top
    2237             ps.TextNDC(0, -0.015, TString("  ")+txt);
    2238             ps.SetTextAlign(31); // right top
    2239             ps.TextNDC(1, -0.015, "(c) 2000-2004, Thomas Bretz  ");
     2487            ps->SetTextAlign(11); // left top
     2488            PSToolsTextNDC(*ps, 0, -0.015, TString("  ")+txt);
     2489            ps->SetTextAlign(31); // right top
     2490            PSToolsTextNDC(*ps, 1, -0.015, "(c) 2000-2005, Thomas Bretz  ");
    22402491        }
    22412492
     
    22502501    l.Delete();
    22512502
    2252     ps.Close();
    2253 
    2254     SetStatusLine2("Updating header of PS file...");
    2255 
    2256     if (num<0)
    2257         *fLog << " - Updating header of PS file... " << flush;
    2258     UpdatePSHeader(name);
    2259     if (num<0)
    2260         *fLog << inf << "done." << endl;
     2503    ps->Close();
     2504    delete ps;
     2505
     2506    if (type==1)
     2507    {
     2508        SetStatusLine2("Updating header of PS file...");
     2509
     2510        if (num<0)
     2511            *fLog << " - Updating header of PS file... " << flush;
     2512        UpdatePSHeader(name);
     2513        if (num<0)
     2514            *fLog << inf << "done." << endl;
     2515    }
    22612516
    22622517    gVirtualPS = psave;
     
    22742529Bool_t MStatusDisplay::SaveAsImage(Int_t num, TString name, TImage::EImageFileTypes type)
    22752530{
     2531//#if ROOT_VERSION_CODE < ROOT_VERSION(4,04,00)
    22762532    if (gROOT->IsBatch())
    22772533    {
     
    22802536        return 0;
    22812537    }
    2282     //SetStatusLine1("Writing GIF file...");
     2538//#endif
     2539
    22832540    SetStatusLine1("Writing image file... <please be patient>");
    22842541    SetStatusLine2("");
     
    23062563        ext = AddExtension(name, "jpg", num);
    23072564        break;
    2308 //    case TImage::kXcf:
    2309 //        ext = AddExtension(name, "xcf", num);
     2565    case TImage::kGif:
     2566        ext = AddExtension(name, "gif", num);
     2567        break;
     2568//    case TImage::kTiff:
     2569//        ext = AddExtension(name, "tiff", num);
    23102570//        break;
    23112571//    case TImage::kPpm:
     
    23152575//        ext = AddExtension(name, "pnm", num);
    23162576//        break;
    2317 //    case TImage::kBmp:
    2318 //        ext = AddExtension(name, "bmp", num);
    2319 //        break;
    23202577//    case TImage::kIco:
    23212578//        ext = AddExtension(name, "ico", num);
     
    23242581//        ext = AddExtension(name, "cur", num);
    23252582//        break;
    2326     case TImage::kGif:
    2327         ext = AddExtension(name, "gif", num);
    2328         break;
    2329 //    case TImage::kTiff:
    2330 //        ext = AddExtension(name, "tif", num);
     2583//    case TImage::kBmp:
     2584//        ext = AddExtension(name, "bmp", num);
     2585//        break;
     2586//    case TImage::kXcf:
     2587//        ext = AddExtension(name, "xcf", num);
    23312588//        break;
    23322589//    case TImage::kXbm:
     
    23972654        *fLog << "..." << flush;
    23982655
     2656#if ROOT_VERSION_CODE < ROOT_VERSION(4,04,00)
    23992657        c->Draw();
     2658
    24002659        if (type==TImage::kGif)
    24012660            c->SaveAs(writename); // FIXME: Seems not to work well in TImage! (root 3.10/02)
     
    24072666            delete img;
    24082667        }
    2409 
     2668#else
     2669        c->Print(writename);
     2670#endif
    24102671        if (num<0)
    24112672            *fLog << "done." << endl;
     
    25352796// --------------------------------------------------------------------------
    25362797//
     2798// Determin File type to save file as by extension. Allowed extensions are:
     2799//   root, ps, pdf, svg, gif, png, jpg, xpm, C
     2800//
     2801// returns -1 if file type is unknown. Otherwise return value of SaveAs*
     2802//
     2803Int_t MStatusDisplay::SaveAs(Int_t num, TString name)
     2804{
     2805    if (name.EndsWith(".root")) return SaveAsRoot(num, name);
     2806    if (name.EndsWith(".ps"))   return SaveAsPS(num, name);
     2807    if (name.EndsWith(".pdf"))  return SaveAsPDF(num, name);
     2808    if (name.EndsWith(".svg"))  return SaveAsSVG(num, name);
     2809    if (name.EndsWith(".gif"))  return SaveAsGIF(num, name);
     2810    if (name.EndsWith(".png"))  return SaveAsPNG(num, name);
     2811    if (name.EndsWith(".jpg"))  return SaveAsJPG(num, name);
     2812    if (name.EndsWith(".xpm"))  return SaveAsXPM(num, name);
     2813    if (name.EndsWith(".C"))    return SaveAsC(num, name);
     2814    return -1;
     2815}
     2816
     2817// --------------------------------------------------------------------------
     2818//
    25372819//  Opens a save as dialog
    25382820//
     
    25422824    {
    25432825        "PostScript",   "*.ps",
     2826        "Acrobat pdf",  "*.pdf",
     2827        "SVG vector",   "*.svg",
    25442828        "Gif files",    "*.gif",
     2829        "Png files",    "*.png",
     2830        "Gif files",    "*.gif",
     2831        "Jpeg files",   "*.jpeg",
     2832        "Xpm files",    "*.xpm",
    25452833        "Macro files",  "*.C",
    25462834        "ROOT files",   "*.root",
     
    25632851    dir = fi.fIniDir;
    25642852
    2565     const TString name(fi.fFilename);
    2566 
    2567     if (name.EndsWith(".root")) return SaveAsRoot(num, name);
    2568     if (name.EndsWith(".ps"))   return SaveAsPS(num, name);
    2569     if (name.EndsWith(".gif"))  return SaveAsGIF(num, name);
    2570     if (name.EndsWith(".C"))    return SaveAsC(num, name);
     2853    const Int_t rc = SaveAs(num, fi.fFilename);
     2854    if (rc>=0)
     2855        return rc;
    25712856
    25722857    Warning("MStatusDisplay::SaveAs", "Unknown Extension: %s", fi.fFilename);
Note: See TracChangeset for help on using the changeset viewer.