nxmc: some graphs functionality ported from Windows console
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 1 Apr 2008 20:03:03 +0000 (20:03 +0000)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 1 Apr 2008 20:03:03 +0000 (20:03 +0000)
27 files changed:
.gitattributes
include/netxms_maps.h
src/client/console/libnxmc/graph.cpp
src/client/console/libnxmc/graph.h
src/client/console/libnxmc/nxview.cpp
src/client/console/libnxmc/nxview.h
src/client/console/nxmc/rc/icons/small/Makefile.am
src/client/console/nxmc/rc/icons/small/graph.xpm [new file with mode: 0644]
src/client/console/nxmc/rc/manual.xrc
src/client/console/plugins/ObjectBrowser/Makefile.am
src/client/console/plugins/ObjectBrowser/graphview.cpp
src/client/console/plugins/ObjectBrowser/lastvalues.cpp
src/client/console/plugins/ObjectBrowser/lastvalview.cpp
src/client/console/plugins/ObjectBrowser/main.cpp
src/client/console/plugins/ObjectBrowser/nodelastval.cpp
src/client/console/plugins/ObjectBrowser/object_browser.h
src/console/win32/NodeTopologyView.cpp
src/console/win32/ObjectDepView.cpp
src/console/win32/ObjectDepView.h
src/libnxcl/layer2.cpp
src/libnxmap/graph.cpp
src/libnxmap/libnxmap.h
src/libnxmap/objlist.cpp
src/libnxmap/radial.cpp
src/libnxmap/rt.cpp
src/libnxmap/submap.cpp
src/libnxmap/vertex.cpp

index a1a431c..f62c276 100644 (file)
@@ -512,6 +512,7 @@ src/client/console/nxmc/rc/icons/small/config.png -text
 src/client/console/nxmc/rc/icons/small/container.xpm -text
 src/client/console/nxmc/rc/icons/small/critical.xpm -text
 src/client/console/nxmc/rc/icons/small/disabled.xpm -text
+src/client/console/nxmc/rc/icons/small/graph.xpm -text
 src/client/console/nxmc/rc/icons/small/information.xpm -text
 src/client/console/nxmc/rc/icons/small/interface.xpm -text
 src/client/console/nxmc/rc/icons/small/major.xpm -text
index 5bba540..c2b16c7 100644 (file)
@@ -128,7 +128,7 @@ struct MAP_ACL_ENTRY
 // Connected object list - used as source for nxSubmap::DoLayout
 //
 
-class LIBNXMAP_EXPORTABLE nxObjList
+class LIBNXMAP_EXPORTABLE nxmap_ObjList
 {
 protected:
    DWORD m_dwNumObjects;
@@ -137,10 +137,10 @@ protected:
    OBJLINK *m_pLinkList;
 
 public:
-   nxObjList();
-   nxObjList(nxObjList *pSrc);
-   nxObjList(CSCPMessage *pMsg);
-   ~nxObjList();
+   nxmap_ObjList();
+   nxmap_ObjList(nxmap_ObjList *pSrc);
+   nxmap_ObjList(CSCPMessage *pMsg);
+   ~nxmap_ObjList();
 
    void AddObject(DWORD dwId);
    void LinkObjects(DWORD dwId1, DWORD dwId2);
@@ -160,37 +160,37 @@ public:
 // Graph's vertex
 //
 
-class LIBNXMAP_EXPORTABLE nxVertex
+class LIBNXMAP_EXPORTABLE nxmap_Vertex
 {
 protected:
    DWORD m_dwId;
    DWORD m_dwNumChilds;
-   nxVertex **m_ppChildList;
+   nxmap_Vertex **m_ppChildList;
    DWORD m_dwNumParents;
-   nxVertex **m_ppParentList;
+   nxmap_Vertex **m_ppParentList;
    int m_posX;
    int m_posY;
    BOOL m_isProcessed;  // Processed flag for various recursive operations
 
-   void LinkParent(nxVertex *pVtx);
-   void UnlinkParent(nxVertex *pVtx);
+   void LinkParent(nxmap_Vertex *pVtx);
+   void UnlinkParent(nxmap_Vertex *pVtx);
 
 public:
-   nxVertex(DWORD dwId);
-   ~nxVertex();
+   nxmap_Vertex(DWORD dwId);
+   ~nxmap_Vertex();
 
    DWORD GetId(void) { return m_dwId; }
    int GetPosX(void) { return m_posX; }
    int GetPosY(void) { return m_posY; }
    DWORD GetNumChilds(void) { return m_dwNumChilds; }
-   nxVertex *GetChild(DWORD dwIndex) { return (dwIndex < m_dwNumChilds) ? m_ppChildList[dwIndex] : NULL; }
+   nxmap_Vertex *GetChild(DWORD dwIndex) { return (dwIndex < m_dwNumChilds) ? m_ppChildList[dwIndex] : NULL; }
    DWORD GetNumParents(void) { return m_dwNumParents; }
-   nxVertex *GetParent(DWORD dwIndex) { return (dwIndex < m_dwNumParents) ? m_ppParentList[dwIndex] : NULL; }
-   BOOL IsParentOf(nxVertex *pVertex);
+   nxmap_Vertex *GetParent(DWORD dwIndex) { return (dwIndex < m_dwNumParents) ? m_ppParentList[dwIndex] : NULL; }
+   BOOL IsParentOf(nxmap_Vertex *pVertex);
    BOOL IsProcessed(void) { return m_isProcessed; }
 
-   void LinkChild(nxVertex *pVtx);
-   void UnlinkChild(nxVertex *pVtx);
+   void LinkChild(nxmap_Vertex *pVtx);
+   void UnlinkChild(nxmap_Vertex *pVtx);
    void SetPosition(int x, int y) { m_posX = x; m_posY = y; }
    void SetAsProcessed(void) { m_isProcessed = TRUE; }
    void SetAsUnprocessed(void) { m_isProcessed = FALSE; }
@@ -201,26 +201,26 @@ public:
 // Connected graph
 //
 
-class LIBNXMAP_EXPORTABLE nxGraph
+class LIBNXMAP_EXPORTABLE nxmap_Graph
 {
 protected:
    DWORD m_dwVertexCount;
-   nxVertex **m_ppVertexList;
-   nxVertex *m_pRoot;
+   nxmap_Vertex **m_ppVertexList;
+   nxmap_Vertex *m_pRoot;
 
    void SetAsUnprocessed(void);
-   void NormalizeVertexLinks(nxVertex *pRoot);
+   void NormalizeVertexLinks(nxmap_Vertex *pRoot);
 
 public:
-   nxGraph();
-   nxGraph(DWORD dwNumObjects, DWORD *pdwObjectList, DWORD dwNumLinks, OBJLINK *pLinkList);
-   ~nxGraph();
+   nxmap_Graph();
+   nxmap_Graph(DWORD dwNumObjects, DWORD *pdwObjectList, DWORD dwNumLinks, OBJLINK *pLinkList);
+   ~nxmap_Graph();
 
    DWORD GetVertexCount(void) { return m_dwVertexCount; }
-   nxVertex *FindVertex(DWORD dwId);
-   DWORD GetVertexIndex(nxVertex *pVertex);
-   nxVertex *GetRootVertex(void) { return (m_pRoot != NULL) ? m_pRoot : (m_dwVertexCount > 0 ? m_ppVertexList[0] : NULL); }
-   nxVertex *GetVertexByIndex(DWORD dwIndex) { return dwIndex < m_dwVertexCount ? m_ppVertexList[dwIndex] : NULL; }
+   nxmap_Vertex *FindVertex(DWORD dwId);
+   DWORD GetVertexIndex(nxmap_Vertex *pVertex);
+   nxmap_Vertex *GetRootVertex(void) { return (m_pRoot != NULL) ? m_pRoot : (m_dwVertexCount > 0 ? m_ppVertexList[0] : NULL); }
+   nxmap_Vertex *GetVertexByIndex(DWORD dwIndex) { return dwIndex < m_dwVertexCount ? m_ppVertexList[dwIndex] : NULL; }
 
    void SetRootVertex(DWORD dwId);
    void NormalizeLinks(void);
index 9b7749b..b44e16d 100644 (file)
@@ -47,6 +47,7 @@ BEGIN_EVENT_TABLE(nxGraph, wxWindow)
        EVT_PAINT(nxGraph::OnPaint)
        EVT_SET_FOCUS(nxGraph::OnSetFocus)
        EVT_KILL_FOCUS(nxGraph::OnKillFocus)
+       EVT_SIZE(nxGraph::OnSize)
 END_EVENT_TABLE()
 
 
@@ -104,6 +105,18 @@ nxGraph::~nxGraph()
 }
 
 
+//
+// Repaint graph entirely
+//
+
+void nxGraph::Redraw()
+{
+       delete m_bitmap;
+   m_bitmap = DrawGraphOnBitmap(GetClientSize());
+       Refresh(false);
+}
+
+
 //
 // Set predefined color scheme
 //
@@ -489,7 +502,7 @@ void nxGraph::DrawAreaGraph(wxMemoryDC &dc, NXC_DCI_DATA *data, wxColour rgbColo
                        } \
    }
 
-wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
+wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &graphSize)
 {
    wxMemoryDC dc;           // Window dc and in-memory dc
        wxBitmap *bitmap;
@@ -511,7 +524,7 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
                                       2592000, 2678400, 2592000, 2678400 };
 
    // Create bitmap for painting
