netview.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:11k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 1991,1993 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  * @(#) $Header: /cvsroot/nsnam/nam-1/netview.cc,v 1.20 2003/10/11 22:56:50 xuanc Exp $ (LBL)
  34.  */
  35. #include <stdlib.h>
  36. #ifdef WIN32
  37. #include <windows.h>
  38. #endif
  39. #include <ctype.h>
  40. #include <math.h>
  41. #include "bbox.h"
  42. #include "netview.h"
  43. #include "netmodel.h"
  44. #include "tclcl.h"
  45. #include "paint.h"
  46. #include "packet.h"
  47. #include "xwd.h"
  48. #include "node.h"
  49. int
  50. NetView::record(const char *file)
  51. {
  52. #ifndef WIN32
  53. return xwd_Window_Dump_To_File(tk_, offscreen_, (unsigned) width_, 
  54.        (unsigned) height_, file);
  55. #else
  56. return TCL_ERROR;
  57. #endif
  58. }
  59. // Static call back function for tcl delete command callback
  60. void NetView::DeleteCmdProc(ClientData cd)
  61. {
  62. NetView *nv = (NetView *)cd;
  63. if (nv->tk_ != NULL) {
  64. Tk_DestroyWindow(nv->tk_);
  65. }
  66. }
  67. NetView::NetView(const char* name, NetModel* m) 
  68.         : View(name, SQUARE, 300, 200), model_(m)
  69. {
  70. if (tk_!=0) {
  71. Tcl& tcl = Tcl::instance();
  72. cmd_ = Tcl_CreateCommand(tcl.interp(), 
  73.  Tk_PathName(View::tk()),
  74.  command, 
  75.  (ClientData)this, 
  76.  DeleteCmdProc);
  77. }
  78. }
  79. // Do nothing. For derived classes only.
  80. NetView::NetView(const char* name)
  81. : View(name, SQUARE, 300, 200), model_(NULL), cmd_(NULL)
  82. {
  83. }
  84. NetView::NetView(const char* name, NetModel* m, int width, int heigth)
  85.   : View(name, SQUARE, 300, 400), model_(NULL)
  86. {
  87. }
  88. NetView::~NetView()
  89. {
  90. model_->remove_view(this);
  91. // Delete Tcl command created
  92. Tcl& tcl = Tcl::instance();
  93. Tcl_DeleteCommandFromToken(tcl.interp(), cmd_);
  94. }
  95. //----------------------------------------------------------------------
  96. // int NetView::command(ClientData cd, Tcl_Interp * tcl, 
  97. //                      int argc, char ** argv)
  98. //----------------------------------------------------------------------
  99. int NetView::command(ClientData cd, Tcl_Interp * tcl, 
  100.                      int argc, CONST84 char ** argv) {
  101.   if (argc < 2) {
  102.     Tcl_AppendResult(tcl, """, argv[0], "": arg mismatch", 0);
  103.     return (TCL_ERROR);
  104.   }
  105.   if (strcmp(argv[1], "info") == 0) {
  106.     if (argc == 5) {
  107.       NetView *nv = (NetView *)cd;
  108.       Tcl& tcl = Tcl::instance();
  109.       Animation* a;
  110.       //double now = atof(argv[2]);
  111.       //int rootX, rootY;
  112.       //Window root, child;
  113.       //unsigned int state;
  114.       int winX, winY;
  115.       float px, py;
  116.        /*XQueryPointer(Tk_Display(nv->tk_),
  117.               Tk_WindowId(nv->tk_), &root,
  118.                &child, &rootX, &rootY, &winX, &winY,
  119.                &state);*/
  120.       winX=atoi(argv[3]);
  121.       winY=atoi(argv[4]);
  122.       nv->matrix_.imap(float(winX), float(winY), px, py);
  123.       //if ((a = nv->model_->inside(now, px, py)) != 0) {
  124.       if ((a = nv->model_->inside(px, py)) != 0) {
  125.         tcl.result(a->info());
  126.         return TCL_OK;
  127.       }
  128.       return TCL_OK;
  129.     } else {
  130.       Tcl_AppendResult(tcl, """, argv[0],
  131.            "": arg mismatch", 0);
  132.       return TCL_ERROR;
  133.     }
  134.   }
  135.   
  136.   if (strcmp(argv[1], "gettype")==0) {
  137.     if (argc == 5) {
  138.       NetView *nv = (NetView *)cd;
  139.       Tcl& tcl = Tcl::instance();
  140.       Animation* a;
  141.       int winX, winY;
  142.       float px, py;
  143.       winX=atoi(argv[3]);
  144.       winY=atoi(argv[4]);
  145.       nv->matrix_.imap(float(winX), float(winY), px, py);
  146.       if ((a = nv->model_->inside(px, py)) != 0) {
  147.         const char * res = a->gettype();
  148.         if (res != NULL)
  149.           tcl.result(res);
  150.         return TCL_OK;
  151.       }
  152.       return TCL_OK;
  153.       
  154.     } else {
  155.       Tcl_AppendResult(tcl, """, argv[0],
  156.            "": arg mismatch", 0);
  157.       return TCL_ERROR;
  158.     }
  159.   }
  160.   
  161.   if (strcmp(argv[1], "getfid")==0) {
  162.     if (argc == 5) {
  163.       NetView *nv = (NetView *)cd;
  164.       Tcl& tcl = Tcl::instance();
  165.       Animation* a;
  166.       int winX, winY;
  167.       float px, py;
  168.       winX=atoi(argv[3]);
  169.       winY=atoi(argv[4]);
  170.        nv->matrix_.imap(float(winX), float(winY), px, py);
  171.       if ((a = nv->model_->inside(px, py)) != 0) {
  172.         const char *res=a->getfid();
  173.         if (res!=NULL)
  174.           tcl.result(res);
  175.         return TCL_OK;
  176.       }
  177.       return TCL_OK;
  178.     } else {
  179.       Tcl_AppendResult(tcl, """, argv[0],
  180.            "": arg mismatch", 0);
  181.       return TCL_ERROR;
  182.     }
  183.   }
  184.   if (strcmp(argv[1], "getesrc")==0) {
  185.     if (argc == 5) {
  186.       NetView *nv = (NetView *)cd;
  187.       Tcl& tcl = Tcl::instance();
  188.       Animation* a;
  189.       int winX, winY;
  190.       float px, py;
  191.       winX=atoi(argv[3]);
  192.       winY=atoi(argv[4]);
  193.        nv->matrix_.imap(float(winX), float(winY), px, py);
  194.       if ((a = nv->model_->inside(px, py)) != 0) {
  195.         const char *res=a->getesrc();
  196.         if (res!=NULL)
  197.           tcl.result(res);
  198.         return TCL_OK;
  199.       }
  200.       return TCL_OK;
  201.     } else {
  202.       Tcl_AppendResult(tcl, """, argv[0],
  203.            "": arg mismatch", 0);
  204.       return TCL_ERROR;
  205.     }
  206.   }
  207.   if (strcmp(argv[1], "getedst")==0) {
  208.     if (argc == 5) {
  209.       NetView *nv = (NetView *)cd;
  210.       Tcl& tcl = Tcl::instance();
  211.       Animation* a;
  212.       int winX, winY;
  213.       float px, py;
  214.       winX=atoi(argv[3]);
  215.       winY=atoi(argv[4]);
  216.        nv->matrix_.imap(float(winX), float(winY), px, py);
  217.       if ((a = nv->model_->inside(px, py)) != 0) {
  218.         const char *res=a->getedst();
  219.         if (res!=NULL)
  220.           tcl.result(res);
  221.         return TCL_OK;
  222.       }
  223.       return TCL_OK;
  224.     } else {
  225.       Tcl_AppendResult(tcl, """, argv[0],
  226.            "": arg mismatch", 0);
  227.       return TCL_ERROR;
  228.     }
  229.   }
  230.   if (strcmp(argv[1], "getname")==0) {
  231.     if (argc == 5) {
  232.       NetView *nv = (NetView *)cd;
  233.       Tcl& tcl = Tcl::instance();
  234.       Animation* a;
  235.       //double now = atof(argv[2]);
  236.       //Window root, child;
  237.       //int rootX, rootY; 
  238.       //unsigned int state;
  239.       int winX, winY;
  240.       float px, py;
  241.       /*XQueryPointer(Tk_Display(nv->tk_),
  242.               Tk_WindowId(nv->tk_), &root,
  243.                &child, &rootX, &rootY, &winX, &winY,
  244.                &state);
  245.               */
  246.       winX=atoi(argv[3]);
  247.       winY=atoi(argv[4]);
  248.        nv->matrix_.imap(float(winX), float(winY), px, py);
  249.       //if ((a = nv->model_->inside(now, px, py)) != 0) {
  250.       if ((a = nv->model_->inside(px, py)) != 0) {
  251.         const char *res=a->getname();
  252.         if (res!=NULL)
  253.           tcl.result(res);
  254.         return TCL_OK;
  255.       }
  256.       return TCL_OK;
  257.     } else {
  258.       Tcl_AppendResult(tcl, """, argv[0],
  259.            "": arg mismatch", 0);
  260.       return TCL_ERROR;
  261.     }
  262.   }
  263.   
  264.   // Node execution script
  265.   //   returns the script to execute if any
  266.   //  - $netview get_node_tclscript $node_id
  267.   if (strcmp(argv[1], "get_node_tclscript")==0) {
  268.     if (argc == 3) {
  269.       NetView * nv = (NetView *) cd;
  270.       Tcl& tcl = Tcl::instance();
  271.       Node * node = nv->model_->lookupNode(atoi(argv[2]));
  272.       char * tcl_script = node->getTclScript();
  273.       if (tcl_script) {
  274.         tcl.result(tcl_script);
  275.       }
  276.       return TCL_OK;
  277.       
  278.     } else {
  279.       Tcl_AppendResult(tcl, """, argv[0], "": arg mismatch", 0);
  280.       return TCL_ERROR;
  281.     }
  282.   }
  283.   if (strcmp(argv[1], "get_node_tclscript_label")==0) {
  284.     if (argc == 3) {
  285.       NetView * nv = (NetView *) cd;
  286.       Tcl& tcl = Tcl::instance();
  287.       Node * node = nv->model_->lookupNode(atoi(argv[2]));
  288.       char * tcl_script = node->getTclScriptLabel();
  289.       if (tcl_script) {
  290.         tcl.result(tcl_script);
  291.       }
  292.       return TCL_OK;
  293.       
  294.     } else {
  295.       Tcl_AppendResult(tcl, """, argv[0], "": arg mismatch", 0);
  296.       return TCL_ERROR;
  297.     }
  298.   }
  299.   if (strcmp(argv[1], "new_monitor") == 0) {
  300.     if (argc == 5) {
  301.       NetView *nv = (NetView *)cd;
  302.       Tcl& tcl = Tcl::instance();
  303.       Animation* a;
  304.       //double now = atof(argv[2]);
  305.       float px, py;
  306.       nv->matrix_.imap(atof(argv[3]), atof(argv[4]), px, py);
  307.       //if ((a = nv->model_->inside(now, px, py)) != 0) {
  308.       if ((a = nv->model_->inside(px, py)) != 0) {
  309.         char num[10];
  310.         int n = nv->model_->add_monitor(a);
  311.         sprintf(num, "%d", n);
  312.         tcl.result(num);
  313.         return TCL_OK;
  314.       }
  315.       return TCL_OK;
  316.     } else {
  317.       Tcl_AppendResult(tcl, """, argv[0],
  318.            "": arg mismatch", 0);
  319.       return TCL_ERROR;
  320.     }
  321.   }
  322.   if (strcmp(argv[1], "delete_monitor") == 0) {
  323.     if (argc == 3) {
  324.       NetView *nv = (NetView *)cd;
  325.       nv->model_->delete_monitor(atoi(argv[2]));
  326.       return TCL_OK;
  327.     } else {
  328.       Tcl_AppendResult(tcl, """, argv[0],
  329.            "": arg mismatch", 0);
  330.       return TCL_ERROR;
  331.     }
  332.   }
  333.   if (strcmp(argv[1], "monitor") == 0) {
  334.     if (argc == 4) {
  335.       NetView *nv = (NetView *)cd;
  336.       Tcl& tcl = Tcl::instance();
  337.       //Animation* a;
  338.       double now = atof(argv[2]);
  339.       int monitor = atoi(argv[3]);
  340.       char result[128];
  341.       nv->model_->monitor(now, monitor, result, 128);
  342.       tcl.result(result);
  343.       return TCL_OK;
  344.     }  else {
  345.       Tcl_AppendResult(tcl, """, argv[0],
  346.            "": arg mismatch", 0);
  347.       return TCL_ERROR;
  348.     }
  349.   }
  350.   if (strcmp(argv[1], "record_frame") == 0) {
  351.     if (argc == 3) {
  352.       NetView *nv = (NetView *)cd;
  353.       return nv->record(argv[2]);
  354.     }  else {
  355.       Tcl_AppendResult(tcl, """, argv[0],
  356.            "": arg mismatch", 0);
  357.       return TCL_ERROR;
  358.     }
  359.   }
  360.   if (strcmp(argv[1], "close") == 0) {
  361.     NetView *nv = (NetView *)cd;
  362.     nv->destroy();
  363.     return TCL_OK;
  364.   }
  365.   return (View::command(cd, tcl, argc, argv));
  366. }
  367. //---------------------------------------------------------------------
  368. // void
  369. // NetView::render()
  370. //   - The drawing/render sequence is a little circular.  NetModel calls
  371. //     View::draw() which calls NetView::render which then goes back to
  372. //     NetModel::render(View *)
  373. //---------------------------------------------------------------------
  374. void
  375. NetView::render() {
  376.   model_->render(this);
  377. }
  378. //---------------------------------------------------------------------
  379. //---------------------------------------------------------------------
  380. void
  381. NetView::BoundingBox(BBox &bb) {
  382.   fprintf(stderr, "NetView::BoundingBoxn");
  383.   model_->BoundingBox(bb);
  384. }