/*
* PDFedit - free program for PDF document manipulation.
* Copyright (C) 2006, 2007 PDFedit team: Michal Hocko,
* Miroslav Jahoda,
* Jozef Misutka,
* Martin Petricek
*
* Project is hosted on http://sourceforge.net/projects/pdfedit
*/
/** @file
"Add Annotation" dialog
This dialog is used to add annotation in PDF document
*/
#include "annotdialog.h"
#include
#include
#include
#include
#include QGROUPBOX
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "kernel/cpage.h"
#include "kernel/cannotation.h"
#include "annotdialog.h"
namespace gui {
/*
* Constructs a AnnotDialog as a child of 'parent', with the
* name 'name' and widget flags set to 'f'.
*
* The dialog will by default be modeless, unless you set 'modal' to
* TRUE to construct a modal dialog.
*/
AnnotDialog::AnnotDialog(QSPage & p, QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl ), page(p)
{
if ( !name )
setName( "AnnotDialog" );
AnnotDialogLayout = new QGridLayout( this, 1, 1, 11, 6, "AnnotDialogLayout");
layout8 = new QHBoxLayout( 0, 0, 6, "layout8");
spacer8 = new QSpacerItem( 50, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
layout8->addItem( spacer8 );
okBtn = new QPushButton( this, "okBtn" );
layout8->addWidget( okBtn );
spacer7 = new QSpacerItem( 40, 20, QSizePolicy::Fixed, QSizePolicy::Minimum );
layout8->addItem( spacer7 );
cancelButton = new QPushButton( this, "cancelButton" );
layout8->addWidget( cancelButton );
spacer9 = new QSpacerItem( 50, 21, QSizePolicy::Expanding, QSizePolicy::Minimum );
layout8->addItem( spacer9 );
AnnotDialogLayout->addLayout( layout8, 1, 0 );
tabWidget3 = new QTabWidget( this, "tabWidget3" );
tab = new QWidget( tabWidget3, "tab" );
tabLayout = new QGridLayout( tab, 1, 1, 11, 6, "tabLayout");
groupBox1 = new Q_GroupBox( tab, "groupBox1" );
groupBox1->setColumnLayout(0, Qt::Vertical );
groupBox1->layout()->setSpacing( 6 );
groupBox1->layout()->setMargin( 11 );
groupBox1Layout = new QGridLayout( groupBox1->layout() );
groupBox1Layout->setAlignment( Qt::AlignTop );
layout21_2 = new QVBoxLayout( 0, 0, 6, "layout21_2");
open = new QCheckBox( groupBox1, "open" );
layout21_2->addWidget( open );
layout16_2 = new QHBoxLayout( 0, 0, 6, "layout16_2");
textLabel2 = new QLabel( groupBox1, "textLabel2" );
layout16_2->addWidget( textLabel2 );
textContent = new QLineEdit( groupBox1, "textContent" );
layout16_2->addWidget( textContent );
layout21_2->addLayout( layout16_2 );
layout18_2 = new QHBoxLayout( 0, 0, 6, "layout18_2");
textLabel3 = new QLabel( groupBox1, "textLabel3" );
textLabel3->setMidLineWidth( -6 );
layout18_2->addWidget( textLabel3 );
iconName = new QComboBox( FALSE, groupBox1, "iconName" );
layout18_2->addWidget( iconName );
layout21_2->addLayout( layout18_2 );
layout19_2 = new QHBoxLayout( 0, 0, 6, "layout19_2");
textLabel4_2 = new QLabel( groupBox1, "textLabel4_2" );
textLabel4_2->setMargin( 0 );
layout19_2->addWidget( textLabel4_2 );
state = new QComboBox( FALSE, groupBox1, "state" );
layout19_2->addWidget( state );
layout21_2->addLayout( layout19_2 );
layout20_2 = new QHBoxLayout( 0, 0, 6, "layout20_2");
textLabel5_2 = new QLabel( groupBox1, "textLabel5_2" );
layout20_2->addWidget( textLabel5_2 );
stateModel = new QComboBox( FALSE, groupBox1, "stateModel" );
layout20_2->addWidget( stateModel );
layout21_2->addLayout( layout20_2 );
groupBox1Layout->addLayout( layout21_2, 0, 0 );
tabLayout->addWidget( groupBox1, 0, 0 );
tabWidget3->insertTab( tab, QString::fromLatin1("") );
tab_2 = new QWidget( tabWidget3, "tab_2" );
tabLayout_2 = new QGridLayout( tab_2, 1, 1, 11, 6, "tabLayout_2");
frame3 = new QFrame( tab_2, "frame3" );
frame3->setFrameShape( QFrame::StyledPanel );
frame3->setFrameShadow( QFrame::Raised );
frame3Layout = new QGridLayout( frame3, 1, 1, 11, 6, "frame3Layout");
layout17 = new QVBoxLayout( 0, 0, 6, "layout17");
layout12 = new QVBoxLayout( 0, 0, 6, "layout12");
layout16_2_2 = new QHBoxLayout( 0, 0, 6, "layout16_2_2");
textLabel2_3 = new QLabel( frame3, "textLabel2_3" );
layout16_2_2->addWidget( textLabel2_3 );
linkContent = new QLineEdit( frame3, "linkContent" );
layout16_2_2->addWidget( linkContent );
layout12->addLayout( layout16_2_2 );
layout8_2 = new QHBoxLayout( 0, 0, 6, "layout8_2");
textLabel1 = new QLabel( frame3, "textLabel1" );
textLabel1->setFrameShape( QLabel::NoFrame );
layout8_2->addWidget( textLabel1 );
destination = new QLineEdit( frame3, "destination" );
layout8_2->addWidget( destination );
layout12->addLayout( layout8_2 );
layout9 = new QHBoxLayout( 0, 0, 6, "layout9");
textLabel2_2 = new QLabel( frame3, "textLabel2_2" );
textLabel2_2->setFrameShape( QLabel::NoFrame );
layout9->addWidget( textLabel2_2 );
highLight = new QComboBox( FALSE, frame3, "highLight" );
highLight->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, highLight->sizePolicy().hasHeightForWidth() ) );
layout9->addWidget( highLight );
layout12->addLayout( layout9 );
layout17->addLayout( layout12 );
spacer4 = new QSpacerItem( 21, 81, QSizePolicy::Minimum, QSizePolicy::Expanding );
layout17->addItem( spacer4 );
frame3Layout->addLayout( layout17, 0, 0 );
tabLayout_2->addWidget( frame3, 0, 0 );
tabWidget3->insertTab( tab_2, QString::fromLatin1("") );
AnnotDialogLayout->addWidget( tabWidget3, 0, 0 );
languageChange();
resize( QSize(477, 341).expandedTo(minimumSizeHint()) );
// signals and slots connections
connect( cancelButton, SIGNAL( clicked() ), this, SLOT( reject() ) );
connect( stateModel, SIGNAL( textChanged(const QString&) ), this, SLOT( fillStates(const QString&) ) );
connect( okBtn, SIGNAL( clicked() ), this, SLOT( createAnnot() ) );
connect( okBtn, SIGNAL( clicked() ), this, SLOT( accept() ) );
connect( stateModel, SIGNAL( activated(const QString&) ), this, SLOT( fillStates(const QString&) ) );
// buddies
textLabel3->setBuddy( iconName );
textLabel4_2->setBuddy( state );
textLabel5_2->setBuddy( stateModel );
textLabel2_3->setBuddy( linkContent );
textLabel1->setBuddy( destination );
textLabel2_2->setBuddy( highLight );
}
/*
* Destroys the object and frees any allocated resources
*/
AnnotDialog::~AnnotDialog()
{
// no need to delete child widgets, Qt does it all for us
}
/*
* Sets the strings of the subwidgets using the current
* language.
*/
void AnnotDialog::languageChange()
{
setCaption(tr("Add new annotation"));
okBtn->setText(QObject::tr("&Ok"));
okBtn->setAccel(QKeySequence("Alt+O"));
cancelButton->setText(QObject::tr("&Cancel"));
cancelButton->setAccel(QKeySequence("Alt+C"));
groupBox1->setTitle(tr("Text Annotation"));
open->setText(tr("&Open"));
open->setAccel(QKeySequence("Alt+O"));
textLabel2->setText(tr("Content"));
textLabel3->setText(tr("Icon &Name"));
iconName->clear();
iconName->insertItem(QString::null);
iconName->insertItem(tr("Comment"));
iconName->insertItem(tr("Help"));
iconName->insertItem(tr("Insert"));
iconName->insertItem(tr("Key"));
iconName->insertItem(tr("NewParagraph"));
iconName->insertItem(tr("Note"));
iconName->insertItem(tr("Paragraph"));
iconName->setCurrentItem(6);
textLabel4_2->setText(tr("&State"));
state->clear();
state->insertItem(tr("Marked"));
state->insertItem(tr("Unmarked"));
textLabel5_2->setText(tr("State &Model"));
stateModel->clear();
stateModel->insertItem(tr("Marked"));
stateModel->insertItem(tr("Review"));
tabWidget3->changeTab(tab, tr("&Text Annotation"));
textLabel2_3->setText(tr("Content"));
textLabel1->setText(tr("&Destination"));
textLabel2_2->setText(tr("&Highlight mode"));
highLight->clear();
highLight->insertItem(tr("N - None"));
highLight->insertItem(tr("I - Invert"));
highLight->insertItem(tr("O - Outline"));
highLight->insertItem(tr("P - Push"));
tabWidget3->changeTab(tab_2, tr("&Link Annotation"));
}
void AnnotDialog::fillStates(const QString & current)
{
state->clear();
if(current == "Marked")
{
state->insertItem("Marked");
state->insertItem("Unmarked");
}else
if(current == "Review")
{
state->insertItem("Accepted");
state->insertItem("Rejected");
state->insertItem("Cancelled");
state->insertItem("Completed");
state->insertItem("None");
}
}
void AnnotDialog::createTextAnnot()
{
using namespace pdfobjects::utils;
using namespace std;
using namespace boost;
// backs up default values
bool dOpen=TextAnnotInitializer::OPEN;
string dContents=TextAnnotInitializer::CONTENTS;
string dName=TextAnnotInitializer::NAME;
string dState=TextAnnotInitializer::STATE;
string dStateMode=TextAnnotInitializer::STATEMODEL;
int dFlags=TextAnnotInitializer::FLAGS;
// sets default values according form values
TextAnnotInitializer::OPEN=open->isChecked();
// FIXME this may be problem with enconding
TextAnnotInitializer::CONTENTS=textContent->text().ascii();
TextAnnotInitializer::NAME=iconName->currentText().ascii();
TextAnnotInitializer::STATE=state->currentText().ascii();
TextAnnotInitializer::STATEMODEL=stateModel->currentText().ascii();
// TODO support flags field
//TextAnnotInitializer::FLAGS=dFlags;
// creates CAnnotation instance with factory, this should
// use TextAnnotInitializer with values which we have
// set above
shared_ptr annotInstance=CAnnotation::createAnnotation(rect, "Text");
page.get()->addAnnotation(annotInstance);
// sets back defaul values
TextAnnotInitializer::OPEN=dOpen;
TextAnnotInitializer::CONTENTS=dContents;
TextAnnotInitializer::NAME=dName;
TextAnnotInitializer::STATE=dState;
TextAnnotInitializer::STATEMODEL=dStateMode;
TextAnnotInitializer::FLAGS=dFlags;
}
void AnnotDialog::createLinkAnnot()
{
using namespace pdfobjects::utils;
using namespace std;
using namespace boost;
// backs up default values
string dContents=LinkAnnotInitializer::CONTENTS;
string dDest=LinkAnnotInitializer::DEST;
string dH=LinkAnnotInitializer::H;
// sets default values according form values
// FIXME this may be problem with enconding
LinkAnnotInitializer::CONTENTS=linkContent->text().ascii();
LinkAnnotInitializer::DEST=destination->text().ascii();
LinkAnnotInitializer::H=highLight->currentText().ascii();
// creates CAnnotation instance with factory, this should
// use LinkAnnotInitializer with values which we have
// set above
shared_ptr annotInstance=CAnnotation::createAnnotation(rect, "Link");
page.get()->addAnnotation(annotInstance);
// sets back defaul values
LinkAnnotInitializer::CONTENTS=dContents;
LinkAnnotInitializer::DEST=dDest;
LinkAnnotInitializer::H=dH;
}
void AnnotDialog::createAnnot()
{
// checks currently set tab and creates annotation instance according
// its setting
// finally creates QSAnnotation and registers it to the page
int current=tabWidget3->currentPageIndex();
switch(current)
{
// Text annotation
case 0:
createTextAnnot();
break;
// Link annotation
case 1:
createLinkAnnot();
break;
// Annotation is not supported at this moment
default:
break;
}
}
void AnnotDialog::setRectangle(double xl, double yl, double width, double height)
{
this->rect.xleft=xl;
this->rect.yleft=yl;
this->rect.xright=xl+width;
this->rect.yright=yl+height;
}
} //namespace gui