headingobj.cpp
author insilmaril
Tue, 03 Jan 2006 09:44:41 +0000
changeset 169 aa48c7b52549
parent 166 325958acb69b
child 173 309609406650
permissions -rw-r--r--
1.7.6 New features for floatimages and fixes
insilmaril@0
     1
#include "headingobj.h"
insilmaril@0
     2
insilmaril@0
     3
/////////////////////////////////////////////////////////////////
insilmaril@0
     4
// HeadingObj
insilmaril@0
     5
/////////////////////////////////////////////////////////////////
insilmaril@0
     6
HeadingObj::HeadingObj() : MapObj()
insilmaril@0
     7
{
insilmaril@0
     8
//    cout << "Const HeadingObj ()\n";
insilmaril@0
     9
    init ();
insilmaril@0
    10
}
insilmaril@0
    11
insilmaril@0
    12
HeadingObj::HeadingObj(QCanvas* c) :MapObj(c)
insilmaril@0
    13
{
insilmaril@0
    14
//    cout << "Const HeadingObj\n";
insilmaril@0
    15
    init ();
insilmaril@0
    16
}
insilmaril@0
    17
insilmaril@0
    18
HeadingObj::~HeadingObj()
insilmaril@0
    19
{
insilmaril@0
    20
    textline.clear();
insilmaril@0
    21
}
insilmaril@0
    22
insilmaril@0
    23
void HeadingObj::init()
insilmaril@0
    24
{
insilmaril@0
    25
    textline.setAutoDelete (TRUE);
insilmaril@0
    26
    textwidth=40;
insilmaril@0
    27
    color=QColor ("black");
insilmaril@0
    28
    font=QFont();
insilmaril@0
    29
}
insilmaril@0
    30
insilmaril@0
    31
void HeadingObj::copy(HeadingObj *other)
insilmaril@0
    32
{
insilmaril@0
    33
    MapObj::copy (other);
insilmaril@0
    34
    textwidth=other->textwidth;
insilmaril@0
    35
    color=other->color;
insilmaril@0
    36
    font=other->font;
insilmaril@0
    37
    setText (other->text() );
insilmaril@0
    38
}
insilmaril@0
    39
insilmaril@0
    40
void HeadingObj::move(double x, double y)
insilmaril@0
    41
{
insilmaril@0
    42
    MapObj::move(x,y);
insilmaril@0
    43
    int h;	// height of a textline
insilmaril@0
    44
    int ho;	// offset of height while drawing all lines
insilmaril@0
    45
    if (textline.first() )
insilmaril@0
    46
		h=textline.first()->boundingRect().height();
insilmaril@0
    47
    else
insilmaril@0
    48
		h=2;
insilmaril@0
    49
    QCanvasText *t;
insilmaril@0
    50
    ho=0;
insilmaril@0
    51
    for (t=textline.first(); t; t=textline.next() )
insilmaril@0
    52
    {
insilmaril@0
    53
		t->move(x,y+ho);
insilmaril@0
    54
		ho=ho+h;
insilmaril@0
    55
    }	
insilmaril@0
    56
}
insilmaril@0
    57
insilmaril@0
    58
insilmaril@0
    59
void HeadingObj::moveBy(double x, double y)
insilmaril@0
    60
{
insilmaril@0
    61
    move (x+absPos.x(),y+absPos.y() );
insilmaril@0
    62
}
insilmaril@0
    63
insilmaril@0
    64
void HeadingObj::positionBBox()
insilmaril@0
    65
{
insilmaril@0
    66
    bbox.setX (absPos.x());
insilmaril@0
    67
    bbox.setY (absPos.y());
insilmaril@0
    68
}
insilmaril@0
    69
insilmaril@0
    70
