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
/
Box.h
< prev
next >
Wrap
C/C++ Source or Header
|
1998-11-23
|
7KB
|
262 lines
// $Id: Box.h,v 1.17 1998/11/23 15:00:17 zeller Exp $
// Box class
// Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
// Written by Andreas Zeller <zeller@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_Box_h
#define _DDD_Box_h
#ifdef __GNUG__
#pragma interface
#endif
// A Box is the base class for all graphical objects. It essentially
// consists of a rectangle with a certain size and a certain
// extensibility. The contents of the box are determined by the
// drawing function _draw().
#include "assert.h"
#include <string.h>
#include "strclass.h"
#include "BoxPoint.h"
#include "BoxSize.h"
#include "BoxD.h"
#include "BoxC.h"
#include "BoxWeight.h"
#include "BoxRegion.h"
#include "BoxExtend.h"
#include "PrintGC.h"
#include "Widget.h"
#include "bool.h"
#include "UniqueId.h"
#include "DataLink.h"
#include "TypeInfo.h"
class TagBox;
// Box class
class Box {
public:
DECLARE_TYPE_INFO
friend class BoxMemInit;
private:
UniqueId _id; // Identifier
BoxSize _size; // Size
BoxExtend _extend; // Extensibility
char *_type; // type
static void epsHeader (ostream& os,
const BoxRegion& region,
const PostScriptPrintGC& gc);
Box& operator = (const Box&) { assert(0); return *this; }
protected:
int _links; // #references (>= 1)
BoxSize& thesize() { return _size; }
BoxExtend& theextend() { return _extend; }
const BoxSize& thesize() const { return _size; }
const BoxExtend& theextend() const { return _extend; }
// Copy constructor
Box(const Box& box):
_id(), _size(box._size), _extend(box._extend),
_type(box._type), _links(1)
{}
// Equality
virtual bool matches(const Box& b, const Box *callbackArg = 0) const;
// Draw box
virtual void _draw(Widget w,
const BoxRegion& region,
const BoxRegion& exposed,
GC gc, bool context_selected) const = 0;
public:
// Save box to stream
virtual void dump(ostream& s) const = 0;
// Constructor
Box(BoxSize s = BoxSize(0, 0), BoxExtend e = BoxExtend(0, 0),
char *t = "Box"):
_id(), _size(s), _extend(e), _type(t), _links(1)
{}
// Destructor
virtual ~Box()
{
assert (_links == 0);
_type = 0;
}
// Create new reference
virtual Box* link()
{
assert(_links > 0);
_links++;
return this;
}
// Copy box
virtual Box *dup() const = 0;
// Same, but only one level deep (if possible)
virtual Box *dup0() const { return dup(); }
// Kill reference
void unlink()
{
assert(_links > 0);
if (--_links == 0)
delete this;
}
// Resources
unsigned long id() const { return (unsigned long)_id; }
const char *type() const { return _type; }
BoxExtend extend() const { return _extend; }
BoxSize size() const { return _size; }
BoxWeight extend(BoxDimension dimension) const
{
return _extend[dimension];
}
BoxCoordinate size(BoxDimension dimension) const
{
return _size[dimension];
}
// Build string from string components
virtual string str() const { return ""; }
// Return free space in lower right corner
virtual BoxSize corner() const
{
// Default: space of zero width on the right of box
return BoxSize(0, _size[Y]);
}
// Re-calculate box size
virtual Box* resize() { return this; }
// Propagate new font
virtual void newFont(const string&) { resize(); }
// Draw
void draw(Widget w,
const BoxRegion& region,
const BoxRegion& exposed = BoxRegion(BoxPoint(0,0),
BoxSize(INT_MAX, INT_MAX)),
GC gc = 0,
bool context_selected = false) const;
// Print box; Header/trailer must be pre-/postfixed
virtual void _print(ostream& os,
const BoxRegion& region,
const PrintGC& gc) const = 0;
// Print Header/trailer
static void _printHeader(ostream& os,
const BoxRegion& region,
const PrintGC& gc);
static void _printTrailer(ostream& os,
const BoxRegion& region,
const PrintGC& gc);
// Custom function: print box with header and trailer
void print(ostream& os = cout,
BoxRegion region =
BoxRegion(BoxPoint(0,0), BoxSize(0,0)),
const PrintGC& gc = PostScriptPrintGC()) const
{
region.space(X) = max(region.space(X), size(X));
region.space(Y) = max(region.space(Y), size(Y));
_printHeader(os, region, gc);
_print(os, region, gc);
_printTrailer(os, region, gc);
}
// Check for equality
bool operator == (const Box& b) const;
bool operator != (const Box& b) const { return !(operator == (b)); }
// Check class
virtual bool isStringBox() const { return false; }
virtual bool isListBox() const { return false; }
virtual bool isDummyBox() const { return false; }
// Tag a node
// Usage: box = box->tag(...)
virtual Box *tag(Data *data, DataLink *dl = 0);
// Return tag attributes for a point (No point: outermost)
BoxRegion region(BoxPoint p = BoxPoint(-1,-1)) const; // current region
Data *data(BoxPoint p = BoxPoint(-1,-1)) const; // current data
string name(BoxPoint p = BoxPoint(-1,-1)) const; // current name
bool selected(BoxPoint p = BoxPoint(-1,-1)) const; // Flag: selected?
string info(BoxPoint p = BoxPoint(-1,-1)) const; // Debugging info
// Return the box that is to be matched
virtual const Box& matchMe() const { return *this; }
// Search functions
// Count MatchBoxes
virtual void countMatchBoxes(int[]) const {}
// Return TagBox for a point (No Punkt: outermost)
virtual const TagBox *findTag(const BoxPoint&) const
{
return 0;
}
const TagBox *findTag() const
{
return findTag(BoxPoint(-1, -1));
}
// Debugging
// Send box to stream
friend ostream& operator << (ostream& s, const Box& b);
// Invariant check
virtual bool OK() const
{
assert (_links > 0);
assert (_type != 0);
return true;
}
};
#endif // _DDD_Box_h
// DON'T ADD ANYTHING BEHIND THIS #endif