home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1999 mARCH
/
PCWK3A99.iso
/
Linux
/
DDD331
/
DDD-3_1_.000
/
DDD-3_1_
/
ddd-3.1.1
/
ddd
/
DispGraph.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-17
|
7KB
|
219 lines
// $Id: DispGraph.h,v 1.25 1998/11/17 11:22:33 zeller Exp $
// Store information about all displayed display expressions
// Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
// Written by Dorothea Luetkehaus <luetke@ips.cs.tu-bs.de>.
//
// This file is part of DDD.
//
// DDD is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// DDD 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 DDD -- see the file COPYING.
// If not, write to the Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
// DDD is the data display debugger.
// For details, see the DDD World-Wide-Web page,
// `http://www.cs.tu-bs.de/softech/ddd/',
// or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
#ifndef _DDD_DispGraph_h
#define _DDD_DispGraph_h
#ifdef __GNUG__
#pragma interface
#endif
//-----------------------------------------------------------------------------
// The `DispGraph' class keeps all displayed display expressions
//-----------------------------------------------------------------------------
// Misc includes
#include "strclass.h"
#include "bool.h"
#include "Graph.h"
#include "HandlerL.h"
#include "LineGraphE.h"
#include "PosGraphN.h"
#include "GraphNPA.h"
#include "DispNodeM.h"
//-----------------------------------------------------------------------------
enum Displaying {Both, Enabled, Disabled};
// Event types
const unsigned DispGraph_Empty = 0; // DispGraph is empty
const unsigned NoEnabled = DispGraph_Empty + 1;
const unsigned NoDisabled = NoEnabled + 1;
const unsigned DispGraph_NTypes = NoDisabled + 1;
class DispGraph: public Graph {
public:
DECLARE_TYPE_INFO
private:
DispNodeMap idMap;
HandlerList handlers;
bool no_enabled;
bool no_disabled;
public:
static bool hide_inactive_displays;
// Constructor
DispGraph();
// Clear all nodes
void clear();
// Destructor
~DispGraph();
int count_all () const { return idMap.length(); }
int count_all (Displaying e) const;
int count_selected() const;
bool has_enabled() const { return !no_enabled; }
bool has_disabled() const { return !no_disabled; }
void addHandler (unsigned type,
HandlerProc proc,
void* client_data = 0);
void removeHandler (unsigned type,
HandlerProc proc,
void *client_data = 0);
void callHandlers();
// Insert a new display DN named DISP_NR dependent on DEPENDS_ON.
// Return new display number, or 0 iff failure.
int insert(int disp_nr, DispNode* dn, int depends_on = 0);
// Make DISP_NR an alias of ALIAS_DISP_NR. Suppress
// ALIAS_DISP_NR. Return true iff changed.
bool alias (Widget w, int disp_nr, int alias_disp_nr);
// Un-alias ALIAS_DISP_NR. Unsuppress ALIAS_DISP_NR. Return true
// iff changed.
bool unalias (int alias_disp_nr);
// (In)activate display NODE. Return true iff changed.
bool make_active (DispNode *node);
bool make_inactive (DispNode *node);
// (Un)cluster display NODE into CLUSTER
void cluster(DispNode *node, int cluster);
inline void uncluster(DispNode *node)
{
cluster(node, 0);
}
// Determine default positions for NEW_NODE
BoxPoint default_pos(DispNode *new_node, Widget w,
int depends_on = 0) const;
// Delete DISP_NR; return false if non-existent
bool del (int disp_nr);
// Return node of display DISP_NR
DispNode* get (int disp_nr) const { return idMap.get (disp_nr); }
// Return number of display NAME
int get_by_name(const string& name) const;
// Return number of node NODEPTR
int get_nr(BoxGraphNode *nodeptr) const;
// Return true iff display has a display numbered DISP_NR
bool contains (int disp_nr) const { return idMap.contains (disp_nr); }
// Return first/next node; return 0 if non-existent
DispNode* first (MapRef& ref, Displaying e = Both) const;
DispNode* next (MapRef& ref, Displaying e = Both) const;
// Return first/next node number; return 0 if non-existent
int first_nr (MapRef& ref, Displaying e = Both) const;
int next_nr (MapRef& ref, Displaying e = Both) const;
// Print graph to OS
void print(ostream& os, const GraphGC& gc = GraphGC()) const
{
Graph::print(os, gc);
}
// Print plots to FILENAME
void print_plots(const string& filename,
const GraphGC& gc = GraphGC()) const;
// Refresh title settings
bool refresh_titles() const;
protected:
BoxPoint adjust_position (DispNode *new_node,
Widget w,
BoxPoint pos,
BoxPoint offset,
BoxPoint grid) const;
// Add a new alias edge
void add_alias_edge(Widget w, int alias_disp_nr,
GraphNode *from, GraphNode *to,
EdgeAnnotation *anno);
// Remove node or edge from memory as well as from graph
void delete_node(GraphNode *node);
void delete_edge(GraphEdge *edge);
private:
static void disp_node_disabledHP(void *, void *, void *);
// Alias edge routing stuff
// True iff R->P1 and R->P2 have the same angle
static bool same_angle(const BoxPoint& r,
const BoxPoint& p1, const BoxPoint& p2);
// True iff NODE is attached to an edge with the same angle as P
static bool has_angle(PosGraphNode *node, const BoxPoint& p);
void add_edge(DispNode *from, DispNode *to);
void add_direct_alias_edge(Widget w, int alias_disp_nr,
GraphNode *from, GraphNode *to,
EdgeAnnotation *anno);
void add_routed_alias_edge(Widget w, int alias_disp_nr,
PosGraphNode *from, PosGraphNode *to,
EdgeAnnotation *anno);
bool is_hidden(Widget w, const BoxPoint& p) const;
static BoxPoint rotate_offset(const BoxPoint& p, int angle);
// Check whether P1 and P2 are okay as hint positions for FROM and TO
bool hint_positions_ok(Widget w,
PosGraphNode *from, PosGraphNode *to,
const BoxPoint& p1, const BoxPoint& p2) const;
// Find all hints in edges leading to NODE; store them in HINTS
static void find_hints_to(GraphNode *node, GraphNodePointerArray& hints);
// Find all hints in edges coming from NODE; store them in HINTS
static void find_hints_from(GraphNode *node, GraphNodePointerArray& hints);
// Hide/Unhide all alias edges of NODE according to its status
void update_alias_edges(DispNode *node);
};
#endif // _DDD_DispGraph_h
// DON'T ADD ANYTHING BEHIND THIS #endif