void HeadingObj::calcBBoxSize()
insilmaril@0
    71
{	
insilmaril@0
    72
	int w=0;
insilmaril@0
    73
	int h=0;
insilmaril@0
    74
	// Using Backspace an empty heading might easily be created, then there
insilmaril@0
    75
	// would be textline.first()==NULL This can be worked around by the following, but
insilmaril@0
    76
	// then no selection would be visible, thus we prevent it in ::setText()
insilmaril@0
    77
	if (!textline.isEmpty() )
insilmaril@0
    78
	{
insilmaril@0
    79
		QCanvasText *t;
insilmaril@0
    80
		for (t=textline.first(); t; t=textline.next() )
insilmaril@0
    81
		{
insilmaril@0
    82
			h+=t->boundingRect().height();
insilmaril@0
    83
			if (w<t->boundingRect().width() )
insilmaril@0
    84
				w=t->boundingRect().width();
insilmaril@0
    85
		}	
insilmaril@0
    86
	} 
insilmaril@0
    87
    bbox.setSize (QSize(w,h));
insilmaril@0
    88
}
insilmaril@0
    89
insilmaril@0
    90
QCanvasText* HeadingObj::newLine(QString s)
insilmaril@0
    91
{
insilmaril@0
    92
    QCanvasText *t;
insilmaril@0
    93
    t = new QCanvasText(canvas);
insilmaril@0
    94
    t->setFont (font);
insilmaril@0
    95
    t->setColor (color);
insilmaril@0
    96
    t->setZ(Z_TEXT);
insilmaril@0
    97
    t->setText(s);
insilmaril@166
    98
	t->setTextFlags(Qt::AlignLeft);
insilmaril@0
    99
    t->show();
insilmaril@0
   100
    return t;
insilmaril@0
   101
}
insilmaril@0
   102
insilmaril@0
   103
void HeadingObj::setText (QString s)
insilmaril@0
   104
{
insilmaril@0
   105
    heading=s;
insilmaril@0
   106
insilmaril@0
   107
    // remove old textlines and prepare generating new ones
insilmaril@0
   108
    textline.clear();
insilmaril@0
   109
insilmaril@0
   110
	// prevent empty textline, so at least a small selection stays
insilmaril@0
   111
	// visible for this heading
insilmaril@0
   112
	if (s.length()==0) s="  ";
insilmaril@0
   113
insilmaril@0
   114
    int i=0;	// index for actual search for ws
insilmaril@0
   115
    int j=0;	// index of last ws
insilmaril@0
   116
	int k=0;	// index of "<br>" or similar linebreak
insilmaril@0
   117
	int br=0;	// width of found break, e.g. for <br> it is 4
insilmaril@0
   118
insilmaril@0
   119
    // set the text and wrap lines
insilmaril@0
   120
    while (s.length()>0)
insilmaril@0
   121
    {
insilmaril@0
   122
		// ok, some people wanted manual linebreaks, here we go
insilmaril@0
   123
		k=s.find ("<br>",i,false);
insilmaril@0
   124
		if (k>=0)
insilmaril@0
   125
		{
insilmaril@0
   126
			br=4;
insilmaril@0
   127
			i=k;
insilmaril@0
   128
		} else
insilmaril@0
   129
			i=s.find (" ",i,false);
insilmaril@0
   130
		if (i<0 && j==0)
insilmaril@0
   131
		{   // no ws found at all in s
insilmaril@0
   132
			// append whole s
insilmaril@0
   133
			textline.append (newLine(s));
insilmaril@0
   134
			s="";
insilmaril@0
   135
		} else
insilmaril@0
   136
		{
insilmaril@0
   137
			if (i<0 && j>0)
insilmaril@0
   138
			{	// no ws found in actual search
insilmaril@0
   139
				if (s.length()<=textwidth)
insilmaril@0
   140
				{
insilmaril@0
   141
					textline.append (newLine(s));
insilmaril@0
   142
					s="";
insilmaril@0
   143
				} else
insilmaril@0
   144
				{
insilmaril@0
   145
					textline.append (newLine(s.left(j)));
insilmaril@0
   146
					s=s.mid(j+1,s.length());
insilmaril@0
   147
					j=0;
insilmaril@0
   148
				}		    
insilmaril@0
   149
			} else
insilmaril@0
   150
			{
insilmaril@0
   151
				if (i>= 0 && i<=static_cast <int> (textwidth))
insilmaril@0
   152
				{   // there is a ws in textwidth
insilmaril@0
   153
					if (br>0)
insilmaril@0
   154
					{
insilmaril@0
   155
						// here is a linebreak
insilmaril@0
   156
						textline.append (newLine(s.left(i)));
insilmaril@0
   157
						s=s.mid(i+br,s.length());
insilmaril@0
   158
						i=0;
insilmaril@0
   159
						j=0;
insilmaril@0
   160
						br=0;
insilmaril@0
   161
					} else
insilmaril@0
   162
					{
insilmaril@0
   163
						j=i;
insilmaril@0
   164
						i++;
insilmaril@0
   165
					}
insilmaril@0
   166
				} else
insilmaril@0
   167
				{
insilmaril@0
   168
					if (i>static_cast <int> (textwidth)  )
insilmaril@0
   169
					{	
insilmaril@0
   170
						if (j>0)
insilmaril@0
   171
						{   // a ws out of textwidth, but we have also one in
insilmaril@0
   172
							textline.append (newLine(s.left(j)));
insilmaril@0
   173
							s=s.mid(j+1,s.length());
insilmaril@0
   174
							i=0;
insilmaril@0
   175
							j=0;
insilmaril@0
   176
						} else
insilmaril@0
   177
						{   // a ws out of text, but none in
insilmaril@0
   178
							textline.append (newLine(s.left(i)));
insilmaril@0
   179
							s=s.mid(i+1,s.length());
insilmaril@0
   180
							i=0;
insilmaril@0
   181
						}
insilmaril@0
   182
					}
insilmaril@0
   183
				} 
insilmaril@0
   184
			}	  
insilmaril@0
   185
		}		    
insilmaril@0
   186
    }
insilmaril@0
   187
	setVisibility (visible);
insilmaril@0
   188
	calcBBoxSize();
insilmaril@0
   189
}
insilmaril@0
   190