-       bitmap = new wxBitmap(size.x, size.y);
+       bitmap = new wxBitmap(graphSize.x, graphSize.y);
 
    // Initial DC setup
    dc.SelectObject(*bitmap);
@@ -521,7 +534,7 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
 
    // Fill background
        dc.SetBrush(brushBkgnd);
-       dc.DrawRectangle(-1, -1, size.x + 2, size.y + 2);
+       dc.DrawRectangle(-1, -1, graphSize.x + 2, graphSize.y + 2);
 
    // Calculate text size and left margin
    textSize = dc.GetTextExtent(_T("0000.000"));
@@ -541,7 +554,7 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
             }
       }
       nColSize += textSize.y + 20;
-      nCols = (size.x - iLeftMargin - iRightMargin) / nColSize;
+      nCols = (graphSize.x - iLeftMargin - iRightMargin) / nColSize;
       if (nCols == 0)
          nCols = 1;
 
@@ -568,7 +581,7 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
 
                rcTitle.x = iLeftMargin;
                rcTitle.y = iTopMargin;
-               rcTitle.width = size.x - iRightMargin;
+               rcTitle.width = graphSize.x - iRightMargin;
                rcTitle.height = rcTitle.y + textSize.y;
                dc.DrawLabel(m_title, rcTitle, DT_CENTER);
                iTopMargin += textSize.y + 7;
@@ -577,10 +590,10 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
    // Calculate data rectangle
    m_rectGraph.x = iLeftMargin;
    m_rectGraph.y = iTopMargin;
-   m_rectGraph.width = size.x - iRightMargin;
-   m_rectGraph.height = size.y - iBottomMargin;
+   m_rectGraph.width = graphSize.x - iRightMargin;
+   m_rectGraph.height = graphSize.y - iBottomMargin;
    iGraphLen = m_rectGraph.width + 1;   // Actual data area length in pixels
-   nDataAreaHeight = size.y - iBottomMargin - textSize.y / 2 - iTopMargin - textSize.y / 2;
+   nDataAreaHeight = graphSize.y - iBottomMargin - textSize.y / 2 - iTopMargin - textSize.y / 2;
 
    // Calculate how many seconds represent each pixel
    // and select time stamp label's style
@@ -692,9 +705,9 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
       {
          x = iLeftMargin + nGridSizeX;
       }
-      while(x < size.x - iRightMargin)
+      while(x < graphSize.x - iRightMargin)
       {
-         dc.DrawLine(x, size.y - iBottomMargin, x, iTopMargin);
+         dc.DrawLine(x, graphSize.y - iBottomMargin, x, iTopMargin);
          if (nTimeLabel == TS_MONTH)
          {
             timeStamp = m_timeFrom + (DWORD)((double)(x - iLeftMargin) * m_secondsPerPixel);
@@ -706,9 +719,9 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
             x += nGridSizeX;
          }
       }
-      for(y = size.y - iBottomMargin - nGridSizeY; y > iTopMargin; y -= nGridSizeY)
+      for(y = graphSize.y - iBottomMargin - nGridSizeY; y > iTopMargin; y -= nGridSizeY)
       {
-         dc.DrawLine(iLeftMargin, y, size.x - iRightMargin, y);
+         dc.DrawLine(iLeftMargin, y, graphSize.x - iRightMargin, y);
       }
                dc.SetPen(wxNullPen);
    }
@@ -737,12 +750,12 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
    // Paint ordinates
    wxPen penAxis(m_rgbAxisColor, 3);
    dc.SetPen(penAxis);
-   dc.DrawLine(iLeftMargin, size.y - iBottomMargin, iLeftMargin, iTopMargin);
-   dc.DrawLine(iLeftMargin, size.y - iBottomMargin, size.x - iRightMargin, size.y - iBottomMargin);
+   dc.DrawLine(iLeftMargin, graphSize.y - iBottomMargin, iLeftMargin, iTopMargin);
+   dc.DrawLine(iLeftMargin, graphSize.y - iBottomMargin, graphSize.x - iRightMargin, graphSize.y - iBottomMargin);
 
    // Display ordinate marks
-   dStep = m_currMaxValue / ((size.y - iBottomMargin - iTopMargin) / nGridSizeY);
-   for(y = size.y - iBottomMargin - textSize.y / 2, dMark = 0; y > iTopMargin; y -= nGridSizeY, dMark += dStep)
+   dStep = m_currMaxValue / ((graphSize.y - iBottomMargin - iTopMargin) / nGridSizeY);
+   for(y = graphSize.y - iBottomMargin - textSize.y / 2, dMark = 0; y > iTopMargin; y -= nGridSizeY, dMark += dStep)
    {
       if (bIntMarks)
          _stprintf(szBuffer, INT64_FMT _T("%s"), (INT64)dMark / nDivider, szModifier);
@@ -753,9 +766,9 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
    }
 
    // Display absciss marks
-   y = size.y - iBottomMargin + 3;
+   y = graphSize.y - iBottomMargin + 3;
    iStep = iTimeLen / nGridSizeX + 1;    // How many grid lines we should skip
