I finally got around to doing this. My method only requires editing theme.php so it doesn't actually touch the jcalpro code at all.
First, you'll need to create an icon_print.png file and put in your theme's images folder. I didn't use the icon_print.gif already supplied with jcalpro because its dimensions are not 23x23 like the other main menu icons.
The following is added to $template_main_menu:
<!-- BEGIN print_view -->
<td><img src="{URL}images/spacer.gif" width="10" height="25" border="0" alt="" /></td>
<td class="buttontext" align="center" valign="middle" nowrap="nowrap">
<a href="{PRINT_TGT}" title="{PRINT_LNK}" class="buttontext" target="_blank" onclick="{PRINT_STATUS}">
<img src="{URL}themes/spartan/images/icon-print.png" border="0" alt="{PRINT_LNK}" /><br />
{PRINT_LNK}</a>
</td>
<!-- END print_view -->
Then this is added after </table> in $template_main_menu:
{PRINT_JSCRIPT}
Then in function theme_main_menu(), add the following lines below all the lines containing "if (!$CONFIG_EXT[])":
if (!strpos($_SERVER["REQUEST_URI"], "index.php")) {
$print_link = "#";
$status = 'javascript:window.print(); return false;';
$print_jscript = '
<script type="text/javascript">
window.onload = function() {
window.print();
}
</script>';
} else {
$print_link = str_replace("index.php", "index2.php", $_SERVER["REQUEST_URI"]);
$status = "window.open('".$print_link."','win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,height=480,directories=no,location=no'); return false;";
$print_jscript = "";
}
Then append the following lines to the end of $param in that same function (and be sure to add a comma at the end of the SEARCH_LNK line):
'{PRINT_LNK}'=> "Print",
'{PRINT_TGT}'=> $print_link,
'{PRINT_STATUS}'=> $status,
'{PRINT_JSCRIPT}'=> $print_jscript
Hope that helps.