insilmaril@0
   191
QString HeadingObj::text ()
insilmaril@0
   192
{
insilmaril@0
   193
    return heading;
insilmaril@0
   194
}
insilmaril@0
   195
insilmaril@0
   196
void HeadingObj::setFont (QFont f)
insilmaril@0
   197
{
insilmaril@0
   198
    if (font!=f) 
insilmaril@0
   199
    {
insilmaril@0
   200
		font=f;
insilmaril@0
   201
		setText (text());
insilmaril@0
   202
    }
insilmaril@0
   203
}
insilmaril@0
   204
insilmaril@0
   205
QFont HeadingObj::getFont()
insilmaril@0
   206
{
insilmaril@0
   207
    return font;
insilmaril@0
   208
}    
insilmaril@0
   209
	
insilmaril@0
   210
	
insilmaril@0
   211
void HeadingObj::setColor (QColor c)
insilmaril@0
   212
{
insilmaril@0
   213
    if (color!=c)
insilmaril@0
   214
    {
insilmaril@0
   215
		color=c;
insilmaril@0
   216
		QCanvasText *t;
insilmaril@0
   217
		for (t=textline.first(); t; t=textline.next() )
insilmaril@0
   218
			t->setColor(c);
insilmaril@0
   219
    }	    
insilmaril@0
   220
}
insilmaril@0
   221
insilmaril@0
   222
QColor HeadingObj::getColor()
insilmaril@0
   223
{
insilmaril@0
   224
    return color;
insilmaril@0
   225
}    
insilmaril@0
   226
insilmaril@0
   227
void HeadingObj::setVisibility (bool v)
insilmaril@0
   228
{
insilmaril@0
   229
    MapObj::setVisibility(v);
insilmaril@0
   230
    QCanvasText *t;
insilmaril@0
   231
    for (t=textline.first(); t; t=textline.next() )
insilmaril@0
   232
		if (v)
insilmaril@0
   233
			t->show();
insilmaril@0
   234
		else
insilmaril@0
   235
			t->hide();
insilmaril@0
   236
}
insilmaril@0
   237
insilmaril@0
   238
int HeadingObj::getHeight ()
insilmaril@0
   239
{
insilmaril@0
   240
	return bbox.height();
insilmaril@0
   241
}
insilmaril@0
   242
insilmaril@0
   243
int HeadingObj::getWidth()
insilmaril@0
   244
{
insilmaril@0
   245
	return bbox.width();
insilmaril@0
   246
}
insilmaril@0
   247