-   for(x = iLeftMargin; x < size.x - iRightMargin;)
+   for(x = iLeftMargin; x < graphSize.x - iRightMargin;)
    {
       timeStamp = m_timeFrom + (time_t)((double)(x - iLeftMargin) * m_secondsPerPixel);
       NXMCFormatTimeStamp(timeStamp, szBuffer, nTimeLabel);
@@ -783,7 +796,7 @@ wxBitmap *nxGraph::DrawGraphOnBitmap(wxSize &size)
          {
             wxBrush brushLegend(m_graphItemStyles[i].rgbColor);
             dc.SetBrush(brushLegend);
-            dc.DrawRectangle(x, y, x + textSize.y, y + textSize.y);
+            dc.DrawRectangle(x, y, textSize.y, textSize.y);
             dc.SetBrush(wxNullBrush);
 
             if (m_dciInfo != NULL)
@@ -835,3 +848,105 @@ int nxGraph::NextMonthOffset(time_t timeStamp)
    else
       return (int)ceil(secondsPerMonth[plt->tm_mon] / m_secondsPerPixel) + 1;
 }
+
+
+//
+// Set time frame this graph covers
+//
+
+void nxGraph::SetTimeFrame(time_t timeFrom, time_t timeTo)
+{
+   struct tm lt;
+
+       if (timeFrom > timeTo)
+               return;
+
+   m_timeTo = timeTo;
+
+   // Round boundaries
+   memcpy(&lt, localtime(&timeFrom), sizeof(struct tm));
+   if (timeTo - timeFrom >= 5184000)   // 60 days
+   {
+      // Align to month boundary
+      lt.tm_mday = 1;
+      lt.tm_hour = 0;
+      lt.tm_min = 0;
+      lt.tm_sec = 0;
+   }
+   else if (timeTo - timeFrom >= 432000)   // 5 days
+   {
+      // Align to day boundary
+      lt.tm_hour = 0;
+      lt.tm_min = 0;
+      lt.tm_sec = 0;
+   }
+   else if (timeTo - timeFrom >= 86400)
+   {
+      lt.tm_min = 0;
+      lt.tm_sec = 0;
+   }
+   else
+   {
+      lt.tm_sec = 0;
+   }
+   m_timeFrom = mktime(&lt);
+}
+
+
+//
+// Set data for specific item
+//
+
+void nxGraph::SetData(DWORD index, NXC_DCI_DATA *data)
+{
+   if (index < MAX_GRAPH_ITEMS)
+   {
+      if (m_data[index] != NULL)
+         NXCDestroyDCIData(m_data[index]);
+      m_data[index] = data;
+   }
+}
+
+
+//
+// Update data (add new items to top and remove old from bottom)
+//
+
+void nxGraph::UpdateData(DWORD index, NXC_DCI_DATA *data)
+{
+   NXC_DCI_ROW *curr;
+   DWORD size;
+
+   if (index >= MAX_GRAPH_ITEMS)
+      return;
+
+   // Delete records older than m_dwTimeFrom
+   if (m_data[index]->dwNumRows > 0)
+   {
+      curr = (NXC_DCI_ROW *)((char *)m_data[index]->pRows + (m_data[index]->dwNumRows - 1) * m_data[index]->wRowSize);
+      while(((time_t)curr->dwTimeStamp < m_timeFrom) && (m_data[index]->dwNumRows > 0))
+      {
+         m_data[index]->dwNumRows--;
+         curr = (NXC_DCI_ROW *)((char *)curr - m_data[index]->wRowSize);
+      }
+   }
+
+   // Insert new records
+   size = m_data[index]->dwNumRows * m_data[index]->wRowSize;
+   m_data[index]->dwNumRows += data->dwNumRows;
+   m_data[index]->pRows = (NXC_DCI_ROW *)realloc(m_data[index]->pRows, m_data[index]->dwNumRows * m_data[index]->wRowSize);
+   memmove((char *)m_data[index]->pRows + data->dwNumRows * m_data[index]->wRowSize, m_data[index]->pRows, size);
+   memcpy(m_data[index]->pRows, data->pRows, data->dwNumRows * m_data[index]->wRowSize);
+
+   NXCDestroyDCIData(data);
+}
+
+
+//
+// Resize handler
+//
+
+void nxGraph::OnSize(wxSizeEvent &event)
+{
+       Redraw();
+}
index 9ce7aff..a1d859e 100644 (file)
@@ -139,10 +139,14 @@ public:
        nxGraph(wxWindow *parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize);
        virtual ~nxGraph();
 
+       void Redraw();
+
        void SetData(DWORD index, NXC_DCI_DATA *data);
+       void UpdateData(DWORD index, NXC_DCI_DATA *data);
        void SetTimeFrame(time_t timeFrom, time_t timeTo);
        void SetDCIInfo(DCIInfo **info) { m_dciInfo = info; }
        void SetColorScheme(int scheme);
+       void SetUpdating(bool isUpdating) { if (isUpdating) m_flags |= NXGF_IS_UPDATING; else m_flags &= ~NXGF_IS_UPDATING; }
 
        bool IsRulerVisible() { return m_flags & NXGF_SHOW_RULER ? true : false; }
        bool IsGridVisible() { return m_flags & NXGF_SHOW_GRID ? true : false; }
@@ -150,12 +154,13 @@ public:
        bool IsTitleVisible() { return m_flags & NXGF_SHOW_TITLE ? true : false; }
        bool IsAutoscale() { return m_flags & NXGF_AUTOSCALE ? true : false; }
 
-       wxBitmap *DrawGraphOnBitmap(wxSize &size);
+       wxBitmap *DrawGraphOnBitmap(wxSize &graphSize);
 
 protected:
        void OnPaint(wxPaintEvent &event);
        void OnSetFocus(wxFocusEvent &event);
        void OnKillFocus(wxFocusEvent &event);
+       void OnSize(wxSizeEvent &event);
 
        DECLARE_EVENT_TABLE();
 };
index df26e52..6946db4 100644 (file)
@@ -226,6 +226,20 @@ int nxView::DoRequestArg4(void *func, wxUIntPtr arg1, wxUIntPtr arg2, wxUIntPtr
    return DoRequest(data);
 }
 
+int nxView::DoRequestArg5(void *func, wxUIntPtr arg1, wxUIntPtr arg2, wxUIntPtr arg3,
+                          wxUIntPtr arg4, wxUIntPtr arg5, const TCHAR *errMsg, DWORD flags)
+{
+   RqData *data;
+
+       data = new RqData(m_freeRqId++, this, func, 5, errMsg, flags);
+   data->m_arg[0] = arg1;
+   data->m_arg[1] = arg2;
+   data->m_arg[2] = arg3;
+   data->m_arg[3] = arg4;
+   data->m_arg[4] = arg5;
+   return DoRequest(data);
+}
+
 
 //
 // Timer event handler
index abf944e..39a9b8f 100644 (file)
@@ -83,6 +83,8 @@ protected:
        int DoRequestArg3(void *func, wxUIntPtr arg1, wxUIntPtr arg2, wxUIntPtr arg3, const TCHAR *errMsg, DWORD flags = 0);
        int DoRequestArg4(void *func, wxUIntPtr arg1, wxUIntPtr arg2, wxUIntPtr arg3,
                      wxUIntPtr arg4, const TCHAR *errMsg, DWORD flags = 0);
+       int DoRequestArg5(void *func, wxUIntPtr arg1, wxUIntPtr arg2, wxUIntPtr arg3,
+                     wxUIntPtr arg4, wxUIntPtr arg5, const TCHAR *errMsg, DWORD flags = 0);
        
        virtual void RequestCompletionHandler(int rqId, DWORD rcc, const TCHAR *errMsg);
 
index d74620b..51e7d1e 100644 (file)
@@ -16,6 +16,7 @@ EXTRA_DIST = \
        container.xpm \
        critical.xpm \
        disabled.xpm \
+       graph.xpm \
        information.xpm \
        interface.xpm \
        major.xpm \
