1 // Copyright (C) 2002 Dominique Devriese <devriese@kde.org>
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18 #include "object_constructor.h"
20 #include "argsparser.h"
21 #include "kigpainter.h"
22 #include "guiaction.h"
24 #include "../kig/kig_part.h"
25 #include "../kig/kig_view.h"
27 #include "../objects/object_holder.h"
28 #include "../objects/object_drawer.h"
29 #include "../objects/object_type.h"
30 #include "../objects/other_type.h"
31 #include "../objects/object_imp.h"
32 #include "../objects/bogus_imp.h"
33 #include "../objects/line_imp.h"
34 #include "../objects/circle_imp.h"
35 #include "../objects/point_imp.h"
37 #include "../modes/construct_mode.h"
46 const QString
StandardConstructorBase::descriptiveName() const
48 return i18n( mdescname
);
51 const QString
StandardConstructorBase::description() const
56 const QCString
StandardConstructorBase::iconFileName( const bool ) const
61 const bool StandardConstructorBase::isAlreadySelectedOK( const std::vector
<ObjectCalcer
*>&, const int& ) const
66 StandardConstructorBase::StandardConstructorBase(
67 const char* descname
, const char* desc
,
68 const char* iconfile
, const ArgsParser
& parser
)
69 : mdescname( descname
),
71 miconfile( iconfile
),
76 const int StandardConstructorBase::wantArgs( const std::vector
<ObjectCalcer
*>& os
,
78 const KigWidget
& ) const
80 return margsparser
.check( os
);
83 void StandardConstructorBase::handleArgs(
84 const std::vector
<ObjectCalcer
*>& os
, KigPart
& d
,
87 std::vector
<ObjectHolder
*> bos
= build( os
, d
.document(), v
);
88 for ( std::vector
<ObjectHolder
*>::iterator i
= bos
.begin();
91 (*i
)->calc( d
.document() );
97 void StandardConstructorBase::handlePrelim(
98 KigPainter
& p
, const std::vector
<ObjectCalcer
*>& os
,
99 const KigDocument
& d
, const KigWidget
&
102 assert ( margsparser
.check( os
) != ArgsParser::Invalid
);
103 std::vector
<ObjectCalcer
*> args
= margsparser
.parse( os
);
104 p
.setBrushStyle( Qt::NoBrush
);
105 p
.setBrushColor( Qt::red
);
106 p
.setPen( QPen ( Qt::red
, 1) );
107 p
.setWidth( -1 ); // -1 means the default width for the object being
110 ObjectDrawer
drawer( Qt::red
);
111 drawprelim( drawer
, p
, args
, d
);
114 SimpleObjectTypeConstructor::SimpleObjectTypeConstructor(
115 const ArgsParserObjectType
* t
, const char* descname
,
116 const char* desc
, const char* iconfile
)
117 : StandardConstructorBase( descname
, desc
, iconfile
,
123 SimpleObjectTypeConstructor::~SimpleObjectTypeConstructor()
127 void SimpleObjectTypeConstructor::drawprelim( const ObjectDrawer
& drawer
, KigPainter
& p
, const std::vector
<ObjectCalcer
*>& parents
,
128 const KigDocument
& doc
) const
132 transform( parents
.begin(), parents
.end(),
133 back_inserter( args
), mem_fun( &ObjectCalcer::imp
) );
134 ObjectImp
* data
= mtype
->calc( args
, doc
);
135 drawer
.draw( *data
, p
, true );
139 std::vector
<ObjectHolder
*> SimpleObjectTypeConstructor::build(
140 const std::vector
<ObjectCalcer
*>& os
, KigDocument
&, KigWidget
& ) const
142 ObjectTypeCalcer
* calcer
= new ObjectTypeCalcer( mtype
, os
);
143 ObjectHolder
* h
= new ObjectHolder( calcer
);
144 std::vector
<ObjectHolder
*> ret
;
149 StandardConstructorBase::~StandardConstructorBase()
153 MultiObjectTypeConstructor::MultiObjectTypeConstructor(
154 const ArgsParserObjectType
* t
, const char* descname
,
155 const char* desc
, const char* iconfile
,
156 const std::vector
<int>& params
)
157 : StandardConstructorBase( descname
, desc
, iconfile
, mparser
),
158 mtype( t
), mparams( params
),
159 mparser( t
->argsParser().without( IntImp::stype() ) )
163 MultiObjectTypeConstructor::MultiObjectTypeConstructor(
164 const ArgsParserObjectType
* t
, const char* descname
,
165 const char* desc
, const char* iconfile
,
166 int a
, int b
, int c
, int d
)
167 : StandardConstructorBase( descname
, desc
, iconfile
, mparser
),
168 mtype( t
), mparams(),
169 mparser( t
->argsParser().without( IntImp::stype() ) )
171 mparams
.push_back( a
);
172 mparams
.push_back( b
);
173 if ( c
!= -999 ) mparams
.push_back( c
);
174 if ( d
!= -999 ) mparams
.push_back( d
);
177 MultiObjectTypeConstructor::~MultiObjectTypeConstructor()
181 void MultiObjectTypeConstructor::drawprelim( const ObjectDrawer
& drawer
, KigPainter
& p
, const std::vector
<ObjectCalcer
*>& parents
,
182 const KigDocument
& doc
) const
186 transform( parents
.begin(), parents
.end(),
187 back_inserter( args
), mem_fun( &ObjectCalcer::imp
) );
189 for ( vector
<int>::const_iterator i
= mparams
.begin(); i
!= mparams
.end(); ++i
)
192 args
.push_back( ¶m
);
193 ObjectImp
* data
= mtype
->calc( args
, doc
);
194 drawer
.draw( *data
, p
, true );
200 std::vector
<ObjectHolder
*> MultiObjectTypeConstructor::build(
201 const std::vector
<ObjectCalcer
*>& os
, KigDocument
&, KigWidget
& ) const
203 std::vector
<ObjectHolder
*> ret
;
204 for ( std::vector
<int>::const_iterator i
= mparams
.begin();
205 i
!= mparams
.end(); ++i
)
207 ObjectConstCalcer
* d
= new ObjectConstCalcer( new IntImp( *i
) );
209 std::vector
<ObjectCalcer
*> args( os
);
212 ret
.push_back( new ObjectHolder( new ObjectTypeCalcer( mtype
, args
) ) );
217 MergeObjectConstructor::~MergeObjectConstructor()
219 for ( vectype::iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
223 MergeObjectConstructor::MergeObjectConstructor(
224 const char* descname
, const char* desc
, const char* iconfilename
)
225 : ObjectConstructor(), mdescname( descname
), mdesc( desc
),
226 miconfilename( iconfilename
), mctors()
230 ObjectConstructor::~ObjectConstructor()
234 void MergeObjectConstructor::merge( ObjectConstructor
* e
)
236 mctors
.push_back( e
);
239 const QString
MergeObjectConstructor::descriptiveName() const
241 return i18n( mdescname
);
244 const QString
MergeObjectConstructor::description() const
246 return i18n( mdesc
);
249 const QCString
MergeObjectConstructor::iconFileName( const bool ) const
251 return miconfilename
;
254 const bool MergeObjectConstructor::isAlreadySelectedOK( const std::vector
<ObjectCalcer
*>&, const int& ) const
259 const int MergeObjectConstructor::wantArgs(
260 const std::vector
<ObjectCalcer
*>& os
, const KigDocument
& d
, const KigWidget
& v
) const
262 for ( vectype::const_iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
264 int w
= (*i
)->wantArgs( os
, d
, v
);
265 if ( w
!= ArgsParser::Invalid
) return w
;
267 return ArgsParser::Invalid
;
270 void MergeObjectConstructor::handleArgs(
271 const std::vector
<ObjectCalcer
*>& os
, KigPart
& d
, KigWidget
& v
) const
273 for ( vectype::const_iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
275 int w
= (*i
)->wantArgs( os
, d
.document(), v
);
276 if ( w
== ArgsParser::Complete
)
278 (*i
)->handleArgs( os
, d
, v
);
285 void MergeObjectConstructor::handlePrelim(
286 KigPainter
& p
, const std::vector
<ObjectCalcer
*>& sel
,
287 const KigDocument
& d
, const KigWidget
& v
) const
289 for ( vectype::const_iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
291 int w
= (*i
)->wantArgs( sel
, d
, v
);
292 if ( w
!= ArgsParser::Invalid
)
294 (*i
)->handlePrelim( p
, sel
, d
, v
);
300 QString
StandardConstructorBase::useText( const ObjectCalcer
& o
, const std::vector
<ObjectCalcer
*>& sel
,
301 const KigDocument
&, const KigWidget
& ) const
305 transform( sel
.begin(), sel
.end(), back_inserter( args
), mem_fun( &ObjectCalcer::imp
) );
307 std::string ret
= margsparser
.usetext( o
.imp(), args
);
308 if ( ret
.empty() ) return QString::null
;
309 return i18n( ret
.c_str() );
312 QString
StandardConstructorBase::selectStatement(
313 const std::vector
<ObjectCalcer
*>& sel
, const KigDocument
&,
314 const KigWidget
& ) const
318 transform( sel
.begin(), sel
.end(), back_inserter( args
), mem_fun( &ObjectCalcer::imp
) );
320 std::string ret
= margsparser
.selectStatement( args
);
321 if ( ret
.empty() ) return QString::null
;
322 return i18n( ret
.c_str() );
325 QString
MergeObjectConstructor::useText( const ObjectCalcer
& o
, const std::vector
<ObjectCalcer
*>& sel
,
326 const KigDocument
& d
, const KigWidget
& v
) const
328 for ( vectype::const_iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
330 std::vector
<ObjectCalcer
*> args( sel
);
331 int w
= (*i
)->wantArgs( args
, d
, v
);
332 if ( w
!= ArgsParser::Invalid
) return (*i
)->useText( o
, sel
, d
, v
);
334 return QString::null
;
337 QString
MergeObjectConstructor::selectStatement(
338 const std::vector
<ObjectCalcer
*>& sel
, const KigDocument
& d
,
339 const KigWidget
& w
) const
341 for ( vectype::const_iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
343 std::vector
<ObjectCalcer
*> args( sel
);
344 int wa
= (*i
)->wantArgs( args
, d
, w
);
345 if ( wa
!= ArgsParser::Invalid
) return (*i
)->selectStatement( sel
, d
, w
);
347 return QString::null
;
350 MacroConstructor::MacroConstructor( const ObjectHierarchy
& hier
, const QString
& name
,
351 const QString
& desc
, const QCString
& iconfile
)
352 : ObjectConstructor(), mhier( hier
), mname( name
), mdesc( desc
),
353 mbuiltin( false ), miconfile( iconfile
),
354 mparser( mhier
.argParser() )
358 MacroConstructor::MacroConstructor(
359 const std::vector
<ObjectCalcer
*>& input
, const std::vector
<ObjectCalcer
*>& output
,
360 const QString
& name
, const QString
& description
,
361 const QCString
& iconfile
)
362 : ObjectConstructor(), mhier( input
, output
),
363 mname( name
), mdesc( description
), mbuiltin( false ),
364 miconfile( iconfile
),
365 mparser( mhier
.argParser() )
369 MacroConstructor::~MacroConstructor()
373 const QString
MacroConstructor::descriptiveName() const
378 const QString
MacroConstructor::description() const
383 const QCString
MacroConstructor::iconFileName( const bool canBeNull
) const
385 return ( miconfile
.isNull() && !canBeNull
) ? QCString( "gear" ) : miconfile
;
388 const bool MacroConstructor::isAlreadySelectedOK( const std::vector
<ObjectCalcer
*>&, const int& ) const
393 const int MacroConstructor::wantArgs( const std::vector
<ObjectCalcer
*>& os
, const KigDocument
&,
394 const KigWidget
& ) const
396 return mparser
.check( os
);
399 void MacroConstructor::handleArgs( const std::vector
<ObjectCalcer
*>& os
, KigPart
& d
,
402 std::vector
<ObjectCalcer
*> args
= mparser
.parse( os
);
403 std::vector
<ObjectCalcer
*> bos
= mhier
.buildObjects( args
, d
.document() );
404 std::vector
<ObjectHolder
*> hos
;
405 for ( std::vector
<ObjectCalcer
*>::iterator i
= bos
.begin();
406 i
!= bos
.end(); ++i
)
408 hos
.push_back( new ObjectHolder( *i
) );
409 hos
.back()->calc( d
.document() );
415 QString
MacroConstructor::selectStatement(
416 const std::vector
<ObjectCalcer
*>& sel
, const KigDocument
&,
417 const KigWidget
& ) const
421 transform( sel
.begin(), sel
.end(), back_inserter( args
),
422 mem_fun( &ObjectCalcer::imp
) );
423 std::string ret
= mparser
.selectStatement( args
);
424 if ( ret
.empty() ) return QString::null
;
425 else return i18n( ret
.c_str() );
428 QString
MacroConstructor::useText( const ObjectCalcer
& o
, const std::vector
<ObjectCalcer
*>& sel
,
429 const KigDocument
&, const KigWidget
&
434 transform( sel
.begin(), sel
.end(), back_inserter( args
),
435 mem_fun( &ObjectCalcer::imp
) );
436 std::string ret
= mparser
.usetext( o
.imp(), args
);
437 if ( ret
.empty() ) return QString::null
;
438 else return i18n( ret
.c_str() );
441 void MacroConstructor::handlePrelim( KigPainter
& p
, const std::vector
<ObjectCalcer
*>& sel
,
442 const KigDocument
& doc
, const KigWidget
&
445 if ( sel
.size() != mhier
.numberOfArgs() ) return;
449 transform( sel
.begin(), sel
.end(), back_inserter( args
),
450 mem_fun( &ObjectCalcer::imp
) );
451 args
= mparser
.parse( args
);
452 std::vector
<ObjectImp
*> ret
= mhier
.calc( args
, doc
);
453 for ( uint i
= 0; i
< ret
.size(); ++i
)
456 d
.draw( *ret
[i
], p
, true );
462 void SimpleObjectTypeConstructor::plug( KigPart
*, KigGUIAction
* )
466 void MultiObjectTypeConstructor::plug( KigPart
*, KigGUIAction
* )
470 void MergeObjectConstructor::plug( KigPart
*, KigGUIAction
* )
474 void MacroConstructor::plug( KigPart
* doc
, KigGUIAction
* kact
)
476 if ( mbuiltin
) return;
477 if ( mhier
.numberOfResults() != 1 )
478 doc
->aMNewOther
.append( kact
);
481 if ( mhier
.idOfLastResult() == SegmentImp::stype() )
482 doc
->aMNewSegment
.append( kact
);
483 else if ( mhier
.idOfLastResult() == PointImp::stype() )
484 doc
->aMNewPoint
.append( kact
);
485 else if ( mhier
.idOfLastResult() == CircleImp::stype() )
486 doc
->aMNewCircle
.append( kact
);
487 else if ( mhier
.idOfLastResult()->inherits( AbstractLineImp::stype() ) )
489 doc
->aMNewLine
.append( kact
);
490 else if ( mhier
.idOfLastResult() == ConicImp::stype() )
491 doc
->aMNewConic
.append( kact
);
492 else doc
->aMNewOther
.append( kact
);
494 doc
->aMNewAll
.append( kact
);
497 const ObjectHierarchy
& MacroConstructor::hierarchy() const
502 bool SimpleObjectTypeConstructor::isTransform() const
504 return mtype
->isTransform();
507 bool MultiObjectTypeConstructor::isTransform() const
509 return mtype
->isTransform();
512 bool MergeObjectConstructor::isTransform() const
515 for ( vectype::const_iterator i
= mctors
.begin(); i
!= mctors
.end(); ++i
)
516 ret
|= (*i
)->isTransform();
520 bool MacroConstructor::isTransform() const
525 void MacroConstructor::setBuiltin( bool builtin
)
530 bool ObjectConstructor::isIntersection() const
535 PropertyObjectConstructor::PropertyObjectConstructor(
536 const ObjectImpType
* imprequirement
, const char* usetext
,
537 const char* selectstat
, const char* descname
, const char* desc
,
538 const char* iconfile
, const char* propertyinternalname
)
539 : StandardConstructorBase( descname
, desc
, iconfile
, mparser
),
540 mpropinternalname( propertyinternalname
)
542 ArgsParser::spec argsspec
[1];
543 argsspec
[0].type
= imprequirement
;
544 argsspec
[0].usetext
= usetext
;
545 argsspec
[0].selectstat
= selectstat
;
546 mparser
.initialize( argsspec
, 1 );
549 PropertyObjectConstructor::~PropertyObjectConstructor()
553 void PropertyObjectConstructor::drawprelim(
554 const ObjectDrawer
& drawer
, KigPainter
& p
, const std::vector
<ObjectCalcer
*>& parents
,
555 const KigDocument
& d
) const
557 int index
= parents
[0]->imp()->propertiesInternalNames().findIndex( mpropinternalname
);
558 assert ( index
!= -1 );
559 ObjectImp
* imp
= parents
[0]->imp()->property( index
, d
);
560 drawer
.draw( *imp
, p
, true );
564 std::vector
<ObjectHolder
*> PropertyObjectConstructor::build(
565 const std::vector
<ObjectCalcer
*>& parents
, KigDocument
&,
568 int index
= parents
[0]->imp()->propertiesInternalNames().findIndex( mpropinternalname
);
569 assert( index
!= -1 );
570 std::vector
<ObjectHolder
*> ret
;
573 new ObjectPropertyCalcer( parents
[0], index
) ) );
577 void PropertyObjectConstructor::plug( KigPart
*, KigGUIAction
* )
581 bool PropertyObjectConstructor::isTransform() const
586 bool ObjectConstructor::isTest() const
591 BaseConstructMode
* ObjectConstructor::constructMode( KigPart
& doc
)
593 return new ConstructMode( doc
, this );
596 void MacroConstructor::setName( const QString
& name
)
601 void MacroConstructor::setDescription( const QString
& desc
)
606 void MacroConstructor::setIcon( QCString
& icon
)