FORMS += mount/mount.ui
FORMS += console/console.ui
FORMS += restore/restore.ui restore/prerestore.ui restore/brestore.ui
+FORMS += restore/restoretree.ui
FORMS += run/run.ui run/runcmd.ui run/estimate.ui run/prune.ui
FORMS += select/select.ui
FORMS += medialist/medialist.ui mediaedit/mediaedit.ui joblist/joblist.ui
HEADERS += jobs/jobs.h
SOURCES += jobs/jobs.cpp
+## RestoreTree
+HEADERS += restore/restoretree.h
+SOURCES += restore/restoretree.cpp
+
+
# Help dialog
HEADERS += help/help.h
SOURCES += help/help.cpp
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48.000000px"
+ height="48.000000px"
+ id="svg97"
+ sodipodi:version="0.32"
+ inkscape:version="0.43"
+ sodipodi:docbase="/home/dbartley/src/bacula/src/qt-console/images"
+ sodipodi:docname="browse.svg"
+ inkscape:export-filename="/home/jimmac/Desktop/horlander-style3.png"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-ydpi="90.000000">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient4467">
+ <stop
+ id="stop4469"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop4471"
+ offset="1.0000000"
+ style="stop-color:#ffffff;stop-opacity:0.24761905;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4467"
+ id="radialGradient1539"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.592963,-7.7469e-24,-5.714443e-24,2.252104,-25.05975,-18.941)"
+ cx="15.414371"
+ cy="13.078408"
+ fx="15.414371"
+ fy="13.078408"
+ r="6.6562500" />
+ <linearGradient
+ id="linearGradient4454">
+ <stop
+ id="stop4456"
+ offset="0.0000000"
+ style="stop-color:#729fcf;stop-opacity:0.20784314;" />
+ <stop
+ id="stop4458"
+ offset="1.0000000"
+ style="stop-color:#729fcf;stop-opacity:0.67619050;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4454"
+ id="radialGradient1537"
+ gradientUnits="userSpaceOnUse"
+ cx="18.240929"
+ cy="21.817987"
+ fx="18.240929"
+ fy="21.817987"
+ r="8.3085051" />
+ <linearGradient
+ id="linearGradient2366">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop2368" />
+ <stop
+ id="stop2374"
+ offset="0.50000000"
+ style="stop-color:#ffffff;stop-opacity:0.21904762;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop2370" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2366"
+ id="linearGradient1533"
+ gradientUnits="userSpaceOnUse"
+ x1="18.292673"
+ y1="13.602121"
+ x2="17.500893"
+ y2="25.743469" />
+ <linearGradient
+ id="linearGradient4440">
+ <stop
+ id="stop4442"
+ offset="0"
+ style="stop-color:#7d7d7d;stop-opacity:1;" />
+ <stop
+ style="stop-color:#b1b1b1;stop-opacity:1.0000000;"
+ offset="0.50000000"
+ id="stop4448" />
+ <stop
+ id="stop4444"
+ offset="1.0000000"
+ style="stop-color:#686868;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4440"
+ id="linearGradient1531"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.334593,0,0,1.291292,-6.973842,-7.460658)"
+ x1="30.656250"
+ y1="34.000000"
+ x2="33.218750"
+ y2="31.062500" />
+ <linearGradient
+ id="linearGradient2846">
+ <stop
+ style="stop-color:#8a8a8a;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop2848" />
+ <stop
+ style="stop-color:#484848;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop2850" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2846"
+ id="linearGradient1529"
+ gradientUnits="userSpaceOnUse"
+ x1="27.366341"
+ y1="26.580296"
+ x2="31.335964"
+ y2="30.557772" />
+ <linearGradient
+ id="linearGradient4477"
+ inkscape:collect="always">
+ <stop
+ id="stop4479"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop4481"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4477"
+ id="radialGradient1527"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.237968,-6.429755e-15,28.93278)"
+ cx="24.130018"
+ cy="37.967922"
+ fx="24.130018"
+ fy="37.967922"
+ r="16.528622" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5060">
+ <stop
+ style="stop-color:black;stop-opacity:1;"
+ offset="0"
+ id="stop5062" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5064" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5060"
+ id="radialGradient6717"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+ cx="605.71429"
+ cy="486.64789"
+ fx="605.71429"
+ fy="486.64789"
+ r="117.14286" />
+ <linearGradient
+ id="linearGradient5048">
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="0"
+ id="stop5050" />
+ <stop
+ id="stop5056"
+ offset="0.5"
+ style="stop-color:black;stop-opacity:1;" />
+ <stop
+ style="stop-color:black;stop-opacity:0;"
+ offset="1"
+ id="stop5052" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5048"
+ id="linearGradient6715"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+ x1="302.85715"
+ y1="366.64789"
+ x2="302.85715"
+ y2="609.50507" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient9806">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop9808" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop9810" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient9766">
+ <stop
+ style="stop-color:#6194cb;stop-opacity:1;"
+ offset="0"
+ id="stop9768" />
+ <stop
+ style="stop-color:#729fcf;stop-opacity:1;"
+ offset="1"
+ id="stop9770" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3096">
+ <stop
+ id="stop3098"
+ offset="0"
+ style="stop-color:#424242;stop-opacity:1;" />
+ <stop
+ id="stop3100"
+ offset="1.0000000"
+ style="stop-color:#777777;stop-opacity:1.0000000;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient319"
+ inkscape:collect="always">
+ <stop
+ id="stop320"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop321"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient1789">
+ <stop
+ style="stop-color:#202020;stop-opacity:1.0000000;"
+ offset="0.0000000"
+ id="stop1790" />
+ <stop
+ style="stop-color:#b9b9b9;stop-opacity:1.0000000;"
+ offset="1.0000000"
+ id="stop1791" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient1789"
+ id="radialGradient238"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.055022,-2.734504e-2,0.177703,1.190929,-3.572177,-7.125301)"
+ cx="20.706017"
+ cy="37.517986"
+ fx="20.706017"
+ fy="37.517986"
+ r="30.905205" />
+ <linearGradient
+ id="linearGradient3983">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.87628865;"
+ offset="0.0000000"
+ id="stop3984" />
+ <stop
+ style="stop-color:#fffffe;stop-opacity:0.0000000;"
+ offset="1.0000000"
+ id="stop3985" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3983"
+ id="linearGradient491"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.516844,0.000000,0.000000,0.708978,-0.879573,-1.318166)"
+ x1="6.2297964"
+ y1="13.773066"
+ x2="9.8980894"
+ y2="66.834053" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="46.689312"
+ x2="12.853771"
+ y1="32.567184"
+ x1="13.035696"
+ gradientTransform="matrix(1.317489,0.000000,0.000000,0.816256,-0.879573,-1.318166)"
+ id="linearGradient322"
+ xlink:href="#linearGradient319"
+ inkscape:collect="always" />
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="6.1802502"
+ x2="15.514889"
+ y1="31.367750"
+ x1="18.112709"
+ id="linearGradient3104"
+ xlink:href="#linearGradient3096"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9766"
+ id="linearGradient9772"
+ x1="22.175976"
+ y1="36.987999"
+ x2="22.065331"
+ y2="32.050499"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient9806"
+ id="radialGradient9812"
+ cx="24.35099"
+ cy="41.591846"
+ fx="24.35099"
+ fy="41.591846"
+ r="19.136078"
+ gradientTransform="matrix(1.000000,0.000000,0.000000,0.242494,1.565588e-16,31.50606)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ fill="#729fcf"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="0.10196078"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="11.645833"
+ inkscape:cx="24"
+ inkscape:cy="24"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1026"
+ inkscape:window-height="724"
+ inkscape:window-x="134"
+ inkscape:window-y="36"
+ inkscape:showpageshadow="false"
+ stroke="#3465a4" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title>Folder Icon</dc:title>
+ <dc:date />
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Jakub Steiner</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <cc:license
+ rdf:resource="http://creativecommons.org/licenses/by/2.0/" />
+ <dc:source>http://jimmac.musichall.cz</dc:source>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>folder</rdf:li>
+ <rdf:li>directory</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ </cc:Work>
+ <cc:License
+ rdf:about="http://creativecommons.org/licenses/by/2.0/">
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/Attribution" />
+ <cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
+ <cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" />
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:label="Folder"
+ inkscape:groupmode="layer">
+ <g
+ style="display:inline"
+ transform="matrix(2.262383e-2,0,0,2.086758e-2,43.38343,36.36962)"
+ id="g6707">
+ <rect
+ style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect6709"
+ width="1339.6335"
+ height="478.35718"
+ x="-1559.2523"
+ y="-150.69685" />
+ <path
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+ id="path6711"
+ sodipodi:nodetypes="cccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path6713"
+ d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+ style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ </g>
+ <path
+ d="M 4.5217805,38.687417 C 4.5435766,39.103721 4.9816854,39.520026 5.3979900,39.520026 L 36.725011,39.520026 C 37.141313,39.520026 37.535823,39.103721 37.514027,38.687417 L 36.577584,11.460682 C 36.555788,11.044379 36.117687,10.628066 35.701383,10.628066 L 22.430510,10.628066 C 21.945453,10.628066 21.196037,10.312477 21.028866,9.5214338 L 20.417475,6.6283628 C 20.262006,5.8926895 19.535261,5.5904766 19.118957,5.5904766 L 4.3400975,5.5904766 C 3.9237847,5.5904766 3.5292767,6.0067807 3.5510726,6.4230849 L 4.5217805,38.687417 z "
+ id="path216"
+ style="fill:url(#radialGradient238);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#linearGradient3104);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ sodipodi:nodetypes="ccccccssssccc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9788"
+ d="M 5.2265927,22.5625 L 35.492173,22.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9784"
+ d="M 5.0421736,18.5625 L 35.489104,18.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 4.9806965,12.5625 L 35.488057,12.5625"
+ id="path9778"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 5.3861577,32.5625 L 35.494881,32.5625"
+ id="path9798"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9800"
+ d="M 5.5091398,34.5625 L 35.496893,34.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 5.0421736,16.5625 L 35.489104,16.5625"
+ id="path9782"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9780"
+ d="M 5.0114345,14.5625 L 35.48858,14.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9776"
+ d="M 4.9220969,10.5625 L 20.202912,10.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.99999982;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 4.8737534,8.5624999 L 19.657487,8.5624999"
+ id="path9774"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 5.3246666,28.5625 L 35.493876,28.5625"
+ id="path9794"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9792"
+ d="M 5.2880638,26.5625 L 35.493184,26.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 5.2265927,24.5625 L 35.492173,24.5625"
+ id="path9790"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000012;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 5.1958537,20.5625 L 35.491649,20.5625"
+ id="path9786"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path9796"
+ d="M 5.3246666,30.5625 L 35.493876,30.5625"
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:0.11363633;color:#000000;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.00000024;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 5.5091398,36.5625 L 35.496893,36.5625"
+ id="path9802"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="color:#000000;fill:url(#linearGradient491);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.2138050;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible;opacity:0.45142857"
+ d="M 6.0683430,38.864023 C 6.0846856,39.176251 5.8874317,39.384402 5.5697582,39.280326 L 5.5697582,39.280326 C 5.2520766,39.176251 5.0330270,38.968099 5.0166756,38.655870 L 4.0689560,6.5913839 C 4.0526131,6.2791558 4.2341418,6.0906134 4.5463699,6.0906134 L 18.968420,6.0429196 C 19.280648,6.0429196 19.900363,6.3433923 20.101356,7.3651014 L 20.674845,10.180636 C 20.247791,9.7153790 20.255652,9.7010175 20.037287,9.0239299 L 19.631192,7.7647478 C 19.412142,7.0371009 18.932991,6.9328477 18.620763,6.9328477 L 5.7329889,6.9328477 C 5.4207613,6.9328477 5.2235075,7.1409999 5.2398583,7.4532364 L 6.1778636,38.968099 L 6.0683430,38.864023 z "
+ id="path219"
+ sodipodi:nodetypes="cccccccccscccccc" />
+ <g
+ style="stroke-miterlimit:4.0000000;stroke-width:0.99946535;stroke:none;fill-rule:nonzero;fill-opacity:0.75706214;fill:#ffffff"
+ id="g220"
+ transform="matrix(1.040764,0.000000,5.449252e-2,1.040764,-8.670199,2.670594)"
+ inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/gnome-fs-directory.png"
+ inkscape:export-xdpi="74.800003"
+ inkscape:export-ydpi="74.800003">
+ <path
+ style="fill-opacity:0.50847459;fill:#ffffff"
+ d="M 42.417183,8.5151772 C 42.422267,8.4180642 42.289022,8.2681890 42.182066,8.2681716 L 29.150665,8.2660527 C 29.150665,8.2660527 30.062379,8.8540072 31.352477,8.8622963 L 42.405974,8.9333167 C 42.417060,8.7215889 42.408695,8.6772845 42.417183,8.5151772 z "
+ id="path221"
+ sodipodi:nodetypes="cscscs" />
+ </g>
+ <path
+ style="color:#000000;fill:url(#linearGradient9772);fill-opacity:1.0;fill-rule:nonzero;stroke:#3465a4;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:block"
+ d="M 39.783532,39.510620 C 40.927426,39.466556 41.746608,38.414321 41.830567,37.189615 C 42.622354,25.640928 43.489927,15.957666 43.489927,15.957666 C 43.562082,15.710182 43.322016,15.462699 43.009787,15.462699 L 8.6386304,15.462699 C 8.6386304,15.462699 6.7883113,37.329591 6.7883113,37.329591 C 6.6737562,38.311657 6.3223038,39.134309 5.2384755,39.513304 L 39.783532,39.510620 z "
+ id="path233"
+ sodipodi:nodetypes="cscccscc"
+ inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/gnome-fs-directory.png"
+ inkscape:export-xdpi="74.800003"
+ inkscape:export-ydpi="74.800003" />
+ <path
+ sodipodi:nodetypes="ccsscsc"
+ id="path304"
+ d="M 9.6202444,16.463921 L 42.411343,16.528735 L 40.837297,36.530714 C 40.752975,37.602225 40.386619,37.958929 38.964641,37.958929 C 37.093139,37.958929 10.286673,37.926522 7.569899,37.926522 C 7.8034973,37.605711 7.9036547,36.937899 7.9049953,36.92191 L 9.6202444,16.463921 z "
+ style="opacity:0.46590909;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient322);stroke-width:0.99999970px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="path323"
+ d="M 9.6202481,16.223182 L 8.4536014,31.866453 C 8.4536014,31.866453 16.749756,27.718375 27.119949,27.718375 C 37.490142,27.718375 42.675239,16.223182 42.675239,16.223182 L 9.6202481,16.223182 z "
+ style="fill:#ffffff;fill-opacity:0.089285679;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+ <g
+ style="display:inline"
+ id="g1772"
+ transform="matrix(0.796586,0,0,0.724744,2.062831,5.630794)">
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.17112301;color:#000000;fill:url(#radialGradient1527);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4475"
+ sodipodi:cx="24.130018"
+ sodipodi:cy="37.967922"
+ sodipodi:rx="16.528622"
+ sodipodi:ry="3.9332814"
+ d="M 40.65864 37.967922 A 16.528622 3.9332814 0 1 1 7.6013966,37.967922 A 16.528622 3.9332814 0 1 1 40.65864 37.967922 z"
+ transform="matrix(1.446431,0,0,1.51999,-10.97453,-17.75168)" />
+ <path
+ sodipodi:nodetypes="csscccscccscczzzz"
+ id="path2844"
+ d="M 18.627569,3.1435548 C 10.488439,3.1435548 3.8827682,9.7492259 3.8827682,17.888356 C 3.8827682,26.027486 10.488439,32.633158 18.627569,32.633158 C 22.107124,32.633158 25.17857,31.248765 27.701292,29.230511 C 27.495915,30.237392 27.623257,31.265879 28.457436,31.990436 L 39.42152,41.517846 C 40.654936,42.589175 42.508982,42.448806 43.58031,41.215389 C 44.651638,39.981971 44.511269,38.127927 43.277853,37.056599 L 32.313769,27.529188 C 31.642242,26.945909 30.820891,26.773219 30.007531,26.886466 C 31.994231,24.374044 33.37237,21.337663 33.37237,17.888356 C 33.37237,9.7492259 26.766699,3.1435548 18.627569,3.1435548 z M 18.551954,4.3697381 C 26.191413,4.3697381 31.843729,9.1586886 31.843729,17.661513 C 31.843729,26.336626 26.027039,30.953288 18.551954,30.953288 C 11.249005,30.953288 5.2601806,25.475196 5.2601806,17.661513 C 5.2601806,9.6774061 11.084819,4.369738 18.551954,4.3697381 z "
+ style="opacity:1;color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1529);stroke-width:3.00581574;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+ <path
+ style="opacity:1;color:#000000;fill:#dcdcdc;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 18.602905,3.0803551 C 10.437465,3.0803551 3.8104408,9.7073791 3.8104408,17.872819 C 3.8104408,26.038259 10.437465,32.665283 18.602905,32.665283 C 22.093708,32.665283 25.175082,31.276416 27.70596,29.251638 C 27.499919,30.261774 27.627672,31.293585 28.464547,32.020484 L 39.464073,41.578691 C 40.701476,42.653483 42.561515,42.512661 43.636306,41.275256 C 44.711097,40.037852 44.570274,38.177814 43.332871,37.103023 L 32.333346,27.544815 C 31.659648,26.959651 30.835642,26.786402 30.019653,26.900016 C 32.012775,24.379472 33.395369,21.333276 33.395369,17.872819 C 33.395369,9.7073791 26.768345,3.0803551 18.602905,3.0803551 z M 18.527046,6.2664243 C 24.808154,6.2664245 29.905864,11.364135 29.905864,17.645243 C 29.905864,23.926351 24.808154,29.024061 18.527046,29.024061 C 12.245938,29.024061 7.1482276,23.926351 7.1482276,17.645243 C 7.1482278,11.364135 12.245938,6.2664243 18.527046,6.2664243 z "
+ id="path4430" />
+ <path
+ style="opacity:1;color:#000000;fill:url(#linearGradient1531);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 39.507004,41.57769 C 39.028332,39.304503 40.904334,36.766268 43.091057,36.789315 C 43.091057,36.789315 32.33069,27.531204 32.33069,27.531204 C 29.385899,27.474498 28.061188,29.80382 28.553876,32.131126 L 39.507004,41.57769 z "
+ id="path4438"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient1533);stroke-width:1.20643401;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="path4450"
+ sodipodi:cx="17.500893"
+ sodipodi:cy="18.920233"
+ sodipodi:rx="11.048544"
+ sodipodi:ry="11.048544"
+ d="M 28.549437 18.920233 A 11.048544 11.048544 0 1 1 6.4523487,18.920233 A 11.048544 11.048544 0 1 1 28.549437 18.920233 z"
+ transform="matrix(1.245743,0,0,1.245743,-3.425346,-6.177033)" />
+ <rect
+ style="opacity:0.43315507;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.50295389;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ id="rect4495"
+ width="19.048439"
+ height="4.4404783"
+ x="40.373337"
+ y="0.14086054"
+ rx="2.7763376"
+ ry="2.4871922"
+ transform="matrix(0.752986,0.658037,-0.648902,0.760872,0,0)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:url(#radialGradient1537);fill-opacity:1;fill-rule:evenodd;stroke:#3063a3;stroke-width:1.07456946;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dashoffset:0;stroke-opacity:1;visibility:visible"
+ id="path4452"
+ sodipodi:cx="17.589281"
+ sodipodi:cy="18.478292"
+ sodipodi:rx="8.3085051"
+ sodipodi:ry="8.3085051"
+ d="M 25.897786 18.478292 A 8.3085051 8.3085051 0 1 1 9.280776,18.478292 A 8.3085051 8.3085051 0 1 1 25.897786 18.478292 z"
+ transform="matrix(1.398614,0,0,1.398614,-6.224338,-8.298958)" />
+ <path
+ style="opacity:0.83422457;color:#000000;fill:url(#radialGradient1539);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+ d="M 18.156915,7.3966938 C 12.949325,7.3966938 8.7323681,11.613651 8.7323681,16.821241 C 8.7323681,18.325216 9.1526753,19.709014 9.77954,20.971144 C 11.03192,21.432757 12.362297,21.746827 13.774307,21.746827 C 19.945262,21.746827 24.873589,16.88519 25.254413,10.809698 C 23.523449,8.7641668 21.044374,7.3966938 18.156915,7.3966938 z "
+ id="path4462" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="pattern" />
+</svg>
<file>images/bat.png</file>
<file>images/bat_icon.png</file>
<file>images/big-server.png</file>
+ <file>images/browse.png</file>
<file>images/cartridge-edit.svg</file>
<file>images/cartridge.svg</file>
<file>images/check.png</file>
<file>images/edit-delete.svg</file>
<file>images/emblem-system.svg</file>
<file>images/estimate-job.svg</file>
+ <file>images/folder.png</file>
<file>images/folder.svg</file>
<file>images/help-browser.svg</file>
<file>images/home.png</file>
<addaction name="actionRun" />
<addaction name="actionUndock" />
<addaction name="actionEstimate" />
+ <addaction name="actionBrowse" />
</widget>
<widget class="QDockWidget" name="dockWidget" >
<property name="sizePolicy" >
<string>bat &Help</string>
</property>
</action>
+ <action name="actionBrowse" >
+ <property name="icon" >
+ <iconset resource="main.qrc" >:/images/browse.png</iconset>
+ </property>
+ <property name="text" >
+ <string>Browse</string>
+ </property>
+ </action>
</widget>
<resources>
<include location="main.qrc" />
#include "medialist/medialist.h"
#include "joblist/joblist.h"
#include "clients/clients.h"
+#include "restore/restoretree.h"
#include "help/help.h"
#include "jobs/jobs.h"
createPageJobList("", "", "", "", NULL);
new MediaList();
new Storage();
+ new restoreTree();
treeWidget->expandItem(topItem);
stackedWidget->setCurrentWidget(m_currentConsole);
connect(actionLabel, SIGNAL(triggered()), this, SLOT(labelButtonClicked()));
connect(actionRun, SIGNAL(triggered()), this, SLOT(runButtonClicked()));
connect(actionEstimate, SIGNAL(triggered()), this, SLOT(estimateButtonClicked()));
+ connect(actionBrowse, SIGNAL(triggered()), this, SLOT(browseButtonClicked()));
connect(actionRestore, SIGNAL(triggered()), this, SLOT(restoreButtonClicked()));
connect(actionUndock, SIGNAL(triggered()), this, SLOT(undockWindowButton()));
connect(actionToggleDock, SIGNAL(triggered()), this, SLOT(toggleDockContextWindow()));
new estimatePage();
}
+void MainWin::browseButtonClicked()
+{
+ new restoreTree();
+}
+
void MainWin::restoreButtonClicked()
{
new prerestorePage();
void labelButtonClicked();
void runButtonClicked();
void estimateButtonClicked();
+ void browseButtonClicked();
void restoreButtonClicked();
void undockWindowButton();
void treeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *);
private:
void createConnections();
+ void connectConsole();
void createPages();
private:
void restorePage::okButtonPushed()
{
+ printf("In restorePage::okButtonPushed\n");
this->hide();
m_console->write("done");
m_console->notify(true);
--- /dev/null
+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2007-2007 Free Software Foundation Europe e.V.
+
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version two of the GNU General Public
+ License as published by the Free Software Foundation plus additions
+ that are listed in the file LICENSE.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of John Walker.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
+
+/*
+ * Version $Id: restore.cpp 4945 2007-05-31 01:24:28Z bartleyd2 $
+ *
+ * Restore Class
+ *
+ * Kern Sibbald, February MMVII
+ *
+ */
+
+#include "bat.h"
+#include "restoretree.h"
+#include "pages.h"
+
+restoreTree::restoreTree()
+{
+ setupUi(this);
+ m_name = "Version Browser";
+ pgInitialize();
+ QTreeWidgetItem* thisitem = mainWin->getFromHash(this);
+ thisitem->setIcon(0,QIcon(QString::fromUtf8(":images/browse.png")));
+
+ m_closeable = true;
+ m_populated = false;
+
+ readSettings();
+ dockPage();
+ m_winregex.setPattern("^/[a-z]:/$");
+ m_slashregex.setPattern("/");
+}
+
+restoreTree::~restoreTree()
+{
+ writeSettings();
+}
+
+/*
+ * Called from the constructor to set up the page widgets and connections.
+ */
+void restoreTree::setupPage()
+{
+ connect(refreshButton, SIGNAL(pressed()), this, SLOT(refreshButtonPushed()));
+ connect(jobCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(jobComboChanged(int)));
+ connect(directoryTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
+ this, SLOT(directoryItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
+ connect(fileTable, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)),
+ this, SLOT(fileItemChanged(QTableWidgetItem *, QTableWidgetItem *)));
+ connect(directoryTree, SIGNAL(itemExpanded(QTreeWidgetItem *)),
+ this, SLOT(directoryItemExpanded(QTreeWidgetItem *)));
+
+ QStringList titles;
+ titles << "Directories";
+ directoryTree->setHeaderLabels(titles);
+ clientCombo->addItems(m_console->client_list);
+ fileSetCombo->addItem("Any");
+ fileSetCombo->addItems(m_console->fileset_list);
+ jobCombo->addItems(m_console->job_list);
+}
+
+/*
+ * When refresh button is pushed, perform a query getting the directories and
+ * use parseDirectory and addDirectory to populate the directory tree with items.
+ */
+void restoreTree::populateDirectoryTree()
+{
+ m_slashTrap = false;
+ m_winTrap = false;
+ m_isWin = false;
+ m_dirPaths.clear();
+ directoryTree->clear();
+ fileTable->clear();
+ versionTable->clear();
+ QString cmd =
+ "SELECT DISTINCT Path.Path FROM Path"
+ " LEFT OUTER JOIN File ON (File.PathId=Path.PathId)"
+ " LEFT OUTER JOIN Job ON (File.JobId=Job.JobId)"
+ " LEFT OUTER JOIN Client ON (Job.ClientId=Client.ClientId)"
+ " LEFT OUTER JOIN FileSet ON (Job.FileSetId=FileSet.FileSetId) WHERE";
+ m_condition = " Job.name = '" + jobCombo->itemText(jobCombo->currentIndex()) + "'";
+ int clientIndex = clientCombo->currentIndex();
+ if ((clientIndex >= 0) && (clientCombo->itemText(clientIndex) != "Any")) {
+ m_condition.append(" AND Client.Name='" + clientCombo->itemText(clientIndex) + "'");
+ }
+ int fileSetIndex = fileSetCombo->currentIndex();
+ if ((fileSetIndex >= 0) && (fileSetCombo->itemText(fileSetIndex) != "Any")) {
+ m_condition.append(" AND FileSet.FileSet='" + fileSetCombo->itemText(fileSetIndex) + "'");
+ }
+ cmd += m_condition;
+ if (mainWin->m_sqlDebug) {
+ Pmsg1(000, "Query cmd : %s\n",cmd.toUtf8().data());
+ }
+ QStringList directories;
+ if (m_console->sql_cmd(cmd, directories)) {
+ if (mainWin->m_miscDebug) {
+ Pmsg1(000, "Done with query %i directories\n", directories.count());
+ }
+ foreach(QString directory, directories) {
+ parseDirectory(directory);
+ }
+ }
+}
+
+/*
+ * Function to parse a directory into all possible subdirectories, then add to
+ * The tree.
+ */
+void restoreTree::parseDirectory(QString &dir_in)
+{
+ /* Clean up the directory string remove some funny char after last '/' */
+ QRegExp rgx("[^/]$");
+ int lastslash = rgx.indexIn(dir_in);
+ dir_in.replace(lastslash, dir_in.length()-lastslash, "");
+ if (mainWin->m_miscDebug) Pmsg1(000, "parsing %s\n", dir_in.toUtf8().data());
+
+ /* split and add if not in yet */
+ QString direct, path;
+ int index;
+ bool done = false;
+ QStringList pathAfter, dirAfter;
+ /* start from the end, turn /etc/somedir/subdir/ into /etc/somedir and subdir/
+ * if not added into tree, then try /etc/ and somedir/ if not added, then try
+ * / and etc/ . That should succeed, then add the ones that failed in reverse */
+ while (((index = m_slashregex.lastIndexIn(dir_in, -2)) != -1) && (!done)) {
+ direct = path = dir_in;
+ path.replace(index+1,dir_in.length()-index-1,"");
+ direct.replace(0,index+1,"");
+/* if (mainWin->m_miscDebug)
+ printf("length = %i index = %i Adding %s %s\n",
+ dir_in.length(), index,
+ path.toUtf8().data(), direct.toUtf8().data()); */
+ if (addDirectory(path, direct)) done = true;
+ else {
+ if (mainWin->m_miscDebug) Pmsg0(000, "Saving for later\n");
+ pathAfter.prepend(path);
+ dirAfter.prepend(direct);
+ }
+ dir_in = path;
+ }
+ for (int k=0; k<pathAfter.count(); k++) {
+ if (addDirectory(pathAfter[k], dirAfter[k]))
+ if (mainWin->m_miscDebug)
+ Pmsg2(000, "Adding After %s %s\n", pathAfter[k].toUtf8().data(), dirAfter[k].toUtf8().data());
+ else
+ if (mainWin->m_miscDebug)
+ Pmsg2(000, "Error Adding %s %s\n", pathAfter[k].toUtf8().data(), dirAfter[k].toUtf8().data());
+ }
+}
+
+/*
+ * Function called from fill directory when a directory is found to see if this
+ * directory exists in the directory pane and then add it to the directory pane
+ */
+bool restoreTree::addDirectory(QString &m_cwd, QString &newdirr)
+{
+ QString newdir = newdirr;
+ QString fullpath = m_cwd + newdirr;
+ bool ok = true, added = false;
+ bool windrive = false;
+
+ if (mainWin->m_miscDebug) {
+ QString msg = QString("In addDirectory cwd \"%1\" newdir \"%2\"\n")
+ .arg(m_cwd)
+ .arg(newdir);
+ Pmsg0(000, msg.toUtf8().data());
+ }
+
+ if (!m_slashTrap) {
+ /* add unix '/' directory first */
+ if (m_dirPaths.empty() && (m_winregex.indexIn(fullpath,0) == -1)) {
+ m_slashTrap = true;
+ QTreeWidgetItem *item = new QTreeWidgetItem(directoryTree);
+ item->setIcon(0,QIcon(QString::fromUtf8(":images/folder.png")));
+
+ QString text("/");
+ item->setText(0, text.toUtf8().data());
+ item->setData(0, Qt::UserRole, QVariant(text));
+ if (mainWin->m_miscDebug) {
+ Pmsg1(000, "Pre Inserting %s\n",text.toUtf8().data());
+ }
+ m_dirPaths.insert(text, item);
+ }
+ }
+
+ if (!m_winTrap) {
+ m_winTrap = true;
+ if (m_winregex.indexIn(fullpath,0) == 0) {
+ m_isWin = true;
+ /* this is a windows drive */
+ if (mainWin->m_miscDebug) {
+ Pmsg0(000, "Need to do windows \"letter\":/\n");
+ }
+ }
+ }
+ if (m_isWin) {
+ fullpath.replace(0,1,"");
+ windrive = true;
+ }
+
+ /* is it already existent ?? */
+ if (!m_dirPaths.contains(fullpath)) {
+ QTreeWidgetItem *item = NULL;
+ if (windrive) {
+ /* this is the base widget */
+ item = new QTreeWidgetItem(directoryTree);
+ item->setText(0, fullpath.toUtf8().data());
+ item->setData(0, Qt::UserRole, QVariant(fullpath));
+ } else {
+ QTreeWidgetItem *parent = m_dirPaths.value(m_cwd);
+ if (parent) {
+ /* new directories to add */
+ item = new QTreeWidgetItem(parent);
+ item->setText(0, newdir.toUtf8().data());
+ item->setData(0, Qt::UserRole, QVariant(fullpath));
+ } else {
+ ok = false;
+ if (mainWin->m_miscDebug) {
+ QString msg = QString("In else of if parent cwd \"%1\" newdir \"%2\"\n")
+ .arg(m_cwd)
+ .arg(newdir);
+ Pmsg0(000, msg.toUtf8().data());
+ }
+ }
+ }
+ /* insert into hash */
+ if (ok) {
+ if (mainWin->m_miscDebug) {
+ Pmsg1(000, "Inserting %s\n",fullpath.toUtf8().data());
+ }
+ m_dirPaths.insert(fullpath, item);
+ added = true;
+ }
+ }
+ return added;
+}
+
+/*
+ * Virtual function which is called when this page is visible on the stack
+ */
+void restoreTree::currentStackItem()
+{
+ if(!m_populated) {
+ if (!m_console->preventInUseConnect())
+ return;
+ setupPage();
+ m_populated=true;
+ }
+}
+
+/*
+ * Populate the tree when refresh button pushed.
+ */
+void restoreTree::refreshButtonPushed()
+{
+ populateDirectoryTree();
+}
+
+/*
+ * Set the values of non-job combo boxes to the job defaults
+ */
+void restoreTree::jobComboChanged(int)
+{
+ job_defaults job_defs;
+
+ (void)index;
+ job_defs.job_name = jobCombo->currentText();
+ if (m_console->get_job_defaults(job_defs)) {
+ fileSetCombo->setCurrentIndex(fileSetCombo->findText(job_defs.fileset_name, Qt::MatchExactly));
+ clientCombo->setCurrentIndex(clientCombo->findText(job_defs.client_name, Qt::MatchExactly));
+ }
+}
+
+/*
+ * Function to populate the file list table
+ */
+void restoreTree::directoryItemChanged(QTreeWidgetItem *item, QTreeWidgetItem *)
+{
+ if (item == NULL)
+ return;
+ QBrush blackBrush(Qt::black);
+ QString directory = item->data(0,Qt::UserRole).toString();
+ directoryLabel->setText("Present Working Directory : " + directory);
+ QString cmd =
+ "SELECT DISTINCT FileName.Name"
+ " FROM File LEFT OUTER JOIN Filename on (FileName.FileNameId=File.FileNameId)"
+ " LEFT OUTER JOIN Path ON (Path.PathId=File.PathId)"
+ " LEFT OUTER JOIN Job ON (File.JobId=Job.JobId)"
+ " LEFT OUTER JOIN Client ON (Job.ClientId=Client.ClientId)"
+ " LEFT OUTER JOIN FileSet ON (Job.FileSetId=FileSet.FileSetId)";
+ cmd += " WHERE Path.Path='" + directory + "' AND FileName.Name!='' AND " + m_condition;
+
+ QStringList headerlist = (QStringList() << "File Name");
+ fileTable->clear();
+ /* Also clear the version table here */
+ versionTable->clear();
+ versionTable->setRowCount(0);
+ versionTable->setColumnCount(0);
+ fileTable->setColumnCount(headerlist.size());
+ fileTable->setHorizontalHeaderLabels(headerlist);
+
+ if (mainWin->m_sqlDebug) {
+ Pmsg1(000, "Query cmd : %s\n",cmd.toUtf8().data());
+ }
+ QStringList results;
+ if (m_console->sql_cmd(cmd, results)) {
+ m_resultCount = results.count();
+
+ QTableWidgetItem* tableItem;
+ QString field;
+ QStringList fieldlist;
+ fileTable->setRowCount(results.size());
+
+ int row = 0;
+ /* Iterate through the record returned from the query */
+ foreach (QString resultline, results) {
+ /* Iterate through fields in the record */
+ int column = 0;
+ fieldlist = resultline.split("\t");
+ foreach (field, fieldlist) {
+ field = field.trimmed(); /* strip leading & trailing spaces */
+ tableItem = new QTableWidgetItem(field,1);
+ tableItem->setFlags(0);
+ tableItem->setForeground(blackBrush);
+ tableItem->setData(Qt::UserRole,QVariant(directory));
+ fileTable->setItem(row, column, tableItem);
+ column++;
+ }
+ row++;
+ }
+ fileTable->setRowCount(row);
+ }
+ fileTable->resizeColumnsToContents();
+ fileTable->resizeRowsToContents();
+ fileTable->verticalHeader()->hide();
+}
+
+/*
+ * Function to populate the version table
+ */
+void restoreTree::fileItemChanged(QTableWidgetItem *fileTableItem, QTableWidgetItem *)
+{
+ if (fileTableItem == NULL)
+ return;
+ QString file = fileTableItem->text();
+ QString directory = fileTableItem->data(Qt::UserRole).toString();
+
+ QBrush blackBrush(Qt::black);
+ QString cmd =
+ "SELECT File.FileId, Job.JobId, Job.EndTime, File.Md5 "
+ " FROM File"
+ " LEFT OUTER JOIN Filename on (FileName.FileNameId=File.FileNameId)"
+ " LEFT OUTER JOIN Path ON (Path.PathId=File.PathId)"
+ " LEFT OUTER JOIN Job ON (File.JobId=Job.JobId)"
+ " LEFT OUTER JOIN Client ON (Job.ClientId=Client.ClientId)"
+ " LEFT OUTER JOIN FileSet ON (Job.FileSetId=FileSet.FileSetId)";
+ cmd += " WHERE FileName.Name='" + file + "' AND Path.Path='" + directory + "' AND " + m_condition;
+
+ QStringList headerlist = (QStringList() << "File Id" << "Job Id" << "End Time" << "Md5");
+ versionTable->clear();
+ versionTable->setColumnCount(headerlist.size());
+ versionTable->setHorizontalHeaderLabels(headerlist);
+
+ if (mainWin->m_sqlDebug) {
+ Pmsg1(000, "Query cmd : %s\n",cmd.toUtf8().data());
+ }
+ QStringList results;
+ if (m_console->sql_cmd(cmd, results)) {
+ m_resultCount = results.count();
+
+ QTableWidgetItem* tableItem;
+ QString field;
+ QStringList fieldlist;
+ versionTable->setRowCount(results.size());
+
+ int row = 0;
+ /* Iterate through the record returned from the query */
+ foreach (QString resultline, results) {
+ fieldlist = resultline.split("\t");
+ int column = 0;
+ /* remove directory */
+ if (fieldlist[0].trimmed() != "") {
+ /* Iterate through fields in the record */
+ foreach (field, fieldlist) {
+ field = field.trimmed(); /* strip leading & trailing spaces */
+ tableItem = new QTableWidgetItem(field,1);
+ tableItem->setFlags(0);
+ tableItem->setForeground(blackBrush);
+ tableItem->setData(Qt::UserRole,QVariant(directory));
+ versionTable->setItem(row, column, tableItem);
+ column++;
+ }
+ row++;
+ }
+ }
+ }
+ versionTable->resizeColumnsToContents();
+ versionTable->resizeRowsToContents();
+ versionTable->verticalHeader()->hide();
+}
+
+/*
+ * Save user settings associated with this page
+ */
+void restoreTree::writeSettings()
+{
+ QSettings settings(m_console->m_dir->name(), "bat");
+ settings.beginGroup("RestoreTree");
+ settings.setValue("splitterSizes", splitter->saveState());
+ settings.endGroup();
+}
+
+/*
+ * Read and restore user settings associated with this page
+ */
+void restoreTree::readSettings()
+{
+ QSettings settings(m_console->m_dir->name(), "bat");
+ settings.beginGroup("RestoreTree");
+ splitter->restoreState(settings.value("splitterSizes").toByteArray());
+ settings.endGroup();
+}
+
+/*
+ * This is a funcion to accomplish the one thing I struggled to figure out what
+ * was taking so long. It add the icons, but after the tree is made.
+ */
+void restoreTree::directoryItemExpanded(QTreeWidgetItem *item)
+{
+ int childCount = item->childCount();
+ for (int i=0; i<childCount; i++) {
+ QTreeWidgetItem *child = item->child(i);
+ child->setIcon(0,QIcon(QString::fromUtf8(":images/folder.png")));
+ }
+}
--- /dev/null
+#ifndef _RESTORETREE_H_
+#define _RESTORETREE_H_
+
+/*
+ Bacula® - The Network Backup Solution
+
+ Copyright (C) 2007-2007 Free Software Foundation Europe e.V.
+
+ The main author of Bacula is Kern Sibbald, with contributions from
+ many others, a complete list can be found in the file AUTHORS.
+ This program is Free Software; you can redistribute it and/or
+ modify it under the terms of version two of the GNU General Public
+ License as published by the Free Software Foundation plus additions
+ that are listed in the file LICENSE.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
+
+ Bacula® is a registered trademark of John Walker.
+ The licensor of Bacula is the Free Software Foundation Europe
+ (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+ Switzerland, email:ftf@fsfeurope.org.
+*/
+/*
+ * Version $Id: restore.h 4945 2007-05-31 01:24:28Z bartleyd2 $
+ *
+ * Kern Sibbald, February 2007
+ */
+
+#include <QtGui>
+#include "pages.h"
+#include "ui_restoretree.h"
+
+/*
+ * A restore tree to view files in the catalog
+ */
+class restoreTree : public Pages, public Ui::restoreTreeForm
+{
+ Q_OBJECT
+
+public:
+ restoreTree();
+ ~restoreTree();
+ virtual void currentStackItem();
+
+private slots:
+ void refreshButtonPushed();
+ void jobComboChanged(int);
+ void directoryItemChanged(QTreeWidgetItem *, QTreeWidgetItem *);
+ void fileItemChanged(QTableWidgetItem *,QTableWidgetItem *);
+ void directoryItemExpanded(QTreeWidgetItem *);
+
+private:
+ void populateDirectoryTree();
+ void parseDirectory(QString &dir_in);
+ bool addDirectory(QString &, QString &);
+ void setupPage();
+ void writeSettings();
+ void readSettings();
+ bool m_populated;
+ QRegExp m_winregex;
+ QRegExp m_slashregex;
+ bool m_slashTrap;
+ bool m_winTrap;
+ bool m_isWin;
+ //QString m_jobCondition;
+ QHash<QString, QTreeWidgetItem *> m_dirPaths;
+ QString m_condition;
+ int m_resultCount;
+};
+
+#endif /* _RESTORETREE_H_ */
--- /dev/null
+<ui version="4.0" >
+ <class>restoreTreeForm</class>
+ <widget class="QWidget" name="restoreTreeForm" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>515</width>
+ <height>333</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>9</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QSplitter" name="splitter" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <widget class="QTreeWidget" name="directoryTree" />
+ <widget class="QWidget" name="" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QTableWidget" name="fileTable" />
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="fileLabel" >
+ <property name="text" >
+ <string>Files</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="1" column="0" >
+ <widget class="QTableWidget" name="versionTable" />
+ </item>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="versionLabel" >
+ <property name="text" >
+ <string>Versions</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <layout class="QGridLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item row="0" column="0" >
+ <widget class="QLabel" name="directoryLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Directory</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <layout class="QHBoxLayout" >
+ <property name="margin" >
+ <number>0</number>
+ </property>
+ <property name="spacing" >
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="refreshButton" >
+ <property name="text" >
+ <string>Refresh</string>
+ </property>
+ <property name="icon" >
+ <iconset resource="../main.qrc" >:/images/view-refresh.svg</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="jobCombo" />
+ </item>
+ <item>
+ <widget class="QComboBox" name="clientCombo" />
+ </item>
+ <item>
+ <widget class="QComboBox" name="fileSetCombo" />
+ </item>
+ <item>
+ <spacer>
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../main.qrc" />
+ </resources>
+ <connections/>
+</ui>