"SfR Fresh" - the SfR Freeware/Shareware Archive

Member "scribus-1.3.3.12/scribus/aligndistribute.cpp" of archive scribus-1.3.3.12.tar.gz:


As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
    1 /*
    2 For general Scribus (>=1.3.2) copyright and licensing information please refer
    3 to the COPYING file provided with the program. Following this notice may exist
    4 a copyright and/or license notice that predates the release of Scribus 1.3.2
    5 for which a new license (GPL+exception) is in place.
    6 */
    7 /***************************************************************************
    8 	begin                : June 2005
    9 	copyright            : (C) 2005 by Craig Bradney
   10 	email                : cbradney@zip.com.au
   11 ***************************************************************************/
   12 
   13 /***************************************************************************
   14 *                                                                         *
   15 *   ScMW program is free software; you can redistribute it and/or modify  *
   16 *   it under the terms of the GNU General Public License as published by  *
   17 *   the Free Software Foundation; either version 2 of the License, or     *
   18 *   (at your option) any later version.                                   *
   19 *                                                                         *
   20 ***************************************************************************/
   21 
   22 #include "aligndistribute.h"
   23 
   24 #include <qvariant.h>
   25 #include <qpushbutton.h>
   26 #include <qgroupbox.h>
   27 #include <qlabel.h>
   28 #include <qcombobox.h>
   29 #include <qtoolbutton.h>
   30 #include <qlayout.h>
   31 #include <qtooltip.h>
   32 #include <qwhatsthis.h>
   33 #include <qimage.h>
   34 #include <qpixmap.h>
   35 #include <qlineedit.h>
   36 
   37 #include "aligndistribute.moc"
   38 #include "page.h"
   39 #include "scmessagebox.h"
   40 #include "scribus.h"
   41 #include "scribusdoc.h"
   42 #include "selection.h"
   43 #include "undomanager.h"
   44 #include "mspinbox.h"
   45 #include "units.h"
   46 #include "commonstrings.h"
   47 
   48 extern QPixmap loadIcon(QString nam);
   49 
   50 //TODO Distribute with
   51 //TODO Handle locked items
   52 
   53 /*
   54  *  Constructs a AlignDistributePalette as a child of 'parent', with the
   55  *  name 'name' and widget flags set to 'f'.
   56  *
   57  *  The dialog will by default be modeless, unless you set 'modal' to
   58  *  true to construct a modal dialog.
   59  */
   60 AlignDistributePalette::AlignDistributePalette( QWidget* parent, const char* name, bool modal, WFlags fl )
   61 	: ScrPaletteBase( parent, name, modal, fl )
   62 {
   63 	if ( !name )
   64 		setName( "AlignDistributePalette" );
   65 	ScMW = (ScribusMainWindow *)parent;
   66 	currDoc=NULL;
   67 	AlignDistributePaletteLayout = new QVBoxLayout( this, 5, 6, "AlignDistributePaletteLayout");
   68 
   69 	alignGroupBox = new QGroupBox( this, "alignGroupBox" );
   70 	alignGroupBox->setColumnLayout(0, Qt::Vertical );
   71 	alignGroupBox->layout()->setSpacing( 6 );
   72 	alignGroupBox->layout()->setMargin( 11 );
   73 	alignGroupBoxLayout = new QGridLayout( alignGroupBox->layout() );
   74 	//alignGroupBoxLayout = new QVBoxLayout( alignGroupBox->layout() );
   75 	alignGroupBoxLayout->setAlignment( Qt::AlignTop );
   76 
   77 	layout11 = new QHBoxLayout( 0, 0, 6, "layout11");
   78 
   79 	alignRelativeToLabel = new QLabel( alignGroupBox, "alignRelativeToLabel" );
   80 	layout11->addWidget( alignRelativeToLabel );
   81 
   82 	alignRelativeToCombo = new QComboBox( false, alignGroupBox, "alignRelativeToCombo" );
   83 	layout11->addWidget( alignRelativeToCombo );
   84 	alignGroupBoxLayout->addLayout( layout11, 0, 0 );
   85 
   86 	layout14 = new QHBoxLayout( 0, 0, 6, "layout14");
   87 	spacer15 = new QSpacerItem( 21, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
   88 	layout14->addItem( spacer15 );
   89 
   90 	layout2 = new QGridLayout( 0, 1, 1, 0, 6, "layout2");
   91 
   92 	alignLeftOutToolButton = new QToolButton( alignGroupBox, "alignLeftOutToolButton" );
   93 	layout2->addWidget( alignLeftOutToolButton, 0, 0 );
   94 
   95 	alignRightOutToolButton = new QToolButton( alignGroupBox, "alignRightOutToolButton" );
   96 	layout2->addWidget( alignRightOutToolButton, 0, 4 );
   97 
   98 	alignBottomInToolButton = new QToolButton( alignGroupBox, "alignBottomInToolButton" );
   99 	layout2->addWidget( alignBottomInToolButton, 1, 3 );
  100 
  101 	alignRightInToolButton = new QToolButton( alignGroupBox, "alignRightInToolButton" );
  102 	layout2->addWidget( alignRightInToolButton, 0, 3 );
  103 
  104 	alignBottomOutToolButton = new QToolButton( alignGroupBox, "alignBottomOutToolButton" );
  105 	layout2->addWidget( alignBottomOutToolButton, 1, 4 );
  106 
  107 	alignCenterHorToolButton = new QToolButton( alignGroupBox, "alignCenterHorToolButton" );
  108 	layout2->addWidget( alignCenterHorToolButton, 0, 2 );
  109 
  110 	alignLeftInToolButton = new QToolButton( alignGroupBox, "alignLeftInToolButton" );
  111 	layout2->addWidget( alignLeftInToolButton, 0, 1 );
  112 
  113 	alignCenterVerToolButton = new QToolButton( alignGroupBox, "alignCenterVerToolButton" );
  114 	layout2->addWidget( alignCenterVerToolButton, 1, 2 );
  115 
  116 	alignTopOutToolButton = new QToolButton( alignGroupBox, "alignTopOutToolButton" );
  117 	layout2->addWidget( alignTopOutToolButton, 1, 0 );
  118 
  119 	alignTopInToolButton = new QToolButton( alignGroupBox, "alignTopInToolButton" );
  120 	layout2->addWidget( alignTopInToolButton, 1, 1 );
  121 	layout14->addLayout( layout2 );
  122 	spacer16 = new QSpacerItem( 21, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
  123 	layout14->addItem( spacer16 );
  124 	alignGroupBoxLayout->addLayout( layout14, 1, 0 );
  125 
  126 	alignGuideLayout = new QHBoxLayout( 0, 0, 6, "alignGuideLayout");
  127 	alignGuideLeftSpacer = new QSpacerItem( 20, 10, QSizePolicy::Expanding, QSizePolicy::Minimum );
  128 	alignGuideLayout->addItem( alignGuideLeftSpacer );
  129 	alignGuideLineEdit = new QLineEdit( "", alignGroupBox, "alignGuideLineEdit");
  130 	alignGuideLineEdit->setMinimumSize( QSize( 80, 20 ) );
  131 	alignGuideLineEdit->setReadOnly(true);
  132 	alignGuideLabel = new QLabel( alignGuideLineEdit, "", alignGroupBox, "alignGuideLabel");
  133 	alignGuideLayout->addWidget( alignGuideLabel );
  134 
  135 	alignGuideLayout->addWidget( alignGuideLineEdit );
  136 	alignGuideRightSpacer = new QSpacerItem( 20, 10, QSizePolicy::Expanding, QSizePolicy::Minimum );
  137 	alignGuideLayout->addItem( alignGuideRightSpacer);
  138 	alignGroupBoxLayout->addLayout( alignGuideLayout, 2, 0 );
  139 
  140 	AlignDistributePaletteLayout->addWidget( alignGroupBox );
  141 
  142 	distributeGroupBox = new QGroupBox( this, "distributeGroupBox" );
  143 	distributeGroupBox->setColumnLayout(0, Qt::Vertical );
  144 	distributeGroupBox->layout()->setSpacing( 6 );
  145 	distributeGroupBox->layout()->setMargin( 11 );
  146 	distributeGroupBoxLayout = new QGridLayout( distributeGroupBox->layout() );
  147 	distributeGroupBoxLayout->setAlignment( Qt::AlignTop );
  148 
  149 	layout4 = new QHBoxLayout( 0, 0, 6, "layout4");
  150 	distributeLeftSpacer = new QSpacerItem( 35, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
  151 	layout4->addItem( distributeLeftSpacer );
  152 
  153 	layout1 = new QGridLayout( 0, 1, 1, 0, 6, "layout1");
  154 
  155 	distributeDistHToolButton = new QToolButton( distributeGroupBox, "distributeDistHToolButton" );
  156 	layout1->addWidget( distributeDistHToolButton, 0, 3 );
  157 
  158 	distributeDistValueHToolButton = new QToolButton( distributeGroupBox, "distributeDistValueHToolButton" );
  159 	layout1->addWidget( distributeDistValueHToolButton, 0, 4 );
  160 
  161 	distributeRightToolButton = new QToolButton( distributeGroupBox, "distributeRightToolButton" );
  162 	layout1->addWidget( distributeRightToolButton, 0, 2 );
  163 
  164 	distributeBottomToolButton = new QToolButton( distributeGroupBox, "distributeBottomToolButton" );
  165 	layout1->addWidget( distributeBottomToolButton, 1, 0 );
  166 
  167 	distributeCenterHToolButton = new QToolButton( distributeGroupBox, "distributeCenterHToolButton" );
  168 	layout1->addWidget( distributeCenterHToolButton, 0, 1 );
  169 
  170 	distributeDistVToolButton = new QToolButton( distributeGroupBox, "distributeDistVToolButton" );
  171 	layout1->addWidget( distributeDistVToolButton, 1, 3 );
  172 
  173 	distributeDistValueVToolButton = new QToolButton( distributeGroupBox, "distributeDistValueVToolButton" );
  174 	layout1->addWidget( distributeDistValueVToolButton, 1, 4 );
  175 
  176 	distributeLeftToolButton = new QToolButton( distributeGroupBox, "distributeLeftToolButton" );
  177 	layout1->addWidget( distributeLeftToolButton, 0, 0 );
  178 
  179 	distributeCenterVToolButton = new QToolButton( distributeGroupBox, "distributeCenterVToolButton" );
  180 	layout1->addWidget( distributeCenterVToolButton, 1, 1 );
  181 
  182 	distributeTopToolButton = new QToolButton( distributeGroupBox, "distributeTopToolButton" );
  183 	layout1->addWidget( distributeTopToolButton, 1, 2 );
  184 	layout4->addLayout( layout1 );
  185 	distributeRightSpacer = new QSpacerItem( 35, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
  186 	layout4->addItem( distributeRightSpacer );
  187 
  188 	distributeGroupBoxLayout->addLayout( layout4, 0, 0 );
  189 
  190 	distanceLayout = new QHBoxLayout( 0, 0, 6, "distanceLayout");
  191 	distributeDistLeftSpacer = new QSpacerItem( 20, 10, QSizePolicy::Expanding, QSizePolicy::Minimum );
  192 	distanceLayout->addItem( distributeDistLeftSpacer );
  193 	distributeDistLabel = new QLabel( distributeGroupBox, "distributeDistLabel");
  194 	distanceLayout->addWidget( distributeDistLabel );
  195 	distributeDistMSpinBox = new MSpinBox( -1000, 1000, distributeGroupBox, 2);
  196 	distributeDistMSpinBox->setMinimumSize( QSize( 80, 20 ) );
  197 	distributeDistMSpinBox->setValue(0);
  198 	distanceLayout->addWidget( distributeDistMSpinBox );
  199 	distributeDistRightSpacer = new QSpacerItem( 20, 10, QSizePolicy::Expanding, QSizePolicy::Minimum );
  200 	distanceLayout->addItem( distributeDistRightSpacer);
  201 	distributeGroupBoxLayout->addLayout( distanceLayout, 1, 0 );
  202 
  203 	AlignDistributePaletteLayout->addWidget( distributeGroupBox );
  204 	languageChange();
  205 
  206 	resize( QSize(222, 232).expandedTo(minimumSizeHint()) );
  207 	clearWState( WState_Polished );
  208 
  209 	// buddies
  210 	alignRelativeToLabel->setBuddy( alignRelativeToCombo );
  211 	distributeDistLabel->setBuddy( distributeDistMSpinBox );
  212 	init();
  213 	setView(NULL);
  214 }
  215 
  216 /*
  217 *  Destroys the object and frees any allocated resources
  218 */
  219 AlignDistributePalette::~AlignDistributePalette()
  220 {
  221 	// no need to delete child widgets, Qt does it all for us
  222 }
  223 
  224 /*
  225 *  Sets the strings of the subwidgets using the current
  226 *  language.
  227 */
  228 void AlignDistributePalette::languageChange()
  229 {
  230 	setCaption( tr( "Align and Distribute" ) );
  231 	alignGroupBox->setTitle( tr( "Align" ) );
  232 	alignRelativeToLabel->setText( tr( "&Relative to:" ) );
  233 	int alignComboValue=alignRelativeToCombo->currentItem();
  234 	alignRelativeToCombo->clear();
  235 	alignRelativeToCombo->insertItem( tr( "First Selected" ) );
  236 	alignRelativeToCombo->insertItem( tr( "Last Selected" ) );
  237 	alignRelativeToCombo->insertItem( tr( "Page" ) );
  238 	alignRelativeToCombo->insertItem( tr( "Margins" ) );
  239 	alignRelativeToCombo->insertItem( tr( "Guide" ) );
  240 	alignRelativeToCombo->insertItem( tr( "Selection" ) );
  241 	alignRelativeToCombo->setCurrentItem(alignComboValue);
  242 	alignToChanged(alignComboValue);
  243 	alignLeftOutToolButton->setText( QString::null );
  244 	QToolTip::add( alignLeftOutToolButton, tr( "Align right sides of objects to left side of anchor" ) );
  245 	alignRightOutToolButton->setText( QString::null );
  246 	QToolTip::add( alignRightOutToolButton, tr( "Align left sides of objects to right side of anchor" ) );
  247 	alignBottomInToolButton->setText( QString::null );
  248 	QToolTip::add( alignBottomInToolButton, tr( "Align bottoms" ) );
  249 	alignRightInToolButton->setText( QString::null );
  250 	QToolTip::add( alignRightInToolButton, tr( "Align right sides" ) );
  251 	alignBottomOutToolButton->setText( QString::null );
  252 	QToolTip::add( alignBottomOutToolButton, tr( "Align tops of objects to bottom of anchor" ) );
  253 	alignCenterHorToolButton->setText( QString::null );
  254 	QToolTip::add( alignCenterHorToolButton, tr( "Center on vertical axis" ) );
  255 	alignLeftInToolButton->setText( QString::null );
  256 	QToolTip::add( alignLeftInToolButton, tr( "Align left sides" ) );
  257 	alignCenterVerToolButton->setText( QString::null );
  258 	QToolTip::add( alignCenterVerToolButton, tr( "Center on horizontal axis" ) );
  259 	alignTopOutToolButton->setText( QString::null );
  260 	QToolTip::add( alignTopOutToolButton, tr( "Align bottoms of objects to top of anchor" ) );
  261 	alignTopInToolButton->setText( QString::null );
  262 	QToolTip::add( alignTopInToolButton, tr( "Align tops" ) );
  263 
  264 	alignGuideLabel->setText( tr( "&Selected Guide:" ) );
  265 
  266 	distributeGroupBox->setTitle( tr( "Distribute" ) );
  267 	distributeDistHToolButton->setText( QString::null );
  268 	QToolTip::add( distributeDistHToolButton, tr( "Make horizontal gaps between objects equal" ) );
  269 	distributeDistValueHToolButton->setText( QString::null );
  270 	QToolTip::add( distributeDistValueHToolButton, tr( "Make horizontal gaps between objects equal to the value specified" ) );
  271 	distributeRightToolButton->setText( QString::null );
  272 	distributeRightToolButton->setTextLabel( tr( "Distribute right sides equidistantly" ) );
  273 	distributeBottomToolButton->setText( QString::null );
  274 	QToolTip::add( distributeBottomToolButton, tr( "Distribute bottoms equidistantly" ) );
  275 	distributeCenterHToolButton->setText( QString::null );
  276 	QToolTip::add( distributeCenterHToolButton, tr( "Distribute centers equidistantly horizontally" ) );
  277 	distributeDistVToolButton->setText( QString::null );
  278 	QToolTip::add( distributeDistVToolButton, tr( "Make vertical gaps between objects equal" ) );
  279 	distributeDistValueVToolButton->setText( QString::null );
  280 	QToolTip::add( distributeDistValueVToolButton, tr( "Make vertical gaps between objects equal to the value specified" ) );
  281 	distributeLeftToolButton->setText( QString::null );
  282 	QToolTip::add( distributeLeftToolButton, tr( "Distribute left sides equidistantly" ) );
  283 	distributeCenterVToolButton->setText( QString::null );
  284 	QToolTip::add( distributeCenterVToolButton, tr( "Distribute centers equidistantly vertically" ) );
  285 	distributeTopToolButton->setText( QString::null );
  286 	QToolTip::add( distributeTopToolButton, tr( "Distribute tops equidistantly" ) );
  287 
  288 	distributeDistLabel->setText( tr( "&Distance:" ) );
  289 	QToolTip::add( distributeDistMSpinBox, tr( "Distribute the items with the distance specified" ) );
  290 
  291 	guideInfoTextNone = tr("None Selected");
  292 }
  293 
  294 void AlignDistributePalette::init()
  295 {
  296 	undoManager = UndoManager::instance();
  297 
  298 	alignLeftOutToolButton->setIconSet(QIconSet(loadIcon("al_left_out.png"), QIconSet::Small));
  299 	alignLeftInToolButton->setIconSet(QIconSet(loadIcon("al_left_in.png"), QIconSet::Small));
  300 	alignCenterHorToolButton->setIconSet(QIconSet(loadIcon("al_center_hor.png"), QIconSet::Small));
  301 	alignRightInToolButton->setIconSet(QIconSet(loadIcon("al_right_in.png"), QIconSet::Small));
  302 	alignRightOutToolButton->setIconSet(QIconSet(loadIcon("al_right_out.png"), QIconSet::Small));
  303 
  304 	alignTopOutToolButton->setIconSet(QIconSet(loadIcon("al_top_out.png"), QIconSet::Small));
  305 	alignTopInToolButton->setIconSet(QIconSet(loadIcon("al_top_in.png"), QIconSet::Small));
  306 	alignCenterVerToolButton->setIconSet(QIconSet(loadIcon("al_center_ver.png"), QIconSet::Small));
  307 	alignBottomInToolButton->setIconSet(QIconSet(loadIcon("al_bottom_in.png"), QIconSet::Small));
  308 	alignBottomOutToolButton->setIconSet(QIconSet(loadIcon("al_bottom_out.png"), QIconSet::Small));
  309 
  310 	distributeLeftToolButton->setIconSet(QIconSet(loadIcon("distribute_left.png"), QIconSet::Small));
  311 	distributeCenterHToolButton->setIconSet(QIconSet(loadIcon("distribute_hcentre.png"), QIconSet::Small));
  312 	distributeRightToolButton->setIconSet(QIconSet(loadIcon("distribute_right.png"), QIconSet::Small));
  313 	distributeDistHToolButton->setIconSet(QIconSet(loadIcon("distribute_hdist.png"), QIconSet::Small));
  314 	distributeDistValueHToolButton->setIconSet(QIconSet(loadIcon("distribute_hdist_val.png"), QIconSet::Small));
  315 
  316 	distributeBottomToolButton->setIconSet(QIconSet(loadIcon("distribute_bottom.png"), QIconSet::Small));
  317 	distributeCenterVToolButton->setIconSet(QIconSet(loadIcon("distribute_vcentre.png"), QIconSet::Small));
  318 	distributeTopToolButton->setIconSet(QIconSet(loadIcon("distribute_top.png"), QIconSet::Small));
  319 	distributeDistVToolButton->setIconSet(QIconSet(loadIcon("distribute_vdist.png"), QIconSet::Small));
  320 	distributeDistValueVToolButton->setIconSet(QIconSet(loadIcon("distribute_vdist_val.png"), QIconSet::Small));
  321 
  322 	connect(alignLeftOutToolButton, SIGNAL(clicked()), this, SLOT(alignLeftOut()));
  323 	connect(alignRightOutToolButton, SIGNAL(clicked()), this, SLOT(alignRightOut()));
  324 	connect(alignBottomInToolButton, SIGNAL(clicked()), this, SLOT(alignBottomIn()));
  325 	connect(alignRightInToolButton, SIGNAL(clicked()), this, SLOT(alignRightIn()));
  326 	connect(alignBottomOutToolButton, SIGNAL(clicked()), this, SLOT(alignBottomOut()));
  327 	connect(alignCenterHorToolButton, SIGNAL(clicked()), this, SLOT(alignCenterHor()));
  328 	connect(alignLeftInToolButton, SIGNAL(clicked()), this, SLOT(alignLeftIn()));
  329 	connect(alignCenterVerToolButton, SIGNAL(clicked()), this, SLOT(alignCenterVer()));
  330 	connect(alignTopOutToolButton, SIGNAL(clicked()), this, SLOT(alignTopOut()));
  331 	connect(alignTopInToolButton, SIGNAL(clicked()), this, SLOT(alignTopIn()));
  332 	connect(distributeDistHToolButton, SIGNAL(clicked()), this, SLOT(distributeDistH()));
  333 	connect(distributeDistValueHToolButton, SIGNAL(clicked()), this, SLOT(distributeDistValH()));
  334 	connect(distributeRightToolButton, SIGNAL(clicked()), this, SLOT(distributeRight()));
  335 	connect(distributeBottomToolButton, SIGNAL(clicked()), this, SLOT(distributeBottom()));
  336 	connect(distributeCenterHToolButton, SIGNAL(clicked()), this, SLOT(distributeCenterH()));
  337 	connect(distributeDistVToolButton, SIGNAL(clicked()), this, SLOT(distributeDistV()));
  338 	connect(distributeDistValueVToolButton, SIGNAL(clicked()), this, SLOT(distributeDistValV()));
  339 	connect(distributeLeftToolButton, SIGNAL(clicked()), this, SLOT(distributeLeft()));
  340 	connect(distributeCenterVToolButton, SIGNAL(clicked()), this, SLOT(distributeCenterV()));
  341 	connect(distributeTopToolButton, SIGNAL(clicked()), this, SLOT(distributeTop()));
  342 
  343 	connect(alignRelativeToCombo, SIGNAL(activated(int)), this, SLOT(alignToChanged(int)));
  344 
  345 	unitRatio=1.0;
  346 	usingDistance=false;
  347 	guideDirection=-1;
  348 
  349 	guideInfoText = guideInfoTextNone;
  350 	alignGuideLineEdit->setText(guideInfoTextNone);
  351 }
  352 
  353 void AlignDistributePalette::unitChange()
  354 {
  355 	if (currDoc!=NULL)
  356 	{
  357 		double oldValue=distributeDistMSpinBox->value();
  358 		double oldRatio=unitRatio;
  359 		distributeDistMSpinBox->setDecimals(unitGetDecimalsFromIndex(currDoc->unitIndex()));
  360 		distributeDistMSpinBox->setSuffix(unitGetSuffixFromIndex(currDoc->unitIndex()));
  361 		unitRatio=unitGetRatioFromIndex(currDoc->unitIndex());
  362 		double ratioDivisor =  unitRatio / oldRatio;
  363 		distributeDistMSpinBox->setValue(oldValue*ratioDivisor);
  364 		enableGuideButtons();
  365 	}
  366 }
  367 
  368 void AlignDistributePalette::setView( ScribusView * newView )
  369 {
  370 	currView=newView;
  371 	if (currView!=NULL)
  372 	{
  373 		currDoc=currView->Doc;
  374 		alignObjects=&(currDoc->AObjects);
  375 	}
  376 	else
  377 	{
  378 		currDoc=NULL;
  379 		alignObjects=NULL;
  380 	}
  381 	unitChange();
  382 }
  383 
  384 bool AlignDistributePalette::startAlign()
  385 {
  386 	currDoc->buildAlignItemList();
  387 	alignObjectsCount=alignObjects->count();
  388 	if (alignObjectsCount==0)
  389 		return false;
  390 
  391 	bool oneLocked=false;
  392 	for (uint i = 0; i < alignObjectsCount; ++i)
  393 			for (uint j = 0; j < (*alignObjects)[i].Objects.count(); ++j)
  394 				if ((*alignObjects)[i].Objects.at(j)->locked())
  395 					oneLocked=true;
  396 	if (oneLocked)
  397 	{
  398 		int t = ScMessageBox::warning(ScMW, CommonStrings::trWarning,
  399 											tr("Some objects are locked."),
  400 											tr("&Unlock All"), CommonStrings::tr_Cancel,
  401 											0, 0);
  402 		if (t == 1)
  403 			return false;
  404 		for (uint i = 0; i < alignObjectsCount; ++i)
  405 			for (uint j = 0; j < (*alignObjects)[i].Objects.count(); ++j)
  406 				if ((*alignObjects)[i].Objects.at(j)->locked())
  407 					(*alignObjects)[i].Objects.at(j)->setLocked(false);
  408 	}
  409 
  410 	QString targetTooltip = Um::ItemsInvolved + "\n";
  411 	for (uint i = 0; i < currDoc->m_Selection->count(); ++i)
  412 		targetTooltip += "\t" + currDoc->m_Selection->itemAt(i)->getUName() + "\n";
  413 		// Make the align action a single action in Action History
  414 	undoManager->beginTransaction(Um::Selection, 0, Um::AlignDistribute, targetTooltip, Um::IAlignDistribute);
  415 	return true;
  416 }
  417 
  418 void AlignDistributePalette::endAlign()
  419 {
  420 	emit documentChanged();
  421 	ScMW->HaveNewSel(currDoc->m_Selection->itemAt(0)->itemType());
  422 	for (uint i = 0; i < currDoc->m_Selection->count(); ++i)
  423 		currDoc->setRedrawBounding(currDoc->m_Selection->itemAt(i));
  424 	undoManager->commit(); // commit and send the action to the UndoManager
  425 	currView->updateContents();
  426 }
  427 
  428 
  429 void AlignDistributePalette::alignLeftOut()
  430 {
  431 	if (currView!=NULL)
  432 	{
  433 		if (!startAlign())
  434 			return;
  435 		int loopStart=0, loopEnd=alignObjectsCount;
  436 		double newX = 99999.9;
  437 		switch ( currAlignTo )
  438 		{
  439 			case First:
  440 				newX = (*alignObjects)[0].x1;
  441 				loopStart=1;
  442 				break;
  443 			case Last:
  444 				newX = (*alignObjects)[alignObjectsCount-1].x1;
  445 				loopEnd=alignObjectsCount-2;
  446 				break;
  447 			case Page:
  448 				newX = currDoc->currentPage->xOffset();
  449 				break;
  450 			case Margins:
  451 				newX = currDoc->currentPage->xOffset();
  452 				newX += currDoc->currentPage->Margins.Left;
  453 				break;
  454 			case Guide:
  455 				newX=currDoc->currentPage->xOffset() + guidePosition;
  456 				break;
  457 			case Selection:
  458 				for (uint a = 0; a < alignObjectsCount; ++a)
  459 					newX = QMIN((*alignObjects)[a].x1, newX);
  460 				break;
  461 		}
  462 		for (int i = loopStart; i <= loopEnd; ++i)
  463 		{
  464 			double diff=newX-(*alignObjects)[i].x2;
  465 			for (uint j = 0; j < (*alignObjects)[i].Objects.count(); ++j)
  466 				(*alignObjects)[i].Objects.at(j)->moveBy(diff, 0.0);
  467 		}
  468 		endAlign();
  469 	}
  470 }
  471 
  472 void AlignDistributePalette::alignLeftIn()
  473 {
  474 	if (currView!=NULL)
  475 	{
  476 		if (!startAlign())
  477 			return;
  478 		int loopStart=0, loopEnd=alignObjectsCount;
  479 		double newX = 99999.9;
  480 		switch ( currAlignTo )
  481 		{
  482 			case First:
  483 				newX = (*alignObjects)[0].x1;
  484 				loopStart=1;
  485 				break;
  486 			case Last:
  487 				newX = (*alignObjects)[alignObjectsCount-1].x1;
  488 				loopEnd=alignObjectsCount-2;
  489 				break;
  490 			case Page:
  491 				newX = currDoc->currentPage->xOffset();
  492 				break;
  493 			case Margins:
  494 				newX = currDoc->currentPage->xOffset();
  495 				newX += currDoc->currentPage->Margins.Left;
  496 				break;
  497 			case Guide:
  498 				newX=currDoc->currentPage->xOffset() + guidePosition;
  499 				break;
  500 			case Selection:
  501 				for (uint a = 0; a < alignObjectsCount; ++a)
  502 					newX = QMIN((*alignObjects)[a].x1, newX);
  503 				break;
  504 		}
  505 		for (int i = loopStart; i <= loopEnd; ++i)
  506 		{
  507 			double diff=newX-(*alignObjects)[i].x1;
  508 			for (uint j = 0; j < (*alignObjects)[i].Objects.count(); ++j)
  509 				(*alignObjects)[i].Objects.at(j)->moveBy(diff, 0.0);
  510 		}
  511 		endAlign();
  512 	}
  513 }
  514 
  515 void AlignDistributePalette::alignCenterHor()
  516 {
  517 	if (currView!=NULL)
  518 	{
  519 		if (!startAlign())
  520 			return;
  521 		int loopStart=0, loopEnd=alignObjectsCount;
  522 		double newX;
  523 		switch ( currAlignTo )
  524 		{
  525 			case First:
  526 				newX = (*alignObjects)[0].x1 + ((*alignObjects)[0].width)/2;
  527 				loopStart=1;
  528 				break;
  529 			case Last:
  530 				{
  531 					int objindex=alignObjectsCount-1;
  532 					newX = (*alignObjects)[objindex].x1 + ((*alignObjects)[objindex].width)/2;
  533 					loopEnd=alignObjectsCount-2;
  534 				}
  535 				break;
  536 			case Page:
  537 				newX = currDoc->currentPage->xOffset();
  538 				newX += currDoc->currentPage->width()/2;
  539 				break;
  540 			case Margins:
  541 				newX = currDoc->currentPage->xOffset();
  542 				newX += currDoc->currentPage->Margins.Left;
  543 				newX += (currDoc->currentPage->width() - currDoc->currentPage->Margins.Right - currDoc->currentPage->Margins.Left)/2;
  544 				break;
  545 			case Guide:
  546 				newX=currDoc->currentPage->xOffset() + guidePosition;
  547 				break;
  548 			case Selection:
  549 				double minX=99999.9, maxX=-99999.9;
  550 				for (uint a = 0; a < alignObjectsCount; ++a)
  551 				{
  552 					minX = QMIN((*alignObjects)[a].x1, minX);
  553 					maxX = QMAX((*alignObjects)[a].x2, maxX);
  554 				}
  555 				newX = minX + (maxX-minX)/2;
  556 				break;
  557 		}
  558 		for (int i = loopStart; i <= loopEnd; ++i)
  559 		{
  560 			double diff=newX-(*alignObjects)[i].x1-((*alignObjects)[i].width)/2;
  561 			for (uint j = 0; j < (*alignObjects)[i].Objects.count(); ++j)
  562 				(*alignObjects)[i].Objects.at(j)->moveBy(diff, 0.0);
  563 		}
  564 		endAlign();
  565 	}
  566 }
  567 
  568 void AlignDistributePalette::alignRightIn()
  569 {
  570 	if (currView!=NULL)
  571 	{
  572 		if (!startAlign())
  573 			return;
  574 		int loopStart=0, loopEnd=alignObjectsCount;
  575 		double newX = -99999.9;
  576 		switch ( currAlignTo )
  577 		{
  578 			case First:
  579 				newX = (*alignObjects)[0].x2;
  580 				loopStart=1;
  581 				break;
  582 			case Last:
  583 				newX = (*alignObjects)[alignObjectsCount-1].x2;
  584 				loopEnd=alignObjectsCount-2;
  585 				break;
  586 			case Page:
  587 				newX = currDoc->currentPage->xOffset();
  588 				newX += currDoc->currentPage->width();;
  589 				break;
  590 			case Margins:
  591 				newX = currDoc->currentPage->xOffset();
  592 				newX += currDoc->currentPage->width();;
  593 				newX -= currDoc->currentPage->Margins.Right;
  594 				break;
  595 			case Guide:
  596 				newX=currDoc->currentPage->xOffset() + guidePosition;
  597 				break;
  598 			case Selection:
  599 				for (uint a = 0; a < alignObjectsCount; ++a)
  600 					newX = QMAX((*alignObjects)[a].x2, newX);
  601 				break;
  602 		}
  603 		for (int i = loopStart; i <= loopEnd; ++i)
  604 		{
  605 			double diff=newX-(*alignObjects)[i].x2;
  606 			for (uint j = 0; j < (*alignObjects)[i].Objects.count(); ++j)
  607 				(*alignObjects)[i].Objects.at(j)->moveBy(diff, 0.0);
  608 		}
  609 		endAlign();
  610 	}
  611 }
  612 
  613 void AlignDistributePalette::alignRightOut()
  614 {
  615 	if (currView!=NULL)
  616 	{
  617 		if (!startAlign())
  618 			return;
  619 		int loopStart=0, loopEnd=alignObjectsCount;
  620 		double newX = -99999.9;
  621 		switch ( currAlignTo )
  622 		{
  623 			case First:
  624 				newX = (*alignObjects)[0].x2;
  625 				loopStart=1;
  626 				break;
  627 			case Last:
  628 				newX = (*alignObjects)[alignObjectsCount-1].x2;
  629 				loopEnd=alignObjectsCount-2;
  630 				break;
  631 			case Page:
  632 				newX = currDoc->currentPage