diff --git a/src/client/console/nxmc/rc/icons/small/graph.xpm b/src/client/console/nxmc/rc/icons/small/graph.xpm
new file mode 100644 (file)
index 0000000..ab147f5
--- /dev/null
@@ -0,0 +1,27 @@
+/* XPM */
+static char *graph__[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 5 1",
+"  c black",
+". c #008000",
+"X c #C0C0C0",
+"o c gray100",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOO",
+"O              O",
+" ooooooooooooo  ",
+" o            X ",
+" o .......... X ",
+" o .  .  .  . X ",
+" o . ooo .  . X ",
+" o .o...o.... X ",
+" o .o . o.  o X ",
+" o o  .  ooo. X ",
+" o .......... X ",
+" o .  .  .  . X ",
+" o            X ",
+"  XXXXXXXXXXXX  ",
+"O              O",
+"OOOOOOOOOOOOOOOO"
+};
index 348c3a2..f5fc445 100644 (file)
@@ -34,6 +34,7 @@
        <object class="wxIcon" name="icoSmallTerminated">icons/small/terminated.xpm</object>
 
        <!-- Miscellanious small icons -->
+       <object class="wxIcon" name="icoGraph">icons/small/graph.xpm</object>
        <object class="wxIcon" name="icoSmallConfig">icons/small/config.png</object>
        <object class="wxIcon" name="icoSmallInformation">icons/small/information.xpm</object>
        <object class="wxIcon" name="icoSortDown">icons/small/sort_down.xpm</object>
index dad785d..6f2db9d 100644 (file)
@@ -3,7 +3,7 @@ INCLUDES=-I@top_srcdir@/include -I@top_srcdir@/src/client/console/include
 SUBDIRS = rc
 
 lib_LTLIBRARIES = libnxmcp_ObjectBrowser.la
-libnxmcp_ObjectBrowser_la_SOURCES = browser.cpp lastval.cpp main.cpp objview.cpp overview.cpp
+libnxmcp_ObjectBrowser_la_SOURCES = browser.cpp graphview.cpp lastvalues.cpp lastvalview.cpp main.cpp nodelastval.cpp objview.cpp overview.cpp
 if BUILD_UNICODE_CONSOLE
 libnxmcp_ObjectBrowser_la_CPPFLAGS = -DUNICODE
 libnxmcp_ObjectBrowser_la_LDFLAGS = ../../../../libnetxms/libnetxmsw.la ../../../../libnxcl/libnxclw.la ../../libnxmc/libnxmc.la
index 06b1eaa..e02b8b3 100644 (file)
 **/
 
 #include "object_browser.h"
+
+
+//
+// Event table
+//
+
+BEGIN_EVENT_TABLE(nxGraphView, nxView)
+       EVT_SIZE(nxGraphView::OnSize)
+       EVT_NX_REFRESH_VIEW(nxGraphView::OnViewRefresh)
+       EVT_NX_DCI_DATA_RECEIVED(nxGraphView::OnDataReceived)
+       EVT_TIMER(1, nxGraphView::OnProcessingTimer)
+END_EVENT_TABLE()
+
+
+//
+// Constructor
+//
+
+nxGraphView::nxGraphView(int dciCount, DCIInfo **dciList, wxWindow *parent)
+            : nxView((parent != NULL) ? parent : NXMCGetDefaultParent())
+{
+       int i;
+       NXC_OBJECT *node;
+       TCHAR buffer[64];
+       wxString title = _T("History Graph");
+
+       m_rqId = -1;
+
+       m_timeFrameType = 1;    // Back from now
+       m_timeFrom = 0;
+       m_timeTo = 0;
+       m_timeFrame = 3600;     // 1 hour by default
+
+       memset(m_dciInfo, 0, sizeof(DCIInfo *) * MAX_GRAPH_ITEMS);
+       m_dciCount = dciCount;
+       for(i = 0; i < m_dciCount; i++)
+               m_dciInfo[i] = new DCIInfo(dciList[i]);
+
+       // Create title
+       if (dciCount == 1)
+       {
+               node = NXCFindObjectById(NXMCGetSession(), m_dciInfo[0]->m_dwNodeId);
+               if (node != NULL)
+               {
+                       title += _T(" - [");
+                       title += node->szName;
+                       title += _T(" - ");
+                       title += m_dciInfo[0]->m_pszDescription;
+                       title += _T("]");
+               }
+       }
+       else
+       {
+               for(i = 1; i < m_dciCount; i++)
+                       if (m_dciInfo[i]->m_dwNodeId != m_dciInfo[0]->m_dwNodeId)
+                               break;
+               if (i == m_dciCount)
+               {
+                       // All DCI's from same node
+                       node = NXCFindObjectById(NXMCGetSession(), m_dciInfo[0]->m_dwNodeId);
+                       if (node != NULL)
+                       {
+                               title += _T(" - [");
+                               title += node->szName;
+                               title += _T("]");
+                       }
+               }
+       }
+       SetLabel(title);
+
+       // Create unique name
+       _sntprintf(buffer, 64, _T("graph_%p"), this);
+       SetName(buffer);
+
+       m_graph = new nxGraph(this);
+       m_graph->SetDCIInfo(m_dciInfo);
+
+       SetIcon(wxXmlResource::Get()->LoadIcon(_T("icoGraph")));
+
+       m_processingTimer = new wxTimer(this, 1);
+
+       wxCommandEvent event(nxEVT_REFRESH_VIEW);
+       AddPendingEvent(event);
+}
+
+
+//
+// Destructor
+//
+
+nxGraphView::~nxGraphView()
+{
+       int i;
+
+       for(i = 0; i < MAX_GRAPH_ITEMS; i++)
+               delete m_dciInfo[i];
+       delete m_processingTimer;
+}
+
+
+//
+// Resize handler
+//
+
+void nxGraphView::OnSize(wxSizeEvent &event)
+{
+       wxSize size = event.GetSize();
+       m_graph->SetSize(0, 0, size.x, size.y);
+}
+
+
+//
+// Get data from server
+//
+
+static DWORD GetData(nxGraphView *view, int dciCount, DCIInfo **dciInfo, time_t timeFrom, time_t timeTo)
+{
+       int i;
+       DWORD rcc;
+       NXC_DCI_DATA *dciData;
+
+       for(i = 0; i < dciCount; i++)
+       {
+               rcc = NXCGetDCIData(NXMCGetSession(), dciInfo[i]->m_dwNodeId, dciInfo[i]->m_dwItemId,
+                                   0, timeFrom, timeTo, &dciData);
+               if (rcc != RCC_SUCCESS)
+                       break;
+               
+               wxCommandEvent event(nxEVT_DCI_DATA_RECEIVED);
+               event.SetInt(i);
+               event.SetClientData(dciData);
+               wxPostEvent(view, event);
+       }
+       return rcc;
+}
+
+
+//
+// Handler for received DCI data
+//
+
+void nxGraphView::OnDataReceived(wxCommandEvent &event)
+{
+       m_graph->SetData(event.GetInt(), (NXC_DCI_DATA *)event.GetClientData());
+}
+
+
+//
+// View->Refresh menu handler
+//
+
+void nxGraphView::OnViewRefresh(wxCommandEvent &event)
+{
+       if (m_rqId != -1)
+               return; // Refresh already in progress
+
+   // Set new time frame
+   if (m_timeFrameType == 1)
+   {
+      m_timeTo = time(NULL);
+      m_timeTo += 60 - m_timeTo % 60;   // Round to minute boundary
+      m_timeFrom = m_timeTo - m_timeFrame;
+   }
+   m_graph->SetTimeFrame(m_timeFrom, m_timeTo);
+
+       m_rqId = DoRequestArg5(GetData, (wxUIntPtr)this, m_dciCount, (wxUIntPtr)m_dciInfo,
+                              m_timeFrom, m_timeTo, _T("Cannot retrieve collected data: %s"));
+       m_graph->SetUpdating(true);
+       m_processingTimer->Start(300, wxTIMER_ONE_SHOT);
+}
+
+
+//
+// Request completion handler
+//
+
+void nxGraphView::RequestCompletionHandler(int rqId, DWORD rcc, const TCHAR *errMsg)
+{
+       if (rqId != m_rqId)     // Sanity check
+               return;
+
+       m_rqId = -1;
+       m_graph->SetUpdating(false);
+       m_graph->Redraw();
+}
+
+
+//
+// Handler for processing timer
+//
+
+void nxGraphView::OnProcessingTimer(wxTimerEvent &event)
+{
+       if (m_rqId != -1)       // Still processing request, show "Update" mark on graph
+               m_graph->Refresh(false);
+}
index b8b9194..4f8a878 100644 (file)
@@ -163,13 +163,14 @@ int nxLastValuesCtrl::CompareListItems(long item1, long item2)
 // Set new data
 //
 
-void nxLastValuesCtrl::SetData(DWORD dciCount, NXC_DCI_VALUE *valueList)
+void nxLastValuesCtrl::SetData(DWORD nodeId, DWORD dciCount, NXC_DCI_VALUE *valueList)
 {
        DWORD i;
        long item;
        TCHAR buffer[64];
 
        safe_free(m_data);
+       m_nodeId = nodeId;
        m_dciCount = dciCount;
        m_data = valueList;
 
@@ -348,11 +349,33 @@ void nxLastValuesCtrl::OnContextMenu(wxContextMenuEvent &event)
 
 void nxLastValuesCtrl::OnDCIGraph(wxCommandEvent &event)
 {
+       int i, count;
+       long item, index;
+       DCIInfo *list[MAX_GRAPH_ITEMS];
+       NXC_DCI dci;
+
+       count = m_wndListCtrl->GetSelectedItemCount();
+       if ((count < 1) || (count > MAX_GRAPH_ITEMS))
+               return;
+
+       for(i = 0, item = m_wndListCtrl->GetFirstSelected(); i < count; i++)
+       {
+               index = m_wndListCtrl->GetItemData(item);
+               dci.dwId = m_data[index].dwId;
+               dci.iDataType = m_data[index].nDataType;
+               dci.iSource = m_data[index].nSource;
+               _tcscpy(dci.szName, m_data[index].szName);
+               _tcscpy(dci.szDescription, m_data[index].szDescription);
+               list[i] = new DCIInfo(m_nodeId, &dci);
+               item = m_wndListCtrl->GetNextSelected(item);
+       }
+
+       NXMCCreateView(new nxGraphView(count, list), VIEWAREA_MAIN);
 }
 
 void nxLastValuesCtrl::OnUpdateDCIGraph(wxUpdateUIEvent &event)
 {
-       event.Enable(m_wndListCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED) != -1);
+       event.Enable((m_wndListCtrl->GetSelectedItemCount() > 0) && (m_wndListCtrl->GetSelectedItemCount() <= MAX_GRAPH_ITEMS));
 }
 
 
index dd81758..690aaf1 100644 (file)
@@ -112,7 +112,7 @@ void nxLastValuesView::RequestCompletionHandler(int rqId, DWORD rcc, const TCHAR
 
        if (rcc == RCC_SUCCESS)
        {
-               m_dciList->SetData(m_dciCount, m_dciValues);
+               m_dciList->SetData(m_node->dwId, m_dciCount, m_dciValues);
        }
        m_rqId = -1;
 }
index 2362b9d..044bdf6 100644 (file)
@@ -37,6 +37,13 @@ static HINSTANCE s_libInstance;
 #endif
 
 
+//
+// Custom events
+//
+
+DEFINE_LOCAL_EVENT_TYPE(nxEVT_DCI_DATA_RECEIVED)
+
+
 //
 // Create object browser
 //
index ee9067e..9163e08 100644 (file)
@@ -146,7 +146,7 @@ void nxNodeLastValues::OnRequestCompleted(wxCommandEvent &event)
        wxLogDebug(_T("nxNodeLastValues::OnRequestCompleted() called"));
        if (event.GetInt())
        {
-               m_dciList->SetData(event.GetExtraLong(), (NXC_DCI_VALUE *)event.GetClientData());
+               m_dciList->SetData(m_object->dwId, event.GetExtraLong(), (NXC_DCI_VALUE *)event.GetClientData());
        }
        else
        {
index 311f3ae..ba5bd18 100644 (file)
@@ -39,6 +39,17 @@ WX_DECLARE_OBJARRAY(wxTreeItemId, nxTreeItemList);
 WX_DECLARE_HASH_MAP(DWORD, nxTreeItemList*, wxIntegerHash, wxIntegerEqual, nxObjectItemsHash);
 
 
+//
+// Custom events
+//
+
+BEGIN_DECLARE_EVENT_TYPES()
+    DECLARE_LOCAL_EVENT_TYPE(nxEVT_DCI_DATA_RECEIVED, 0)
+END_DECLARE_EVENT_TYPES()
+
+#define EVT_NX_DCI_DATA_RECEIVED(fn)   EVT_LIBNXMC_EVENT(nxEVT_DCI_DATA_RECEIVED, fn)
+
+
 //
 // Header for object overview
 //
@@ -97,6 +108,7 @@ class nxLastValuesCtrl : public wxWindow
 {
 private:
        wxListView *m_wndListCtrl;
+       DWORD m_nodeId;
        DWORD m_dciCount;
        NXC_DCI_VALUE *m_data;
        int m_sortMode;
@@ -110,7 +122,7 @@ public:
 
        int CompareListItems(long item1, long item2);
 
-       void SetData(DWORD dciCount, NXC_DCI_VALUE *valueList);
+       void SetData(DWORD nodeId, DWORD dciCount, NXC_DCI_VALUE *valueList);
        void Clear() { m_wndListCtrl->DeleteAllItems(); }
 
        void SetUseMultipliers(bool flag) { m_useMultipliers = flag; }
@@ -202,8 +214,32 @@ protected:
 
 class nxGraphView : public nxView
 {
+private:
+       nxGraph *m_graph;
+       int m_dciCount;
+       DCIInfo *m_dciInfo[MAX_GRAPH_ITEMS];
+       int m_rqId;
+       int m_timeFrameType;
+       time_t m_timeFrom;
+       time_t m_timeTo;
+       time_t m_timeFrame;
+       wxTimer *m_processingTimer;
+
+protected:
+       virtual void RequestCompletionHandler(int rqId, DWORD rcc, const TCHAR *errMsg);
+
 public:
-       nxGraphView(wxWindow *parent = NULL);
+       nxGraphView(int dciCount, DCIInfo **dciList, wxWindow *parent = NULL);
+       virtual ~nxGraphView();
+
+       // Event handlers
+protected:
+       void OnSize(wxSizeEvent &event);
+       void OnViewRefresh(wxCommandEvent &event);
+       void OnDataReceived(wxCommandEvent &event);
+       void OnProcessingTimer(wxTimerEvent &event);
+
+       DECLARE_EVENT_TABLE()
 };
 
 
index fffd3d6..cec85b9 100644 (file)
@@ -24,7 +24,7 @@ static THREAD_RESULT THREAD_CALL QueryThread(void *pArg)
 {
        HWND hWnd = ((CNodeTopologyView *)pArg)->m_hWnd;
        DWORD dwResult, dwNodeId = ((CNodeTopologyView *)pArg)->GetObjectId();
-       nxObjList *pTopo;
+       nxmap_ObjList *pTopo;
 
        dwResult = NXCQueryL2Topology(g_hSession, dwNodeId, (void **)&pTopo);
        if (!PostMessage(hWnd, NXCM_REQUEST_COMPLETED, dwNodeId, (LPARAM)(dwResult == RCC_SUCCESS ? pTopo : 0)))
@@ -133,7 +133,7 @@ void CNodeTopologyView::OnSetObject(WPARAM wParam, NXC_OBJECT *pObject)
 
 void CNodeTopologyView::OnRequestCompleted(WPARAM wParam, LPARAM lParam)
 {
-       nxObjList *pList = (nxObjList *)lParam;
+       nxmap_ObjList *pList = (nxmap_ObjList *)lParam;
    nxMap *pMap;
    nxSubmap *pSubmap;
        RECT rect;
index 36651fa..34984ab 100644 (file)
@@ -89,7 +89,7 @@ void CObjectDepView::Refresh()
 {
    nxMap *pMap;
    nxSubmap *pSubmap;
-   nxObjList list;
+   nxmap_ObjList list;
    RECT rect;
 
    if (m_pObject == NULL)
@@ -115,7 +115,7 @@ void CObjectDepView::Refresh()
 // Add object's parents to map
 //
 
-void CObjectDepView::AddParentsToMap(NXC_OBJECT *pChild, nxObjList &list)
+void CObjectDepView::AddParentsToMap(NXC_OBJECT *pChild, nxmap_ObjList &list)
 {
    DWORD i;
    NXC_OBJECT *pObject;
index a7e8826..139a2ca 100644 (file)
@@ -35,7 +35,7 @@ public:
 
        // Generated message map functions
 protected:
-       void AddParentsToMap(NXC_OBJECT *pChild, nxObjList &list);
+       void AddParentsToMap(NXC_OBJECT *pChild, nxmap_ObjList &list);
        NXC_OBJECT * m_pObject;
        CMapView m_wndMap;
        //{{AFX_MSG(CObjectDepView)
index 8ef2203..a5612b6 100644 (file)
@@ -48,7 +48,7 @@ DWORD LIBNXCL_EXPORTABLE NXCQueryL2Topology(NXC_SESSION hSession, DWORD dwNodeId
       dwRetCode = pResponse->GetVariableLong(VID_RCC);
       if (dwRetCode == RCC_SUCCESS)
                {
-                       *ppTopology = new nxObjList(pResponse);
+                       *ppTopology = new nxmap_ObjList(pResponse);
                }
       delete pResponse;
    }
index 1eb29e2..a9d60f3 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Network Maps Library
-** Copyright (C) 2006 Victor Kirhenshtein
+** Copyright (C) 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 // Default constructor
 //
 
-nxGraph::nxGraph()
+nxmap_Graph::nxmap_Graph()
 {
    m_dwVertexCount = 0;
    m_ppVertexList = NULL;
@@ -42,17 +42,17 @@ nxGraph::nxGraph()
 // Create graph from list of objects and links
 //
 
-nxGraph::nxGraph(DWORD dwNumObjects, DWORD *pdwObjectList,
+nxmap_Graph::nxmap_Graph(DWORD dwNumObjects, DWORD *pdwObjectList,
                  DWORD dwNumLinks, OBJLINK *pLinkList)
 {
    DWORD i;
-   nxVertex *pVtx1, *pVtx2;
+   nxmap_Vertex *pVtx1, *pVtx2;
 
    m_dwVertexCount = dwNumObjects;
-   m_ppVertexList = (nxVertex **)malloc(sizeof(nxVertex *) * dwNumObjects);
+   m_ppVertexList = (nxmap_Vertex **)malloc(sizeof(nxmap_Vertex *) * dwNumObjects);
    for(i = 0; i < dwNumObjects; i++)
    {
-      m_ppVertexList[i] = new nxVertex(pdwObjectList[i]);
+      m_ppVertexList[i] = new nxmap_Vertex(pdwObjectList[i]);
    }
 
    // Create links between vertexes
@@ -72,7 +72,7 @@ nxGraph::nxGraph(DWORD dwNumObjects, DWORD *pdwObjectList,
 // Destructor
 //
 
-nxGraph::~nxGraph()
+nxmap_Graph::~nxmap_Graph()
 {
    DWORD i;
 
@@ -86,7 +86,7 @@ nxGraph::~nxGraph()
 // Set all vertexes as unprocessed
 //
 
-void nxGraph::SetAsUnprocessed(void)
+void nxmap_Graph::SetAsUnprocessed(void)
 {
    DWORD i;
 
@@ -99,7 +99,7 @@ void nxGraph::SetAsUnprocessed(void)
 // Find vertex by ID
 //
 
-nxVertex *nxGraph::FindVertex(DWORD dwId)
+nxmap_Vertex *nxmap_Graph::FindVertex(DWORD dwId)
 {
    DWORD i;
 
@@ -114,7 +114,7 @@ nxVertex *nxGraph::FindVertex(DWORD dwId)
 // Get internal index of given vertex
 //
 
-DWORD nxGraph::GetVertexIndex(nxVertex *pVertex)
+DWORD nxmap_Graph::GetVertexIndex(nxmap_Vertex *pVertex)
 {
    DWORD i;
 
@@ -129,7 +129,7 @@ DWORD nxGraph::GetVertexIndex(nxVertex *pVertex)
 // Normalize vertex positions
 //
 
-void nxGraph::NormalizeVertexPositions(void)
+void nxmap_Graph::NormalizeVertexPositions(void)
 {
    DWORD i;
    int x, y, dx, dy;
@@ -161,7 +161,7 @@ void nxGraph::NormalizeVertexPositions(void)
 // Set root vertex
 //
 
-void nxGraph::SetRootVertex(DWORD dwId)
+void nxmap_Graph::SetRootVertex(DWORD dwId)
 {
    DWORD i;
 
@@ -179,7 +179,7 @@ void nxGraph::SetRootVertex(DWORD dwId)
 // Normalize links for given vertex
 //
 
-void nxGraph::NormalizeVertexLinks(nxVertex *pRoot)
+void nxmap_Graph::NormalizeVertexLinks(nxmap_Vertex *pRoot)
 {
    DWORD i;
 
@@ -207,7 +207,7 @@ void nxGraph::NormalizeVertexLinks(nxVertex *pRoot)
 // Normalize links - make all links to go from root when possible
 //
 
-void nxGraph::NormalizeLinks(void)
+void nxmap_Graph::NormalizeLinks(void)
 {
    if (m_pRoot != NULL)
    {
index 6c630eb..66a8484 100644 (file)
 class nxleGeneric
 {
 protected:
-   nxGraph *m_graph;
+   nxmap_Graph *m_graph;
 
 public:
-   nxleGeneric(nxGraph *pGraph) { m_graph = pGraph; }
+   nxleGeneric(nxmap_Graph *pGraph) { m_graph = pGraph; }
    virtual ~nxleGeneric() { }
 
    virtual void Execute(void) { }
@@ -63,12 +63,12 @@ protected:
    double m_increase;
    BOOL m_bConvexity;
 
-   double SetWidth(nxVertex *root);
-   void SetPlacement(nxVertex *root, double ro,
+   double SetWidth(nxmap_Vertex *root);
+   void SetPlacement(nxmap_Vertex *root, double ro,
                      double alpha1, double alpha2,     int layer);
 
 public:
-   nxleRadial(nxGraph *pGraph);
+   nxleRadial(nxmap_Graph *pGraph);
    virtual ~nxleRadial();
 
    virtual void Execute(void);
@@ -86,18 +86,18 @@ protected:
    double *m_xModifier;
    double *m_xParentModifier;
    int *m_passCount;
-   nxVertex **m_leftBrother;
+   nxmap_Vertex **m_leftBrother;
    DWORD *m_layer;
-   nxVertex **m_contour;
+   nxmap_Vertex **m_contour;
    double m_spacing;
 
-   void Initialize(nxVertex *root, DWORD layer);
-   double TrueX(nxVertex *root);
-   void FirstPass(nxVertex *root);
-   void SecondPass(nxVertex *root, double modifier);
+   void Initialize(nxmap_Vertex *root, DWORD layer);
+   double TrueX(nxmap_Vertex *root);
+   void FirstPass(nxmap_Vertex *root);
+   void SecondPass(nxmap_Vertex *root, double modifier);
 
 public:
-   nxleReingoldTilford(nxGraph *pGraph);
+   nxleReingoldTilford(nxmap_Graph *pGraph);
    virtual ~nxleReingoldTilford();
 
    virtual void Execute(void);
index 4d30092..62af02c 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Network Maps Library
-** Copyright (C) 2006, 2007 Victor Kirhenshtein
+** Copyright (C) 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 // Constructors
 //
 
-nxObjList::nxObjList()
+nxmap_ObjList::nxmap_ObjList()
 {
    m_dwNumObjects = 0;
    m_pdwObjectList = NULL;
@@ -36,7 +36,7 @@ nxObjList::nxObjList()
    m_pLinkList = NULL;
 }
 
-nxObjList::nxObjList(CSCPMessage *pMsg)
+nxmap_ObjList::nxmap_ObjList(CSCPMessage *pMsg)
 {
        DWORD i, dwId;
 
@@ -55,7 +55,7 @@ nxObjList::nxObjList(CSCPMessage *pMsg)
        }
 }
 
-nxObjList::nxObjList(nxObjList *pSrc)
+nxmap_ObjList::nxmap_ObjList(nxmap_ObjList *pSrc)
 {
    m_dwNumObjects = pSrc->m_dwNumObjects;
    m_pdwObjectList = (DWORD *)nx_memdup(pSrc->m_pdwObjectList, sizeof(DWORD) * m_dwNumObjects);
@@ -68,7 +68,7 @@ nxObjList::nxObjList(nxObjList *pSrc)
 // Destructor
 //
 
-nxObjList::~nxObjList()
+nxmap_ObjList::~nxmap_ObjList()
 {
    safe_free(m_pdwObjectList);
    safe_free(m_pLinkList);
@@ -79,7 +79,7 @@ nxObjList::~nxObjList()
 // Clear list
 //
 
-void nxObjList::Clear(void)
+void nxmap_ObjList::Clear(void)
 {
    safe_free_and_null(m_pdwObjectList);
    safe_free_and_null(m_pLinkList);
@@ -92,7 +92,7 @@ void nxObjList::Clear(void)
 // Add object to list
 //
 
-void nxObjList::AddObject(DWORD dwId)
+void nxmap_ObjList::AddObject(DWORD dwId)
 {
    DWORD i;
 
@@ -115,7 +115,7 @@ void nxObjList::AddObject(DWORD dwId)
 // Link two objects
 //
 
-void nxObjList::LinkObjects(DWORD dwId1, DWORD dwId2)
+void nxmap_ObjList::LinkObjects(DWORD dwId1, DWORD dwId2)
 {
    DWORD i;
    int nCount;
@@ -155,7 +155,7 @@ void nxObjList::LinkObjects(DWORD dwId1, DWORD dwId2)
 // Link two objects with named links
 //
 
-void nxObjList::LinkObjectsEx(DWORD dwId1, DWORD dwId2, TCHAR *pszPort1, TCHAR *pszPort2)
+void nxmap_ObjList::LinkObjectsEx(DWORD dwId1, DWORD dwId2, TCHAR *pszPort1, TCHAR *pszPort2)
 {
    DWORD i;
    int nCount;
@@ -197,7 +197,7 @@ void nxObjList::LinkObjectsEx(DWORD dwId1, DWORD dwId2, TCHAR *pszPort1, TCHAR *
 // Create NXCP message
 //
 
-void nxObjList::CreateMessage(CSCPMessage *pMsg)
+void nxmap_ObjList::CreateMessage(CSCPMessage *pMsg)
 {
        DWORD i, dwId;
 
index ae3691a..5f71640 100644 (file)
@@ -34,7 +34,7 @@
 // Constructor
 //
 
-nxleRadial::nxleRadial(nxGraph *pGraph)
+nxleRadial::nxleRadial(nxmap_Graph *pGraph)
            :nxleGeneric(pGraph)
 {
    m_bConvexity = FALSE;
@@ -71,7 +71,7 @@ nxleRadial::~nxleRadial()
 // of this (sub)-tree.
 //
 
-double nxleRadial::SetWidth(nxVertex *root)
+double nxleRadial::SetWidth(nxmap_Vertex *root)
 {
        double width;
    DWORD i;
@@ -99,14 +99,14 @@ double nxleRadial::SetWidth(nxVertex *root)
 // the tree, and the (final) position of its parent.
 //
 
-void nxleRadial::SetPlacement(nxVertex *root, double ro,
+void nxleRadial::SetPlacement(nxmap_Vertex *root, double ro,
                               double alpha1, double alpha2,    int layer)
 {
    double s, tau, alpha, rootFullWidth, childWidth;
    double myDelta = m_delta + m_increase;
    double fi = (alpha1 + alpha2)/2.0;
    DWORD i, index;
-   nxVertex *child;
+   nxmap_Vertex *child;
 
        root->SetPosition((int)(ro * sin(fi)), (int)(ro * cos(fi)));
 
index c38fd75..7c2410d 100644 (file)
 // Constructor
 //
 
-nxleReingoldTilford::nxleReingoldTilford(nxGraph *pGraph)
+nxleReingoldTilford::nxleReingoldTilford(nxmap_Graph *pGraph)
                     :nxleGeneric(pGraph)
 {
    m_xPreliminary = (double *)malloc(pGraph->GetVertexCount() * sizeof(double));
    m_xModifier = (double *)malloc(pGraph->GetVertexCount() * sizeof(double));
    m_xParentModifier = (double *)malloc(pGraph->GetVertexCount() * sizeof(double));
    m_passCount = (int *)malloc(pGraph->GetVertexCount() * sizeof(int));
-   m_leftBrother = (nxVertex **)malloc(pGraph->GetVertexCount() * sizeof(nxVertex *));
+   m_leftBrother = (nxmap_Vertex **)malloc(pGraph->GetVertexCount() * sizeof(nxmap_Vertex *));
    m_layer = (DWORD *)malloc(pGraph->GetVertexCount() * sizeof(DWORD));
-   m_contour = (nxVertex **)malloc(pGraph->GetVertexCount() * sizeof(nxVertex *));
+   m_contour = (nxmap_Vertex **)malloc(pGraph->GetVertexCount() * sizeof(nxmap_Vertex *));
    m_spacing = MAP_OBJECT_SIZE_Y + MAP_TEXT_BOX_HEIGHT + MAP_OBJECT_INTERVAL_Y;
 }
 
@@ -72,7 +72,7 @@ nxleReingoldTilford::~nxleReingoldTilford()
 // of the tree currently being considered.
 //
 
-void nxleReingoldTilford::Initialize(nxVertex *root, DWORD layer)
+void nxleReingoldTilford::Initialize(nxmap_Vertex *root, DWORD layer)
 {
    DWORD i, index;
 
@@ -97,11 +97,11 @@ void nxleReingoldTilford::Initialize(nxVertex *root, DWORD layer)
 // the position modifiers of its ancestors up to the root. 
 //
 
-double nxleReingoldTilford::TrueX(nxVertex *root)
+double nxleReingoldTilford::TrueX(nxmap_Vertex *root)
 {
    double x;
    DWORD index;
-   nxVertex *node;
+   nxmap_Vertex *node;
        
    index = m_graph->GetVertexIndex(root);
        node = root;
@@ -121,11 +121,11 @@ double nxleReingoldTilford::TrueX(nxVertex *root)
 // First pass
 //
 
-void nxleReingoldTilford::FirstPass(nxVertex *root) 
+void nxleReingoldTilford::FirstPass(nxmap_Vertex *root) 
 {
    double modifier, xRoot, xBrother;
    DWORD i, index, leftIndex, rightIndex;
-   nxVertex *brother;
+   nxmap_Vertex *brother;
 
    index = m_graph->GetVertexIndex(root);
 
@@ -178,7 +178,7 @@ void nxleReingoldTilford::FirstPass(nxVertex *root)
 // Second pass
 //
 
-void nxleReingoldTilford::SecondPass(nxVertex *root, double modifier)
+void nxleReingoldTilford::SecondPass(nxmap_Vertex *root, double modifier)
 {
    double childModif;
    DWORD i, index;
@@ -210,8 +210,8 @@ void nxleReingoldTilford::Execute(void)
    memset(m_xModifier, 0, sizeof(double) * m_graph->GetVertexCount());
    memset(m_xParentModifier, 0, sizeof(double) * m_graph->GetVertexCount());
    memset(m_passCount, 0, sizeof(int) * m_graph->GetVertexCount());
-   memset(m_contour, 0, sizeof(nxVertex *) * m_graph->GetVertexCount());
-   memset(m_leftBrother, 0, sizeof(nxVertex *) * m_graph->GetVertexCount());
+   memset(m_contour, 0, sizeof(nxmap_Vertex *) * m_graph->GetVertexCount());
+   memset(m_leftBrother, 0, sizeof(nxmap_Vertex *) * m_graph->GetVertexCount());
    memset(m_layer, 0, sizeof(DWORD) * m_graph->GetVertexCount());
 
    Initialize(m_graph->GetRootVertex(), 0);
index 23fb847..e6d8aca 100644 (file)
@@ -380,10 +380,10 @@ void nxSubmap::DoLayout(DWORD dwNumObjects, DWORD *pdwObjectList,
    else
    {
       nxleGeneric *engine;
-      nxGraph *graph;
-      nxVertex *vertex;
+      nxmap_Graph *graph;
+      nxmap_Vertex *vertex;
 
-      graph = new nxGraph(dwNumObjects, pdwObjectList, dwNumLinks, pLinkList);
+      graph = new nxmap_Graph(dwNumObjects, pdwObjectList, dwNumLinks, pLinkList);
       if (dwNumObjects > 0)
       {
          graph->SetRootVertex(pdwObjectList[0]);
index bf91eb4..f47e1dd 100644 (file)
@@ -1,7 +1,7 @@
 /* 
 ** NetXMS - Network Management System
 ** Network Maps Library
-** Copyright (C) 2006 Victor Kirhenshtein
+** Copyright (C) 2006, 2007, 2008 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
 // Constructor
 //
 
-nxVertex::nxVertex(DWORD dwId)
+nxmap_Vertex::nxmap_Vertex(DWORD dwId)
 {
    m_dwId = dwId;
    m_posX = 0;
@@ -44,7 +44,7 @@ nxVertex::nxVertex(DWORD dwId)
 // Destructor
 //
 
-nxVertex::~nxVertex()
+nxmap_Vertex::~nxmap_Vertex()
 {
    safe_free(m_ppChildList);
    safe_free(m_ppParentList);
@@ -55,7 +55,7 @@ nxVertex::~nxVertex()
 // Link another vertex as child
 //
 
-void nxVertex::LinkChild(nxVertex *pVtx)
+void nxmap_Vertex::LinkChild(nxmap_Vertex *pVtx)
 {
    DWORD i;
 
@@ -65,7 +65,7 @@ void nxVertex::LinkChild(nxVertex *pVtx)
    if (i == m_dwNumChilds)
    {
       m_dwNumChilds++;
-      m_ppChildList = (nxVertex **)realloc(m_ppChildList, sizeof(nxVertex *) * m_dwNumChilds);
+      m_ppChildList = (nxmap_Vertex **)realloc(m_ppChildList, sizeof(nxmap_Vertex *) * m_dwNumChilds);
       m_ppChildList[i] = pVtx;
       pVtx->LinkParent(this);
    }
@@ -76,7 +76,7 @@ void nxVertex::LinkChild(nxVertex *pVtx)
 // Unlink child vertex
 //
 
-void nxVertex::UnlinkChild(nxVertex *pVtx)
+void nxmap_Vertex::UnlinkChild(nxmap_Vertex *pVtx)
 {
    DWORD i;
 
@@ -84,7 +84,7 @@ void nxVertex::UnlinkChild(nxVertex *pVtx)
       if (m_ppChildList[i] == pVtx)
       {
          m_dwNumChilds--;
-         memmove(&m_ppChildList[i], &m_ppChildList[i + 1], (m_dwNumChilds - i) * sizeof(nxVertex *));
+         memmove(&m_ppChildList[i], &m_ppChildList[i + 1], (m_dwNumChilds - i) * sizeof(nxmap_Vertex *));
          pVtx->UnlinkParent(this);
          break;
       }
@@ -95,7 +95,7 @@ void nxVertex::UnlinkChild(nxVertex *pVtx)
 // Link another vertex as parent
 //
 
-void nxVertex::LinkParent(nxVertex *pVtx)
+void nxmap_Vertex::LinkParent(nxmap_Vertex *pVtx)
 {
    DWORD i;
 
@@ -105,7 +105,7 @@ void nxVertex::LinkParent(nxVertex *pVtx)
    if (i == m_dwNumParents)
    {
       m_dwNumParents++;
-      m_ppParentList = (nxVertex **)realloc(m_ppParentList, sizeof(nxVertex *) * m_dwNumParents);
+      m_ppParentList = (nxmap_Vertex **)realloc(m_ppParentList, sizeof(nxmap_Vertex *) * m_dwNumParents);
       m_ppParentList[i] = pVtx;
    }
 }
@@ -115,7 +115,7 @@ void nxVertex::LinkParent(nxVertex *pVtx)
 // Unlink parent vertex
 //
 
-void nxVertex::UnlinkParent(nxVertex *pVtx)
+void nxmap_Vertex::UnlinkParent(nxmap_Vertex *pVtx)
 {
    DWORD i;
 
@@ -123,7 +123,7 @@ void nxVertex::UnlinkParent(nxVertex *pVtx)
       if (m_ppParentList[i] == pVtx)
       {
          m_dwNumParents--;
-         memmove(&m_ppParentList[i], &m_ppParentList[i + 1], (m_dwNumParents - i) * sizeof(nxVertex *));
+         memmove(&m_ppParentList[i], &m_ppParentList[i + 1], (m_dwNumParents - i) * sizeof(nxmap_Vertex *));
          break;
       }
 }
@@ -133,7 +133,7 @@ void nxVertex::UnlinkParent(nxVertex *pVtx)
 // Check if link to given vertex exist
 //
 
-BOOL nxVertex::IsParentOf(nxVertex *pVtx)
+BOOL nxmap_Vertex::IsParentOf(nxmap_Vertex *pVtx)
 {
    DWORD i;
    BOOL bRet = FALSE;