View Issue Details

IDProjectCategoryView StatusLast Update
0011228ScribusStory Editor / Text Framespublic2015-09-04 22:17
Reportercezaryece Assigned Tocezaryece  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionno change required 
Product Version1.5.0svn 
Target VersionFixed in Version 
Summary0011228: [PATCH] bulleted and numbered lists
DescriptionAttached patch adds new feature to Scribus - lists with bullets or numbering.

This time whole feature is based on marks design.
Few new paragraph style properties are added to current set.
Bullets, numerations and drop caps are now in group of Paragraph Effect. Paragraph can have one of these three effects enabled and rendered in layout.
It can be set as named paragraph style property in Style Manager or override locally from Paragraph Effect in Text tab of Property Palette.
Bullets and numbering are read from ODT files on importing (maybe with not all ODT features support, but it is better than any support).
SLA file reader has workaround for changed names of paragraph style properties, so old files read well and are saved with new names.

Feature was tested (on different implementation states) by Ale, Pygmee and JLuc (thanks for support) and I am quite sure it is stable and I hope it don`t causing crashes or regressions.
Tagslists, numbering, numeration, text, text frames, usability
Patch

Relationships

related to 0000102 closed Bullet list support 
related to 0002038 acknowledged extended paragraph styles 
related to 0011277 closed [OBSOLETE][patch] numeration and bullets 

Activities

cezaryece

2012-12-03 11:40

developer  

numeration.diff (232,706 bytes)
diff --git a/Scribus/Scribus.pro b/Scribus/Scribus.pro
index f9844bc..fca0e1f 100644
--- a/Scribus/Scribus.pro
+++ b/Scribus/Scribus.pro
@@ -3,7 +3,7 @@
 ######################################################################
 
 TEMPLATE = app
-TARGET = 
+TARGET =
 DEPENDPATH += . \
               scribus \
               scribus/colormgmt \
@@ -689,7 +689,6 @@ HEADERS += scribus/actionmanager.h \
            scribus/ui/propertiespalette_xyz.h \
            scribus/ui/propertywidget_advanced.h \
            scribus/ui/propertywidget_distance.h \
-           scribus/ui/propertywidget_dropcap.h \
            scribus/ui/propertywidget_flop.h \
            scribus/ui/propertywidget_optmargins.h \
            scribus/ui/propertywidget_orphans.h \
@@ -1123,7 +1122,9 @@ HEADERS += scribus/actionmanager.h \
     scribus/ui/MarkInsertDlg.h \
     scribus/ui/markanchor.h \
     scribus/ui/mark2mark.h \
-    scribus/ui/mark2item.h
+    scribus/ui/mark2item.h \
+    scribus/numeration.h \
+    scribus/ui/propertywidget_pareffect.h
 FORMS += scribus/ui/aboutplugins.ui \
          scribus/ui/aligndistribute.ui \
          scribus/ui/arcvectorbase.ui \
@@ -1199,7 +1200,6 @@ FORMS += scribus/ui/aboutplugins.ui \
          scribus/ui/propertiespalette_xyzbase.ui \
          scribus/ui/propertywidget_advancedbase.ui \
          scribus/ui/propertywidget_distancebase.ui \
-         scribus/ui/propertywidget_dropcapbase.ui \
          scribus/ui/propertywidget_flopbase.ui \
          scribus/ui/propertywidget_optmarginsbase.ui \
          scribus/ui/propertywidget_orphansbase.ui \
@@ -1258,7 +1258,8 @@ FORMS += scribus/ui/aboutplugins.ui \
     scribus/ui/marknote.ui \
     scribus/ui/markanchor.ui \
     scribus/ui/mark2mark.ui \
-    scribus/ui/mark2item.ui
+    scribus/ui/mark2item.ui \
+    scribus/ui/propertywidget_pareffectbase.ui
 SOURCES += scribus/actionmanager.cpp \
            scribus/canvas.cpp \
            scribus/canvasgesture_cellselect.cpp \
@@ -1695,7 +1696,6 @@ SOURCES += scribus/actionmanager.cpp \
            scribus/ui/propertiespalette_xyz.cpp \
            scribus/ui/propertywidget_advanced.cpp \
            scribus/ui/propertywidget_distance.cpp \
-           scribus/ui/propertywidget_dropcap.cpp \
            scribus/ui/propertywidget_flop.cpp \
            scribus/ui/propertywidget_optmargins.cpp \
            scribus/ui/propertywidget_orphans.cpp \
@@ -2168,7 +2168,9 @@ SOURCES += scribus/actionmanager.cpp \
     scribus/ui/marknote.cpp \
     scribus/ui/markanchor.cpp \
     scribus/ui/mark2mark.cpp \
-    scribus/canvasmode_imageimport.cpp
+    scribus/canvasmode_imageimport.cpp \
+    scribus/numeration.cpp \
+    scribus/ui/propertywidget_pareffect.cpp
 RESOURCES += scribus/plugins/scripter/python/sceditor/dockwidget_icons.qrc
 TRANSLATIONS += resources/translations/po/scribus.af.ts \
                 resources/translations/po/scribus.ar.ts \
@@ -2227,4 +2229,5 @@ OTHER_FILES += \
     scribus/plugins/scripter/api_Scripter.dialogs.nodes.api \
     scribus/plugins/scripter/api_Scripter.dialogs.mainWindow.api \
     scribus/plugins/scripter/api_Scripter.dialogs.layers.api \
-    scribus/plugins/scripter/api_Scripter.activeDocument.activePage.items.api
+    scribus/plugins/scripter/api_Scripter.activeDocument.activePage.items.api \
+    scribus/CMakeLists.txt
diff --git a/Scribus/scribus/CMakeLists.txt b/Scribus/scribus/CMakeLists.txt
index 9bcec0d..19e3002 100644
--- a/Scribus/scribus/CMakeLists.txt
+++ b/Scribus/scribus/CMakeLists.txt
@@ -143,7 +143,7 @@ SET(SCRIBUS_UI_SRC
   ui/propertiespalette_xyzbase.ui
   ui/propertywidget_advancedbase.ui
   ui/propertywidget_distancebase.ui
-  ui/propertywidget_dropcapbase.ui
+  ui/propertywidget_pareffectbase.ui
   ui/propertywidget_flopbase.ui
   ui/propertywidget_optmarginsbase.ui
   ui/propertywidget_orphansbase.ui
@@ -216,6 +216,7 @@ SET(SCRIBUS_MOC_CLASSES
   latexhelpers.h
   loadsaveplugin.h
   menumanager.h
+  numeration.h
   navigator.h
   notesstyles.h
   observable.h
@@ -409,7 +410,7 @@ SET(SCRIBUS_MOC_CLASSES
   ui/propertiespalette_xyz.h
   ui/propertywidget_advanced.h
   ui/propertywidget_distance.h
-  ui/propertywidget_dropcap.h
+  ui/propertywidget_pareffect.h
   ui/propertywidget_flop.h
   ui/propertywidget_optmargins.h
   ui/propertywidget_orphans.h
@@ -578,6 +579,7 @@ SET(SCRIBUS_SOURCES
   menumanager.cpp
   mesh.cpp
   navigator.cpp
+  numeration.cpp
   observable.cpp
   nftrcreader.cpp
   nftsettings.cpp
@@ -851,7 +853,7 @@ SET(SCRIBUS_SOURCES
   ui/propertiespalette_xyz.cpp
   ui/propertywidget_advanced.cpp
   ui/propertywidget_distance.cpp
-  ui/propertywidget_dropcap.cpp
+  ui/propertywidget_pareffect.cpp
   ui/propertywidget_flop.cpp
   ui/propertywidget_optmargins.cpp
   ui/propertywidget_orphans.cpp
diff --git a/Scribus/scribus/actionmanager.cpp b/Scribus/scribus/actionmanager.cpp
index 6c959ce..f37e7c8 100644
--- a/Scribus/scribus/actionmanager.cpp
+++ b/Scribus/scribus/actionmanager.cpp
@@ -908,9 +908,12 @@ void ActionManager::initExtrasMenuActions()
 	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
 	name="extrasGenerateTableOfContents";
 	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
+	name="extrasUpdateDocument";
+	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
 
 	connect( (*scrActions)["extrasManageImages"], SIGNAL(triggered()), mainWindow, SLOT(StatusPic()) );
 	connect( (*scrActions)["extrasGenerateTableOfContents"], SIGNAL(triggered()), mainWindow, SLOT(generateTableOfContents()) );
+	connect( (*scrActions)["extrasUpdateDocument"], SIGNAL(triggered()), mainWindow, SLOT(updateDocument()) );
 }
 
 
@@ -1664,6 +1667,7 @@ void ActionManager::languageChange()
 	(*scrActions)["extrasHyphenateText"]->setTexts( tr("&Hyphenate Text"));
 	(*scrActions)["extrasDeHyphenateText"]->setTexts( tr("Dehyphenate Text"));
 	(*scrActions)["extrasGenerateTableOfContents"]->setTexts( tr("&Generate Table Of Contents"));
+	(*scrActions)["extrasUpdateDocument"]->setTexts( tr("&Update Document"));
 
 	//Windows Menu
 	(*scrActions)["windowsCascade"]->setText( tr("&Cascade"));
@@ -2191,7 +2195,8 @@ void ActionManager::createDefaultMenus()
 		<< "extrasManageImages"
 		<< "extrasHyphenateText"
 		<< "extrasDeHyphenateText"
-		<< "extrasGenerateTableOfContents";
+		<< "extrasGenerateTableOfContents"
+		<< "extrasUpdateDocument";
 	//Windows
 	++itmenu;
 	itmenu->second
diff --git a/Scribus/scribus/fileloader.cpp b/Scribus/scribus/fileloader.cpp
index b458798..e6ad94a 100644
--- a/Scribus/scribus/fileloader.cpp
+++ b/Scribus/scribus/fileloader.cpp
@@ -320,9 +320,11 @@ void FileLoader::readParagraphStyle(ParagraphStyle& vg, const QDomElement& pg, S
 		vg.charStyle().setFont((*currDoc->AllFonts)[tmpf]);
 		vg.charStyle().setFontSize(qRound(ScCLocale::toDoubleC(pg.attribute("FONTSIZE"), 12.0) * 10.0));
 		vg.setHasDropCap(static_cast<bool>(pg.attribute("DROP", "0").toInt()));
-		vg.setDcCharStyleName(pg.attribute("DROPCHSTYLE", ""));
+		vg.setPeCharStyleName(pg.attribute("DROPCHSTYLE", ""));
+		vg.setPeCharStyleName(pg.attribute("PECHSTYLE", ""));
 		vg.setDropCapLines(pg.attribute("DROPLIN", "2").toInt());
-		vg.setDropCapOffset(ScCLocale::toDoubleC(pg.attribute("DROPDIST"), 0.0));
+		vg.setParEffectOffset(ScCLocale::toDoubleC(pg.attribute("DROPDIST"), 0.0));
+		vg.setParEffectOffset(ScCLocale::toDoubleC(pg.attribute("PEDIST"), 0.0));
 		vg.charStyle().setFeatures(static_cast<StyleFlag>(pg.attribute("EFFECT", "0").toInt()).featureList());
 		vg.charStyle().setFillColor(pg.attribute("FCOLOR", currDoc->itemToolPrefs().shapeFillColor));
 		vg.charStyle().setFillShade(pg.attribute("FSHADE", "100").toInt());
diff --git a/Scribus/scribus/gtaction.cpp b/Scribus/scribus/gtaction.cpp
index d9a34b0..0c17130 100644
--- a/Scribus/scribus/gtaction.cpp
+++ b/Scribus/scribus/gtaction.cpp
@@ -394,6 +394,10 @@ void gtAction::getFrameStyle(gtFrameStyle *fstyle)
 		fstyle->setDropCap(vg.hasDropCap());
 	if (!vg.isInhDropCapLines())
 		fstyle->setDropCapHeight(vg.dropCapLines());
+	if (!vg.isInhHasBullet())
+		fstyle->setBullet(vg.hasBullet(), vg.bulletStr());
+	if (!vg.isInhHasNum())
+		fstyle->setNum(vg.hasNum(),vg.numFormat(),vg.numLevel(), vg.numStart(), vg.numPrefix(), vg.numSuffix());
 
 	gtFont font;
 	getFrameFont(&font);
@@ -490,6 +494,24 @@ void gtAction::setParaStyleAttributes(gtParagraphStyle *pstyle, ParagraphStyle&
 		style.setHasDropCap(pstyle->hasDropCap());
 	if (flags & gtParagraphStyle::dropCapHeightWasSet)
 		style.setDropCapLines(pstyle->getDropCapHeight());
+	if (flags & gtParagraphStyle::bulletWasSet)
+	{
+		style.setHasBullet(pstyle->hasBullet());
+		style.setBulletStr(pstyle->getBullet());
+	}
+	if (flags & gtParagraphStyle::numWasSet)
+	{
+		style.setHasNum(pstyle->hasNum());
+		style.setNumName(pstyle->getName());
+		style.setNumFormat(pstyle->getNumFormat());
+		style.setNumLevel(pstyle->getNumLevel());
+		style.setNumStart(pstyle->getNumStart());
+		style.setNumHigher(true);
+		style.setNumOther(true);
+		style.setNumPrefix(pstyle->getNumPrefix());
+		style.setNumSuffix(pstyle->getNumSuffix());
+	}
+	
 	/*vg.setDropCapOffset(0);*/
 }
 
diff --git a/Scribus/scribus/gtparagraphstyle.cpp b/Scribus/scribus/gtparagraphstyle.cpp
index 9a486d6..7261536 100644
--- a/Scribus/scribus/gtparagraphstyle.cpp
+++ b/Scribus/scribus/gtparagraphstyle.cpp
@@ -42,7 +42,15 @@ gtParagraphStyle::gtParagraphStyle(const gtParagraphStyle& p) : gtStyle(p)
 	spaceAbove      = p.spaceAbove;
 	spaceBelow      = p.spaceBelow;
 	dropCap         = p.dropCap;
+	bullet          = p.bullet;
+	bulletStr       = p.bulletStr;
 	dropCapHeight   = p.dropCapHeight;
+	numeration      = p.numeration;
+	numformat       = p.numformat;
+	numlevel        = p.numlevel;
+	numstart        = p.numstart;
+	numprefix       = p.numprefix;
+	numsuffix       = p.numsuffix;
 	adjToBaseline   = p.adjToBaseline;
 	autoLineSpacing = p.autoLineSpacing;
 	isVisible       = p.isVisible;
@@ -65,6 +73,14 @@ void gtParagraphStyle::init()
 	spaceBelow      = 0;
 	dropCap         = false;
 	dropCapHeight   = 2;
+	bullet          = false;
+	bulletStr       = QString(QChar(0x2022));
+	numeration      = false;
+	numformat       = 0;
+	numlevel        = 0;
+	numstart        = 1;
+	numprefix       = QString();
+	numsuffix       = QString();
 	adjToBaseline   = false;
 	autoLineSpacing = false;
 	isVisible       = true;
@@ -221,6 +237,67 @@ void   gtParagraphStyle::setDropCapHeight(int newHeight)
 	flags |= dropCapHeightWasSet;
 }
 
+bool gtParagraphStyle::hasBullet()
+{
+	return bullet;
+}
+
+QString  gtParagraphStyle::getBullet()
+{
+	return bulletStr;
+}
+
+void gtParagraphStyle::setBullet(bool newBullet, QString str)
+{
+	bullet = newBullet;
+	bulletStr = str;
+	flags |= bulletWasSet;
+}
+
+bool gtParagraphStyle::hasNum()
+{
+	return numeration;
+}
+
+void gtParagraphStyle::setNum(bool newNum, int format, int level, int start, QString prefix, QString suffix)
+{
+	numeration = newNum;
+	if (newNum)
+	{
+		numformat = format;
+		numlevel = level;
+		numstart = start;
+		numprefix = prefix;
+		numsuffix = suffix;
+	}
+	flags |= numWasSet;
+}
+
+int gtParagraphStyle::getNumLevel()
+{
+	return numlevel;
+}
+
+int gtParagraphStyle::getNumFormat()
+{
+	return numformat;
+}
+
+int gtParagraphStyle::getNumStart()
+{
+	return numstart;
+}
+
+QString gtParagraphStyle::getNumPrefix()
+{
+	return numprefix;
+}
+
+QString gtParagraphStyle::getNumSuffix()
+{
+	return numsuffix;
+}
+
 bool gtParagraphStyle::isAdjToBaseline()
 {
 	return adjToBaseline;
diff --git a/Scribus/scribus/gtparagraphstyle.h b/Scribus/scribus/gtparagraphstyle.h
index 344f14d..2dcede5 100644
--- a/Scribus/scribus/gtparagraphstyle.h
+++ b/Scribus/scribus/gtparagraphstyle.h
@@ -64,6 +64,14 @@ protected:
 	QList<ParagraphStyle::TabRecord> tabValues;
 	bool dropCap;
 	int  dropCapHeight;
+	bool bullet;
+	QString bulletStr;
+	bool numeration;
+	int numlevel;
+	int numformat;
+	int numstart;
+	QString numprefix;
+	QString numsuffix;
 	bool adjToBaseline;
 	bool autoLineSpacing;
 	bool isVisible;
@@ -83,6 +91,8 @@ public:
 		dropCapHeightWasSet = 512,
 		adjToBaselineWasSet = 1024,
 		autoLineSpacingWasSet  = 2048,
+		bulletWasSet = 4096,
+		numWasSet = 8192
 	} wasSetFlags;
 
 	int    getFlags();
@@ -118,6 +128,16 @@ public:
 	gtParagraphStyle(const gtStyle& s);
 	~gtParagraphStyle();
 	QString target();
+	bool hasBullet();
+	void setBullet(bool newBullet, QString str = QString(QChar(0x2022)));
+	QString getBullet();
+	bool hasNum();
+	void setNum(bool newNum, int format=0, int level=0, int start = 1, QString prefix = "", QString suffix = "");
+	int getNumLevel();
+	int getNumFormat();
+	int getNumStart();
+	QString getNumPrefix();
+	QString getNumSuffix();
 };
 
 #endif // GTPARAGRAPHSTYLE_H
diff --git a/Scribus/scribus/marks.h b/Scribus/scribus/marks.h
index e6988f7..376fcf6 100644
--- a/Scribus/scribus/marks.h
+++ b/Scribus/scribus/marks.h
@@ -19,7 +19,8 @@ enum MarkType
 	MARKVariableTextType = 3,//mark contain dynamic text
 	MARKNoteMasterType = 4,  //mark contain footnote reference
 	MARKNoteFrameType = 5,  //mark used internally in note frame at beginning of note`s text
-	MARKIndexType = 6 // index entry
+	MARKIndexType = 6, // index entry
+	MARKBullNumType = 7
 };
 
 struct MarkData
@@ -40,6 +41,7 @@ class SCRIBUS_API Mark
 {
 	friend class ScribusDoc;
 	friend class ScribusMainWindow;
+	friend class BulNumMark;
 	//only ScribusDoc && ScribusMainWindow can create and delete marks
 private:
 	Mark() : label(""), OwnPage(-1), typ(MARKNoType), data() {}
@@ -86,7 +88,7 @@ public:
 	bool hasItemPtr() { return data.itemPtr != NULL; }
 	bool hasString() { return !data.strtxt.isEmpty(); }
 	bool hasMark() { return data.destmarkName != ""; }
-	bool isUnique() { return ((typ != MARKVariableTextType) && (typ != MARKIndexType)); }
+	bool isUnique() { return ((typ != MARKVariableTextType) && (typ != MARKIndexType) && (typ != MARKBullNumType)); }
 	bool isNoteType() { return ((typ == MARKNoteMasterType) || (typ==MARKNoteFrameType)); }
 	bool isType(const MarkType t) { return t==typ; }
 
@@ -95,4 +97,11 @@ protected:
 	MarkData data;
 };
 
+class SCRIBUS_API BulNumMark : public Mark
+{
+public:
+	BulNumMark() : Mark() { label = "BullNumMark"; typ = MARKBullNumType; }
+	~BulNumMark() {}
+};
+
 #endif // MARKS_H
diff --git a/Scribus/scribus/notesstyles.h b/Scribus/scribus/notesstyles.h
index 9bd101f..792b50f 100644
--- a/Scribus/scribus/notesstyles.h
+++ b/Scribus/scribus/notesstyles.h
@@ -5,6 +5,7 @@
 #include <QObject>
 #include <QString>
 #include <QList>
+#include "numeration.h"
 #include "pagestructs.h"
 #include "scpage.h"
 #include "styles/charstyle.h"
@@ -16,25 +17,6 @@ class ScribusDoc;
 class PageItem_NoteFrame;
 class PageItem_TextFrame;
 
-class Numeration
-{
-public:
-	Numeration() : numType(Type_1_2_3) {}
-	void setType(NumerationType type) { numType = type; }
-	const NumerationType type() { return numType; }
-	const QString numString(const int num) { return getStringFromSequence(numType, num); }
-private:
-	NumerationType numType;
-};
-
-typedef enum {
-	NSRdocument,
-	NSRsection,
-	NSRstory,
-	NSRpage,
-	NSRframe
-} NumerationRange;
-
 //used for map with endnotes frames maped with range item
 typedef union
 {
@@ -65,8 +47,8 @@ public:
 	void setSuffix (const QString str) { suffixStr = str; }
 
 	const QString numString(const int num) { return numeration.numString(num); }
-	void setType(const NumerationType type) { numeration.setType(type); }
-	const NumerationType getType() { return numeration.type(); }
+	void setType(const NumFormat type) { numeration.numFormat = type; }
+	const NumFormat getType() { return numeration.numFormat; }
 
 	bool isEndNotes() { return m_endNotesStyle; }
 	bool isAutoNotesHeight() { return autoNotesHeight; }
diff --git a/Scribus/scribus/numeration.cpp b/Scribus/scribus/numeration.cpp
new file mode 100644
index 0000000..61e7268
--- /dev/null
+++ b/Scribus/scribus/numeration.cpp
@@ -0,0 +1,53 @@
+#include "numeration.h"
+#include "util.h"
+
+const QString getStringFromNum(NumFormat format, int num, const QChar leadingChar, const int charsLen)
+{
+	QString str = getStringFromSequence(format, num);
+	if (charsLen > str.length())
+		str = str.rightJustified(charsLen, leadingChar);
+	return str;
+}
+
+const QString getAsterixStringFromNum(int num, QString asterix, const QChar leadingChar, const int charsLen)
+{
+	QString str = getStringFromSequence(Type_asterix, num, asterix);
+	if (charsLen > str.length())
+		str = str.rightJustified(charsLen, leadingChar);
+	return str;
+}
+
+const QString getFormatName(int format)
+{
+	QString name = QString();
+	if (format == Type_1_2_3)
+		name = "1_2_3";
+	else if (format == Type_i_ii_iii)
+		name = "i_ii_iii";
+	else if (format == Type_I_II_III)
+		name = "I_II_III";
+	else if (format == Type_a_b_c)
+		name = "a_b_c";
+	else if (format == Type_A_B_C)
+		name = "A_B_C";
+	else if (format == Type_asterix)
+		name = "*";
+	Q_ASSERT(!name.isEmpty());
+	return name;
+}
+
+const QStringList getFormatList()
+{
+	QStringList list;
+	list << "1_2_3" << "i_ii_iii" << "I_II_III" << "a_b_c" << "A_B_C" << "*";
+	return list;
+}
+
+const QString Numeration::numString(const int num)
+{
+	if (numFormat == Type_asterix)
+		return getAsterixStringFromNum(num, asterix, lead, len);
+
+	return getStringFromNum(numFormat, num, lead, len);
+	
+}
diff --git a/Scribus/scribus/numeration.h b/Scribus/scribus/numeration.h
new file mode 100644
index 0000000..e94f9fb
--- /dev/null
+++ b/Scribus/scribus/numeration.h
@@ -0,0 +1,62 @@
+#ifndef NUMERATION_H
+#define NUMERATION_H
+
+#include <QString>
+#include <QStringList>
+#include <QMap>
+
+typedef enum 
+{
+	Type_1_2_3,
+	Type_i_ii_iii,
+	Type_I_II_III,
+	Type_a_b_c,
+	Type_A_B_C,
+	Type_asterix,
+	Type_None=99
+} NumFormat;
+
+typedef enum {
+	NSRdocument,
+	NSRsection,
+	NSRstory,
+	NSRpage,
+	NSRframe
+//	NSRblock //used for contignous numeration eg. paragraphs - paragraph without numbering reset counter
+} NumerationRange;
+
+class Numeration
+{
+public:
+	Numeration() : numFormat(Type_1_2_3), asterix(QString()), lead('0'), len(0), range(NSRdocument), prefix(QString()), suffix(QString()), start(1) {}
+	Numeration(NumFormat f) : numFormat(f), asterix("*") {}
+	const QString numString(const int num);
+
+	NumFormat numFormat;
+	QString asterix;
+	QChar lead;
+	int len;
+	NumerationRange range;
+	QString prefix;
+	QString suffix;
+	int start;
+};
+
+//struct used by ScribusDoc for storing numerations used in document
+typedef struct {
+	QString m_name;
+	QList<Numeration> m_nums;
+	QList<int> m_counters;
+	int m_lastlevel;
+} NumStruct;
+
+//util functions for use without Numeration class
+//convert passed num to string using numeration style
+const QString getStringFromNum(NumFormat format, int num, const QChar leadingChar='0', const int charsLen=0);
+//convert passed num to string with custom chars
+const QString getAsterixStringFromNum(int num, QString asterix, const QChar leadingChar='_', const int charsLen=0);
+//return numeration name from type
+const QString getFormatName(int format);
+const QStringList getFormatList();
+
+#endif // NUMERATION_H
diff --git a/Scribus/scribus/pageitem.cpp b/Scribus/scribus/pageitem.cpp
index 9f79383..a489646 100644
--- a/Scribus/scribus/pageitem.cpp
+++ b/Scribus/scribus/pageitem.cpp
@@ -48,9 +48,9 @@ for which a new license (GPL+exception) is in place.
 #include "pageitem_group.h"
 #include "pageitem_regularpolygon.h"
 #include "pageitem_arc.h"
-#include "pageitem_noteframe.h"
 #include "pageitem_spiral.h"
 #include "pageitem_textframe.h"
+#include "pageitem_noteframe.h"
 #include "pageitem_latexframe.h"
 #include "prefsmanager.h"
 
@@ -851,7 +851,8 @@ PageItem::~PageItem()
 				if (itemText.item(pos)->hasMark())
 				{
 					Mark* mrk = itemText.item(pos)->mark;
-					m_Doc->eraseMark(mrk);
+					if (!mrk->isType(MARKBullNumType))
+						m_Doc->eraseMark(mrk);
 				}
 			}
 		}
@@ -5036,6 +5037,8 @@ void PageItem::restore(UndoState *state, bool isUndo)
 			restoreWeldItems(ss, isUndo);
 		else if (ss->contains("UNWELD_ITEM"))
 			restoreUnWeldItem(ss, isUndo);
+		else if (ss->contains("CLEARMARKSTRING"))
+			restoreMarkString(ss, isUndo);
 	}
 	if (!OnMasterPage.isEmpty())
 		m_Doc->setCurrentPage(oldCurrentPage);
@@ -5111,6 +5114,17 @@ void PageItem::restoreWeldItems(SimpleState *state, bool isUndo)
 	m_Doc->regionsChanged()->update(QRectF());
 }
 
+void PageItem::restoreMarkString(SimpleState *state, bool isUndo)
+{
+	ScItemState< QPair<int,QString> > *is = dynamic_cast<ScItemState< QPair<int,QString> >*>(state);
+	ScText * hl = itemText.item(is->getItem().first);
+	Q_ASSERT(hl->hasMark());
+	if (isUndo)
+		hl->mark->setString(is->getItem().second);
+	else
+		hl->mark->setString(QString());
+}
+
 bool PageItem::checkGradientUndoRedo(SimpleState *ss, bool isUndo)
 {
 	if (ss->contains("SNAP_TO_PATCH"))
diff --git a/Scribus/scribus/pageitem.h b/Scribus/scribus/pageitem.h
index a454fb6..6b6460c 100644
--- a/Scribus/scribus/pageitem.h
+++ b/Scribus/scribus/pageitem.h
@@ -1449,6 +1449,7 @@ protected:
 
 	void restoreWeldItems(SimpleState *state, bool isUndo);
 	void restoreUnWeldItem(SimpleState *state, bool isUndo);
+	void restoreMarkString(SimpleState *state, bool isUndo);
 	
 	/*@}*/
 
diff --git a/Scribus/scribus/pageitem_textframe.cpp b/Scribus/scribus/pageitem_textframe.cpp
index d99f626..95aa5d6 100644
--- a/Scribus/scribus/pageitem_textframe.cpp
+++ b/Scribus/scribus/pageitem_textframe.cpp
@@ -35,12 +35,13 @@ for which a new license (GPL+exception) is in place.
 #include "canvas.h"
 #include "commonstrings.h"
 #include "hyphenator.h"
+#include "numeration.h"
 #include "marks.h"
 #include "notesstyles.h"
 #include "pageitem.h"
 #include "pageitem_group.h"
-#include "pageitem_noteframe.h"
 #include "pageitem_textframe.h"
+#include "pageitem_noteframe.h"
 #include "prefsmanager.h"
 #include "scpage.h"
 #include "scpainter.h"
@@ -1354,6 +1355,7 @@ void PageItem_TextFrame::layout()
 	QList<ParagraphStyle::TabRecord> tTabValues;
 	tTabValues.clear();
 	
+	bool BulNumMode = false; //when bullet or counter should be inserted
 	bool   DropCmode = false, FlopBaseline = false;
 	double desc=0, asce=0, realAsce=0, realDesc = 0, offset = 0;
 	double maxDY=0, maxDX=0;
@@ -1505,6 +1507,7 @@ void PageItem_TextFrame::layout()
 		itemText.blockSignals(true);
 		setMaxY(-1);
 		double maxYAsc = 0.0, maxYDesc = 0.0;
+		double autoLeftIndent = 0.0;
 
 		for (int a = firstInFrame(); a < itLen; ++a)
 		{
@@ -1570,17 +1573,78 @@ void PageItem_TextFrame::layout()
 					}
 				}
 			}
+			BulNumMode = false;
+			if (a==0 || itemText.text(a-1) == SpecialChars::PARSEP)
+			{
+				autoLeftIndent = 0.0;
+				style = itemText.paragraphStyle(a);
+				if (style.hasBullet() || style.hasNum())
+				{
+					BulNumMode = true;
+					if (hl->mark == NULL || !hl->mark->isType(MARKBullNumType))
+					{
+						BulNumMark* bnMark = new BulNumMark();
+						itemText.insertMark(bnMark,a);
+						a--;
+						itLen = itemText.length();
+						continue;
+					}
+					if (style.hasBullet())
+						hl->mark->setString(style.bulletStr());
+					else if (style.hasNum())
+					{
+						if (hl->mark->getString().isEmpty())
+						{
+							hl->mark->setString("?");
+							m_Doc->flag_Renumber = true;
+						}
+					}
+				}
+			}
+			if (!BulNumMode && hl->mark && hl->mark->isType(MARKBullNumType))
+			{
+				delete (BulNumMark*) hl->mark;
+				hl->mark = NULL;
+				itemText.removeChars(a,1);
+				a--;
+				itLen = itemText.length();
+				continue;
+			}
+			if (current.itemsInLine == 0)
+				opticalMargins = style.opticalMargins();
+			CharStyle charStyle = ((hl->ch != SpecialChars::PARSEP) ? itemText.charStyle(a) : style.charStyle());
 			chstr = ExpandToken(a);
 			int chstrLen = chstr.length();
 			if (chstr.isEmpty())
 				chstr = SpecialChars::ZWNBSPACE;
 
 			curStat = SpecialChars::getCJKAttr(hl->ch);
-			if (a > 0 && itemText.text(a-1) == SpecialChars::PARSEP)
-				style = itemText.paragraphStyle(a);
-			if (current.itemsInLine == 0)
-				opticalMargins = style.opticalMargins();
-			CharStyle charStyle = (hl->ch != SpecialChars::PARSEP? itemText.charStyle(a) : style.charStyle());
+
+			//set style for paragraph effects
+			if (a == 0 || itemText.text(a-1) == SpecialChars::PARSEP)
+			{
+				if (style.hasDropCap() || style.hasBullet() || style.hasNum())
+				{
+					const QString& curParent(style.hasParent() ? style.parent() : style.name());
+					CharStyle newStyle;
+					if (style.peCharStyleName() == tr("No Style") || style.peCharStyleName().isEmpty())
+						newStyle.setParent(m_Doc->paragraphStyle(curParent).charStyle().name());
+					else if (charStyle.name() != style.peCharStyleName())
+						newStyle.setParent(m_Doc->charStyle(style.peCharStyleName()).name());
+					newStyle.applyCharStyle(charStyle);
+					charStyle.setStyle(newStyle);
+					itemText.setCharStyle(a, 1 , charStyle);
+				}
+				else if (style.peCharStyleName() != tr("No Style") && !style.peCharStyleName().isEmpty())
+				//par effect is cleared but is set dcCharStyleName = clear drop cap char style
+				{
+					const QString& curParent(style.hasParent() ? style.parent() : style.name());
+					charStyle.eraseCharStyle(m_Doc->charStyle(style.peCharStyleName()));
+					charStyle.setParent(m_Doc->paragraphStyle(curParent).charStyle().name());
+					itemText.setCharStyle(a, 1,charStyle);
+				}
+			}
+
 			double hlcsize10 = charStyle.fontSize() / 10.0;
 			double scaleV = charStyle.scaleV() / 1000.0;
 			double scaleH = charStyle.scaleH() / 1000.0;
@@ -1603,31 +1667,6 @@ void PageItem_TextFrame::layout()
 						DropCmode = false;
 				}
 			}
-			if (a == 0 || itemText.text(a-1) == SpecialChars::PARSEP)
-			{
-				if (style.hasDropCap())
-				{
-					if (style.dcCharStyleName() == tr("No Style") || style.dcCharStyleName().isEmpty())
-					{
-						const QString& curParent(style.hasParent() ? style.parent() : style.name());
-						CharStyle newStyle;
-						newStyle.setParent(m_Doc->paragraphStyle(curParent).charStyle().name());
-						charStyle.setStyle(newStyle);
-					}
-					else if (charStyle.name() != style.dcCharStyleName())
-						charStyle.setStyle(m_Doc->charStyle(style.dcCharStyleName()));
-					itemText.setCharStyle(a, chstrLen ,charStyle);
-				}
-				else if (style.dcCharStyleName() != tr("No Style") && !style.dcCharStyleName().isEmpty())
-				//hasDropCap is cleared but is set dcCharStyleName = clear drop cap char style
-				{
-					const QString& curParent(style.hasParent() ? style.parent() : style.name());
-					CharStyle newStyle;
-					newStyle.setParent(m_Doc->paragraphStyle(curParent).charStyle().name());
-					charStyle.setStyle(newStyle);
-					itemText.setCharStyle(a, chstr.length(),charStyle);
-				}
-			}
 
 			const ScFace font = charStyle.font();
 
@@ -1703,7 +1742,7 @@ void PageItem_TextFrame::layout()
 			// find charsize factors
 			if (DropCmode)
 			{
-				DropCapDrop = calculateLineSpacing (style, this) * (DropLines - 1);
+//				DropCapDrop = calculateLineSpacing (style, this) * (DropLines - 1);
 
 				// FIXME : we should ensure that fonts are loaded before calls to layout()
 				// ScFace::realCharHeight()/Ascent() ensure font is loaded thanks to an indirect call to char2CMap()
@@ -1742,7 +1781,7 @@ void PageItem_TextFrame::layout()
 			// set StartOfLine (and find tracking?)
 			if (current.itemsInLine == 0)
 			{
-				itemText.item(a)->setEffects(itemText.item(a)->effects() | ScStyle_StartOfLine);
+				hl->setEffects(hl->effects() | ScStyle_StartOfLine);
 				kernVal = 0;
 			}
 			else
@@ -1752,6 +1791,7 @@ void PageItem_TextFrame::layout()
 			}
 			hl->glyph.yadvance = 0;
 			layoutGlyphs(*hl, chstr, hl->glyph);
+			
 			// find out width, ascent and descent of char
 			if (HasObject)
 			{
@@ -1765,9 +1805,9 @@ void PageItem_TextFrame::layout()
 				if (a+1 < itemText.length())
 				{
 					uint glyph2 = font.char2CMap(itemText.text(a+1));
-					double kern= font.glyphKerning(hl->glyph.glyph, glyph2, chs / 10.0) * hl->glyph.scaleH;
+					double kern= font.glyphKerning(hl->glyph.last()->glyph, glyph2, chs / 10.0) * hl->glyph.scaleH;
 					wide += kern;
-					hl->glyph.xadvance += kern;
+					hl->glyph.last()->xadvance += kern;
 					// change xadvance, xoffset according to JIS X4051
 					ScText *hl2 = itemText.item(a+1);
 					int nextStat = SpecialChars::getCJKAttr(hl2->ch);
@@ -1781,7 +1821,7 @@ void PageItem_TextFrame::layout()
 							case SpecialChars::CJK_NOTOP:
 								kern = wide / 4;
 								wide += kern;
-								hl->glyph.xadvance += kern;
+								hl->glyph.last()->xadvance += kern;
 							}
 						} else {	// next char is CJK, too
 							switch(curStat & SpecialChars::CJK_CHAR_MASK){
@@ -1794,7 +1834,7 @@ void PageItem_TextFrame::layout()
 								case SpecialChars::CJK_MIDPOINT:
 									kern = -wide / 2;
 									wide += kern;
-									hl->glyph.xadvance += kern;
+									hl->glyph.last()->xadvance += kern;
 								}
 								break;
 							case SpecialChars::CJK_COMMA:
@@ -1804,7 +1844,7 @@ void PageItem_TextFrame::layout()
 								case SpecialChars::CJK_FENCE_END:
 									kern = -wide / 2;
 									wide += kern;
-									hl->glyph.xadvance += kern;
+									hl->glyph.last()->xadvance += kern;
 								}
 								break;
 							case SpecialChars::CJK_MIDPOINT:
@@ -1812,7 +1852,7 @@ void PageItem_TextFrame::layout()
 								case SpecialChars::CJK_FENCE_BEGIN:
 									kern = -wide / 2;
 									wide += kern;
-									hl->glyph.xadvance += kern;
+									hl->glyph.last()->xadvance += kern;
 								}
 								break;
 							case SpecialChars::CJK_FENCE_BEGIN:
@@ -1825,8 +1865,8 @@ void PageItem_TextFrame::layout()
 								if(prevStat == SpecialChars::CJK_FENCE_BEGIN){
 									kern = -wide / 2;
 									wide += kern;
-									hl->glyph.xadvance += kern;
-									hl->glyph.xoffset += kern;
+									hl->glyph.last()->xadvance += kern;
+									hl->glyph.last()->xoffset += kern;
 								}
 								break;
 							}
@@ -1840,7 +1880,7 @@ void PageItem_TextFrame::layout()
 							case SpecialChars::CJK_NOTOP:
 								kern = hl2->glyph.wide() / 4;
 								wide += kern;
-								hl->glyph.xadvance += kern;
+								hl->glyph.last()->xadvance += kern;
 							}
 						}
 					}
@@ -1865,7 +1905,6 @@ void PageItem_TextFrame::layout()
 				{
 					double realCharHeight = 0.0;
 					wide = 0.0; realAsce = 0.0;
-					//
 					for (int i = 0; i < chstrLen; ++i)
 					{
 						realCharHeight = qMax(realCharHeight, font.realCharHeight(chstr[i], charStyle.fontSize() / 10.0));
@@ -1918,7 +1957,7 @@ void PageItem_TextFrame::layout()
 				else
 				{
 					asce = font.ascent(hlcsize10);
-					if (HasMark)
+					if (HasMark && !BulNumMode)
 						realAsce = asce * scaleV + offset;
 					else
 					{
@@ -1927,7 +1966,8 @@ void PageItem_TextFrame::layout()
 					}
 				}
 			}
-
+//			if (BulNumMode)
+//				hl->glyph.last()->xadvance += style.parEffectOffset();
 			//check for Y position at beginning of line
 			if (current.itemsInLine == 0 && !current.afterOverflow)
 			{
@@ -1986,21 +2026,33 @@ void PageItem_TextFrame::layout()
 				}
 				//set left indentation
 				current.leftIndent = 0.0;
-				if (current.addLeftIndent && (maxDX == 0 || DropCmode))
+				if (current.addLeftIndent && (maxDX == 0 || DropCmode || BulNumMode))
 				{
-					current.leftIndent = style.leftMargin();
-					if (current.hasDropCap)
-						current.leftIndent = 0;
+					current.leftIndent = style.leftMargin() + autoLeftIndent;
 					if (a==0 || (a > 0 && (itemText.text(a-1) == SpecialChars::PARSEP)))
+					{
 						current.leftIndent += style.firstIndent();
+						if (BulNumMode || DropCmode)
+						{
+							if(style.parEffectIndent())
+							{
+								current.leftIndent -= style.parEffectOffset() + wide;
+								if (current.leftIndent < 0.0)
+								{
+									autoLeftIndent = abs(current.leftIndent);
+									current.leftIndent = 0.0;
+								}
+							}
+						}
+					}
 					current.addLeftIndent = false;
 				}
 			}
 			current.recalculateY = true;
 			maxYAsc = 0.0, maxYDesc = 0.0;
+			double addAsce = 0.0;
 			if (current.startOfCol)
 			{
-				double addAsce;
 				if (DropCmode)
 					addAsce = qMax(realAsce, asce + offset);
 				else
@@ -2089,18 +2141,18 @@ void PageItem_TextFrame::layout()
 						lastLineY = maxYAsc;
 						if (current.startOfCol)
 						{
-							double addAsce;
-							if (DropCmode)
-								addAsce = qMax(realAsce, asce + offset);
-							else
-								addAsce = asce + offset;
-							if (style.lineSpacingMode() != ParagraphStyle::BaselineGridLineSpacing)
-							{
-								if (firstLineOffset() == FLOPRealGlyphHeight)
-									addAsce = realAsce;
-								else if (firstLineOffset() == FLOPLineSpacing)
-									addAsce = style.lineSpacing() + offset;
-							}
+//							double addAsce;
+//							if (DropCmode)
+//								addAsce = qMax(realAsce, asce + offset);
+//							else
+//								addAsce = asce + offset;
+//							if (style.lineSpacingMode() != ParagraphStyle::BaselineGridLineSpacing)
+//							{
+//								if (firstLineOffset() == FLOPRealGlyphHeight)
+//									addAsce = realAsce;
+//								else if (firstLineOffset() == FLOPLineSpacing)
+//									addAsce = style.lineSpacing() + offset;
+//							}
 							maxYAsc = current.yPos - addAsce;
 						}
 						else
@@ -2302,7 +2354,7 @@ void PageItem_TextFrame::layout()
 					current.rememberBreak(a, breakPos, style.rightMargin());
 				}
 			}
-			if  ((hl->ch == SpecialChars::OBJECT) && (hl->hasObject(m_Doc)))
+			if  (hl->hasObject(m_Doc))
 				current.rememberBreak(a, breakPos, style.rightMargin());
 			// CJK break
 			if(a > current.line.firstItem)
@@ -2560,21 +2612,23 @@ void PageItem_TextFrame::layout()
 					tabs.status = TabNONE;
 				}
 			}
-			
-			if (DropCmode && !outs)
+			if ((DropCmode || BulNumMode) && !outs)
 			{
-				DropCmode = false;
-				DropLinesCount = 0;
-				maxDY = current.yPos;
-				current.hasDropCap = true;
-				current.xPos += style.dropCapOffset();
-				hl->glyph.xadvance += style.dropCapOffset();
-				maxDX = current.xPos;
-				double spacing = calculateLineSpacing (style, this);
-				current.yPos -= spacing * (DropLines-1);
-				if (style.lineSpacingMode() == ParagraphStyle::BaselineGridLineSpacing)
-					current.yPos = adjustToBaselineGrid (current, this, OwnPage);
-				current.recalculateY = false;
+				current.xPos += style.parEffectOffset();
+				hl->glyph.last()->xadvance += style.parEffectOffset();
+				if (DropCmode)
+				{
+					DropCmode = false;
+					DropLinesCount = 0;
+					maxDY = current.yPos;
+					current.hasDropCap = true;
+					maxDX = current.xPos;
+					double spacing = calculateLineSpacing (style, this);
+					current.yPos -= spacing * (DropLines-1);
+					if (style.lineSpacingMode() == ParagraphStyle::BaselineGridLineSpacing)
+						current.yPos = adjustToBaselineGrid (current, this, OwnPage);
+					current.recalculateY = false;
+				}
 			}
 			// end of line
 			if (outs)
@@ -5062,7 +5116,7 @@ QString PageItem_TextFrame::infoDescription()
 	return QString();
 }
 
-bool PageItem_TextFrame::hasMark(NotesStyle *NS)
+bool PageItem_TextFrame::hasNoteMark(NotesStyle *NS)
 {
 	if (isNoteFrame())
 		return (asNoteFrame()->notesStyle() == NS);
@@ -5205,6 +5259,8 @@ Mark* PageItem_TextFrame::selectedMark(bool onlySelection)
 		{
 			if (omitNotes && (hl->mark->isType(MARKNoteMasterType) || hl->mark->isType(MARKNoteFrameType)))
 				continue;
+			if (hl->mark->isType(MARKBullNumType))
+				continue;
 			return hl->mark;
 		}
 	}
@@ -5457,12 +5513,14 @@ int PageItem_TextFrame::removeMarksFromText(bool doUndo)
 	Mark* mrk = selectedMark(true);
 	while (mrk != NULL)
 	{
-		Q_ASSERT(!mrk->isNoteType());
-		if (doUndo)
-			m_Doc->setUndoDelMark(mrk);
-		m_Doc->eraseMark(mrk, true, this);
+		if (!mrk->isType(MARKBullNumType))
+		{
+			if (doUndo)
+				m_Doc->setUndoDelMark(mrk);
+			m_Doc->eraseMark(mrk, true, this);
+			++num;
+		}
 		mrk = selectedMark(true);
-		++num;
 	}
 	return num;
 }
diff --git a/Scribus/scribus/pageitem_textframe.h b/Scribus/scribus/pageitem_textframe.h
index 8f0b454..e93ef94 100644
--- a/Scribus/scribus/pageitem_textframe.h
+++ b/Scribus/scribus/pageitem_textframe.h
@@ -139,7 +139,7 @@ private slots:
 
 public:
 	//for footnotes/endnotes
-	bool hasMark(NotesStyle* NS = NULL);
+	bool hasNoteMark(NotesStyle* NS = NULL);
 	bool hasNoteFrame(NotesStyle* NS, bool inChain = false);
 	//bool hasNoteFrame(PageItem_NoteFrame* nF) { return m_notesFramesMap.contains(nF); }
 	void delAllNoteFrames(bool doUpdate = false);
diff --git a/Scribus/scribus/pagestructs.h b/Scribus/scribus/pagestructs.h
index 74571ed..2cf2a96 100644
--- a/Scribus/scribus/pagestructs.h
+++ b/Scribus/scribus/pagestructs.h
@@ -10,6 +10,7 @@ for which a new license (GPL+exception) is in place.
 #include <QMap>
 #include <QList>
 #include <QString>
+#include "numeration.h"
 
 struct ObjectAttribute 
 {
@@ -40,27 +41,13 @@ struct ToCSetup
 
 typedef QList<ToCSetup> ToCSetupVector;
 
-
-typedef enum 
-{
-	Type_1_2_3,
-	Type_i_ii_iii,
-	Type_I_II_III,
-	Type_a_b_c,
-	Type_A_B_C,
-	Type_asterix,
-	Type_None=99
-} DocumentSectionType;
-
-typedef DocumentSectionType NumerationType;
-
 struct DocumentSection
 {
 	uint number; //Just an index in the section list
 	QString name; //User defined name for the section
 	uint fromindex; //First page _index_ of the section in the document (old page number)
 	uint toindex; //Last page _index_ of the section in the document (old page number)
-	DocumentSectionType type; //Type of section numbering, ie i,ii,iii or a,b,c or 1,2,3, etc
+	NumFormat type; //Type of section numbering, ie i,ii,iii or a,b,c or 1,2,3, etc
 	uint sectionstartindex; // Start of section, an index in the range of type, eg for type i,ii,iii, this would be 2 for "ii".
 	bool reversed; // Counting 10-1 ?
 	bool active; // Is the section active, ie, if the fromindex is 10, and theres 5 pages, this should be inactive.
diff --git a/Scribus/scribus/plugins/fileloader/scribus12format/scribus12format.cpp b/Scribus/scribus/plugins/fileloader/scribus12format/scribus12format.cpp
index bf54f9f..d744b61 100644
--- a/Scribus/scribus/plugins/fileloader/scribus12format/scribus12format.cpp
+++ b/Scribus/scribus/plugins/fileloader/scribus12format/scribus12format.cpp
@@ -2218,7 +2218,7 @@ void Scribus12Format::GetStyle(QDomElement *pg, ParagraphStyle *vg, StyleSet<Par
 	vg->charStyle().setFontSize(qRound(ScCLocale::toDoubleC(pg->attribute("FONTSIZE"), 12.0) * 10.0));
 	vg->setHasDropCap(static_cast<bool>(pg->attribute("DROP", "0").toInt()));
 	vg->setDropCapLines(pg->attribute("DROPLIN", "2").toInt());
-	vg->setDropCapOffset(ScCLocale::toDoubleC(pg->attribute("DROPDIST"), 0.0));
+	vg->setParEffectOffset(ScCLocale::toDoubleC(pg->attribute("DROPDIST"), 0.0));
 	vg->charStyle().setFeatures(static_cast<StyleFlag>((pg->attribute("EFFECT", "0").toInt())).featureList());
 	fColor = pg->attribute("FCOLOR", doc->itemToolPrefs().shapeFillColor);
 	fShade = pg->attribute("FSHADE", "100").toInt();
diff --git a/Scribus/scribus/plugins/fileloader/scribus134format/scribus134format.cpp b/Scribus/scribus/plugins/fileloader/scribus134format/scribus134format.cpp
index a247929..3302078 100644
--- a/Scribus/scribus/plugins/fileloader/scribus134format/scribus134format.cpp
+++ b/Scribus/scribus/plugins/fileloader/scribus134format/scribus134format.cpp
@@ -818,8 +818,8 @@ namespace {
 			pstyle.resetGapAfter();
 		if (pstyle.dropCapLines() < 0)
 			pstyle.resetDropCapLines();
-		if (pstyle.dropCapOffset() <= -16000)
-			pstyle.resetDropCapOffset();
+		if (pstyle.parEffectOffset() <= -16000)
+			pstyle.resetParEffectOffset();
 		fixLegacyCharStyle(pstyle.charStyle());
 	}
 	
@@ -1329,7 +1329,7 @@ void Scribus134Format::readParagraphStyle(ScribusDoc *doc, ScXmlStreamReader& re
 
 	static const QString DROPDIST("DROPDIST");
 	if (attrs.hasAttribute(DROPDIST))
-		newStyle.setDropCapOffset(attrs.valueAsDouble(DROPDIST));
+		newStyle.setParEffectOffset(attrs.valueAsDouble(DROPDIST));
 
 	static const QString PSHORTCUT("PSHORTCUT");
 	if (attrs.hasAttribute(PSHORTCUT))
diff --git a/Scribus/scribus/plugins/fileloader/scribus13format/scribus13format.cpp b/Scribus/scribus/plugins/fileloader/scribus13format/scribus13format.cpp
index 0c35740..8e98c95 100644
--- a/Scribus/scribus/plugins/fileloader/scribus13format/scribus13format.cpp
+++ b/Scribus/scribus/plugins/fileloader/scribus13format/scribus13format.cpp
@@ -1173,7 +1173,7 @@ bool Scribus13Format::loadFile(const QString & fileName, const FileFormat & /* f
 	if (m_Doc->autoSave() && ScCore->usingGUI())
 		m_Doc->restartAutoSaveTimer();
 //		m_Doc->autoSaveTimer->start(m_Doc->autoSaveTime());
-	
+
 	if (m_mwProgressBar!=0)
 		m_mwProgressBar->setValue(DOC.childNodes().count());
 
@@ -1384,7 +1384,7 @@ void Scribus13Format::readParagraphStyle(ParagraphStyle& vg, const QDomElement&
 	vg.charStyle().setFontSize(qRound(ScCLocale::toDoubleC(pg.attribute("FONTSIZE"), 12.0) * 10.0));
 	vg.setHasDropCap(static_cast<bool>(pg.attribute("DROP", "0").toInt()));
 	vg.setDropCapLines(pg.attribute("DROPLIN", "2").toInt());
-	vg.setDropCapOffset(ScCLocale::toDoubleC(pg.attribute("DROPDIST"), 0.0));
+	vg.setParEffectOffset(ScCLocale::toDoubleC(pg.attribute("DROPDIST"), 0.0));
 	vg.charStyle().setFeatures(static_cast<StyleFlag>(pg.attribute("EFFECT", "0").toInt()).featureList());
 	QString fColor = pg.attribute("FCOLOR", doc->itemToolPrefs().shapeFillColor);
 	int fShade = pg.attribute("FSHADE", "100").toInt();
diff --git a/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp b/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
index 2dd2faa..c2f154b 100644
--- a/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
+++ b/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format.cpp
@@ -1890,9 +1890,9 @@ bool Scribus150Format::loadFile(const QString & fileName, const FileFormat & /*
 	}
 
 	// start auto save timer if needed
-	if (m_Doc->autoSave()  && ScCore->usingGUI())
+	if (m_Doc->autoSave() && ScCore->usingGUI())
 		m_Doc->restartAutoSaveTimer();
-//		m_Doc->autoSaveTimer->start(m_Doc->autoSaveTime());
+//	m_Doc->autoSaveTimer->start(m_Doc->autoSaveTime());
 	
 	if (m_mwProgressBar!=0)
 		m_mwProgressBar->setValue(reader.characterOffset());
@@ -1981,8 +1981,8 @@ namespace {
 			pstyle.resetGapAfter();
 		if (pstyle.dropCapLines() < 0)
 			pstyle.resetDropCapLines();
-		if (pstyle.dropCapOffset() <= -16000)
-			pstyle.resetDropCapOffset();
+		if (pstyle.parEffectOffset() <= -16000)
+			pstyle.resetParEffectOffset();
 		fixLegacyCharStyle(pstyle.charStyle());
 	}
 	
@@ -2560,13 +2560,25 @@ void Scribus150Format::readParagraphStyle(ScribusDoc *doc, ScXmlStreamReader& re
 	if (attrs.hasAttribute(NACH))
 		newStyle.setGapAfter(attrs.valueAsDouble(NACH));
 
+	static const QString PECHSTYLE("PECHSTYLE");
+	if (attrs.hasAttribute(PECHSTYLE))
+		newStyle.setPeCharStyleName(attrs.valueAsString(PECHSTYLE));
+
+	static const QString PEDIST("PEDIST");
+	if (attrs.hasAttribute(PEDIST))
+		newStyle.setParEffectOffset(attrs.valueAsDouble(PEDIST));
+
+	static const QString PEINDENT("PEINDENT");
+	if (attrs.hasAttribute(PEINDENT))
+		newStyle.setParEffectIndent(attrs.valueAsDouble(PEINDENT));
+
 	static const QString DROP("DROP");
 	if (attrs.hasAttribute(DROP))
 		newStyle.setHasDropCap(static_cast<bool>(attrs.valueAsInt(DROP)));
 
 	static const QString DROPCHSTYLE("DROPCHSTYLE");
 	if (attrs.hasAttribute(DROPCHSTYLE))
-		newStyle.setDcCharStyleName(attrs.valueAsString(DROPCHSTYLE));
+		newStyle.setPeCharStyleName(attrs.valueAsString(DROPCHSTYLE));
 
 	static const QString DROPLIN("DROPLIN");
 	if (attrs.hasAttribute(DROPLIN))
@@ -2574,7 +2586,55 @@ void Scribus150Format::readParagraphStyle(ScribusDoc *doc, ScXmlStreamReader& re
 
 	static const QString DROPDIST("DROPDIST");
 	if (attrs.hasAttribute(DROPDIST))
-		newStyle.setDropCapOffset(attrs.valueAsDouble(DROPDIST));
+		newStyle.setParEffectOffset(attrs.valueAsDouble(DROPDIST));
+
+	static const QString BULLET("BULLET");
+	if (attrs.hasAttribute(BULLET))
+		newStyle.setHasBullet(static_cast<bool>(attrs.valueAsInt(BULLET)));
+
+	static const QString BULLETSTR("BULLETSTR");
+	if (attrs.hasAttribute(BULLETSTR))
+		newStyle.setBulletStr(attrs.valueAsString(BULLETSTR));
+
+	static const QString NUMERATION("NUMERATION");
+	if (attrs.hasAttribute(NUMERATION))
+		newStyle.setHasNum(static_cast<bool>(attrs.valueAsInt(NUMERATION)));
+
+	static const QString NUMNAME("NUMNAME");
+	if (attrs.hasAttribute(NUMNAME))
+		newStyle.setNumName(attrs.valueAsString(NUMNAME));
+
+	static const QString NUMFORMAT("NUMFORMAT");
+	if (attrs.hasAttribute(NUMFORMAT))
+		newStyle.setNumFormat(attrs.valueAsInt(NUMFORMAT));
+
+	static const QString NUMLEVEL("NUMLEVEL");
+	if (attrs.hasAttribute(NUMLEVEL))
+		newStyle.setNumLevel(attrs.valueAsInt(NUMLEVEL));
+
+	static const QString NUMSTART("NUMSTART");
+	if (attrs.hasAttribute(NUMSTART))
+		newStyle.setNumStart(attrs.valueAsInt(NUMSTART));
+
+	static const QString NUMPREFIX("NUMPREFIX");
+	if (attrs.hasAttribute(NUMPREFIX))
+		newStyle.setNumPrefix(attrs.valueAsString(NUMPREFIX));
+
+	static const QString NUMSUFFIX("NUMSUFFIX");
+	if (attrs.hasAttribute(NUMSUFFIX))
+		newStyle.setNumSuffix(attrs.valueAsString(NUMSUFFIX));
+
+	static const QString NUMRESTART("NUMRESTART");
+	if (attrs.hasAttribute(NUMRESTART))
+		newStyle.setNumRestart(attrs.valueAsInt(NUMRESTART));
+
+	static const QString NUMOTHER("NUMOTHER");
+	if (attrs.hasAttribute(NUMOTHER))
+		newStyle.setNumOther(static_cast<bool>(attrs.valueAsInt(NUMOTHER)));
+
+	static const QString NUMHIGHER("NUMHIGHER");
+	if (attrs.hasAttribute(NUMHIGHER))
+		newStyle.setNumHigher(static_cast<bool>(attrs.valueAsInt(NUMHIGHER)));
 
 	static const QString PSHORTCUT("PSHORTCUT");
 	if (attrs.hasAttribute(PSHORTCUT))
diff --git a/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp b/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
index 003672a..d115783 100644
--- a/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
+++ b/Scribus/scribus/plugins/fileloader/scribus150format/scribus150format_save.cpp
@@ -639,14 +639,40 @@ void Scribus150Format::putPStyle(ScXmlStreamWriter & docu, const ParagraphStyle
 		docu.writeAttribute("VOR", style.gapBefore());
 	if ( ! style.isInhGapAfter())
 		docu.writeAttribute("NACH", style.gapAfter());
+	if ( ! style.isInhPeCharStyleName())
+		docu.writeAttribute("PECHSTYLE", style.peCharStyleName());
+	if ( ! style.isInhParEffectOffset())
+		docu.writeAttribute("PEDIST", style.parEffectOffset());
+	if ( ! style.isInhParEffectIndent())
+		docu.writeAttribute("PEINDENT", static_cast<int>(style.parEffectIndent()));
 	if ( ! style.isInhHasDropCap())
 		docu.writeAttribute("DROP", static_cast<int>(style.hasDropCap()));
-	if ( ! style.isInhDcCharStyleName())
-		docu.writeAttribute("DROPCHSTYLE", style.dcCharStyleName());
 	if ( ! style.isInhDropCapLines())
 		docu.writeAttribute("DROPLIN", style.dropCapLines());
-	if ( ! style.isInhDropCapOffset())
-		docu.writeAttribute("DROPDIST", style.dropCapOffset());
+	if ( ! style.isInhHasBullet())
+		docu.writeAttribute("BULLET", static_cast<int>(style.hasBullet()));
+	if ( ! style.isInhBulletStr())
+		docu.writeAttribute("BULLETSTR", style.bulletStr());
+	if ( ! style.isInhHasNum())
+		docu.writeAttribute("NUMERATION", static_cast<int>(style.hasNum()));
+	if ( ! style.isInhNumFormat())
+		docu.writeAttribute("NUMFORMAT", style.numFormat());
+	if ( ! style.isInhNumName())
+		docu.writeAttribute("NUMNAME", style.numName());
+	if ( ! style.isInhNumLevel())
+		docu.writeAttribute("NUMLEVEL", style.numLevel());
+	if ( ! style.isInhNumPrefix())
+		docu.writeAttribute("NUMPREFIX", style.numPrefix());
+	if ( ! style.isInhNumSuffix())
+		docu.writeAttribute("NUMSUFFIX", style.numSuffix());
+	if ( ! style.isInhNumStart())
+		docu.writeAttribute("NUMSTART", style.numStart());
+	if ( ! style.isInhNumRestart())
+		docu.writeAttribute("NUMRESTART", style.numRestart());
+	if ( ! style.isInhNumOther())
+		docu.writeAttribute("NUMOTHER", static_cast<int>(style.numOther()));
+	if ( ! style.isInhNumHigher())
+		docu.writeAttribute("NUMHIGHER", static_cast<int>(style.numHigher()));
 	if ( ! style.isInhOpticalMargins())
 		docu.writeAttribute("OpticalMargins", style.opticalMargins());
 	if ( ! style.isInhHyphenationMode())
@@ -1566,9 +1592,12 @@ void Scribus150Format::writeITEXTs(ScribusDoc *doc, ScXmlStreamWriter &docu, Pag
 		else if (ch == SpecialChars::OBJECT && item->itemText.item(k)->mark != NULL)
 		{
 			Mark* mark = item->itemText.item(k)->mark;
-			docu.writeEmptyElement("MARK");
-			docu.writeAttribute("label", mark->label);
-			docu.writeAttribute("type", mark->getType());
+			if (!mark->isType(MARKBullNumType))
+			{ //dont save marks for bullets and numbering
+				docu.writeEmptyElement("MARK");
+				docu.writeAttribute("label", mark->label);
+				docu.writeAttribute("type", mark->getType());
+			}
 		}
 		else if (ch == SpecialChars::PARSEP)	// stores also the paragraphstyle for preceding chars
 			putPStyle(docu, item->itemText.paragraphStyle(k), "para");
diff --git a/Scribus/scribus/plugins/gettext/odtim/contentreader.cpp b/Scribus/scribus/plugins/gettext/odtim/contentreader.cpp
index 65b675a..a6ff041 100644
--- a/Scribus/scribus/plugins/gettext/odtim/contentreader.cpp
+++ b/Scribus/scribus/plugins/gettext/odtim/contentreader.cpp
@@ -130,7 +130,7 @@ bool ContentReader::startElement(const QString&, const QString&, const QString &
 		if (currentListStyle)
 		{
 			currentListStyle->advance();
-			write(currentListStyle->bullet());
+			//write(currentListStyle->bullet());
 		}
 	}
 	else if (name == "office:annotation")
diff --git a/Scribus/scribus/plugins/gettext/odtim/stylereader.cpp b/Scribus/scribus/plugins/gettext/odtim/stylereader.cpp
index 6c2ea96..d9a0866 100644
--- a/Scribus/scribus/plugins/gettext/odtim/stylereader.cpp
+++ b/Scribus/scribus/plugins/gettext/odtim/stylereader.cpp
@@ -167,6 +167,16 @@ StyleReader::StyleReader(QString documentName, gtWriter *w,
 		ListLevel *llevel = new ListLevel(ulevel, bstyle, prefix, suffix, bullet, displayLevels, startAt);
 		currentListStyle->addLevel(ulevel, llevel);
  		readProperties = true;
+
+		gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
+		assert(s != NULL);
+		if (bstyle == Bullet || bstyle == Graphic)
+			s->setBullet(true);
+		else
+		{
+			Q_ASSERT(((int) bstyle > 0) && ((int) bstyle < 6));
+			s->setNum(true, (int) bstyle -1, 0, startAt+1, prefix, suffix);
+		}
  	}
  	else if ((name == "style:drop-cap") && (readProperties))
  	{
@@ -498,6 +508,18 @@ StyleReader::StyleReader(QString documentName, gtWriter *w,
  			  (name == "text:list-level-style-number") ||
 			  (name == "text:list-level-style-image")) && (currentStyle != NULL))
  	{
+//		if ((name == "text:list-level-style-bullet"))
+//		{
+//			gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
+//			if (s)
+//				s->setBullet(true);
+//		}
+//		else if ((name == "text:list-level-style-number"))
+//		{
+//			gtParagraphStyle* s = dynamic_cast<gtParagraphStyle*>(currentStyle);
+//			if (s)
+//				s->setNum(true);
+//		}
  		setStyle(currentStyle->getName(), currentStyle);
  		currentStyle = NULL;
  		parentStyle = NULL;
@@ -572,6 +594,7 @@ StyleReader::StyleReader(QString documentName, gtWriter *w,
  		nameByAttrs += QString("%1-").arg(s->getFirstLineIndent());
  		nameByAttrs += QString("%1-").arg(s->getAlignment());
  		nameByAttrs += QString("%1-").arg(s->hasDropCap());
+		nameByAttrs += QString("%1-").arg(s->hasBullet());
  		nameByAttrs += QString("%1-").arg(s->getFont()->getColor());
  		nameByAttrs += QString("%1-").arg(s->getFont()->getStrokeColor());
 // TODO is this important ??
diff --git a/Scribus/scribus/plugins/gettext/xtgim/xtgscanner.cpp b/Scribus/scribus/plugins/gettext/xtgim/xtgscanner.cpp
index 35d1ee6..c5748f2 100755
--- a/Scribus/scribus/plugins/gettext/xtgim/xtgscanner.cpp
+++ b/Scribus/scribus/plugins/gettext/xtgim/xtgscanner.cpp
@@ -731,7 +731,7 @@ void XtgScanner::setDropCap()
 		{
 			flushText();
 			currentParagraphStyle.setDropCapLines(lineCount);
-			currentParagraphStyle.setDropCapOffset(charCount);
+			currentParagraphStyle.setParEffectOffset(charCount);
 			currentParagraphStyle.setHasDropCap(true);
 			writer->setStyle(currentParagraphStyle);
 			currentParagraphStyle = writer->getCurrentStyle();
@@ -741,7 +741,7 @@ void XtgScanner::setDropCap()
 		if (define == 2)
 		{
 			defParagraphStyle.setDropCapLines(lineCount);
-			defParagraphStyle.setDropCapOffset(charCount);
+			defParagraphStyle.setParEffectOffset(charCount);
 			defParagraphStyle.setHasDropCap(true);
 		}
 	}
diff --git a/Scribus/scribus/plugins/scriptplugin/cmdstyle.cpp b/Scribus/scribus/plugins/scriptplugin/cmdstyle.cpp
index 1152d68..fc1967b 100644
--- a/Scribus/scribus/plugins/scriptplugin/cmdstyle.cpp
+++ b/Scribus/scribus/plugins/scriptplugin/cmdstyle.cpp
@@ -22,6 +22,7 @@ for which a new license (GPL+exception) is in place.
 			Special thanks go to avox for helping me! */
 PyObject *scribus_createparagraphstyle(PyObject* /* self */, PyObject* args, PyObject* keywords)
 {
+	//TODO - new paragraph properties for bullets and numbering
 	char* keywordargs[] = {
 			const_cast<char*>("name"),
 			const_cast<char*>("linespacingmode"),
@@ -40,11 +41,11 @@ PyObject *scribus_createparagraphstyle(PyObject* /* self */, PyObject* args, PyO
 	char *Name = const_cast<char*>(""), *CharStyle = const_cast<char*>("");
 	int LineSpacingMode = 0, Alignment = 0, DropCapLines = 2, HasDropCap = 0;
 	double LineSpacing = 15.0, LeftMargin = 0.0, RightMargin = 0.0;
-	double GapBefore = 0.0, GapAfter = 0.0, FirstIndent = 0.0, DropCapOffset = 0;
+	double GapBefore = 0.0, GapAfter = 0.0, FirstIndent = 0.0, PEOffset = 0;
 	if (!PyArg_ParseTupleAndKeywords(args, keywords, "es|ididddddiides",
 		 keywordargs, "utf-8", &Name, &LineSpacingMode, &LineSpacing, &Alignment,
 		&LeftMargin, &RightMargin, &GapBefore, &GapAfter, &FirstIndent,
-		&HasDropCap, &DropCapLines, &DropCapOffset, "utf-8", &CharStyle))
+		&HasDropCap, &DropCapLines, &PEOffset, "utf-8", &CharStyle))
 		return NULL;
 	if(!checkHaveDocument())
 		return NULL;
@@ -74,7 +75,7 @@ PyObject *scribus_createparagraphstyle(PyObject* /* self */, PyObject* args, PyO
 		return NULL;
 	}
 	TmpParagraphStyle.setDropCapLines(DropCapLines);
-	TmpParagraphStyle.setDropCapOffset(DropCapOffset);
+	TmpParagraphStyle.setParEffectOffset(PEOffset);
 	TmpParagraphStyle.charStyle().setParent(CharStyle);
 
 	StyleSet<ParagraphStyle> TmpStyleSet;
diff --git a/Scribus/scribus/sampleitem.cpp b/Scribus/scribus/sampleitem.cpp
index d56287f..9ae10dd 100644
--- a/Scribus/scribus/sampleitem.cpp
+++ b/Scribus/scribus/sampleitem.cpp
@@ -47,8 +47,10 @@ SampleItem::SampleItem() : QObject()
 	tmpStyle.charStyle().setFontSize(m_Doc->itemToolPrefs().textSize);
 //	tmpStyle.tabValues().clear();
 	tmpStyle.setHasDropCap(false);
+	tmpStyle.setHasBullet(false);
+	tmpStyle.setHasNum(false);
 	tmpStyle.setDropCapLines(0);//2;
-	tmpStyle.setDropCapOffset(0);
+	tmpStyle.setParEffectOffset(0);
 	tmpStyle.charStyle().setFeatures(QStringList(CharStyle::INHERIT));
 	tmpStyle.charStyle().setFillColor("__blackforpreview__");
 	tmpStyle.charStyle().setFillShade(100); //m_Doc->toolSettings.dShade;
@@ -178,9 +180,19 @@ void SampleItem::setDropLin(int dropLin)
 	tmpStyle.setDropCapLines(dropLin);
 }
 
-void SampleItem::setDropDist(double dropDist)
+void SampleItem::setParEffectDist(double dist)
 {
-	tmpStyle.setDropCapOffset(dropDist);
+	tmpStyle.setParEffectOffset(dist);
+}
+
+void SampleItem::setBullet(bool bul)
+{
+	tmpStyle.setHasBullet(bul);
+}
+
+void SampleItem::setNum(bool num)
+{
+	tmpStyle.setHasNum(num);
 }
 
 void SampleItem::setFontEffect(int fontEffect)
diff --git a/Scribus/scribus/sampleitem.h b/Scribus/scribus/sampleitem.h
index 18a15a2..bbcd552 100644
--- a/Scribus/scribus/sampleitem.h
+++ b/Scribus/scribus/sampleitem.h
@@ -67,8 +67,10 @@ class SCRIBUS_API SampleItem : QObject
 		void setFontSize(int fontSize, bool autoLineSpa=false);
 		//void setTabValues(QValueList<PageItem::TabRecord> tabValues);
 		void setDrop(bool drop);
+		void setBullet(bool bul);
+		void setNum(bool num);
 		void setDropLin(int dropLin);
-		void setDropDist(double dropDist);
+		void setParEffectDist(double dropDist);
 		void setFontEffect(int fontEffect);
 		void setFColor(QString fColor);
 		void setFShade(int fShade);
diff --git a/Scribus/scribus/scribus.cpp b/Scribus/scribus/scribus.cpp
index 511d994..c2758c6 100644
--- a/Scribus/scribus/scribus.cpp
+++ b/Scribus/scribus/scribus.cpp
@@ -105,9 +105,9 @@ for which a new license (GPL+exception) is in place.
 #include "pageitem_group.h"
 #include "pageitem_imageframe.h"
 #include "pageitem_latexframe.h"
-#include "pageitem_noteframe.h"
 #include "pageitem_table.h"
 #include "pageitem_textframe.h"
+#include "pageitem_noteframe.h"
 #include "pagesize.h"
 #include "pdflib.h"
 #include "pdfoptions.h"
@@ -1081,6 +1081,7 @@ void ScribusMainWindow::initMenuBar()
 	scrMenuMgr->addMenuItem(scrActions["extrasHyphenateText"], "Extras", false);
 	scrMenuMgr->addMenuItem(scrActions["extrasDeHyphenateText"], "Extras", false);
 	scrMenuMgr->addMenuItem(scrActions["extrasGenerateTableOfContents"], "Extras", false);
+	scrMenuMgr->addMenuItem(scrActions["extrasUpdateDocument"], "Extras", false);
 	connect(scrMenuMgr->getLocalPopupMenu("Extras"), SIGNAL(aboutToShow()), this, SLOT(extrasMenuAboutToShow()));
 
 	//Window menu
@@ -1697,7 +1698,7 @@ void ScribusMainWindow::keyPressEvent(QKeyEvent *k)
 					currItem->handleModeEditKey(k, keyrep);
 				}
 //FIXME:av		view->oldCp = currItem->CPos;
-				if (currItem->itemType() == PageItem::TextFrame)
+				if (currItem->isTextFrame())
 				{
 					bool kr=keyrep;
 					view->canvasMode()->keyPressEvent(k); //Hack for 1.4.x for stopping the cursor blinking while moving about
@@ -1712,7 +1713,8 @@ void ScribusMainWindow::keyPressEvent(QKeyEvent *k)
 					}
 					keyrep=kr;
 				}
-				slotDocCh(false);
+				if (!currItem->isTextFrame() || (currItem->isAutoNoteFrame() && currItem->asNoteFrame()->notesList().isEmpty()))
+					slotDocCh(false);
 				doc->regionsChanged()->update(QRectF());
 			}
 		}
@@ -2353,6 +2355,7 @@ void ScribusMainWindow::newActWin(QMdiSubWindow *w)
 	scrActions["viewShowRulers"]->setChecked(doc->guidesPrefs().rulersShown);
 	scrActions["viewRulerMode"]->setChecked(doc->guidesPrefs().rulerMode);
 	scrActions["extrasGenerateTableOfContents"]->setEnabled(doc->hasTOCSetup());
+	scrActions["extrasUpdateDocument"]->setEnabled(true);
 	if (!doc->masterPageMode())
 		pagePalette->Rebuild();
 	outlinePalette->setDoc(doc);
@@ -3435,6 +3438,12 @@ void ScribusMainWindow::slotDocCh(bool /*reb*/)
 		Q_ASSERT(plugin); // all the returned names should represent loaded plugins
 		plugin->changedDoc(doc);
 	}
+	while (doc->flag_Renumber)
+	{
+		doc->updateNumbers();
+		if (!doc->flag_Renumber)
+			doc->regionsChanged()->update(QRect());
+	}
 	if (m_marksCount != doc->marksList().count() || doc->notesChanged() || doc->flag_updateEndNotes || doc->flag_updateMarksLabels)
 	{
 		bool sendUpdateReqest = false;
@@ -4268,6 +4277,7 @@ bool ScribusMainWindow::loadDoc(QString fileName)
 		/*QTime t;
 		t.start();*/
 		int docItemsCount=doc->Items->count();
+		doc->flag_Renumber = false;
 		for (int azz=0; azz<docItemsCount; ++azz)
 		{
 			PageItem *ite = doc->Items->at(azz);
@@ -4303,6 +4313,7 @@ bool ScribusMainWindow::loadDoc(QString fileName)
 //		if (fileLoader->fileType() > FORMATID_NATIVEIMPORTEND)
 //			scrActions["fileSave"]->setEnabled(false);
 		delete fileLoader;
+		doc->updateNumbers(true);
 		view->updatesOn(true);
 		w->setUpdatesEnabled(true);
 		disconnect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(newActWin(QMdiSubWindow *)));
@@ -4421,6 +4432,8 @@ void ScribusMainWindow::slotGetContent()
 				if (doc->Items->at(a)->isBookmark)
 					bookmarkPalette->BView->ChangeText(doc->Items->at(a));
 			}
+			if (!impsetup.textOnly)
+				doc->setupNumerations();
 			view->DrawNew();
 			slotDocCh();
 			styleManager->setDoc(doc);
@@ -8075,6 +8088,7 @@ void ScribusMainWindow::slotDocSetup()
 		scrActions["viewShowRulers"]->setChecked(doc->guidesPrefs().rulersShown);
 		scrActions["viewRulerMode"]->setChecked(doc->guidesPrefs().rulerMode);
 		scrActions["extrasGenerateTableOfContents"]->setEnabled(doc->hasTOCSetup());
+		scrActions["extrasUpdateDocument"]->setEnabled(true);
 		view->cmsToolbarButton->setChecked(doc->HasCMS);
 		//doc emits changed() via this
 		doc->setMasterPageMode(true);
@@ -9939,6 +9953,16 @@ void ScribusMainWindow::generateTableOfContents()
 		tocGenerator->generateDefault();
 }
 
+void ScribusMainWindow::updateDocument()
+{
+	if (HaveDoc)
+	{
+		doc->updateNumbers(true);
+		doc->updateMarks(true);
+		doc->regionsChanged()->update(QRect());
+	}
+}
+
 void ScribusMainWindow::insertSampleText()
 {
 	LoremManager m(doc, this);
diff --git a/Scribus/scribus/scribus.h b/Scribus/scribus/scribus.h
index aea92ea..c08d13f 100644
--- a/Scribus/scribus/scribus.h
+++ b/Scribus/scribus/scribus.h
@@ -448,6 +448,7 @@ public slots:
 	void objectAttributes();
 	void getImageInfo();
 	void generateTableOfContents();
+	void updateDocument();
 
 //	void saveStyles(StilFormate *dia); //still required for style save from SE
 	void setNewAlignment(int a);
diff --git a/Scribus/scribus/scribusdoc.cpp b/Scribus/scribus/scribusdoc.cpp
index b7c16b5..8c5ce68 100644
--- a/Scribus/scribus/scribusdoc.cpp
+++ b/Scribus/scribus/scribusdoc.cpp
@@ -54,6 +54,7 @@ for which a new license (GPL+exception) is in place.
 #include "ui/inserttablecolumnsdialog.h"
 #include "ui/inserttablerowsdialog.h"
 #include "notesstyles.h"
+#include "numeration.h"
 #include "ui/notesstyleseditor.h"
 #include "pageitem.h"
 #include "pageitem_imageframe.h"
@@ -276,7 +277,8 @@ ScribusDoc::ScribusDoc() : UndoObject( tr("Document")), Observable<ScribusDoc>(N
 	flag_restartMarksRenumbering(false),
 	flag_updateMarksLabels(false),
 	flag_updateEndNotes(false),
-	flag_layoutNotesFrames(true)
+	flag_layoutNotesFrames(true),
+	flag_Renumber(false)
 {
 	docUnitRatio=unitGetRatioFromIndex(docPrefsData.docSetupPrefs.docUnitIndex);
 	docPrefsData.docSetupPrefs.pageHeight=0;
@@ -379,7 +381,8 @@ ScribusDoc::ScribusDoc(const QString& docName, int unitindex, const PageSize& pa
 	flag_restartMarksRenumbering(false),
 	flag_updateMarksLabels(false),
 	flag_updateEndNotes(false),
-	flag_layoutNotesFrames(true)
+	flag_layoutNotesFrames(true),
+	flag_Renumber(false)
 {
 	docPrefsData.docSetupPrefs.docUnitIndex=unitindex;
 	docPrefsData.docSetupPrefs.pageHeight=pagesize.height();
@@ -487,8 +490,10 @@ void ScribusDoc::init()
 	pstyle.setGapBefore(0);
 	pstyle.setGapAfter(0);
 	pstyle.setHasDropCap(false);
+	pstyle.setHasBullet(false);
+	pstyle.setHasNum(false);
 	pstyle.setDropCapLines(2);
-	pstyle.setDropCapOffset(0);
+	pstyle.setParEffectOffset(0);
 	pstyle.charStyle().setParent("");
 	
 	CharStyle cstyle;
@@ -686,6 +691,9 @@ ScribusDoc::~ScribusDoc()
 		delete m_docNotesStylesList.takeFirst();
 	docPatterns.clear();
 	docGradients.clear();
+	foreach (NumStruct* ns, numerations.values())
+		delete ns;
+	numerations.clear();
 	while (!DocItems.isEmpty())
 	{
 		delete DocItems.takeFirst();
@@ -1485,6 +1493,9 @@ void ScribusDoc::redefineStyles(const StyleSet<ParagraphStyle>& newStyles, bool
 		}
 	}
 	docParagraphStyles.invalidate();
+	setupNumerations();
+	if (!isLoading())
+		flag_Renumber = true;
 }
 
 void ScribusDoc::redefineCharStyles(const StyleSet<CharStyle>& newStyles, bool removeUnused)
@@ -1865,7 +1876,7 @@ void ScribusDoc::restore(UndoState* state, bool isUndo)
 				NS->setName(ss->get("name"));
 				NS->setStart(ss->getInt("start"));
 				NS->setEndNotes(ss->getBool("endNotes"));
-				NS->setType((NumerationType) ss->getInt("numStyle"));
+				NS->setType((NumFormat) ss->getInt("numFormat"));
 				NS->setRange((NumerationRange) ss->getInt("range"));
 				NS->setPrefix(ss->get("prefix"));
 				NS->setSuffix(ss->get("suffix"));
@@ -1906,7 +1917,7 @@ void ScribusDoc::restore(UndoState* state, bool isUndo)
 					NS->setStart(ss->getInt("start"));
 					NS->setRange((NumerationRange) ss->getInt("range"));
 					NS->setEndNotes(ss->getBool("endNotes"));
-					NS->setType((NumerationType) ss->getInt("numStyle"));
+					NS->setType((NumFormat) ss->getInt("numFormat"));
 					NS->setPrefix(ss->get("prefix"));
 					NS->setSuffix(ss->get("suffix"));
 					NS->setAutoNotesHeight(ss->getBool("autoH"));
@@ -1924,7 +1935,7 @@ void ScribusDoc::restore(UndoState* state, bool isUndo)
 					NS->setStart(ss->getInt("NEWstart"));
 					NS->setRange((NumerationRange) ss->getInt("NEWrange"));
 					NS->setEndNotes(ss->getBool("NEWendNotes"));
-					NS->setType((NumerationType) ss->getInt("NEWnumStyle"));
+					NS->setType((NumFormat) ss->getInt("NEWnumFormat"));
 					NS->setPrefix(ss->get("NEWprefix"));
 					NS->setSuffix(ss->get("NEWsuffix"));
 					NS->setAutoNotesHeight(ss->getBool("NEWautoH"));
@@ -4424,10 +4435,25 @@ void ScribusDoc::checkItemForFonts(PageItem *it, QMap<QString, QMap<uint, FPoint
 	int stop  = it->isTextFrame() ? it->lastInFrame() + 1 : it->itemText.length();
 	for (int e = start; e < stop; ++e)
 	{
-		if (! Really.contains(it->itemText.charStyle(e).font().replacementName()) )
+		const ScFace* font = &it->itemText.charStyle(e).font();
+		if (it->itemText.item(e)->mark)
 		{
-			if (!it->itemText.charStyle(e).font().replacementName().isEmpty())
-				Really.insert(it->itemText.charStyle(e).font().replacementName(), QMap<uint, FPointArray>());
+			QString mrkStr = it->itemText.item(e)->mark->getString();
+			for (int i=0;i<mrkStr.length(); ++i)
+			{
+				if (font->canRender(mrkStr[i].unicode()))
+				{
+					uint gl = font->char2CMap(mrkStr[i]);
+					FPointArray gly(font->glyphOutline(gl));
+					if (!font->replacementName().isEmpty())
+						Really[font->replacementName()].insert(gl, gly);
+				}
+			}
+		}
+		if (! Really.contains(font->replacementName()) )
+		{
+			if (!font->replacementName().isEmpty())
+				Really.insert(font->replacementName(), QMap<uint, FPointArray>());
 		}
 		uint chr = it->itemText.text(e).unicode();
 		if ((chr == 13) || (chr == 32) || ((chr >= 26) && (chr <= 29)))
@@ -4445,10 +4471,10 @@ void ScribusDoc::checkItemForFonts(PageItem *it, QMap<QString, QMap<uint, FPoint
 						chstr = chstr.toUpper();
 				}
 				chr = chstr.unicode();
-				uint gl = it->itemText.charStyle(e).font().char2CMap(chstr);
-				gly = it->itemText.charStyle(e).font().glyphOutline(gl);
-				if (!it->itemText.charStyle(e).font().replacementName().isEmpty())
-					Really[it->itemText.charStyle(e).font().replacementName()].insert(gl, gly);
+				uint gl = font->char2CMap(chstr);
+				gly = font->glyphOutline(gl);
+				if (!font->replacementName().isEmpty())
+					Really[font->replacementName()].insert(gl, gly);
 			}
 			for (int t1 = 0; t1 < it->itemText.defaultStyle().tabValues().count(); t1++)
 			{
@@ -4461,10 +4487,10 @@ void ScribusDoc::checkItemForFonts(PageItem *it, QMap<QString, QMap<uint, FPoint
 						chstr = chstr.toUpper();
 				}
 				chr = chstr.unicode();
-				uint gl = it->itemText.charStyle(e).font().char2CMap(chstr);
-				gly = it->itemText.charStyle(e).font().glyphOutline(gl);
-				if (!it->itemText.charStyle(e).font().replacementName().isEmpty())
-					Really[it->itemText.charStyle(e).font().replacementName()].insert(gl, gly);
+				uint gl = font->char2CMap(chstr);
+				gly = font->glyphOutline(gl);
+				if (!font->replacementName().isEmpty())
+					Really[font->replacementName()].insert(gl, gly);
 			}
 			continue;
 		}
@@ -4540,16 +4566,17 @@ void ScribusDoc::checkItemForFonts(PageItem *it, QMap<QString, QMap<uint, FPoint
 			for (int pnti=0;pnti<pageNumberText.length(); ++pnti)
 			{
 				uint chr = pageNumberText[pnti].unicode();
-				if (it->itemText.charStyle(e).font().canRender(chr))
+				if (font->canRender(chr))
 				{
-					uint gl = it->itemText.charStyle(e).font().char2CMap(pageNumberText[pnti]);
-					FPointArray gly(it->itemText.charStyle(e).font().glyphOutline(gl));
-					if (!it->itemText.charStyle(e).font().replacementName().isEmpty())
-						Really[it->itemText.charStyle(e).font().replacementName()].insert(gl, gly);
+					uint gl = font->char2CMap(pageNumberText[pnti]);
+					FPointArray gly(font->glyphOutline(gl));
+					if (!font->replacementName().isEmpty())
+						Really[font->replacementName()].insert(gl, gly);
 				}
 			}
 			continue;
 		}
+
 		if (it->itemText.charStyle(e).effects() & ScStyle_SoftHyphenVisible)
 		{
 			uint gl = it->itemText.charStyle(e).font().char2CMap(QChar('-'));
@@ -6783,7 +6810,7 @@ void ScribusDoc::setInlineEditMode(bool mode, int id)
 	}
 }
 
-void ScribusDoc::addSection(const int number, const QString& name, const uint fromindex, const uint toindex, const DocumentSectionType type, const uint sectionstartindex, const bool reversed, const bool active, const QChar fillChar, int fieldWidth)
+void ScribusDoc::addSection(const int number, const QString& name, const uint fromindex, const uint toindex, const NumFormat type, const uint sectionstartindex, const bool reversed, const bool active, const QChar fillChar, int fieldWidth)
 {
 	struct DocumentSection newSection;
 	uint docPageCount=DocPages.count();
@@ -9034,6 +9061,69 @@ void ScribusDoc::itemSelection_EraseParagraphStyle(Selection* customSelection)
 	regionsChanged()->update(QRectF());
 }
 
+void ScribusDoc::itemSelection_ClearBulNumStrings(Selection* customSelection)
+{
+	Selection* itemSelection = (customSelection!=0) ? customSelection : m_Selection;
+	assert(itemSelection!=0);
+	uint selectedItemCount=itemSelection->count();
+	if (selectedItemCount == 0)
+		return;
+	for (uint aa = 0; aa < selectedItemCount; ++aa)
+	{
+		PageItem *currItem = itemSelection->itemAt(aa);
+		if (currItem->itemText.length() == 0)
+			continue;
+		int currItemTextCount = currItem->itemText.length();
+		if ((appMode != modeEdit) && (appMode != modeEditTable))
+		{
+			for (int pos = 0; pos < currItemTextCount; ++pos)
+			{
+				ScText* hl = currItem->itemText.item(pos);
+				if (hl->hasMark() && hl->mark->isType(MARKBullNumType))
+				{
+					if (UndoManager::undoEnabled())
+					{
+						ScItemState<QPair<int,QString> > *is = new ScItemState<QPair <int,QString> >(Um::SetStyle);
+						is->set("CLEARMARK", "clear_mark_string");
+						is->setItem(qMakePair(pos, hl->mark->getString()));
+						undoManager->action(currItem, is);
+					}
+					hl->mark->setString(QString());
+				}
+			}
+		}
+		else
+		{
+			int start;
+			int stop;
+			start = stop = currItem->itemText.normalizedCursorPosition();
+			if (currItem->HasSel)
+			{
+				start = currItem->itemText.startOfSelection();
+				stop = currItem->itemText.endOfSelection();
+			}
+			start = currItem->itemText.startOfParagraph(currItem->itemText.nrOfParagraph(start));
+			stop = currItem->itemText.endOfParagraph(currItem->itemText.nrOfParagraph(stop));
+			for (int pos=start; pos < stop; ++pos)
+			{
+				ScText* hl = currItem->itemText.item(pos);
+				if (hl->hasMark() && hl->mark->isType(MARKBullNumType))
+				{
+					if (UndoManager::undoEnabled())
+					{
+						ScItemState<QPair<int,QString> > *is = new ScItemState<QPair <int,QString> >(Um::SetStyle);
+						is->set("CLEARMARKSTRING", "clear_mark_string");
+						is->setItem(qMakePair(pos, hl->mark->getString()));
+						undoManager->action(currItem, is);
+					}
+					hl->mark->setString(QString());
+				}
+			}
+		}
+	}
+	flag_Renumber = true;
+}
+
 void ScribusDoc::itemSelection_ApplyParagraphStyle(const ParagraphStyle & newStyle, Selection* customSelection, bool rmDirectFormatting)
 {
 	Selection* itemSelection = (customSelection!=0) ? customSelection : m_Selection;
@@ -9041,6 +9131,7 @@ void ScribusDoc::itemSelection_ApplyParagraphStyle(const ParagraphStyle & newSty
 	uint selectedItemCount=itemSelection->count();
 	if (selectedItemCount == 0)
 		return;
+	itemSelection_ClearBulNumStrings(itemSelection);
 	UndoTransaction* activeTransaction = NULL;
 	if (UndoManager::undoEnabled() && selectedItemCount > 1)
 		activeTransaction = new UndoTransaction(undoManager->beginTransaction(Um::SelectionGroup, Um::IGroup, Um::ApplyTextStyle, newStyle.displayName(), Um::IFont));
@@ -16192,6 +16283,7 @@ Serializer *ScribusDoc::textSerializer()
 	return m_tserializer;
 }
 
+
 void ScribusDoc::RotMode(const int& val)
 {
 	rotMode = val;
@@ -16230,7 +16322,7 @@ void ScribusDoc::setNewPrefs(const ApplicationPrefs& prefsData, const Applicatio
 */
 
 	docHyphenator->slotNewSettings(docPrefsData.hyphPrefs.MinWordLen,
-											docPrefsData.hyphPrefs.Automatic,
+											!docPrefsData.hyphPrefs.Automatic,
 											docPrefsData.hyphPrefs.AutoCheck,
 											docPrefsData.hyphPrefs.HyCount);
 	docHyphenator->ignoredWords = docPrefsData.hyphPrefs.ignoredWords;
@@ -16585,7 +16677,7 @@ void ScribusDoc::checkItemForFrames(PageItem *it, int fIndex)
 	for (int e = start; e < stop; ++e)
 	{
 		ScText *hl = it->itemText.item(e);
-		if ((hl->ch == SpecialChars::OBJECT) && (hl->hasObject(this)))
+		if (hl->hasObject(this))
 		{
 			if (hl->getItem(this)->inlineCharID == fIndex)
 				deleteList.prepend(e);
@@ -16650,6 +16742,295 @@ void ScribusDoc::restartAutoSaveTimer()
 	emit updateAutoSaveClock();
 }
 
+void ScribusDoc::setupNumerations()
+{
+	Numeration num;
+	NumStruct * numS = NULL;
+	if (numerations.isEmpty())
+	{
+		//create default numeration
+		numS = new NumStruct;
+		numS->m_name = "default";
+		numS->m_nums.insert(0, num);
+		numS->m_counters.insert(0, 1);
+		numS->m_lastlevel = 0;
+		numerations.insert(numS->m_name, numS);
+	}
+	
+	for (int i=0; i < docParagraphStyles.count(); ++i)
+	{
+		if (docParagraphStyles[i].hasNum())
+		{
+			ParagraphStyle &style = docParagraphStyles[i];
+			QString name = style.numName();
+			if (numerations.contains(name))
+				numS = numerations.value(name);
+			else
+			{
+				numS = new NumStruct;
+				numS->m_name = name;
+			}
+			num.numFormat = (NumFormat) style.numFormat();
+			num.prefix = style.numPrefix();
+			num.suffix = style.numSuffix();
+			num.start = style.numStart();
+			int level = style.numLevel();
+			if (level >= numS->m_counters.count())
+			{
+				for (int i=numS->m_counters.count(); i <= level; ++i)
+				{
+					numS->m_nums.insert(i,num);
+					numS->m_counters.insert(i, 1);
+				}
+			}
+			numS->m_nums.replace(level, num);
+			numS->m_counters.replace(level, num.start);
+			numS->m_lastlevel = 0;
+			numerations.insert(numS->m_name, numS);
+		}
+	}
+	if (orgNumerations != numerations)
+	{
+		orgNumerations = numerations;
+		flag_Renumber = true;
+	}
+}
+
+QString ScribusDoc::getNumberStr(QString numName, int level, bool reset, ParagraphStyle &style)
+{
+	Q_ASSERT(numerations.contains(numName));
+	NumStruct * numS = numerations.value(numName);
+	numS->m_lastlevel = level;
+
+	Numeration num = numS->m_nums[level];
+	num.numFormat = (NumFormat) style.numFormat();
+	num.start = style.numStart();
+	num.prefix = style.numPrefix();
+	num.suffix = style.numSuffix();
+	numS->m_nums.replace(level, num);
+
+	int currNum = numS->m_counters.at(level);
+	if (reset)
+		currNum = numS->m_nums[level].start;
+	else
+		++currNum;
+	setNumerationCounter(numName, level, currNum);
+
+	QString result = QString();
+	for (int i=0; i <= level; ++i)
+	{
+		Numeration num = numS->m_nums[i];
+		result.append(num.prefix);
+		result.append(num.numString(numS->m_counters.at(i)));
+		result.append(num.suffix);
+	}
+	return result;
+}
+
+void ScribusDoc::setNumerationCounter(QString numName, int level, int number)
+{
+	NumStruct * numS = numerations.value(numName);
+	if (level > numS->m_counters.count())
+		numS->m_counters.insert(level, number);
+	else
+		numS->m_counters.replace(level, number);
+}
+
+bool ScribusDoc::updateLocalNums(StoryText& itemText)
+{
+	QList<Numeration> m_nums;
+	QList<int> m_counters;
+	bool needUpdate = false;
+	for (int pos = 0; pos < itemText.length(); ++pos)
+	{
+		if (pos != 0 && itemText.text(pos-1) != SpecialChars::PARSEP)
+			continue;
+		ScText* hl = itemText.item(pos);
+		if (hl->mark != NULL && hl->mark->isType(MARKBullNumType) && itemText.paragraphStyle(pos).hasNum())
+		{
+			ParagraphStyle style = itemText.paragraphStyle(pos);
+			if (style.numName() == "<local block>")
+			{
+				int level = style.numLevel();
+				while (m_counters.count() < (level + 1))
+				{
+					m_counters.append(0);
+					Numeration num((NumFormat) style.numFormat());
+					m_nums.append(num);
+				}
+				Numeration num = m_nums.at(level);
+				num.prefix = style.numPrefix();
+				num.suffix = style.numSuffix();
+				num.start = style.numStart();
+				num.numFormat = (NumFormat) style.numFormat();
+				m_nums.replace(level, num);
+				int count = m_counters.at(level);
+				bool reset = false;
+				if (pos == 0)
+					reset = true;
+				else if (pos > 0)
+				{
+					ParagraphStyle prevStyle;
+					prevStyle = itemText.paragraphStyle(pos -1);
+					reset = !prevStyle.hasNum()
+					        || prevStyle.numName() != "<local block>"
+					        || prevStyle.numLevel() < level
+					        || prevStyle.numFormat() != style.numFormat();
+				}
+				if ((level == 0) && (style.numFormat() != (int) num.numFormat))
+				{
+					reset = true;
+					m_counters.clear();
+					m_counters.append(0);
+					m_nums.clear();
+					m_nums.append(num);
+				}
+				if (reset)
+					count = style.numStart();
+				else
+					count++;
+				m_counters.replace(level, count);
+				//m_nums.insert(level, num);
+				QString result = QString();
+				for (int i=0; i <= level; ++i)
+				{
+					result.append(m_nums.at(i).prefix);
+					result.append(getStringFromNum(m_nums.at(i).numFormat, m_counters.at(i)));
+					result.append(m_nums.at(i).suffix);
+				}
+				if (hl->mark->getString() != result)
+				{
+					hl->mark->setString(result);
+					needUpdate = true;
+				}
+			}
+		}
+	}
+	return needUpdate;
+}
+
+void ScribusDoc::updateNumbers(bool updateNumerations)
+{
+	if (updateNumerations)
+		//after styles change reset all numerations settings
+		setupNumerations();
+	//reset ALL counters
+	foreach (NumStruct * numS, numerations.values())
+		for (int l = 0; l < numS->m_nums.count(); ++l)
+			numS->m_counters[l] = numS->m_nums[l].start;
+	foreach (PageItem* item, DocItems)
+	{
+		if (item->itemText.length() > 0)
+		{
+			PageItem* itemFirst = item->firstInChain();
+			if (updateLocalNums(itemFirst->itemText))
+			{
+				if (itemFirst->isTextFrame())
+					itemFirst->asTextFrame()->invalidateLayout(true);
+				else
+					itemFirst->invalidateLayout();
+			}
+		}
+	}
+
+	flag_Renumber = false;
+	//renumbering for doc, sections, page and frame range
+	for (int sec = 0; sec < sections().count(); ++sec)
+	{
+		//reset section range counters
+		foreach (NumStruct * numS, numerations.values())
+			for (int l = 0; l < numS->m_nums.count(); ++l)
+				if (numS->m_nums[l].range == NSRsection)
+					numS->m_counters[l] = numS->m_nums[l].start;
+
+		int start = sections().value(sec).fromindex;
+		int stop = sections().value(sec).toindex;
+		for (int page = start; page <= stop; ++page)
+		{
+			//reset page range counters
+			foreach (NumStruct * numS, numerations.values())
+				for (int l = 0; l < numS->m_nums.count(); ++l)
+					if (numS->m_nums[l].range == NSRpage)
+						numS->m_counters[l] = numS->m_nums[l].start;
+			for (int i=0; i < DocItems.count(); ++i)
+			{
+				PageItem* item = DocItems.at(i);
+				if (item->OwnPage != page)
+					continue;
+				if (!item->isTextFrame())
+					continue;
+
+				//reset items and stories range counters
+				foreach (NumStruct * numS, numerations.values())
+					for (int l = 0; l < numS->m_nums.count(); ++l)
+						if ((numS->m_nums[l].range == NSRframe) || ((numS->m_nums[l].range == NSRstory) && (item->prevInChain() == NULL)))
+							numS->m_counters[l] = numS->m_nums[l].start;
+
+				int pos = item->firstInFrame();
+				if ((pos != 0) && (item->itemText.text(pos-1) != SpecialChars::PARSEP))
+					pos = item->itemText.nextParagraph(pos)+1;
+				int last = item->lastInFrame();
+				int len = item->itemText.length();
+				while (pos <= last)
+				{
+					ParagraphStyle style = item->itemText.paragraphStyle(pos);
+					if (style.hasNum() && style.numName()!="<local block>")
+					{
+						ScText * hl = item->itemText.item(pos);
+						bool resetNums = false;
+						if (style.numOther())
+						{
+							if (pos == 0)
+								resetNums = true;
+							else
+							{
+								int currPara = item->itemText.nrOfParagraph(pos);
+								int currStart = item->itemText.startOfParagraph(currPara);
+								ParagraphStyle preStyle = item->itemText.paragraphStyle(currStart-1);
+								//reset counter if prev style hasnt numeration or has other numeration
+								if (!preStyle.hasNum() || (preStyle.numName() != style.numName()))
+									resetNums = true;
+							}
+						}
+						if (style.numHigher() && (style.numLevel() > 0))
+						{
+							if (numerations.value(style.numName())->m_lastlevel < style.numLevel())
+								resetNums = true;
+						}
+						QString prefixStr = getNumberStr(style.numName(), style.numLevel(), resetNums, style);
+						if (hl->mark == NULL)
+						{
+							BulNumMark* bnMark = new BulNumMark;
+							item->itemText.insertMark(bnMark,pos);
+							hl = item->itemText.item(pos);
+							hl->applyCharStyle(item->itemText.paragraphStyle(pos).charStyle());
+							hl->setEffects(ScStyle_Default);
+							const StyleContext* cStyleContext = item->itemText.paragraphStyle(pos).charStyleContext();
+							hl->setContext(cStyleContext);
+						}
+						if (hl->mark->getString() != prefixStr)
+						{
+							hl->mark->setString(prefixStr);
+							item->invalid = true;
+							flag_Renumber = true;
+						}
+					}
+					if (pos == last)
+						break;
+					if (item->itemText.text(pos) == SpecialChars::PARSEP)
+						++pos;
+					else
+					{
+						pos = item->itemText.nextParagraph(pos)+1;
+						if (pos == len)
+							break;
+					}
+				}
+			}
+		}
+	}
+}
+
 QStringList ScribusDoc::marksLabelsList(MarkType type)
 {
 	QStringList nameList;
@@ -16949,7 +17330,7 @@ bool ScribusDoc::updateMarks(bool updateNotesMarks)
 			{
 				PageItem* mItem = findFirstMarkItem(mrk);
 				mrk->OwnPage =(mItem != NULL) ? mItem->OwnPage : -1;
-				mrk->setItemName((mItem != NULL) ? mItem->itemName() : "");
+				mrk->setItemName((mItem != NULL) ? mItem->itemName() : QString());
 			}
 		}
 	}
@@ -17139,7 +17520,7 @@ void ScribusDoc::undoSetNotesStyle(SimpleState* ss, NotesStyle *NS)
 		ss->set("name", NS->name());
 		ss->set("start", NS->start());
 		ss->set("endNotes", NS->isEndNotes());
-		ss->set("numStyle", (int) NS->getType());
+		ss->set("numFormat", (int) NS->getType());
 		ss->set("range", (int) NS->range());
 		ss->set("prefix", NS->prefix());
 		ss->set("suffix", NS->suffix());
diff --git a/Scribus/scribus/scribusdoc.h b/Scribus/scribus/scribusdoc.h
index 04bc770..d68a3af 100644
--- a/Scribus/scribus/scribusdoc.h
+++ b/Scribus/scribus/scribusdoc.h
@@ -41,6 +41,7 @@ for which a new license (GPL+exception) is in place.
 #include "scribusapi.h"
 #include "colormgmt/sccolormgmtengine.h"
 #include "documentinformation.h"
+#include "numeration.h"
 #include "marks.h"
 #include "notesstyles.h"
 #include "observable.h"
@@ -938,7 +939,7 @@ public:
 	 * @brief Add a section to the document sections list
 	 * Set number to -1 to add in the default section if the map is empty
 	 */
-	void addSection(const int number=0, const QString& name=QString::null, const uint fromindex=0, const uint toindex=0, const  DocumentSectionType type=Type_1_2_3, const uint sectionstartindex=0, const bool reversed=false, const bool active=true, const QChar fillChar=QChar(), int fieldWidth=0);
+	void addSection(const int number=0, const QString& name=QString::null, const uint fromindex=0, const uint toindex=0, const  NumFormat type=Type_1_2_3, const uint sectionstartindex=0, const bool reversed=false, const bool active=true, const QChar fillChar=QChar(), int fieldWidth=0);
 	/**
 	 * @brief Delete a section from the document sections list
 	 */
@@ -1769,6 +1770,18 @@ public slots:
 	void itemSelection_Weld();
 	void itemSelection_EditWeld();
 	void restartAutoSaveTimer();
+
+//auto-numerations
+public:
+	QMap<QString, NumStruct*> numerations, orgNumerations; //orgNumerations keeps original settings read from paragraph styles for reset settings overrided localy
+	void setupNumerations(); //read styles for used auto-numerations, initialize numCounters
+	QString getNumberStr(QString numName, int level, bool reset, ParagraphStyle &style);
+	void setNumerationCounter(QString numName, int level, int number);
+	bool flag_Renumber;
+	// for local numeration of paragraphs
+	bool updateLocalNums(StoryText& itemText); //return true if any num strings were updated and item need s invalidation
+	void updateNumbers(bool updateNumerations = false);
+	void itemSelection_ClearBulNumStrings(Selection *customSelection);
 };
 
 Q_DECLARE_METATYPE(ScribusDoc*);
diff --git a/Scribus/scribus/scribusstructs.h b/Scribus/scribus/scribusstructs.h
index 7d65fdc..7a31c55 100644
--- a/Scribus/scribus/scribusstructs.h
+++ b/Scribus/scribus/scribusstructs.h
@@ -170,6 +170,20 @@ struct SingleLine
 	}
 };
 
+struct Bullet  //used by style reader while importing ODT files
+{
+	QString name;
+	QString charStr;
+	double indent;
+	double firstLineIndent;
+	double tabPosition;
+	CharStyle* style;
+	Bullet() : name(""), charStr(""), indent(0.0), firstLineIndent(0.0), tabPosition(0.0), style(NULL) {}
+	Bullet(QString n, QString ch) : name(n), charStr(ch), indent(0.0), firstLineIndent(0.0), tabPosition(0.0), style(NULL) {}
+	Bullet(QString n, QString ch, double first, double ind, double tab, CharStyle* chStyle)
+		{ name = n; charStr = ch, firstLineIndent = first; indent = ind; tabPosition = tab; style = chStyle; }
+};
+
 struct ArrowDesc
 {
 	QString name;
@@ -368,6 +382,7 @@ enum UpdateRequests
 	reqCustomShapeUpdate = 1024,
 	reqInlinePalUpdate   = 2048,
 	reqMarksUpdate       = 4096,
+	reqNumUpdate         = 8192,
 	reqUpdateAll = 65535
 };
 
diff --git a/Scribus/scribus/styles/charstyle.cpp b/Scribus/scribus/styles/charstyle.cpp
index 0c17d3c..2160778 100644
--- a/Scribus/scribus/styles/charstyle.cpp
+++ b/Scribus/scribus/styles/charstyle.cpp
@@ -148,7 +148,7 @@ void CharStyle::eraseDirectFormatting()
 bool CharStyle::equiv(const Style & other) const
 {
 	other.validate();
-	const CharStyle * oth = dynamic_cast<const CharStyle*> ( & other );
+	const CharStyle * oth = reinterpret_cast<const CharStyle*> ( & other );
 	return  oth &&
 		parent() == oth->parent() 
 #define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
@@ -267,7 +267,7 @@ QStringList StyleFlag::featureList() const
 void CharStyle::updateFeatures()
 {
 	m_Effects &= ~ScStyle_UserStyles;
-	runFeatures(m_Features, dynamic_cast<const CharStyle*>(parentStyle()));
+	runFeatures(m_Features, reinterpret_cast<const CharStyle*>(parentStyle()));
 /* need to access global fontlist :-/
 	if (!font().name().endsWith(fontVariant()))
 	{
@@ -280,13 +280,14 @@ void CharStyle::updateFeatures()
 void CharStyle::runFeatures(const QStringList& featureList, const CharStyle* parent)
 {
 	QStringList::ConstIterator it;
-	for (it = featureList.begin(); it != featureList.end(); ++it)
+	QStringList::ConstIterator itEnd = featureList.end();
+	for (it = featureList.begin(); it != itEnd; ++it)
 	{
 		QString feature = it->trimmed();
 		if (feature == INHERIT)
 		{
 			if (parent)
-				runFeatures(parent->features(), dynamic_cast<const CharStyle*>(parent->parentStyle()));
+				runFeatures(parent->features(), reinterpret_cast<const CharStyle*>(parent->parentStyle()));
 			continue;
 		}
 		int set = feature.startsWith('-') ? 0 : 1;
@@ -294,15 +295,16 @@ void CharStyle::runFeatures(const QStringList& featureList, const CharStyle* par
 		if (invert)
 			feature = feature.mid(1);
 
-		if (feature == BOLD)
-		{
-			// (de)select bolder font
-		}
-		else if (feature == ITALIC)
-		{
-			// (de)select italic font
-		}
-		else if (feature == UNDERLINE)
+//		if (feature == BOLD)
+//		{
+//			// (de)select bolder font
+//		}
+//		else if (feature == ITALIC)
+//		{
+//			// (de)select italic font
+//		}
+//		else
+		if (feature == UNDERLINE)
 		{
 			m_Effects &= ~(invert * ScStyle_Underline);
 			m_Effects |= set * ScStyle_Underline;
diff --git a/Scribus/scribus/styles/paragraphstyle.attrdefs.cxx b/Scribus/scribus/styles/paragraphstyle.attrdefs.cxx
index 0e0d150..138f701 100644
--- a/Scribus/scribus/styles/paragraphstyle.attrdefs.cxx
+++ b/Scribus/scribus/styles/paragraphstyle.attrdefs.cxx
@@ -31,13 +31,26 @@ ATTRDEF(double, firstIndent, FirstIndent, 0.0)
 ATTRDEF(double, gapBefore, GapBefore, 0.0)
 ATTRDEF(double, gapAfter, GapAfter, 0.0)
 ATTRDEF(QList<TabRecord>, tabValues, TabValues, QList<TabRecord>())
-ATTRDEF(int, dropCapLines, DropCapLines, 0)
-ATTRDEF(bool, hasDropCap, HasDropCap, false)
-ATTRDEF(double, dropCapOffset, DropCapOffset, 0.0)
 ATTRDEF(bool, useBaselineGrid, UseBaselineGrid, false)
 ATTRDEF(int, keepLinesStart, KeepLinesStart, 0)
 ATTRDEF(int, keepLinesEnd, KeepLinesEnd, 0)
 ATTRDEF(bool, keepWithNext, KeepWithNext, false)
 ATTRDEF(bool, keepTogether, KeepTogether, false)
-ATTRDEF(QString, dcCharStyleName, DcCharStyleName,"")
+ATTRDEF(bool, hasDropCap, HasDropCap, false)
+ATTRDEF(int, dropCapLines, DropCapLines, 2)
+ATTRDEF(double, parEffectOffset, ParEffectOffset, 0.0)
+ATTRDEF(bool, parEffectIndent, ParEffectIndent, false)
+ATTRDEF(QString, peCharStyleName, PeCharStyleName,"")
+ATTRDEF(bool, hasBullet, HasBullet, false)
+ATTRDEF(QString, bulletStr, BulletStr, QString(QChar(0x2022)))
+ATTRDEF(bool, hasNum, HasNum, false)
+ATTRDEF(QString, numName, NumName, "<local block>")
+ATTRDEF(int, numFormat, NumFormat, 0)
+ATTRDEF(QString, numPrefix, NumPrefix, "")
+ATTRDEF(QString, numSuffix, NumSuffix, ".")
+ATTRDEF(int, numLevel, NumLevel, 0)
+ATTRDEF(int, numStart, NumStart, 1)
+ATTRDEF(int, numRestart, NumRestart, 0)
+ATTRDEF(bool, numOther, NumOther, false)
+ATTRDEF(bool, numHigher, NumHigher, true)
 
diff --git a/Scribus/scribus/styles/paragraphstyle.cpp b/Scribus/scribus/styles/paragraphstyle.cpp
index 390392e..f005c40 100644
--- a/Scribus/scribus/styles/paragraphstyle.cpp
+++ b/Scribus/scribus/styles/paragraphstyle.cpp
@@ -81,7 +81,7 @@ QString ParagraphStyle::displayName() const
 bool ParagraphStyle::equiv(const Style& other) const
 {
 	other.validate();
-	const ParagraphStyle* oth = dynamic_cast<const ParagraphStyle*> ( & other );
+	const ParagraphStyle* oth = reinterpret_cast<const ParagraphStyle*> ( & other );
 	return  oth &&
 		parent() == oth->parent() && cstyle.equiv(oth->charStyle())
 #define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
@@ -123,7 +123,7 @@ ParagraphStyle& ParagraphStyle::operator=(const ParagraphStyle& other)
 	
 	if (cstyleContextIsInh)
 	{
-		const ParagraphStyle * parent = dynamic_cast<const ParagraphStyle*> ( parentStyle() );
+		const ParagraphStyle * parent = reinterpret_cast<const ParagraphStyle*> ( parentStyle() );
 		cstyle.setContext(parent ? parent->charStyleContext() : NULL);
 	}
 	else
@@ -150,7 +150,7 @@ void ParagraphStyle::setContext(const StyleContext* context)
 void ParagraphStyle::repairImplicitCharStyleInheritance()
 {
 	if (cstyleContextIsInh) {
-		const ParagraphStyle * newParent = dynamic_cast<const ParagraphStyle*> ( parentStyle() );
+		const ParagraphStyle * newParent = reinterpret_cast<const ParagraphStyle*> ( parentStyle() );
 		cstyle.setContext(newParent ? newParent->charStyleContext() : NULL);
 	}
 }
@@ -172,7 +172,7 @@ void ParagraphStyle::update(const StyleContext* context)
 	cstyle.validate();
 	cstyleContext.invalidate();
 
-	const ParagraphStyle * oth = dynamic_cast<const ParagraphStyle*> ( parentStyle() );
+	const ParagraphStyle * oth = reinterpret_cast<const ParagraphStyle*> ( parentStyle() );
 //	qDebug() << QString("ParagraphStyle::update(%1) parent=%2").arg((unsigned long int)context).arg((unsigned long int)oth);
 	if (oth) {
 #define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
diff --git a/Scribus/scribus/ui/notesstyleseditor.cpp b/Scribus/scribus/ui/notesstyleseditor.cpp
index 9d7319e..f7b3ce6 100644
--- a/Scribus/scribus/ui/notesstyleseditor.cpp
+++ b/Scribus/scribus/ui/notesstyleseditor.cpp
@@ -315,7 +315,7 @@ void NotesStylesEditor::on_ApplyButton_clicked()
 					ss->set("NEWname", NS->name());
 					ss->set("NEWstart", NS->start());
 					ss->set("NEWendNotes", NS->isEndNotes());
-					ss->set("NEWnumStyle", (int) NS->getType());
+					ss->set("NEWnumFormat", (int) NS->getType());
 					ss->set("NEWrange", (int) NS->range());
 					ss->set("NEWprefix", NS->prefix());
 					ss->set("NEWsuffix", NS->suffix());
@@ -332,7 +332,7 @@ void NotesStylesEditor::on_ApplyButton_clicked()
 				//invalidate all text frames with marks from current changed notes style
 				foreach (PageItem* item, m_Doc->DocItems)
 				{
-					if (item->isTextFrame() && !item->isNoteFrame() && item->asTextFrame()->hasMark(NS))
+					if (item->isTextFrame() && !item->isNoteFrame() && item->asTextFrame()->hasNoteMark(NS))
 						item->invalid = true;
 				}
 				m_Doc->updateNotesNums(NS);
@@ -480,7 +480,7 @@ void NotesStylesEditor::on_EndRadio_toggled(bool checked)
 void NotesStylesEditor::on_NumberingBox_currentIndexChanged(int index)
 {
 	NotesStyle ns = changesMap.value(NSlistBox->currentText());
-	ns.setType((NumerationType) index);
+	ns.setType((NumFormat) index);
 
 	changesMap.insert(NSlistBox->currentText(), ns);
 	ApplyButton->setEnabled(true);
diff --git a/Scribus/scribus/ui/prefs_documentsections.cpp b/Scribus/scribus/ui/prefs_documentsections.cpp
index f2be423..ca31d7c 100644
--- a/Scribus/scribus/ui/prefs_documentsections.cpp
+++ b/Scribus/scribus/ui/prefs_documentsections.cpp
@@ -148,7 +148,7 @@ void Prefs_DocumentSections::tableItemChanged( int row, int col )
 			{
 				int index=qcti->currentIndex();
 				if (index<styles.count()-1)
-					localSections[row].type=(DocumentSectionType)index;
+					localSections[row].type=(NumFormat)index;
 				else
 					if (index==styles.count()-1)
 					localSections[row].type=Type_None;
diff --git a/Scribus/scribus/ui/propertiespalette_text.cpp b/Scribus/scribus/ui/propertiespalette_text.cpp
index 4ae518a..e72e489 100644
--- a/Scribus/scribus/ui/propertiespalette_text.cpp
+++ b/Scribus/scribus/ui/propertiespalette_text.cpp
@@ -20,7 +20,7 @@ for which a new license (GPL+exception) is in place.
 #include "propertiespalette_utils.h"
 #include "propertywidget_advanced.h"
 #include "propertywidget_distance.h"
-#include "propertywidget_dropcap.h"
+#include "propertywidget_pareffect.h"
 #include "propertywidget_flop.h"
 #include "propertywidget_optmargins.h"
 #include "propertywidget_orphans.h"
@@ -77,8 +77,8 @@ PropertiesPalette_Text::PropertiesPalette_Text( QWidget* parent) : QWidget(paren
 	orphanBox = new PropertyWidget_Orphans(textTree);
 	orphanItem = textTree->addWidget( tr("Orphans and Widows"), orphanBox);
 
-	dropcapsBox = new PropertyWidget_DropCap(textTree);
-	dropcapsItem = textTree->addWidget( tr("Drop Cap"), dropcapsBox);
+	parEffectWidgets = new PropertyWidget_ParEffect(textTree);
+	parEffectItem = textTree->addWidget( tr("Paragraph Effects"), parEffectWidgets);
 
 	distanceWidgets = new PropertyWidget_Distance(textTree);
 	distanceItem = textTree->addWidget( tr("Columns && Text Distances"), distanceWidgets);
@@ -120,7 +120,7 @@ void PropertiesPalette_Text::setMainWindow(ScribusMainWindow* mw)
 	advancedWidgets->setMainWindow(mw);
 	colorWidgets->setMainWindow(mw);
 	distanceWidgets->setMainWindow(mw);
-	dropcapsBox->setMainWindow(mw);
+	parEffectWidgets->setMainWindow(mw);
 	optMargins->setMainWindow(mw);
 	pathTextWidgets->setMainWindow(mw);
 
@@ -156,7 +156,7 @@ void PropertiesPalette_Text::setDoc(ScribusDoc *d)
 	advancedWidgets->setDoc(m_doc);
 	colorWidgets->setDoc(m_doc);
 	distanceWidgets->setDoc(m_doc);
-	dropcapsBox->setDoc(m_doc);
+	parEffectWidgets->setDoc(m_doc);
 	flopBox->setDoc(m_doc);
 	optMargins->setDoc(m_doc);
 	orphanBox->setDoc(m_doc);
@@ -192,7 +192,7 @@ void PropertiesPalette_Text::unsetDoc()
 	flopBox->setDoc(0);
 	optMargins->setDoc(0);
 	orphanBox->setDoc(0);
-	dropcapsBox->setDoc(0);
+	parEffectWidgets->setDoc(0);
 	pathTextWidgets->setDoc(0);
 
 	m_haveItem = false;
@@ -276,7 +276,7 @@ void PropertiesPalette_Text::handleUpdateRequest(int updateFlags)
 	if (updateFlags & reqCharStylesUpdate)
 	{
 		charStyleCombo->updateFormatList();
-		dropcapsBox->updateCharStyles();
+		parEffectWidgets->updateCharStyles();
 	}
 	if (updateFlags & reqParaStylesUpdate)
 		paraStyleCombo->updateFormatList();
@@ -288,7 +288,7 @@ void PropertiesPalette_Text::handleUpdateRequest(int updateFlags)
 	{
 		paraStyleCombo->setDoc(m_haveDoc ? m_doc : 0);
 		charStyleCombo->setDoc(m_haveDoc ? m_doc : 0);
-		dropcapsBox->setDoc(m_haveDoc ? m_doc : 0);
+		parEffectWidgets->setDoc(m_haveDoc ? m_doc : 0);
 	}
 }
 
@@ -320,7 +320,7 @@ void PropertiesPalette_Text::setCurrentItem(PageItem *i)
 		flopItem->setHidden(true);
 		distanceItem->setHidden(true);
 		orphanItem->setHidden(true);
-		dropcapsItem->setHidden(true);
+		parEffectItem->setHidden(true);
 		pathTextItem->setHidden(false);
 	}
 	else if (m_item->asTextFrame() || m_item->asTable())
@@ -328,7 +328,7 @@ void PropertiesPalette_Text::setCurrentItem(PageItem *i)
 		flopItem->setHidden(false);
 		distanceItem->setHidden(false);
 		orphanItem->setHidden(false);
-		dropcapsItem->setHidden(false);
+		parEffectItem->setHidden(false);
 		pathTextItem->setHidden(true);
 	}
 	else
@@ -336,7 +336,7 @@ void PropertiesPalette_Text::setCurrentItem(PageItem *i)
 		flopItem->setHidden(false);
 		distanceItem->setHidden(false);
 		orphanItem->setHidden(false);
-		dropcapsItem->setHidden(false);
+		parEffectItem->setHidden(false);
 		pathTextItem->setHidden(true);
 	}
 
@@ -374,7 +374,7 @@ void PropertiesPalette_Text::unitChange()
 	flopBox->unitChange();
 	optMargins->unitChange();
 	pathTextWidgets->unitChange();
-	dropcapsBox->unitChange();
+	parEffectWidgets->unitChange();
 
 	m_haveItem = tmp;
 }
@@ -496,7 +496,7 @@ void PropertiesPalette_Text::updateStyle(const ParagraphStyle& newCurrent)
 	colorWidgets->updateStyle(newCurrent);
 	optMargins->updateStyle(newCurrent);
 	orphanBox->updateStyle (newCurrent);
-	dropcapsBox->updateStyle(newCurrent);
+	parEffectWidgets->updateStyle(newCurrent);
 
 	displayFontFace(charStyle.font().scName());
 	displayFontSize(charStyle.fontSize());
@@ -514,14 +514,14 @@ void PropertiesPalette_Text::updateStyle(const ParagraphStyle& newCurrent)
 void PropertiesPalette_Text::updateCharStyles()
 {
 	charStyleCombo->updateFormatList();
-	dropcapsBox->updateCharStyles();
+	parEffectWidgets->updateCharStyles();
 }
 
 void PropertiesPalette_Text::updateParagraphStyles()
 {
 	paraStyleCombo->updateFormatList();
 	charStyleCombo->updateFormatList();
-	dropcapsBox->updateCharStyles();
+	parEffectWidgets->updateCharStyles();
 }
 
 void PropertiesPalette_Text::updateTextStyles()
@@ -643,6 +643,7 @@ void PropertiesPalette_Text::doClearPStyle()
 		{
 			Selection tempSelection(this, false);
 			tempSelection.addItem(i2, true);
+			m_doc->itemSelection_ClearBulNumStrings(&tempSelection);
 			m_doc->itemSelection_EraseParagraphStyle(&tempSelection);
 			CharStyle emptyCStyle;
 			m_doc->itemSelection_SetCharStyle(emptyCStyle, &tempSelection);
diff --git a/Scribus/scribus/ui/propertiespalette_text.h b/Scribus/scribus/ui/propertiespalette_text.h
index d4c73db..b15b840 100644
--- a/Scribus/scribus/ui/propertiespalette_text.h
+++ b/Scribus/scribus/ui/propertiespalette_text.h
@@ -25,7 +25,7 @@ for which a new license (GPL+exception) is in place.
 class PageItem;
 class PropertyWidget_Advanced;
 class PropertyWidget_Distance;
-class PropertyWidget_DropCap;
+class PropertyWidget_ParEffect;
 class PropertyWidget_Flop;
 class PropertyWidget_OptMargins;
 class PropertyWidget_Orphans;
@@ -134,8 +134,8 @@ protected:
 	PropertyWidget_Orphans* orphanBox;
 	QTreeWidgetItem* orphanItem;
 
-	PropertyWidget_DropCap* dropcapsBox;
-	QTreeWidgetItem* dropcapsItem;
+	PropertyWidget_ParEffect* parEffectWidgets;
+	QTreeWidgetItem* parEffectItem;
 
 	PropertyWidget_PathText* pathTextWidgets;
 	QTreeWidgetItem* pathTextItem;
diff --git a/Scribus/scribus/ui/propertywidget_dropcap.cpp b/Scribus/scribus/ui/propertywidget_dropcap.cpp
deleted file mode 100644
index 9c6fbb7..0000000
--- a/Scribus/scribus/ui/propertywidget_dropcap.cpp
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
-For general Scribus (>=1.3.2) copyright and licensing information please refer
-to the COPYING file provided with the program. Following this notice may exist
-a copyright and/or license notice that predates the release of Scribus 1.3.2
-for which a new license (GPL+exception) is in place.
-*/
-
-#include "pageitem.h"
-#include "pageitem_table.h"
-#include "propertywidget_dropcap.h"
-#include "scribus.h"
-#include "selection.h"
-#include "units.h"
-#include "util.h"
-
-PropertyWidget_DropCap::PropertyWidget_DropCap(QWidget *parent) : QFrame(parent)
-{
-	m_item = 0;
-	m_ScMW = 0;
-
-    setupUi(this);
-	setFrameStyle(QFrame::Box | QFrame::Plain);
-	setLineWidth(1);
-	layout()->setAlignment( Qt::AlignTop );
-
-	languageChange();
-	dropCapLines->setDecimals(0);
-
-	if (!m_doc) return;
-	dropCapCharStyleCombo->updateFormatList();
-}
-
-void PropertyWidget_DropCap::setMainWindow(ScribusMainWindow* mw)
-{
-	m_ScMW = mw;
-
-	connect(m_ScMW, SIGNAL(AppModeChanged(int, int)), this, SLOT(handleAppModeChanged(int, int)));
-	connect(m_ScMW, SIGNAL(UpdateRequest(int)), this  , SLOT(handleUpdateRequest(int)));
-}
-
-void PropertyWidget_DropCap::setDoc(ScribusDoc *doc)
-{
-	if(doc == (ScribusDoc*) m_doc)
-		return;
-
-	if (m_doc)
-	{
-		disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
-		disconnect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
-	}
-
-	m_doc = doc;
-	dropCapCharStyleCombo->setDoc(doc);
-
-	if (m_doc.isNull())
-	{
-		disconnectSignals();
-		return;
-	}
-
-	m_unitRatio   = m_doc->unitRatio();
-	m_unitIndex   = m_doc->unitIndex();
-	dropCapOffset->setSuffix(unitGetSuffixFromIndex(0));
-
-	connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
-	connect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
-}
-
-void PropertyWidget_DropCap::setCurrentItem(PageItem *item)
-{
-	if (item && m_doc.isNull())
-		setDoc(item->doc());
-
-	m_item = item;
-
-	disconnectSignals();
-	configureWidgets();
-
-	if (!m_item) return;
-
-	if (m_item->asTextFrame() || m_item->asPathText() || m_item->asTable())
-	{
-		ParagraphStyle parStyle =  m_item->itemText.defaultStyle();
-		if (m_doc->appMode == modeEdit)
-			m_item->currentTextProps(parStyle);
-		else if (m_doc->appMode == modeEditTable)
-			m_item->asTable()->activeCell().textFrame()->currentTextProps(parStyle);
-		updateStyle(parStyle);
-
-		connectSignals();
-	}
-}
-
-void PropertyWidget_DropCap::unitChange()
-{
-	if (!m_doc)
-		return;
-
-	m_unitRatio = m_doc->unitRatio();
-	m_unitIndex = m_doc->unitIndex();
-
-	dropCapOffset->blockSignals(true);
-	dropCapOffset->setNewUnit( m_unitIndex );
-	dropCapOffset->blockSignals(false);
-}
-
-void PropertyWidget_DropCap::updateCharStyles()
-{
-	dropCapCharStyleCombo->updateFormatList();
-}
-
-void PropertyWidget_DropCap::displayCharStyle(const QString& name)
-{
-	bool blocked = dropCapCharStyleCombo->blockSignals(true);
-	dropCapCharStyleCombo->setFormat(name);
-	dropCapCharStyleCombo->blockSignals(blocked);
-}
-
-void PropertyWidget_DropCap::enableDropCap(bool enable)
-{
-	dropCapLines->setEnabled(enable);
-	dropCapOffset->setEnabled(enable);
-	dropCapCharStyleCombo->setEnabled(enable);
-}
-
-void PropertyWidget_DropCap::updateStyle(const ParagraphStyle& newCurrent)
-{
-	disconnectSignals ();
-	dropCapBox->setChecked(newCurrent.hasDropCap());
-	dropCapLines->setValue(newCurrent.dropCapLines());
-	dropCapOffset->setValue(newCurrent.dropCapOffset() * m_unitRatio);
-	displayCharStyle(newCurrent.dcCharStyleName());
-	connectSignals ();
-}
-
-void PropertyWidget_DropCap::connectSignals()
-{
-	connect(dropCapBox, SIGNAL(stateChanged(int)), this, SLOT(handleDropCapUse()), Qt::UniqueConnection);
-	connect(dropCapLines, SIGNAL(valueChanged(double)), this, SLOT(handleDropCapLines()), Qt::UniqueConnection);
-	connect(dropCapOffset, SIGNAL(valueChanged(double)), this, SLOT(handleDropCapOffset()), Qt::UniqueConnection);
-	connect(dropCapCharStyleCombo, SIGNAL(activated(int)), this, SLOT(handleDropCapCharStyle()), Qt::UniqueConnection);
-}
-
-void PropertyWidget_DropCap::disconnectSignals()
-{
-	disconnect(dropCapBox, SIGNAL(stateChanged(int)), this, SLOT(handleDropCapUse()));
-	disconnect(dropCapLines, SIGNAL(valueChanged(double)), this, SLOT(handleDropCapLines()));
-	disconnect(dropCapOffset, SIGNAL(valueChanged(double)), this, SLOT(handleDropCapOffset()));
-	disconnect(dropCapCharStyleCombo, SIGNAL(activated(int)), this, SLOT(handleDropCapCharStyle()));
-}
-
-void PropertyWidget_DropCap::configureWidgets(void)
-{
-	bool enabled = false;
-	if (m_item && m_doc)
-	{
-		PageItem_TextFrame *textItem = m_item->asTextFrame();
-		if (m_doc->appMode == modeEditTable)
-			textItem = m_item->asTable()->activeCell().textFrame();
-		if (textItem || m_item->asPathText())
-			enabled = true;
-	}
-	setEnabled(enabled);
-}
-
-void PropertyWidget_DropCap::handleAppModeChanged(int oldMode, int mode)
-{
-	if (oldMode == modeEditTable || mode == modeEditTable)
-	{
-		setCurrentItem(m_item);
-	}
-}
-
-void PropertyWidget_DropCap::handleSelectionChanged()
-{
-	if (!m_doc || !m_ScMW || m_ScMW->scriptIsRunning())
-		return;
-
-	PageItem* currItem = currentItemFromSelection();
-	setCurrentItem(currItem);
-	updateGeometry();
-	repaint();
-}
-
-void PropertyWidget_DropCap::handleUpdateRequest(int updateFlags)
-{
-	if (updateFlags & reqCharStylesUpdate)
-		updateCharStyles();
-	if (updateFlags & reqStyleComboDocUpdate)
-		setDoc(m_doc ? m_doc : 0);
-}
-
-void PropertyWidget_DropCap::handleDropCapUse()
-{
-	if (!m_doc || !m_item)
-		return;
-	ParagraphStyle newStyle;
-	newStyle.setHasDropCap(dropCapBox->isChecked());
-	PageItem *item = m_item;
-	if (m_doc->appMode == modeEditTable)
-		item = item->asTable()->activeCell().textFrame();
-	if (item != NULL)
-	{
-		Selection tempSelection(this, false);
-		tempSelection.addItem(item, true);
-		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
-	}
-	enableDropCap(dropCapBox->isChecked());
-}
-
-void PropertyWidget_DropCap::handleDropCapLines()
-{
-	if (!m_doc || !m_item)
-		return;
-	ParagraphStyle newStyle;
-	newStyle.setDropCapLines(static_cast<int>(dropCapLines->value()));
-	newStyle.setHasDropCap(dropCapBox->isChecked());
-	PageItem *item = m_doc->m_Selection->itemAt(0);
-	if (m_doc->appMode == modeEditTable)
-		item = item->asTable()->activeCell().textFrame();
-	if (item != NULL)
-	{
-		Selection tempSelection(this, false);
-		tempSelection.addItem(item, true);
-		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
-	}
-}
-
-void PropertyWidget_DropCap::handleDropCapOffset()
-{
-	if (!m_doc || !m_item)
-		return;
-	ParagraphStyle newStyle;
-	newStyle.setDropCapOffset(dropCapOffset->value());
-	newStyle.setHasDropCap(dropCapBox->isChecked());
-	PageItem *item = m_item;
-	if (m_doc->appMode == modeEditTable)
-		item = item->asTable()->activeCell().textFrame();
-	if (item != NULL)
-	{
-		Selection tempSelection(this, false);
-		tempSelection.addItem(item, true);
-		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
-	}
-}
-
-void PropertyWidget_DropCap::handleDropCapCharStyle()
-{
-	if (!m_doc || !m_item)
-		return;
-	ParagraphStyle newStyle;
-	QString name = dropCapCharStyleCombo->currentText();
-	if (!name.isEmpty())
-		newStyle.setDcCharStyleName(name);
-	newStyle.setHasDropCap(dropCapBox->isChecked());
-	PageItem *item = m_item;
-	if (m_doc->appMode == modeEditTable)
-		item = item->asTable()->activeCell().textFrame();
-	if (item != NULL)
-	{
-		Selection tempSelection(this, false);
-		tempSelection.addItem(item, true);
-		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
-	}
-}
-
-void PropertyWidget_DropCap::changeEvent(QEvent *e)
-{
-	if (e->type() == QEvent::LanguageChange)
-	{
-		languageChange();
-		return;
-	}
-	QWidget::changeEvent(e);
-}
-
-void PropertyWidget_DropCap::languageChange()
-{
-	dropCapBox->setText(tr("Use Drop Caps"));
-	dropCapLinesLabel->setText(tr("Drop Caps lines"));
-	dropCapOffsetLabel->setText(tr("Drop Caps offset"));
-	dropCapCharStyleLabel->setText(tr("Drop Cap use character style..."));
-	dropCapCharStyleCombo->setToolTip("<qt>" + tr("Choose character style or leave blank for use default paragraph style"));
-}
-
diff --git a/Scribus/scribus/ui/propertywidget_dropcap.h b/Scribus/scribus/ui/propertywidget_dropcap.h
deleted file mode 100644
index 9f43245..0000000
--- a/Scribus/scribus/ui/propertywidget_dropcap.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef PROPERTYWIDGET_DropCap_H
-#define PROPERTYWIDGET_DropCap_H
-
-#include "ui_propertywidget_dropcapbase.h"
-
-#include "propertywidgetbase.h"
-
-class PageItem;
-class ParagraphStyle;
-class ScribusMainWindow;
-
-class PropertyWidget_DropCap : public QFrame, private Ui::PropertyWidget_DropCapBase, public PropertyWidgetBase
-{
-    Q_OBJECT
-
-public:
-	PropertyWidget_DropCap(QWidget *parent = 0);
-	~PropertyWidget_DropCap() {}
-
-	void updateStyle(const ParagraphStyle& newCurrent);
-	void updateCharStyles();
-
-	void displayCharStyle(const QString& name);
-
-protected:
-	double m_unitRatio;
-	int    m_unitIndex;
-
-	PageItem *         m_item;
-	ScribusMainWindow* m_ScMW;
-
-	void configureWidgets();
-	void setCurrentItem(PageItem *item);
-
-	virtual void changeEvent(QEvent *e);
-
-public slots:
-	void setMainWindow(ScribusMainWindow *mw);
-	void setDoc(ScribusDoc *doc);
-
-	void handleAppModeChanged(int oldMode, int mode);
-	void handleSelectionChanged();
-	void handleUpdateRequest(int);
-
-	void languageChange();
-	void unitChange();
-
-	void handleDropCapUse();
-	void handleDropCapLines();
-	void handleDropCapOffset();
-	void handleDropCapCharStyle();
-
-private:
-	void connectSignals();
-	void disconnectSignals();
-	void enableDropCap(bool);
-};
-
-#endif // PROPERTYWIDGET_DropCap_H
diff --git a/Scribus/scribus/ui/propertywidget_dropcapbase.ui b/Scribus/scribus/ui/propertywidget_dropcapbase.ui
deleted file mode 100644
index af1c28d..0000000
--- a/Scribus/scribus/ui/propertywidget_dropcapbase.ui
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>PropertyWidget_DropCapBase</class>
- <widget class="QFrame" name="PropertyWidget_DropCapBase">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>211</width>
-    <height>142</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>Form</string>
-  </property>
-  <layout class="QGridLayout" name="gridLayout" columnstretch="0,0">
-   <item row="1" column="0">
-    <widget class="QLabel" name="dropCapLinesLabel">
-     <property name="toolTip">
-      <string>Number of lines used by the drop cap</string>
-     </property>
-     <property name="text">
-      <string>Height</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="ScrSpinBox" name="dropCapLines">
-     <property name="suffix">
-      <string> lines</string>
-     </property>
-     <property name="maximum">
-      <number>10</number>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0">
-    <widget class="QLabel" name="dropCapOffsetLabel">
-     <property name="text">
-      <string>Offset</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="0">
-    <widget class="QCheckBox" name="dropCapBox">
-     <property name="text">
-      <string>use Drop Caps</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="0" colspan="2">
-    <widget class="QLabel" name="dropCapCharStyleLabel">
-     <property name="text">
-      <string>Use Character Style</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="2">
-    <widget class="CharStyleComboBox" name="dropCapCharStyleCombo"/>
-   </item>
-   <item row="2" column="1">
-    <widget class="ScrSpinBox" name="dropCapOffset">
-     <property name="minimum">
-      <double>-99.989999999999995</double>
-     </property>
-    </widget>
-   </item>
-  </layout>
- </widget>
- <customwidgets>
-  <customwidget>
-   <class>ScrSpinBox</class>
-   <extends>QDoubleSpinBox</extends>
-   <header>ui/scrspinbox.h</header>
-  </customwidget>
-  <customwidget>
-   <class>CharStyleComboBox</class>
-   <extends>QComboBox</extends>
-   <header>ui/spalette.h</header>
-  </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
diff --git a/Scribus/scribus/ui/propertywidget_pareffect.cpp b/Scribus/scribus/ui/propertywidget_pareffect.cpp
new file mode 100644
index 0000000..c0a08ef
--- /dev/null
+++ b/Scribus/scribus/ui/propertywidget_pareffect.cpp
@@ -0,0 +1,680 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+
+#include "pageitem.h"
+#include "pageitem_table.h"
+#include "propertywidget_pareffect.h"
+#include "scribus.h"
+#include "scribusdoc.h"
+#include "selection.h"
+#include "units.h"
+#include "util.h"
+#include "util_icon.h"
+
+PropertyWidget_ParEffect::PropertyWidget_ParEffect(QWidget *parent) : QFrame(parent), m_enhanced(NULL), m_item(NULL), m_ScMW(NULL)
+{
+	setupUi(this);
+	setFrameStyle(QFrame::Box | QFrame::Plain);
+	setLineWidth(1);
+	layout()->setAlignment( Qt::AlignTop );
+
+	languageChange();
+	dropCapLines->setValue(2);
+
+	if (m_doc)
+		peCharStyleCombo->updateFormatList();
+	fillBulletStrEditCombo();
+	fillNumFormatCombo();
+	enableParEffect(false);
+	bulletCharTableButton_->setIcon(loadIcon("22/insert-table.png"));
+	numStart->setMinimum(1);
+	numStart->setMaximum(9999);
+	numLevelSpin->setMinimum(1);
+	numLevelSpin->setMaximum(3);
+	dropCapLines->setMinimum(2);
+	dropCapLines->setMaximum(99);
+}
+
+void PropertyWidget_ParEffect::setMainWindow(ScribusMainWindow* mw)
+{
+	m_ScMW = mw;
+
+	connect(m_ScMW, SIGNAL(AppModeChanged(int, int)), this, SLOT(handleAppModeChanged(int, int)));
+	connect(m_ScMW, SIGNAL(UpdateRequest(int)), this  , SLOT(handleUpdateRequest(int)));
+}
+
+void PropertyWidget_ParEffect::setDoc(ScribusDoc *doc)
+{
+	if(doc == (ScribusDoc*) m_doc)
+		return;
+
+	if (m_doc)
+	{
+		disconnect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
+		disconnect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
+	}
+
+	m_doc = doc;
+	peCharStyleCombo->setDoc(doc);
+
+	if (m_doc.isNull())
+	{
+		disconnectSignals();
+		return;
+	}
+	fillNumerationsCombo();
+
+	m_unitRatio   = m_doc->unitRatio();
+	m_unitIndex   = m_doc->unitIndex();
+	peOffset_->setSuffix(unitGetSuffixFromIndex(0));
+
+	connect(m_doc->m_Selection, SIGNAL(selectionChanged()), this, SLOT(handleSelectionChanged()));
+	connect(m_doc             , SIGNAL(docChanged())      , this, SLOT(handleSelectionChanged()));
+}
+
+void PropertyWidget_ParEffect::setCurrentItem(PageItem *item)
+{
+	if (item && m_doc.isNull())
+		setDoc(item->doc());
+
+	m_item = item;
+
+	if (!m_item) return;
+
+	if (m_item->asTextFrame() || m_item->asPathText() || m_item->asTable())
+	{
+		configureWidgets();
+		ParagraphStyle parStyle =  m_item->itemText.defaultStyle();
+		if (m_doc->appMode == modeEdit)
+			m_item->currentTextProps(parStyle);
+		else if (m_doc->appMode == modeEditTable)
+			m_item->asTable()->activeCell().textFrame()->currentTextProps(parStyle);
+		updateStyle(parStyle);
+	}
+}
+
+void PropertyWidget_ParEffect::unitChange()
+{
+	if (!m_doc)
+		return;
+
+	m_unitRatio = m_doc->unitRatio();
+	m_unitIndex = m_doc->unitIndex();
+
+	peOffset_->blockSignals(true);
+	peOffset_->setNewUnit( m_unitIndex );
+	peOffset_->blockSignals(false);
+}
+
+void PropertyWidget_ParEffect::fillNumerationsCombo()
+{
+	QStringList numNames;
+	for (int i = 0; i < m_doc->paragraphStyles().count(); ++i)
+	{
+		ParagraphStyle pStyle = m_doc->paragraphStyles()[i];
+		if (pStyle.hasNum() && pStyle.numName() != "<local block>" && !numNames.contains(pStyle.numName()))
+			numNames.append(pStyle.numName());
+	}
+	if (numNames.isEmpty())
+		numNames.append("default");
+	else if (numNames.count() > 1)
+		numNames.sort();
+	numNames.prepend("<local block>");
+	numComboBox->clear();
+	numComboBox->insertItems(0, numNames);
+}
+
+void PropertyWidget_ParEffect::updateCharStyles()
+{
+	peCharStyleCombo->updateFormatList();
+}
+
+void PropertyWidget_ParEffect::displayCharStyle(const QString& name)
+{
+	bool blocked = peCharStyleCombo->blockSignals(true);
+	peCharStyleCombo->setFormat(name);
+	peCharStyleCombo->blockSignals(blocked);
+}
+
+void PropertyWidget_ParEffect::enableDropCap(bool enable)
+{
+	dropCapRadio_->setChecked(enable);
+	dropCapLines->setEnabled(enable);
+	if (enable)
+	{
+		enableBullet(false);
+		enableNum(false);
+	}
+}
+void PropertyWidget_ParEffect::enableBullet(bool enable)
+{
+	bulletRadio_->setChecked(enable);
+	bulletStrEdit_->setEnabled(enable);
+	bulletCharTableButton_->setEnabled(enable);
+	if (enable)
+	{
+		enableDropCap(false);
+		enableNum(false);
+	}
+}
+void PropertyWidget_ParEffect::enableNum(bool enable)
+{
+	numRadio_->setChecked(enable);
+	numComboBox->setEnabled(enable);
+	numLevelSpin->setEnabled(enable);
+	numStart->setEnabled(enable);
+	numPrefix->setEnabled(enable);
+	numSuffix->setEnabled(enable);
+	numFormatCombo->setEnabled(enable);
+	if (enable)
+	{
+		enableBullet(false);
+		enableDropCap(false);
+	}
+}
+void PropertyWidget_ParEffect::enableParEffect(bool enable)
+{
+	peOffRadio->setChecked(!enable);
+	peOffset_->setEnabled(enable);
+	peCharStyleCombo->setEnabled(enable);
+	peIndent_->setEnabled(enable);
+	if (!enable)
+	{
+		enableBullet(false);
+		enableDropCap(false);
+		enableNum(false);
+	}
+}
+
+void PropertyWidget_ParEffect::updateStyle(const ParagraphStyle& newPStyle)
+{
+	if (peOffRadio->isChecked() && !newPStyle.hasBullet() && !newPStyle.hasDropCap() && !newPStyle.hasNum())
+		return;
+	disconnectSignals ();
+
+	bool enablePE = true;
+	if (newPStyle.hasDropCap())
+		enableDropCap(true);
+	else if (newPStyle.hasBullet())
+		enableBullet(true);
+	else if (newPStyle.hasNum())
+		enableNum(true);
+	else
+		enablePE = false;
+
+	QString numName = numComboBox->currentText();
+	int nFormat = 0;
+	dropCapLines->setValue(newPStyle.dropCapLines());
+	bulletStrEdit_->setEditText(newPStyle.bulletStr());
+	numName = newPStyle.numName();
+	nFormat = newPStyle.numFormat();
+	NumStruct * numS = m_doc->numerations.value(numName);
+	if (numS)
+		numLevelSpin->setMaximum(numS->m_counters.count()+1);
+	else
+		numLevelSpin->setMaximum(3);
+	numLevelSpin->setValue(newPStyle.numLevel() +1);
+	numPrefix->setText(newPStyle.numPrefix());
+	numSuffix->setText(newPStyle.numSuffix());
+	numStart->setValue(newPStyle.numStart());
+
+	numComboBox->setCurrentIndex(numComboBox->findText(numName));
+	numFormatCombo->setCurrentIndex(nFormat);
+	peOffset_->setValue(newPStyle.parEffectOffset() * m_unitRatio);
+	peIndent_->setChecked(newPStyle.parEffectIndent());
+	displayCharStyle(newPStyle.peCharStyleName());
+
+	enableParEffect(enablePE);
+	connectSignals ();
+}
+
+void PropertyWidget_ParEffect::connectSignals()
+{
+	connect(peOffRadio, SIGNAL(clicked()), this, SLOT(handleParEffectUse()), Qt::UniqueConnection);
+	connect(dropCapRadio_, SIGNAL(clicked()), this, SLOT(handleParEffectUse()), Qt::UniqueConnection);
+	connect(bulletRadio_, SIGNAL(clicked()), this, SLOT(handleParEffectUse()), Qt::UniqueConnection);
+	connect(numRadio_, SIGNAL(clicked()), this, SLOT(handleParEffectUse()), Qt::UniqueConnection);
+	connect(dropCapLines, SIGNAL(valueChanged(int)), this, SLOT(handleDropCapLines(int)), Qt::UniqueConnection);
+	connect(bulletStrEdit_, SIGNAL(editTextChanged(QString)), this, SLOT(handleBulletStr(QString)), Qt::UniqueConnection);
+	connect(numComboBox, SIGNAL(activated(QString)), this, SLOT(handleNumName(QString)), Qt::UniqueConnection);
+	connect(numLevelSpin, SIGNAL(valueChanged(int)), this, SLOT(handleNumLevel(int)), Qt::UniqueConnection);
+	connect(numFormatCombo, SIGNAL(activated(int)), this, SLOT(handleNumFormat(int)), Qt::UniqueConnection);
+	connect(numPrefix, SIGNAL(textChanged(QString)), this, SLOT(handleNumPrefix(QString)), Qt::UniqueConnection);
+	connect(numSuffix, SIGNAL(textChanged(QString)), this, SLOT(handleNumSuffix(QString)), Qt::UniqueConnection);
+	connect(numStart, SIGNAL(valueChanged(int)), this, SLOT(handleNumStart(int)), Qt::UniqueConnection);
+	connect(peOffset_, SIGNAL(valueChanged(double)), this, SLOT(handlePEOffset(double)), Qt::UniqueConnection);
+	connect(peIndent_, SIGNAL(toggled(bool)), this, SLOT(handlePEIndent(bool)), Qt::UniqueConnection);
+	connect(peCharStyleCombo, SIGNAL(activated(QString)), this, SLOT(handlePECharStyle(QString)), Qt::UniqueConnection);
+}
+
+void PropertyWidget_ParEffect::disconnectSignals()
+{
+	disconnect(peOffRadio, SIGNAL(clicked()), this, SLOT(handleParEffectUse()));
+	disconnect(dropCapRadio_, SIGNAL(clicked()), this, SLOT(handleParEffectUse()));
+	disconnect(bulletRadio_, SIGNAL(clicked()), this, SLOT(handleParEffectUse()));
+	disconnect(numRadio_, SIGNAL(clicked()), this, SLOT(handleParEffectUse()));
+	disconnect(dropCapLines, SIGNAL(valueChanged(int)), this, SLOT(handleDropCapLines(int)));
+	disconnect(bulletStrEdit_, SIGNAL(editTextChanged(QString)), this, SLOT(handleBulletStr(QString)));
+	disconnect(numComboBox, SIGNAL(activated(QString)), this, SLOT(handleNumName(QString)));
+	disconnect(numLevelSpin, SIGNAL(valueChanged(int)), this, SLOT(handleNumLevel(int)));
+	disconnect(numFormatCombo, SIGNAL(activated(int)), this, SLOT(handleNumFormat(int)));
+	disconnect(numPrefix, SIGNAL(textChanged(QString)), this, SLOT(handleNumPrefix(QString)));
+	disconnect(numSuffix, SIGNAL(textChanged(QString)), this, SLOT(handleNumSuffix(QString)));
+	disconnect(numStart, SIGNAL(valueChanged(int)), this, SLOT(handleNumStart(int)));
+	disconnect(peOffset_, SIGNAL(valueChanged(double)), this, SLOT(handlePEOffset(double)));
+	disconnect(peIndent_, SIGNAL(toggled(bool)), this, SLOT(handlePEIndent(bool)));
+	disconnect(peCharStyleCombo, SIGNAL(activated(QString)), this, SLOT(handlePECharStyle(QString)));
+}
+
+void PropertyWidget_ParEffect::configureWidgets(void)
+{
+	bool enabled = false;
+	if (m_item && m_doc)
+	{
+		PageItem_TextFrame *textItem = m_item->asTextFrame();
+		if (m_doc->appMode == modeEditTable)
+			textItem = m_item->asTable()->activeCell().textFrame();
+		if (textItem || m_item->asPathText())
+			enabled = true;
+	}
+	setEnabled(enabled);
+}
+
+void PropertyWidget_ParEffect::handleAppModeChanged(int oldMode, int mode)
+{
+	if (oldMode == modeEditTable || mode == modeEditTable)
+	{
+		setCurrentItem(m_item);
+	}
+}
+
+void PropertyWidget_ParEffect::handleSelectionChanged()
+{
+	if (!m_doc || !m_ScMW || m_ScMW->scriptIsRunning())
+		return;
+
+	PageItem* currItem = currentItemFromSelection();
+	setCurrentItem(currItem);
+	updateGeometry();
+	repaint();
+}
+
+void PropertyWidget_ParEffect::handleUpdateRequest(int updateFlags)
+{
+	if (updateFlags & reqCharStylesUpdate)
+		updateCharStyles();
+	if (updateFlags & reqStyleComboDocUpdate)
+		setDoc(m_doc ? m_doc : 0);
+	if (updateFlags & reqNumUpdate)
+		fillNumerationsCombo();
+}
+
+void PropertyWidget_ParEffect::handleParEffectUse()
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	enableParEffect(!peOffRadio->isChecked());
+	if (dropCapRadio_->isChecked())
+	{
+		enableDropCap(true);
+		newStyle.setDropCapLines(dropCapLines->value());
+		newStyle.setHasDropCap(true);
+		newStyle.setHasBullet(false);
+		newStyle.setHasNum(false);
+	}
+	else if (bulletRadio_->isChecked())
+	{
+		enableBullet(true);
+		newStyle.setHasBullet(true);
+		QString bStr = bulletStrEdit_->currentText();
+		if (bStr.isEmpty())
+			bStr = QChar(0x2022);
+		newStyle.setBulletStr(bStr);
+		newStyle.setHasNum(false);
+		newStyle.setHasDropCap(false);
+	}
+	else if (numRadio_->isChecked())
+	{
+		enableNum(true);
+		newStyle.setHasDropCap(false);
+		newStyle.setHasBullet(false);
+		newStyle.setHasNum(true);
+		newStyle.setNumName(numComboBox->currentText());
+		newStyle.setNumFormat(numFormatCombo->currentIndex());
+		newStyle.setNumLevel(numLevelSpin->value() -1);
+		newStyle.setNumStart(numStart->value());
+		newStyle.setNumPrefix(numPrefix->text());
+		newStyle.setNumSuffix(numSuffix->text());
+		if (newStyle.numName() == "<local block>")
+		{
+			newStyle.setNumOther(true);
+			newStyle.setNumHigher(true);
+		}
+	}
+	else
+	{
+		newStyle.setHasDropCap(false);
+		newStyle.setHasBullet(false);
+		newStyle.setHasNum(false);
+	}
+	newStyle.setParEffectOffset(peOffset_->value());
+	newStyle.setParEffectIndent(peIndent_->isChecked());
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleBulletStr(QString bulStr)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	if (bulStr.isEmpty())
+		bulStr = QChar(0x2022);
+	newStyle.setBulletStr(bulStr);
+	PageItem *item = m_doc->m_Selection->itemAt(0);
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleDropCapLines(int dcLines)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setDropCapLines(dcLines);
+	PageItem *item = m_doc->m_Selection->itemAt(0);
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleNumName(QString numName)
+{
+	if (!m_doc || !m_item)
+		return;
+	disconnectSignals();
+	ParagraphStyle newStyle;
+	if (numName == "<local block>")
+	{
+		newStyle.setNumOther(true);
+		newStyle.setNumHigher(true);
+		newStyle.setNumRestart(NSRstory);
+	}
+	else
+	{
+		NumStruct * numS = m_doc->numerations.value(numName);
+		Q_ASSERT(numS);
+		int level = qMin(numLevelSpin->value(), numS->m_counters.count()) -1;
+		numLevelSpin->setValue(level +1);
+		newStyle.setNumLevel(level);
+		Numeration num = numS->m_nums[level];
+		numFormatCombo->setCurrentIndex((int) num.numFormat);
+		numStart->setValue(num.start);
+		numPrefix->setText(num.prefix);
+		numSuffix->setText(num.suffix);
+	}
+	newStyle.setNumPrefix(numPrefix->text());
+	newStyle.setNumSuffix(numSuffix->text());
+	newStyle.setNumName(numName);
+	newStyle.setNumFormat((NumFormat) numFormatCombo->currentIndex());
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+	connectSignals();
+}
+
+void PropertyWidget_ParEffect::handleNumFormat(int style)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setNumFormat(style);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleNumLevel(int level)
+{
+	if (!m_doc || !m_item)
+		return;
+	if ((numComboBox->currentText() != "<local block>") && level == numLevelSpin->maximum())
+	{
+		NumStruct * numS = m_doc->numerations.value(numComboBox->currentText());
+		Q_ASSERT(numS);
+		while (level > numS->m_counters.count())
+		{
+			numS->m_counters.append(1);
+			Numeration num;
+			num.numFormat = (NumFormat) numFormatCombo->currentIndex();
+			num.prefix = numPrefix->text();
+			num.suffix = numSuffix->text();
+			num.start = numStart->value();
+			numS->m_nums.append(num);
+		}
+	}
+	ParagraphStyle newStyle;
+	newStyle.setNumLevel(level -1);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleNumPrefix(QString prefix)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setNumPrefix(prefix);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleNumSuffix(QString suffix)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setNumSuffix(suffix);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handleNumStart(int start)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setNumStart(start);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->flag_Renumber = true;
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handlePEOffset(double offset)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setParEffectOffset(offset);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handlePEIndent(bool indent)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	newStyle.setParEffectIndent(indent);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::handlePECharStyle(QString name)
+{
+	if (!m_doc || !m_item)
+		return;
+	ParagraphStyle newStyle;
+	if (!name.isEmpty())
+		newStyle.setPeCharStyleName(name);
+	PageItem *item = m_item;
+	if (m_doc->appMode == modeEditTable)
+		item = item->asTable()->activeCell().textFrame();
+	if (item != NULL)
+	{
+		Selection tempSelection(this, false);
+		tempSelection.addItem(item, true);
+		m_doc->itemSelection_ApplyParagraphStyle(newStyle, &tempSelection);
+	}
+}
+
+void PropertyWidget_ParEffect::changeEvent(QEvent *e)
+{
+	if (e->type() == QEvent::LanguageChange)
+	{
+		languageChange();
+		return;
+	}
+	QWidget::changeEvent(e);
+}
+
+void PropertyWidget_ParEffect::languageChange()
+{
+	peOffRadio->setText(tr("No Paragraph Effects"));
+	dropCapRadio_->setText(tr("Use Drop Caps"));
+	dropCapLinesLabel->setText(tr("Drop Caps lines"));
+	peOffsetLabel->setText(tr("Paragraph Effect offset"));
+	peCharStyleLabel->setText(tr("Pargraph Effect style..."));
+	peCharStyleCombo->setToolTip("<qt>" + tr("Choose chracter style or leave blank for use default paragraph style"));
+	bulletCharTableButton_->setToolTip(tr("Enhanced Char Table for inserting customs chars as bullets"));
+	bulletCharTableButton_->setText(tr("Char Table"));
+}
+
+void PropertyWidget_ParEffect::openEnhanced()
+{
+	if (m_enhanced)
+		return;
+
+	QApplication::changeOverrideCursor(QCursor(Qt::WaitCursor));
+	m_enhanced = new CharSelectEnhanced(this);
+	m_enhanced->setModal(true);
+	connect(m_enhanced, SIGNAL(insertSpecialChars(const QString &)), this, SLOT(insertSpecialChars(const QString &)));
+	connect(m_enhanced, SIGNAL(paletteShown(bool)), bulletCharTableButton_, SLOT(setChecked(bool)));
+	m_enhanced->setDoc(m_doc);
+	m_enhanced->setEnabled(true);
+	QString styleName = peCharStyleCombo->currentText();
+	setCurrentComboItem(m_enhanced->fontSelector, m_item->currentStyle().charStyle().font().scName());
+	m_enhanced->newFont(m_enhanced->fontSelector->currentIndex());
+	m_enhanced->show();
+	QApplication::changeOverrideCursor(Qt::ArrowCursor);
+}
+
+void PropertyWidget_ParEffect::closeEnhanced(bool show)
+{
+	if (!m_enhanced || show)
+		return;
+	disconnect(m_enhanced, SIGNAL(insertSpecialChars(const QString &)), this, SLOT(insertSpecialChars(const QString &)));
+	disconnect(m_enhanced, SIGNAL(paletteShown(bool)), bulletCharTableButton_, SLOT(setChecked(bool)));
+	m_enhanced->close();
+	delete m_enhanced;
+	m_enhanced = NULL;
+}
+
+void PropertyWidget_ParEffect::on_bulletCharTableButton__toggled(bool checked)
+{
+	if (m_enhanced && !checked)
+		closeEnhanced();
+	else if (!m_enhanced && checked)
+		openEnhanced();
+}
+void PropertyWidget_ParEffect::insertSpecialChars(const QString &chars)
+{
+	if (bulletStrEdit_->lineEdit()->hasSelectedText())
+		bulletStrEdit_->lineEdit()->del();
+	bulletStrEdit_->lineEdit()->insert(chars);
+}
diff --git a/Scribus/scribus/ui/propertywidget_pareffect.h b/Scribus/scribus/ui/propertywidget_pareffect.h
new file mode 100644
index 0000000..9314370
--- /dev/null
+++ b/Scribus/scribus/ui/propertywidget_pareffect.h
@@ -0,0 +1,104 @@
+#ifndef PROPERTYWIDGET_PAREFFECT_H
+#define PROPERTYWIDGET_PAREFFECT_H
+
+#include "ui_propertywidget_pareffectbase.h"
+#include "numeration.h"
+#include "propertywidgetbase.h"
+#include "ui/charselectenhanced.h"
+
+class PageItem;
+class ParagraphStyle;
+class ScribusMainWindow;
+
+class PropertyWidget_ParEffect : public QFrame, private Ui::PropertyWidget_ParEffectBase, public PropertyWidgetBase
+{
+    Q_OBJECT
+
+public:
+	PropertyWidget_ParEffect(QWidget *parent = 0);
+	~PropertyWidget_ParEffect() {}
+
+	void updateStyle(const ParagraphStyle& newPStyle);
+	void updateCharStyles();
+
+	void displayCharStyle(const QString& name);
+	void connectSignals();
+	void disconnectSignals();
+	CharSelectEnhanced * m_enhanced;
+	
+	void fillNumerationsCombo();
+protected:
+	double m_unitRatio;
+	int    m_unitIndex;
+
+	PageItem *         m_item;
+	ScribusMainWindow* m_ScMW;
+
+	void configureWidgets();
+	void setCurrentItem(PageItem *item);
+
+	virtual void changeEvent(QEvent *e);
+
+public slots:
+	void setMainWindow(ScribusMainWindow *mw);
+	void setDoc(ScribusDoc *doc);
+
+	void handleAppModeChanged(int oldMode, int mode);
+	void handleSelectionChanged();
+	void handleUpdateRequest(int);
+
+	void languageChange();
+	void unitChange();
+
+	void handleParEffectUse();
+	void handleBulletStr(QString);
+	void handleDropCapLines(int);
+	void handleNumName(QString);
+	void handleNumFormat(int);
+	void handleNumLevel(int);
+	void handleNumPrefix(QString);
+	void handleNumSuffix(QString);
+	void handleNumStart(int);
+	void handlePEOffset(double);
+	void handlePEIndent(bool);
+	void handlePECharStyle(QString);
+
+private slots:
+	void on_bulletCharTableButton__toggled(bool checked);
+	void insertSpecialChars(const QString &chars);
+
+private:
+	void openEnhanced();
+	void closeEnhanced(bool show = false);
+	void enableDropCap(bool);
+	void enableBullet(bool);
+	void enableNum(bool);
+	void enableParEffect(bool);
+	void fillBulletStrEditCombo()
+	{
+		bulletStrEdit_->clear();
+		bulletStrEdit_->addItem(QChar(0x2022));
+		bulletStrEdit_->addItem("*");
+		bulletStrEdit_->addItem(QChar(0x2013));
+		bulletStrEdit_->setMinimumWidth(50);
+		if (bulletStrEdit_->currentText().isEmpty())
+			bulletStrEdit_->setEditText(QChar(0x2022));
+	}
+	
+	void fillNumFormatCombo()
+	{
+		numFormatCombo->clear();
+		numFormatCombo->addItems(getFormatList());
+	}
+//	void SMPStyleWidget::fillNumRestartCombo()
+//	{
+//		numRestartCombo->clear();
+//		numRestartCombo->addItem(tr("Document"));
+//		numRestartCombo->addItem(tr("Section"));
+//		numRestartCombo->addItem(tr("Story"));
+//		numRestartCombo->addItem(tr("Page"));
+//		numRestartCombo->addItem(tr("Frame"));
+//	}
+};
+
+#endif // PROPERTYWIDGET_PAREFFECT_H
diff --git a/Scribus/scribus/ui/propertywidget_pareffectbase.ui b/Scribus/scribus/ui/propertywidget_pareffectbase.ui
new file mode 100644
index 0000000..7ab095a
--- /dev/null
+++ b/Scribus/scribus/ui/propertywidget_pareffectbase.ui
@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PropertyWidget_ParEffectBase</class>
+ <widget class="QFrame" name="PropertyWidget_ParEffectBase">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>238</width>
+    <height>468</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout" columnstretch="0,0">
+   <item row="24" column="0">
+    <widget class="QCheckBox" name="peIndent_">
+     <property name="text">
+      <string>AutoIndent</string>
+     </property>
+    </widget>
+   </item>
+   <item row="10" column="1">
+    <widget class="QComboBox" name="bulletStrEdit_">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>50</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="editable">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="19" column="0">
+    <widget class="QLabel" name="numPrefixLabel">
+     <property name="text">
+      <string>Prefix</string>
+     </property>
+     <property name="buddy">
+      <cstring>numPrefix</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="19" column="1">
+    <widget class="QLabel" name="numSuffixLabel">
+     <property name="text">
+      <string>Suffix</string>
+     </property>
+     <property name="buddy">
+      <cstring>numSuffix</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="20" column="1">
+    <widget class="QLineEdit" name="numSuffix"/>
+   </item>
+   <item row="13" column="1">
+    <widget class="QComboBox" name="numComboBox"/>
+   </item>
+   <item row="5" column="0">
+    <widget class="QLabel" name="dropCapLinesLabel">
+     <property name="toolTip">
+      <string>Number of lines used by the drop cap</string>
+     </property>
+     <property name="text">
+      <string>Height</string>
+     </property>
+    </widget>
+   </item>
+   <item row="18" column="0">
+    <widget class="QSpinBox" name="numLevelSpin"/>
+   </item>
+   <item row="20" column="0">
+    <widget class="QLineEdit" name="numPrefix"/>
+   </item>
+   <item row="28" column="0" colspan="2">
+    <widget class="CharStyleComboBox" name="peCharStyleCombo"/>
+   </item>
+   <item row="24" column="1">
+    <widget class="QLabel" name="peOffsetLabel">
+     <property name="text">
+      <string>Offset</string>
+     </property>
+     <property name="buddy">
+      <cstring>peOffset_</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QRadioButton" name="peOffRadio">
+     <property name="text">
+      <string>No Paragraph Effects</string>
+     </property>
+    </widget>
+   </item>
+   <item row="9" column="1">
+    <widget class="QPushButton" name="bulletCharTableButton_">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Char Table</string>
+     </property>
+     <property name="checkable">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="17" column="1">
+    <widget class="QLabel" name="numStartLabel">
+     <property name="text">
+      <string>Start with</string>
+     </property>
+    </widget>
+   </item>
+   <item row="25" column="1">
+    <widget class="ScrSpinBox" name="peOffset_">
+     <property name="minimum">
+      <double>-99.989999999999995</double>
+     </property>
+    </widget>
+   </item>
+   <item row="18" column="1">
+    <widget class="QSpinBox" name="numStart"/>
+   </item>
+   <item row="23" column="0" colspan="2">
+    <widget class="Line" name="line_3">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item row="12" column="0">
+    <widget class="QRadioButton" name="numRadio_">
+     <property name="text">
+      <string>use Numbering</string>
+     </property>
+    </widget>
+   </item>
+   <item row="9" column="0">
+    <widget class="QRadioButton" name="bulletRadio_">
+     <property name="text">
+      <string>use Bullet</string>
+     </property>
+    </widget>
+   </item>
+   <item row="11" column="0" colspan="2">
+    <widget class="Line" name="line_2">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="0">
+    <widget class="QRadioButton" name="dropCapRadio_">
+     <property name="text">
+      <string>use Drop Caps</string>
+     </property>
+    </widget>
+   </item>
+   <item row="13" column="0">
+    <widget class="QLabel" name="numComboLeable">
+     <property name="text">
+      <string>Set</string>
+     </property>
+    </widget>
+   </item>
+   <item row="14" column="0">
+    <widget class="QLabel" name="numFormatLabel">
+     <property name="text">
+      <string>Nums Format</string>
+     </property>
+     <property name="buddy">
+      <cstring>numFormatCombo</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="2">
+    <widget class="Line" name="line_4">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item row="10" column="0">
+    <widget class="QLabel" name="bulletCharLabel">
+     <property name="text">
+      <string>Bullet Char/String</string>
+     </property>
+     <property name="buddy">
+      <cstring>bulletStrEdit_</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="8" column="0" colspan="2">
+    <widget class="Line" name="line">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </item>
+   <item row="14" column="1">
+    <widget class="QComboBox" name="numFormatCombo">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item row="27" column="0" colspan="2">
+    <widget class="QLabel" name="peCharStyleLabel">
+     <property name="text">
+      <string>Use Character Style</string>
+     </property>
+     <property name="buddy">
+      <cstring>peCharStyleCombo</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="17" column="0">
+    <widget class="QLabel" name="numLevelLabel">
+     <property name="text">
+      <string>Level</string>
+     </property>
+     <property name="buddy">
+      <cstring>numLevelSpin</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="1">
+    <widget class="QSpinBox" name="dropCapLines"/>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>ScrSpinBox</class>
+   <extends>QDoubleSpinBox</extends>
+   <header location="global">ui/scrspinbox.h</header>
+  </customwidget>
+  <customwidget>
+   <class>CharStyleComboBox</class>
+   <extends>QComboBox</extends>
+   <header location="global">ui/spalette.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Scribus/scribus/ui/smpstylewidget.cpp b/Scribus/scribus/ui/smpstylewidget.cpp
index 7bade6a..d4e69ec 100644
--- a/Scribus/scribus/ui/smpstylewidget.cpp
+++ b/Scribus/scribus/ui/smpstylewidget.cpp
@@ -7,11 +7,12 @@ for which a new license (GPL+exception) is in place.
 
 #include <QEvent>
 
+#include "numeration.h"
 #include "smpstylewidget.h"
 #include "units.h"
 #include "util.h"
 #include "util_icon.h"
-
+#include "ui/charselectenhanced.h"
 
 static bool isEqual(double a, double b)
 {
@@ -22,8 +23,9 @@ static bool isEqual(double a, double b)
 }
 
 
-SMPStyleWidget::SMPStyleWidget() : QWidget()
+SMPStyleWidget::SMPStyleWidget(ScribusDoc* doc) : QWidget()
 {
+	m_Doc = doc;
 	setupUi(this);
 	//Not used yet
 // 	optMarginCheckLeftProtruding->setVisible(false);
@@ -47,14 +49,25 @@ SMPStyleWidget::SMPStyleWidget() : QWidget()
 //	optMarginCombo->addItem(tr("Right Hanging Punctuation"), ParagraphStyle::OM_RightHangingPunct);
 //	optMarginCombo->addItem(tr("Default"), ParagraphStyle::OM_Default);
 
-	dropCapOffset_->setSuffix(unitGetSuffixFromIndex(0));
+	parEffectOffset_->setSuffix(unitGetSuffixFromIndex(0));
 	
+	fillBulletStrEditCombo();
+	bulletCharTableButton_->setIcon(loadIcon("22/insert-table.png"));
+	fillNumFormatCombo();
+	numStartSpin->setMinimum(1);
+	numStartSpin->setMaximum(9999);
+	numLevelSpin->setMinimum(1);
+	numLevelSpin->setMaximum(1);
+	fillNumRestartCombo();
+	dropCapLines_->setMinimum(2);
+	dropCapLines_->setMaximum(99);
+
 	minSpaceSpin->setSuffix(unitGetSuffixFromIndex(SC_PERCENT));
 	minGlyphExtSpin->setSuffix(unitGetSuffixFromIndex(SC_PERCENT));
 	maxGlyphExtSpin->setSuffix(unitGetSuffixFromIndex(SC_PERCENT));
 
 	connect(optMarginDefaultButton, SIGNAL(clicked()), this, SLOT(slotDefaultOpticalMargins()));
-
+	m_enhanced = NULL;
 }
 
 void SMPStyleWidget::slotLineSpacingModeChanged(int i)
@@ -92,8 +105,10 @@ void SMPStyleWidget::languageChange()
 	//CB Unneeded, gets in the way of single widget tooltips
 	//dropCapsBox->setToolTip(      tr("Enable or disable drop cap"));
 	dropCapLines_->setToolTip(    tr("Drop Cap Lines"));
-	dropCapOffset_->setToolTip(   tr("Drop Cap Offset"));
-	dropCapCharStyleCombo->setToolTip("<qt>" + tr("Choose chracter style or leave blank for use default paragraph style"));
+	bulletCharTableButton_->setToolTip(tr("Enhanced Char Table for inserting customs chars as bullets"));
+	parEffectOffset_->setToolTip(   tr("Paragraph Effects Chars Offset"));
+	parEffectIndentBox->setToolTip(   tr("Hang Paragraph Effect before paragraph indent"));
+	parEffectCharStyleCombo->setToolTip("<qt>" + tr("Choose chracter style or leave blank for use default paragraph style"));
 	alignement_->setToolTip(      tr("Alignment"));
 	tabList_->first_->setToolTip( tr("First Line Indent"));
 	tabList_->left_->setToolTip(  tr("Left Indent"));
@@ -115,7 +130,6 @@ void SMPStyleWidget::languageChange()
 	keepTogether->setToolTip ("<qt>" + tr ("If checked, ensures that the paragraph won't be split across multiple pages or columns") + "</qt>");
 	keepWithNext->setToolTip ("<qt>" + tr ("If checked, automatically moves the paragraph to the next column or page if the next paragraph isn't on the same page or column") + "</qt>");
 
-
 /***********************************/
 /*      End Tooltips               */
 /***********************************/
@@ -135,14 +149,39 @@ void SMPStyleWidget::languageChange()
 //
 //	optMarginLabel->setText(tr("Optical Margins:"));
 
-	dropCapsLineLabel->setText( tr("Lines:"));
-	distFromTextLabel->setText( tr("Distance from Text:"));
 	lineSpacing_->setSuffix(unitGetSuffixFromIndex(0));
 	spaceAbove_->setSuffix(unitGetSuffixFromIndex(0));
 	spaceBelow_->setSuffix(unitGetSuffixFromIndex(0));
 	parentLabel->setText( tr("Based On:"));
 	distancesBox->setTitle( tr("Distances and Alignment"));
+
+	parEffectsBox->setTitle(tr("Paragraph Effects"));
 	dropCapsBox->setTitle( tr("Drop Caps"));
+	bulletBox->setTitle(tr("Bullets"));
+	numBox->setTitle(tr("Numeration"));
+	dropCapsLineLabel->setText( tr("Lines:"));
+	bulletCharLabel->setText(tr("Bullet Char/String"));
+	bulletCharTableButton_->setText(tr("Char Table"));
+	numFormatLabel->setText(tr("Numbering Style"));
+	numLevelLabel->setText(tr("Level"));
+	numPrefixLabel->setText(tr("Prefix"));
+	numSuffixLabel->setText(tr("Suffix"));
+	numStartLabel->setText(tr("Start with"));
+	numRestartOtherBox->setText(tr("Restart after other format"));
+	numRestartHigherBox->setText(tr("Restart after higher level"));
+
+	parEffectCharStyleComboLabel->setText(tr("Character Style for Effect:"));
+	distFromTextLabel->setText(tr("Distance from Text:"));
+	parentParEffectsButton->setText(tr("Use Parent`s Values"));
+	
+	QFont font1;
+	if (font1.pointSize())
+		font1.setPointSize(font1.pointSize() *2);
+	else if (font1.pixelSize())
+		font1.setPixelSize(font1.pixelSize() *2);
+	((QComboBox*) bulletStrEdit_)->setFont(font1);
+	(bulletStrEdit_->lineEdit())->setFont(font1);
+
 	tabsBox->setTitle( tr("Tabulators and Indentation"));
 	tabWidget->setTabText(0, tr("Properties"));
 	tabWidget->setTabText(1, tr("Character Style"));
@@ -165,12 +204,67 @@ void SMPStyleWidget::languageChange()
 
 void SMPStyleWidget::unitChange(double oldRatio, double newRatio, int unitIndex)
 {
-	dropCapOffset_->setNewUnit(unitIndex);
+	parEffectOffset_->setNewUnit(unitIndex);
 	tabList_->unitChange(unitIndex);
 }
 
+void SMPStyleWidget::fillBulletStrEditCombo()
+{
+	bulletStrEdit_->clear();
+	bulletStrEdit_->addItem(QChar(0x2022));
+	bulletStrEdit_->addItem("*");
+	bulletStrEdit_->addItem(QChar(0x2013));
+	bulletStrEdit_->setMinimumWidth(50);
+	if (bulletStrEdit_->currentText().isEmpty())
+		bulletStrEdit_->setEditText(QChar(0x2022));
+}
+
+void SMPStyleWidget::fillNumFormatCombo()
+{
+	numFormatCombo->clear();
+	numFormatCombo->addItems(getFormatList());
+}
+
+void SMPStyleWidget::fillNumerationsCombo(QList<ParagraphStyle> &pstyles)
+{
+	QStringList numNames;
+	foreach (ParagraphStyle pStyle, pstyles)
+	{
+		if (pStyle.hasNum() && !numNames.contains(pStyle.numName()))
+			numNames.append(pStyle.numName());
+	}
+	if (numNames.isEmpty())
+		numNames.append("default");
+	else if (numNames.count() > 1)
+		numNames.sort();
+	numComboBox->clear();
+	numComboBox->insertItems(0, numNames);
+}
+
+void SMPStyleWidget::fillNumRestartCombo()
+{
+	numRestartCombo->clear();
+	numRestartCombo->addItem(tr("Document"));
+	numRestartCombo->addItem(tr("Section"));
+	numRestartCombo->addItem(tr("Story"));
+	numRestartCombo->addItem(tr("Page"));
+	numRestartCombo->addItem(tr("Frame"));
+}
+
+void SMPStyleWidget::checkParEffectState()
+{
+	bool enable = false;
+	if (dropCapsBox->isChecked() || bulletBox->isChecked() || numBox->isChecked())
+		enable = true;
+
+	parEffectCharStyleCombo->setEnabled(enable);
+	parEffectOffset_->setEnabled(enable);
+	parEffectIndentBox->setEnabled(enable);
+}
+
 void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles, QList<CharStyle> &cstyles, int unitIndex, const QString &defLang)
 {
+	currPStyle = pstyle;
 	double unitRatio = unitGetRatioFromIndex(unitIndex);
 	parentCombo->setEnabled(!pstyle->isDefaultStyle());
 	const ParagraphStyle *parent = dynamic_cast<const ParagraphStyle*>(pstyle->parentStyle());
@@ -194,6 +288,10 @@ void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles
 	minGlyphExtSpin->setRange(90.0,100.0);
 	maxGlyphExtSpin->setRange(100.0,110.0);
 	
+	//fillBulletStrEditCombo();
+	//fillNumFormatCombo();
+	fillNumerationsCombo(pstyles);
+	//fillNumRestartCombo();
 
 	if (hasParent_)
 	{
@@ -221,20 +319,6 @@ void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles
 		spaceBelow_->setValue(pstyle->gapAfter(), pstyle->isInhGapAfter());
 		spaceBelow_->setParentValue(parent->gapAfter());
 
-		dropCapsBox->setChecked(pstyle->hasDropCap());;
-		parentDropCap_ = parent->hasDropCap();
-		if (pstyle->isInhHasDropCap())
-			parentDropCapButton->hide();
-		else
-			parentDropCapButton->show();
-
-		connect(parentDropCapButton, SIGNAL(clicked()), this, SLOT(slotParentDropCap()));
-
-		dropCapLines_->setValue(pstyle->dropCapLines(), pstyle->isInhDropCapLines());
-		dropCapLines_->setParentValue(parent->dropCapLines());
-
-		dropCapOffset_->setValue(pstyle->dropCapOffset() * unitRatio, pstyle->isInhDropCapOffset());
-		dropCapOffset_->setParentValue(parent->dropCapOffset() * unitRatio);
 
 		alignement_->setStyle(pstyle->alignment(), pstyle->isInhAlignment());
 		alignement_->setParentItem(parent->alignment());
@@ -266,6 +350,71 @@ void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles
 		keepLinesEnd->setParentValue (parent->keepLinesEnd());
 		keepTogether->setParentValue (parent->keepTogether());
 		keepWithNext->setParentValue (parent->keepWithNext());
+		
+//Effects Gropup Box
+		parentDC_ = parent->hasDropCap();
+		parentBul_ = parent->hasBullet();
+		parentNum_ = parent->hasNum();
+		//parentParEffects_ = (parentDC_ || parentBul_ || parentNum_);
+		if (pstyle->isInhHasDropCap() && pstyle->isInhHasBullet() && pstyle->isInhHasNum())
+		{
+			parentParEffectsButton->hide();
+			disconnect(parentParEffectsButton, SIGNAL(clicked()), this, SLOT(slotParentParEffects()));
+		}
+		else
+		{
+			parentParEffectsButton->show();
+			QFont f(font());
+			f.setBold(true);
+			parentParEffectsButton->setFont(f);
+		}
+		connect(parentParEffectsButton, SIGNAL(clicked()), this, SLOT(slotParentParEffects()));
+
+		dropCapsBox->setChecked(pstyle->hasDropCap());
+		setWidgetBoldFont(dropCapsBox, !pstyle->isInhHasDropCap());
+		dropCapLines_->setValue(pstyle->dropCapLines(), pstyle->isInhDropCapLines());
+		dropCapLines_->setParentValue(parent->dropCapLines());
+
+		parEffectOffset_->setValue(pstyle->parEffectOffset() * unitRatio, pstyle->isInhParEffectOffset());
+		parEffectOffset_->setParentValue(parent->parEffectOffset() * unitRatio);
+		parEffectIndentBox->setChecked(pstyle->parEffectIndent(),pstyle->isInhParEffectIndent());
+		parEffectIndentBox->setParentValue(parent->parEffectIndent());
+
+		bulletBox->setChecked(pstyle->hasBullet());
+		setWidgetBoldFont(bulletBox, !pstyle->isInhHasBullet());
+		bulletStrEdit_->setEditText(pstyle->bulletStr());
+		setWidgetBoldFont(bulletCharLabel, !pstyle->isInhBulletStr());
+		numBox->setChecked(pstyle->hasNum());
+		setWidgetBoldFont(numBox, !pstyle->isInhHasNum());
+		QString numName = pstyle->numName();
+		if (numName.isEmpty())
+			numName = "default";
+		numComboBox->setCurrentItem(numComboBox->findText(numName), pstyle->isInhNumName());
+		if (!parent->numName().isEmpty())
+			numComboBox->setParentItem(numComboBox->findText(parent->numName()));
+		else
+			numComboBox->setParentItem(0);
+		numFormatCombo->setCurrentItem(pstyle->numFormat());
+		numFormatCombo->setParentItem(parent->numFormat());
+		numLevelSpin->setValue(pstyle->numLevel() +1, pstyle->isInhNumLevel());
+		NumStruct * numS = m_Doc->numerations.value(pstyle->numName());
+		if (numS)
+			numLevelSpin->setMaximum(numS->m_counters.count()+1);
+		else
+			numLevelSpin->setMaximum(1);
+		numLevelSpin->setParentValue(parent->numLevel()+1);
+		numPrefix->setText(pstyle->numPrefix());
+		setWidgetBoldFont(numPrefixLabel, !pstyle->isInhNumPrefix());
+		numSuffix->setText(pstyle->numSuffix());
+		setWidgetBoldFont(numSuffixLabel, !pstyle->isInhNumSuffix());
+		numStartSpin->setValue(pstyle->numStart(), pstyle->isInhNumStart());
+		numStartSpin->setParentValue(parent->numStart());
+		numRestartCombo->setCurrentItem(pstyle->numRestart(), pstyle->isInhNumRestart());
+		numRestartCombo->setParentItem(parent->numRestart());
+		numRestartOtherBox->setChecked(pstyle->numOther(), pstyle->isInhNumOther());
+		numRestartOtherBox->setParentValue(parent->numOther());
+		numRestartHigherBox->setChecked(pstyle->numHigher(), pstyle->isInhNumHigher());
+		numRestartHigherBox->setParentValue(parent->numHigher());
 	}
 	else
 	{
@@ -279,12 +428,41 @@ void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles
 		minSpaceSpin->setValue(pstyle->minWordTracking() * 100.0);
 		minGlyphExtSpin->setValue(pstyle->minGlyphExtension() * 100.0);
 		maxGlyphExtSpin->setValue(pstyle->maxGlyphExtension() * 100.0);
+
+		parEffectOffset_->setValue(pstyle->parEffectOffset() * unitRatio);
+		parEffectIndentBox->setChecked(pstyle->parEffectIndent());
+		parentParEffectsButton->hide();
+		disconnect(parentParEffectsButton, SIGNAL(clicked()), this, SLOT(slotParentParEffects()));
 		dropCapsBox->setChecked(pstyle->hasDropCap());
-		parentDropCapButton->hide();
-		disconnect(parentDropCapButton, SIGNAL(clicked()), this, SLOT(slotParentDropCap()));
+		setWidgetBoldFont(dropCapsBox, false);
 		dropCapLines_->setValue(pstyle->dropCapLines());
-		dropCapOffset_->setValue(pstyle->dropCapOffset() * unitRatio);
-		parentDropCapButton->hide();
+		bulletBox->setChecked(pstyle->hasBullet());
+		setWidgetBoldFont(bulletBox, false);
+		bulletStrEdit_->setEditText(pstyle->bulletStr());
+		setWidgetBoldFont(bulletCharLabel, false);
+		numBox->setChecked(pstyle->hasNum());
+		setWidgetBoldFont(numBox, false);
+		QString numName = pstyle->numName();
+		if (numName.isEmpty())
+			numName = "default";
+		numComboBox->setCurrentItem(numComboBox->findText(numName));
+		numNewLineEdit->clear();
+		numFormatCombo->setCurrentIndex(pstyle->numFormat());
+		numLevelSpin->setValue(pstyle->numLevel()+1);
+		NumStruct * numS = m_Doc->numerations.value(pstyle->numName());
+		if (numS)
+			numLevelSpin->setMaximum(numS->m_counters.count()+1);
+		else
+			numLevelSpin->setMaximum(1);
+		numPrefix->setText(pstyle->numPrefix());
+		setWidgetBoldFont(numPrefixLabel, false);
+		numSuffix->setText(pstyle->numSuffix());
+		setWidgetBoldFont(numSuffixLabel, false);
+		numStartSpin->setValue(pstyle->numStart());
+		numRestartCombo->setCurrentItem(pstyle->numRestart());
+		numRestartOtherBox->setChecked(pstyle->numOther());
+		numRestartHigherBox->setChecked(pstyle->numHigher());
+
 		alignement_->setStyle(pstyle->alignment());
 		tabList_->setTabs(pstyle->tabValues(), unitIndex);
 		tabList_->setLeftIndentValue(pstyle->leftMargin() * unitRatio);
@@ -299,17 +477,13 @@ void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles
 
 	lineSpacing_->setEnabled(pstyle->lineSpacingMode() == ParagraphStyle::FixedLineSpacing);
 	dropCapLines_->setEnabled(pstyle->hasDropCap());
-	dropCapOffset_->setEnabled(pstyle->hasDropCap());
-	dropCapCharStyleCombo->setEnabled(pstyle->hasDropCap());
-	dropCapCharStyleCombo->clear();
-	dropCapCharStyleCombo->addItem(tr("No Style"));
-	for (int i =0; i < cstyles.count(); i++)
-		dropCapCharStyleCombo->addItem(cstyles.at(i).name());
-	setCurrentComboItem(dropCapCharStyleCombo, pstyle->dcCharStyleName().isEmpty() ? tr("No Style") : pstyle->dcCharStyleName());
 
-	QFont f(font());
-	f.setBold(true);
-	parentDropCapButton->setFont(f);
+	checkParEffectState();
+	parEffectCharStyleCombo->clear();
+	parEffectCharStyleCombo->addItem(tr("No Style"));
+	for (int i =0; i < cstyles.count(); i++)
+		parEffectCharStyleCombo->addItem(cstyles.at(i).name());
+	setCurrentComboItem(parEffectCharStyleCombo, pstyle->peCharStyleName().isEmpty() ? tr("No Style") : pstyle->peCharStyleName());
 
 	cpage->parentLabel->setText( tr("Based On:"));
 	cpage->show(&pstyle->charStyle(), cstyles, defLang, unitIndex);
@@ -341,6 +515,8 @@ void SMPStyleWidget::show(ParagraphStyle *pstyle, QList<ParagraphStyle> &pstyles
 	}
 
 	connect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
+	connect(bulletBox, SIGNAL(toggled(bool)), this, SLOT(slotBullets(bool)));
+	connect(numBox, SIGNAL(toggled(bool)), this, SLOT(slotNumbering(bool)));
 }
 
 void SMPStyleWidget::show(QList<ParagraphStyle*> &pstyles, QList<ParagraphStyle> &pstylesAll, QList<CharStyle> &cstyles, int unitIndex, const QString &defLang)
@@ -349,9 +525,12 @@ void SMPStyleWidget::show(QList<ParagraphStyle*> &pstyles, QList<ParagraphStyle>
 		show(pstyles[0], pstylesAll, cstyles, unitIndex, defLang);
 	else if (pstyles.count() > 1)
 	{
+		currPStyle = pstyles[0];
 		showLineSpacing(pstyles);
 		showSpaceAB(pstyles, unitIndex);
 		showDropCap(pstyles, cstyles, unitIndex);
+		showBullet(pstyles, cstyles, unitIndex);
+		showNumeration(pstyles, cstyles, unitIndex);
 		showAlignment(pstyles);
 		showOpticalMargin(pstyles);
 		showMinSpace(pstyles);
@@ -360,6 +539,7 @@ void SMPStyleWidget::show(QList<ParagraphStyle*> &pstyles, QList<ParagraphStyle>
 		showTabs(pstyles, unitIndex);
 		showCStyle(pstyles, cstyles, defLang, unitIndex);
 		showParent(pstyles);
+		checkParEffectState();
 	}
 }
 
@@ -447,10 +627,7 @@ void SMPStyleWidget::showSpaceAB(QList<ParagraphStyle*> &pstyles, int unitIndex)
 
 void SMPStyleWidget::showDropCap(QList<ParagraphStyle*> &pstyles, QList<CharStyle> &cstyles, int unitIndex)
 {
-	double unitRatio = unitGetRatioFromIndex(unitIndex);
-	parentDropCapButton->hide();
-	disconnect(parentDropCapButton, SIGNAL(clicked()), this, SLOT(slotParentDropCap()));
-
+	disconnectPESignals();
 	bool dc = pstyles[0]->hasDropCap();
 	for (int i = 0; i < pstyles.count(); ++i)
 	{
@@ -478,33 +655,76 @@ void SMPStyleWidget::showDropCap(QList<ParagraphStyle*> &pstyles, QList<CharStyl
 	else
 		dropCapLines_->setValue(lines);
 
-	double dco = -4000.0;
+	dropCapsBox->setEnabled(true);
+	dropCapLines_->setEnabled(true);
+	connectPESignals();
+}
+
+void SMPStyleWidget::showBullet(QList<ParagraphStyle *> &pstyles, QList<CharStyle> &cstyles, int unitIndex)
+{
+//	double unitRatio = unitGetRatioFromIndex(unitIndex);
+
+	disconnectPESignals();
+	bool hb = pstyles[0]->hasBullet();
+	for (int i = 0; i < pstyles.count(); ++i)
+	{
+		if (hb != pstyles[i]->hasBullet())
+		{
+			hb = false;
+			break;
+		}
+	}
+	bulletBox->setChecked(hb);
+
+	QString chStr = pstyles[0]->bulletStr();
 	for (int i = 0; i < pstyles.count(); ++i)
 	{
-		if (dco > -3980.0 && !isEqual(pstyles[i]->dropCapOffset(), dco))
+		if (chStr != pstyles[i]->bulletStr())
 		{
-			dco = -4000.0;
+			chStr.clear();
 			break;
 		}
 		else
-			dco = pstyles[i]->dropCapOffset();
+			chStr = pstyles[i]->bulletStr();
 	}
+	bulletStrEdit_->setEditText(chStr);
 
-	if (dco < -3800.0)
-		dropCapOffset_->clear();
-	else
-		dropCapOffset_->setValue(dco * unitRatio);
+	connectPESignals();
+	bulletCharTableButton_->setEnabled(true);
+}
 
-	dropCapCharStyleCombo->clear();
-	dropCapCharStyleCombo->addItem(tr("No Style"));
-	for (int i=0; i < cstyles.count(); i++)
-		dropCapCharStyleCombo->addItem(cstyles.at(i).name());
+void SMPStyleWidget::showNumeration(QList<ParagraphStyle *> &pstyles, QList<CharStyle> &cstyles, int unitIndex)
+{
+	disconnectPESignals();
+	QString prefix = pstyles[0]->numPrefix();
+	for (int i = 0; i < pstyles.count(); ++i)
+	{
+		if (prefix != pstyles[i]->numPrefix())
+		{
+			prefix.clear();
+			break;
+		}
+		else
+			prefix = pstyles[i]->numPrefix();
+	}
+	numPrefix->setText(prefix);
+	
+	QString suffix = pstyles[0]->numSuffix();
+	for (int i = 0; i < pstyles.count(); ++i)
+	{
+		if (suffix != pstyles[i]->numSuffix())
+		{
+			suffix.clear();
+			break;
+		}
+		else
+			suffix = pstyles[i]->numSuffix();
+	}
+	numSuffix->setText(suffix);
 
-	connect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
-	dropCapsBox->setEnabled(true);
-	dropCapLines_->setEnabled(true);
-	dropCapOffset_->setEnabled(true);
-	dropCapCharStyleCombo->setEnabled(true);
+	numFormatCombo->setEnabled(true);
+	numLevelSpin->setEnabled(true);
+	connectPESignals();
 }
 
 void SMPStyleWidget::showAlignment(QList<ParagraphStyle*> &pstyles)
@@ -771,45 +991,12 @@ void SMPStyleWidget::setOpticalMargins(int o, bool inhO, const ParagraphStyle *p
 		optMarginRadioLeft->setParentValue(parent->opticalMargins() ==  ParagraphStyle::OM_LeftHangingPunct);
 		optMarginRadioRight->setParentValue(parent->opticalMargins() ==  ParagraphStyle::OM_RightHangingPunct);
 		optMarginRadioNone->setParentValue(parent->opticalMargins() ==  ParagraphStyle::OM_None);
-// 		optMarginCheckLeftProtruding->setChecked(om & ParagraphStyle::OM_LeftProtruding, (om & ParagraphStyle::OM_LeftProtruding)==(parent->opticalMargins() & ParagraphStyle::OM_LeftProtruding));
-// 		optMarginCheckRightProtruding->setChecked(om & ParagraphStyle::OM_RightProtruding, (om & ParagraphStyle::OM_RightProtruding)==(parent->opticalMargins() & ParagraphStyle::OM_RightProtruding));
-// 		optMarginCheckLeftHangPunct->setChecked(om & ParagraphStyle::OM_LeftHangingPunct, (om & ParagraphStyle::OM_LeftHangingPunct)==(parent->opticalMargins() & ParagraphStyle::OM_LeftHangingPunct));
-// 		optMarginCheckRightHangPunct->setChecked(om & ParagraphStyle::OM_RightHangingPunct, (om & ParagraphStyle::OM_RightHangingPunct)==(parent->opticalMargins() & ParagraphStyle::OM_RightHangingPunct));
-// 
-// 		optMarginCheckLeftProtruding->setParentValue(parent->opticalMargins() & ParagraphStyle::OM_LeftProtruding);
-// 		optMarginCheckRightProtruding->setParentValue(parent->opticalMargins() & ParagraphStyle::OM_RightProtruding);
-// 		optMarginCheckLeftHangPunct->setParentValue(parent->opticalMargins() & ParagraphStyle::OM_LeftHangingPunct);
-// 		optMarginCheckRightHangPunct->setParentValue(parent->opticalMargins() & ParagraphStyle::OM_RightHangingPunct);
-//		optMarginCheckLeftProtruding->setFont(false);
-//		optMarginCheckRightProtruding->setFont(false);
-//		optMarginCheckLeftHangPunct->setFont(false);
-//		optMarginCheckRightHangPunct->setFont(false);
-//
-//		if ((om & ParagraphStyle::OM_LeftProtruding)!=(parent->opticalMargins() & ParagraphStyle::OM_LeftProtruding))
-//		{
-//			optMarginCheckLeftProtruding->setFont(true);
-//		}
-//		if ((om & ParagraphStyle::OM_RightProtruding)!=(parent->opticalMargins() & ParagraphStyle::OM_RightProtruding))
-//		{
-//			optMarginCheckRightProtruding->setFont(true);
-//		}
-//		if ((om & ParagraphStyle::OM_LeftHangingPunct)!=(parent->opticalMargins() & ParagraphStyle::OM_LeftHangingPunct))
-//		{
-//			optMarginCheckLeftHangPunct->setFont(true);
-//		}
-//		if ((om & ParagraphStyle::OM_RightHangingPunct)!=(parent->opticalMargins() & ParagraphStyle::OM_LeftProtruding))
-//		{
-//			optMarginCheckRightHangPunct->setFont(true);
-//		}
 	}
 }
 
+
 void SMPStyleWidget::slotDefaultOpticalMargins()
 {
-// 	optMarginCheckLeftProtruding->setChecked(false);
-// 	optMarginCheckRightProtruding->setChecked(true);
-// 	optMarginCheckLeftHangPunct->setChecked(true);
-// 	optMarginCheckRightHangPunct->setChecked(true);
 	optMarginRadioNone->setChecked(true);
 	if (hasParent_)
 		optMarginParentButton->show();
@@ -818,12 +1005,9 @@ void SMPStyleWidget::slotDefaultOpticalMargins()
 void SMPStyleWidget::slotParentOpticalMargins()
 {
 	disconnect(optMarginParentButton, SIGNAL(clicked()), this, SLOT(slotParentOpticalMargins()));
-//	disconnect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
 	optMarginParentButton->hide();
-//	dropCapsBox->setChecked(parentDropCap_);
 	emit useParentOptMargins();
 	connect(optMarginParentButton, SIGNAL(clicked()), this, SLOT(slotParentOpticalMargins()));
-//	connect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
 }
 
 void SMPStyleWidget::clearAll()
@@ -833,33 +1017,106 @@ void SMPStyleWidget::clearAll()
 
 void SMPStyleWidget::slotDropCap(bool isOn)
 {
+	disconnectPESignals();
 	if (isOn)
 	{
-		dropCapsBox->setEnabled(true);
 		dropCapLines_->setEnabled(true);
-		dropCapOffset_->setEnabled(true);
-		dropCapCharStyleCombo->setEnabled(true);
+
+		bulletBox->setChecked(false);
+		bulletStrEdit_->setEnabled(false);
+		bulletCharTableButton_->setEnabled(false);
+
+		numBox->setChecked(false);
+		numFormatCombo->setEnabled(false);
+		numLevelSpin->setEnabled(false);
+		numComboBox->setEnabled(false);
+		numRestartCombo->setEnabled(false);
+		numNewLineEdit->setEnabled(false);
 	}
 	else
+		dropCapLines_->setEnabled(false);
+	if (hasParent_)
+		parentParEffectsButton->show();
+	checkParEffectState();
+	connectPESignals();
+}
+
+void SMPStyleWidget::slotBullets(bool isOn)
+{
+	disconnectPESignals();
+	if (isOn)
 	{
-		dropCapsBox->setEnabled(true);
+		bulletStrEdit_->setEnabled(true);
+		if (bulletStrEdit_->currentText().isEmpty())
+			bulletStrEdit_->setEditText(bulletStrEdit_->itemText(0));
+		bulletCharTableButton_->setEnabled(true);
+
+		numBox->setChecked(false);
+		numFormatCombo->setEnabled(false);
+		numLevelSpin->setEnabled(false);
+		numComboBox->setEnabled(false);
+		numRestartCombo->setEnabled(false);
+		numNewLineEdit->setEnabled(false);
+
+		dropCapsBox->setChecked(false);
 		dropCapLines_->setEnabled(false);
-		dropCapOffset_->setEnabled(false);
-		dropCapCharStyleCombo->setEnabled(false);
+	}
+	else
+	{
+		bulletStrEdit_->setEnabled(false);
+		bulletCharTableButton_->setEnabled(false);
 	}
 	if (hasParent_)
-		parentDropCapButton->show();
+		parentParEffectsButton->show();
+	checkParEffectState();
+	connectPESignals();
 }
 
-void SMPStyleWidget::slotParentDropCap()
+void SMPStyleWidget::insertSpecialChars(const QString &chars)
 {
-	disconnect(parentDropCapButton, SIGNAL(clicked()), this, SLOT(slotParentDropCap()));
-	disconnect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
-	parentDropCapButton->hide();
-	dropCapsBox->setChecked(parentDropCap_);
-	emit useParentDropCap();
-	connect(parentDropCapButton, SIGNAL(clicked()), this, SLOT(slotParentDropCap()));
-	connect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
+	if (bulletStrEdit_->lineEdit()->hasSelectedText())
+		bulletStrEdit_->lineEdit()->del();
+	bulletStrEdit_->lineEdit()->insert(chars);
+}
+
+void SMPStyleWidget::slotNumbering(bool isOn)
+{
+	disconnectPESignals();
+	if (isOn)
+	{
+		numFormatCombo->setEnabled(true);
+		numLevelSpin->setEnabled(true);
+		numComboBox->setEnabled(true);
+		numRestartCombo->setEnabled(true);
+		numNewLineEdit->setEnabled(true);
+
+		bulletBox->setChecked(false);
+		bulletStrEdit_->setEnabled(false);
+		bulletCharTableButton_->setEnabled(false);
+
+		dropCapsBox->setChecked(false);
+		dropCapLines_->setEnabled(false);
+	}
+	else
+	{
+		numFormatCombo->setEnabled(false);
+		numLevelSpin->setEnabled(false);
+	}
+	if (hasParent_)
+		parentParEffectsButton->show();
+	checkParEffectState();
+	connectPESignals();
+}
+
+void SMPStyleWidget::slotParentParEffects()
+{
+	disconnectPESignals();
+	parentParEffectsButton->hide();
+	dropCapsBox->setChecked(parentDC_);
+	bulletBox->setChecked(parentBul_);
+	numBox->setChecked(parentNum_);
+	emit useParentParaEffects();
+	connectPESignals();
 }
 
 SMPStyleWidget::~SMPStyleWidget()
@@ -867,5 +1124,62 @@ SMPStyleWidget::~SMPStyleWidget()
 	
 }
 
+void SMPStyleWidget::openEnhanced()
+{
+	if (m_enhanced)
+		return;
+
+	QApplication::changeOverrideCursor(QCursor(Qt::WaitCursor));
+	m_enhanced = new CharSelectEnhanced(this);
+	m_enhanced->setModal(true);
+	connect(m_enhanced, SIGNAL(insertSpecialChars(const QString &)), this, SLOT(insertSpecialChars(const QString &)));
+	connect(m_enhanced, SIGNAL(paletteShown(bool)), bulletCharTableButton_, SLOT(setChecked(bool)));
+	m_enhanced->setDoc(m_Doc);
+	m_enhanced->setEnabled(true);
+	QString styleName = parEffectCharStyleCombo->currentText();
+	if (styleName != tr("No Style") && !styleName.isEmpty())
+	{
+		CharStyle chStyle = m_Doc->charStyle(styleName);
+		setCurrentComboItem(m_enhanced->fontSelector, chStyle.font().scName());
+	}
+	else if (currPStyle)
+		setCurrentComboItem(m_enhanced->fontSelector, currPStyle->charStyle().font().scName());
+	m_enhanced->newFont(m_enhanced->fontSelector->currentIndex());
+	m_enhanced->show();
+	QApplication::changeOverrideCursor(Qt::ArrowCursor);
+}
+
+void SMPStyleWidget::closeEnhanced(bool show)
+{
+	if (!m_enhanced || show)
+		return;
+	disconnect(m_enhanced, SIGNAL(insertSpecialChars(const QString &)), this, SLOT(insertSpecialChars(const QString &)));
+	disconnect(m_enhanced, SIGNAL(paletteShown(bool)), bulletCharTableButton_, SLOT(setChecked(bool)));
+	m_enhanced->close();
+	delete m_enhanced;
+	m_enhanced = NULL;
+}
+
+void SMPStyleWidget::connectPESignals()
+{
+	connect(parentParEffectsButton, SIGNAL(clicked()), this, SLOT(slotParentParEffects()));
+	connect(bulletBox, SIGNAL(toggled(bool)), this, SLOT(slotBullets(bool)));
+	connect(numBox, SIGNAL(toggled(bool)), this, SLOT(slotNumbering(bool)));
+	connect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
+}
 
+void SMPStyleWidget::disconnectPESignals()
+{
+	disconnect(parentParEffectsButton, SIGNAL(clicked()), this, SLOT(slotParentParEffects()));
+	disconnect(bulletBox, SIGNAL(toggled(bool)), this, SLOT(slotBullets(bool)));
+	disconnect(numBox, SIGNAL(toggled(bool)), this, SLOT(slotNumbering(bool)));
+	disconnect(dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
+}
 
+void SMPStyleWidget::on_bulletCharTableButton__toggled(bool checked)
+{
+	if (m_enhanced && !checked)
+		closeEnhanced();
+	else if (!m_enhanced && checked)
+		openEnhanced();
+}
diff --git a/Scribus/scribus/ui/smpstylewidget.h b/Scribus/scribus/ui/smpstylewidget.h
index 4cd688b..3155ea9 100644
--- a/Scribus/scribus/ui/smpstylewidget.h
+++ b/Scribus/scribus/ui/smpstylewidget.h
@@ -9,9 +9,9 @@ for which a new license (GPL+exception) is in place.
 #define SMPSTYLEWIDGET_H
 
 class QEvent;
-
 #include "ui_smpstylewidget.h"
 
+#include "ui/charselectenhanced.h"
 // #include "styles/styleset.h"
 
 
@@ -19,7 +19,7 @@ class SMPStyleWidget : public QWidget, Ui::SMPStyleWidget
 {
 	Q_OBJECT
 public:
-	SMPStyleWidget();
+	SMPStyleWidget(ScribusDoc *doc);
 	~SMPStyleWidget();
 	
 	virtual void changeEvent(QEvent *e);
@@ -30,14 +30,27 @@ public:
 	void clearAll();
 	void languageChange();
 	void unitChange(double oldRatio, double newRatio, int unitIndex);
+	void setDoc(ScribusDoc* doc) { m_Doc = doc; }
 
 private:
 	bool hasParent_;
-	bool parentDropCap_;
+	//bool parentParEffects_;
+	bool parentDC_, parentBul_, parentNum_;
+	CharSelectEnhanced * m_enhanced;
+	ScribusDoc * m_Doc;
+	QString currFontName;
+	ParagraphStyle* currPStyle;
 
+	void fillBulletStrEditCombo();
+	void fillNumFormatCombo();
+	void fillNumerationsCombo(QList<ParagraphStyle> &pstyles);
+	void fillNumRestartCombo();
+	void checkParEffectState();
 	void showLineSpacing(QList<ParagraphStyle*> &pstyles);
 	void showSpaceAB(QList<ParagraphStyle*> &pstyles, int unitIndex);
 	void showDropCap(QList<ParagraphStyle*> &pstyles, QList<CharStyle> &cstyles, int unitIndex);
+	void showBullet(QList<ParagraphStyle*> &pstyles, QList<CharStyle> &cstyles, int unitIndex);
+	void showNumeration(QList<ParagraphStyle*> &pstyles, QList<CharStyle> &cstyles, int unitIndex);
 	void showAlignment(QList<ParagraphStyle*> &pstyles);
 	void showOpticalMargin(QList<ParagraphStyle*> &pstyles);
 	void showMinSpace(QList<ParagraphStyle*> &pstyles);
@@ -48,19 +61,27 @@ private:
 	void showParent(QList<ParagraphStyle*> &pstyles);
 	void setOpticalMargins(int o, bool inhO=false, const ParagraphStyle *parent=NULL);
 
+	void openEnhanced();
+	void closeEnhanced(bool show = false);
+	void connectPESignals();
+	void disconnectPESignals();
+
 	friend class SMParagraphStyle;
 
 private slots:
 	void slotLineSpacingModeChanged(int);
 	void slotDropCap(bool isOn);
-	void slotParentDropCap();
+	void slotBullets(bool isOn);
+	void insertSpecialChars(const QString &);
+	void slotNumbering(bool isOn);
+	void slotParentParEffects();
 	void slotDefaultOpticalMargins();
 	void slotParentOpticalMargins();
 //	void slotUpdateOpticalMarginsFromCheckBoxes(int);
-
+	void on_bulletCharTableButton__toggled(bool checked);
 
 signals:
-	void useParentDropCap();
+	void useParentParaEffects();
 	void useParentOptMargins();
 };
 
diff --git a/Scribus/scribus/ui/smpstylewidget.ui b/Scribus/scribus/ui/smpstylewidget.ui
index 00654ac..fea9615 100644
--- a/Scribus/scribus/ui/smpstylewidget.ui
+++ b/Scribus/scribus/ui/smpstylewidget.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>792</width>
-    <height>717</height>
+    <width>798</width>
+    <height>755</height>
    </rect>
   </property>
   <layout class="QVBoxLayout">
@@ -234,47 +234,25 @@
             </widget>
            </item>
            <item>
-            <widget class="QGroupBox" name="dropCapsBox">
-             <property name="sizePolicy">
-              <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
-               <horstretch>0</horstretch>
-               <verstretch>0</verstretch>
-              </sizepolicy>
-             </property>
+            <widget class="QGroupBox" name="parEffectsBox">
              <property name="title">
-              <string>Drop Caps</string>
+              <string>Paragraph Effects</string>
              </property>
-             <property name="checkable">
-              <bool>true</bool>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-             <layout class="QVBoxLayout">
+             <layout class="QVBoxLayout" name="verticalLayout_6">
               <item>
-               <layout class="QHBoxLayout">
+               <layout class="QHBoxLayout" name="horizontalLayout_13">
                 <item>
-                 <widget class="QLabel" name="dropCapsLineLabel">
+                 <widget class="QLabel" name="parEffectCharStyleComboLabel">
                   <property name="text">
-                   <string>&amp;Lines:</string>
-                  </property>
-                  <property name="buddy">
-                   <cstring>dropCapLines_</cstring>
+                   <string>Character Style for Effect:</string>
                   </property>
                  </widget>
                 </item>
                 <item>
-                 <widget class="SMSpinBox" name="dropCapLines_">
-                  <property name="minimum">
-                   <number>2</number>
-                  </property>
-                  <property name="maximum">
-                   <number>20</number>
-                  </property>
-                 </widget>
+                 <widget class="SMScComboBox" name="parEffectCharStyleCombo"/>
                 </item>
                 <item>
-                 <spacer name="horizontalSpacer_2">
+                 <spacer name="spacer_6">
                   <property name="orientation">
                    <enum>Qt::Horizontal</enum>
                   </property>
@@ -292,12 +270,12 @@
                    <string>Distance from Text:</string>
                   </property>
                   <property name="buddy">
-                   <cstring>dropCapOffset_</cstring>
+                   <cstring>parEffectOffset_</cstring>
                   </property>
                  </widget>
                 </item>
                 <item>
-                 <widget class="SMScrSpinBox" name="dropCapOffset_">
+                 <widget class="SMScrSpinBox" name="parEffectOffset_">
                   <property name="minimum">
                    <number>-3000</number>
                   </property>
@@ -319,86 +297,368 @@
                   </property>
                  </spacer>
                 </item>
+                <item>
+                 <widget class="SMCheckBox" name="parEffectIndentBox">
+                  <property name="text">
+                   <string>AutoIndent</string>
+                  </property>
+                 </widget>
+                </item>
                </layout>
               </item>
               <item>
-               <widget class="QLabel" name="dropCapCharStyleComboLabel">
-                <property name="text">
-                 <string>Character Style for Drop Cap:</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="SMScComboBox" name="dropCapCharStyleCombo"/>
+               <layout class="QHBoxLayout" name="horizontalLayout_12">
+                <item>
+                 <spacer name="spacer_10">
+                  <property name="orientation">
+                   <enum>Qt::Horizontal</enum>
+                  </property>
+                  <property name="sizeHint" stdset="0">
+                   <size>
+                    <width>40</width>
+                    <height>20</height>
+                   </size>
+                  </property>
+                 </spacer>
+                </item>
+                <item>
+                 <widget class="QToolButton" name="parentParEffectsButton">
+                  <property name="enabled">
+                   <bool>true</bool>
+                  </property>
+                  <property name="text">
+                   <string>Use Parent`s Values</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
               </item>
               <item>
-               <widget class="QToolButton" name="parentDropCapButton">
-                <property name="enabled">
-                 <bool>true</bool>
+               <widget class="QGroupBox" name="bulletBox">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
                 </property>
-                <property name="text">
-                 <string>Use Parent Value</string>
+                <property name="title">
+                 <string>Bullets</string>
                 </property>
-               </widget>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QGroupBox" name="textFlowBox">
-             <property name="title">
-              <string>Orphans and Widows</string>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_2">
-              <item row="0" column="0">
-               <widget class="QLabel" name="keepLabelStart">
-                <property name="toolTip">
-                 <string>Ensure that first lines of a paragraph won't end up separated from the rest (known as widow/orphan control)</string>
+                <property name="checkable">
+                 <bool>true</bool>
                 </property>
-                <property name="text">
-                 <string>Don't separate first</string>
+                <property name="checked">
+                 <bool>false</bool>
                 </property>
+                <layout class="QVBoxLayout" name="verticalLayout">
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_7">
+                   <item>
+                    <widget class="QLabel" name="bulletCharLabel">
+                     <property name="text">
+                      <string>Bullet Char/String</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMScComboBox" name="bulletStrEdit_">
+                     <property name="sizePolicy">
+                      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+                       <horstretch>0</horstretch>
+                       <verstretch>0</verstretch>
+                      </sizepolicy>
+                     </property>
+                     <property name="minimumSize">
+                      <size>
+                       <width>50</width>
+                       <height>0</height>
+                      </size>
+                     </property>
+                     <property name="editable">
+                      <bool>true</bool>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="spacer">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                   <item>
+                    <widget class="QPushButton" name="bulletCharTableButton_">
+                     <property name="sizePolicy">
+                      <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+                       <horstretch>0</horstretch>
+                       <verstretch>0</verstretch>
+                      </sizepolicy>
+                     </property>
+                     <property name="text">
+                      <string>Char Table</string>
+                     </property>
+                     <property name="checkable">
+                      <bool>true</bool>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="spacer_2">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
                </widget>
               </item>
-              <item row="0" column="1">
-               <widget class="SMSpinBox" name="keepLinesStart">
-                <property name="suffix">
-                 <string> lines</string>
+              <item>
+               <widget class="QGroupBox" name="numBox">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
                 </property>
-                <property name="maximum">
-                 <number>10</number>
+                <property name="title">
+                 <string>Numeration</string>
                 </property>
-               </widget>
-              </item>
-              <item row="1" column="0">
-               <widget class="QLabel" name="keepLabelEnd">
-                <property name="text">
-                 <string>Don't separate last</string>
+                <property name="checkable">
+                 <bool>true</bool>
+                </property>
+                <property name="checked">
+                 <bool>false</bool>
                 </property>
+                <layout class="QVBoxLayout" name="verticalLayout_5">
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_9">
+                   <item>
+                    <widget class="QLabel" name="numComboLabel">
+                     <property name="text">
+                      <string>Set:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMScComboBox" name="numComboBox">
+                     <property name="currentIndex">
+                      <number>-1</number>
+                     </property>
+                     <property name="minimumContentsLength">
+                      <number>10</number>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLabel" name="numLevelLabel">
+                     <property name="text">
+                      <string>Level</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMSpinBox" name="numLevelSpin"/>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_4">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                   <item>
+                    <widget class="QLabel" name="numNewLabel">
+                     <property name="text">
+                      <string>Create New Set:</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="numNewLineEdit"/>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_10">
+                   <item>
+                    <widget class="QLabel" name="numFormatLabel">
+                     <property name="text">
+                      <string>Nums Format</string>
+                     </property>
+                     <property name="buddy">
+                      <cstring>numFormatCombo</cstring>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMScComboBox" name="numFormatCombo">
+                     <property name="sizePolicy">
+                      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+                       <horstretch>0</horstretch>
+                       <verstretch>0</verstretch>
+                      </sizepolicy>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLabel" name="numStartLabel">
+                     <property name="text">
+                      <string>Start with</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMSpinBox" name="numStartSpin">
+                     <property name="maximum">
+                      <number>99999</number>
+                     </property>
+                     <property name="value">
+                      <number>1</number>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLabel" name="numPrefixLabel">
+                     <property name="text">
+                      <string>Prefix</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="numPrefix"/>
+                   </item>
+                   <item>
+                    <widget class="QLabel" name="numSuffixLabel">
+                     <property name="text">
+                      <string>Suffix</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="QLineEdit" name="numSuffix"/>
+                   </item>
+                  </layout>
+                 </item>
+                 <item>
+                  <layout class="QHBoxLayout" name="horizontalLayout_8">
+                   <item>
+                    <widget class="QLabel" name="numRestartLabel">
+                     <property name="text">
+                      <string>Restart</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMScComboBox" name="numRestartCombo"/>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_3">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                   <item>
+                    <widget class="SMCheckBox" name="numRestartOtherBox">
+                     <property name="text">
+                      <string>Restart after other format</string>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMCheckBox" name="numRestartHigherBox">
+                     <property name="text">
+                      <string>Restart after higher level</string>
+                     </property>
+                    </widget>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
                </widget>
               </item>
-              <item row="1" column="1">
-               <widget class="SMSpinBox" name="keepLinesEnd">
-                <property name="suffix">
-                 <string> lines</string>
+              <item>
+               <widget class="QGroupBox" name="dropCapsBox">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
                 </property>
-                <property name="maximum">
-                 <number>10</number>
+                <property name="title">
+                 <string>Drop Caps</string>
                 </property>
-               </widget>
-              </item>
-              <item row="2" column="0" colspan="2">
-               <widget class="SMCheckBox" name="keepTogether">
-                <property name="text">
-                 <string>Do not split paragraph</string>
+                <property name="checkable">
+                 <bool>true</bool>
                 </property>
-               </widget>
-              </item>
-              <item row="3" column="0" colspan="2">
-               <widget class="SMCheckBox" name="keepWithNext">
-                <property name="text">
-                 <string>Keep with next paragraph</string>
+                <property name="checked">
+                 <bool>true</bool>
                 </property>
+                <layout class="QVBoxLayout">
+                 <item>
+                  <layout class="QHBoxLayout">
+                   <item>
+                    <widget class="QLabel" name="dropCapsLineLabel">
+                     <property name="text">
+                      <string>&amp;Lines:</string>
+                     </property>
+                     <property name="buddy">
+                      <cstring>dropCapLines_</cstring>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <widget class="SMSpinBox" name="dropCapLines_">
+                     <property name="minimum">
+                      <number>2</number>
+                     </property>
+                     <property name="maximum">
+                      <number>20</number>
+                     </property>
+                    </widget>
+                   </item>
+                   <item>
+                    <spacer name="horizontalSpacer_2">
+                     <property name="orientation">
+                      <enum>Qt::Horizontal</enum>
+                     </property>
+                     <property name="sizeHint" stdset="0">
+                      <size>
+                       <width>40</width>
+                       <height>20</height>
+                      </size>
+                     </property>
+                    </spacer>
+                   </item>
+                  </layout>
+                 </item>
+                </layout>
                </widget>
               </item>
              </layout>
@@ -415,7 +675,7 @@
              <property name="sizeHint" stdset="0">
               <size>
                <width>272</width>
-               <height>0</height>
+               <height>13</height>
               </size>
              </property>
             </spacer>
@@ -627,6 +887,79 @@
             </widget>
            </item>
            <item>
+            <widget class="Line" name="line">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="textFlowBox">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="title">
+              <string>Orphans and Widows</string>
+             </property>
+             <layout class="QGridLayout" name="gridLayout_2">
+              <item row="1" column="1">
+               <widget class="SMSpinBox" name="keepLinesEnd">
+                <property name="suffix">
+                 <string> lines</string>
+                </property>
+                <property name="maximum">
+                 <number>10</number>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="keepLabelEnd">
+                <property name="text">
+                 <string>Don't separate last</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="SMSpinBox" name="keepLinesStart">
+                <property name="suffix">
+                 <string> lines</string>
+                </property>
+                <property name="maximum">
+                 <number>10</number>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="0">
+               <widget class="QLabel" name="keepLabelStart">
+                <property name="toolTip">
+                 <string>Ensure that first lines of a paragraph won't end up separated from the rest (known as widow/orphan control)</string>
+                </property>
+                <property name="text">
+                 <string>Don't separate first</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0" colspan="2">
+               <widget class="SMCheckBox" name="keepTogether">
+                <property name="text">
+                 <string>Do not split paragraph</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="0" colspan="2">
+               <widget class="SMCheckBox" name="keepWithNext">
+                <property name="text">
+                 <string>Keep with next paragraph</string>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
             <spacer>
              <property name="orientation">
               <enum>Qt::Vertical</enum>
@@ -749,6 +1082,16 @@
    <header>ui/smsccombobox.h</header>
   </customwidget>
   <customwidget>
+   <class>SMRadioButton</class>
+   <extends>QRadioButton</extends>
+   <header>ui/smradiobutton.h</header>
+  </customwidget>
+  <customwidget>
+   <class>SMCheckBox</class>
+   <extends>QCheckBox</extends>
+   <header>ui/smcheckbox.h</header>
+  </customwidget>
+  <customwidget>
    <class>SMScrSpinBox</class>
    <extends>QSpinBox</extends>
    <header>ui/smscrspinbox.h</header>
@@ -776,16 +1119,6 @@
    <header>ui/smcstylewidget.h</header>
    <container>1</container>
   </customwidget>
-  <customwidget>
-   <class>SMRadioButton</class>
-   <extends>QRadioButton</extends>
-   <header>ui/smradiobutton.h</header>
-  </customwidget>
-  <customwidget>
-   <class>SMCheckBox</class>
-   <extends>QCheckBox</extends>
-   <header>ui/smcheckbox.h</header>
-  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/Scribus/scribus/ui/smtextstyles.cpp b/Scribus/scribus/ui/smtextstyles.cpp
index e5cbf48..54472e9 100644
--- a/Scribus/scribus/ui/smtextstyles.cpp
+++ b/Scribus/scribus/ui/smtextstyles.cpp
@@ -45,7 +45,7 @@ SMParagraphStyle::SMParagraphStyle(StyleSet<CharStyle> *cstyles) : StyleItem(),
 pwidget_(0), doc_(0), selectionIsDirty_(false), unitRatio_(1.0), cstyles_(cstyles)
 {
 	Q_ASSERT(cstyles_);
-	pwidget_ = new SMPStyleWidget();
+	pwidget_ = new SMPStyleWidget(doc_);
 	Q_CHECK_PTR(pwidget_);
 }
 
@@ -87,6 +87,8 @@ void SMParagraphStyle::setCurrentDoc(ScribusDoc *doc)
 		tmpStyles_.clear();
 		deleted_.clear();
 	}
+	if (pwidget_)
+		pwidget_->setDoc(doc);
 }
 
 StyleSet<ParagraphStyle>* SMParagraphStyle::tmpStyles()
@@ -512,11 +514,27 @@ void SMParagraphStyle::setupConnections()
 	connect(pwidget_->minGlyphExtSpin, SIGNAL(valueChanged(double)),this,SLOT(slotMinGlyphExt()));
 	connect(pwidget_->maxGlyphExtSpin, SIGNAL(valueChanged(double)),this,SLOT(slotMaxGlyphExt()));
 
-	connect(pwidget_, SIGNAL(useParentDropCap()), this, SLOT(slotParentDropCap()));
+	connect(pwidget_, SIGNAL(useParentParaEffects()), this, SLOT(slotParentParaEffects()));
 	connect(pwidget_->dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
 	connect(pwidget_->dropCapLines_, SIGNAL(valueChanged(int)), this, SLOT(slotDropCapLines(int)));
-	connect(pwidget_->dropCapOffset_, SIGNAL(valueChanged(double)), this, SLOT(slotDropCapOffset()));
-	connect(pwidget_->dropCapCharStyleCombo, SIGNAL(activated(const QString&)), this, SLOT(slotDropCapCharStyle(const QString&)));
+	connect(pwidget_->parEffectOffset_, SIGNAL(valueChanged(double)), this, SLOT(slotParEffectOffset()));
+	connect(pwidget_->parEffectIndentBox, SIGNAL(toggled(bool)), this, SLOT(slotParEffectIndent(bool)));
+	connect(pwidget_->parEffectCharStyleCombo, SIGNAL(activated(const QString&)), this, SLOT(slotParEffectCharStyle(const QString&)));
+
+	connect(pwidget_->bulletBox, SIGNAL(toggled(bool)), this, SLOT(slotBullet(bool)));
+	connect(pwidget_->bulletStrEdit_, SIGNAL(editTextChanged(QString)), this, SLOT(slotBulletStr(QString)));
+	connect(pwidget_->numBox, SIGNAL(toggled(bool)), this, SLOT(slotNumeration(bool)));
+	connect(pwidget_->numComboBox, SIGNAL(activated(QString)), this, SLOT(slotNumName(QString)));
+	connect(pwidget_->numLevelSpin, SIGNAL(valueChanged(int)), this, SLOT(slotNumLevel(int)));
+	connect(pwidget_->numFormatCombo, SIGNAL(activated(int)), this, SLOT(slotNumFormat(int)));
+	connect(pwidget_->numStartSpin, SIGNAL(valueChanged(int)), this, SLOT(slotNumStart(int)));
+	connect(pwidget_->numRestartCombo, SIGNAL(activated(int)), this, SLOT(slotNumRestart(int)));
+	connect(pwidget_->numRestartOtherBox, SIGNAL(toggled(bool)), this, SLOT(slotNumOther(bool)));
+	connect(pwidget_->numRestartHigherBox, SIGNAL(toggled(bool)), this, SLOT(slotNumHigher(bool)));
+	connect(pwidget_->numPrefix, SIGNAL(textChanged(QString)), this, SLOT(slotNumPrefix(QString)));
+	connect(pwidget_->numSuffix, SIGNAL(textChanged(QString)), this, SLOT(slotNumSuffix(QString)));
+	connect(pwidget_->numNewLineEdit, SIGNAL(editingFinished()), this, SLOT(slotNumNew()));
+	connect(pwidget_->numNewLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSelectionDirty()));
 
 	connect(pwidget_->keepLinesStart, SIGNAL(valueChanged(int)), this, SLOT(handleKeepLinesStart()));
 	connect(pwidget_->keepLinesEnd, SIGNAL(valueChanged(int)), this, SLOT(handleKeepLinesEnd()));
@@ -529,26 +547,18 @@ void SMParagraphStyle::setupConnections()
 	connect(pwidget_->tabList_->right_, SIGNAL(valueChanged(double)), this, SLOT(slotRightIndent()));
 	connect(pwidget_->tabList_->first_, SIGNAL(valueChanged(double)), this, SLOT(slotFirstLine()));
 
-	connect(pwidget_->parentCombo, SIGNAL(activated(const QString&)),
-			this, SLOT(slotParentChanged(const QString&)));
+	connect(pwidget_->parentCombo, SIGNAL(activated(const QString&)), this, SLOT(slotParentChanged(const QString&)));
 
 	// character attributes
 	connect(pwidget_->cpage->fontFace_, SIGNAL(fontSelected(QString)), this, SLOT(slotFont(QString)));
 	connect(pwidget_->cpage->effects_, SIGNAL(State(int)), this, SLOT(slotEffects(int)));
-	connect(pwidget_->cpage->effects_->ShadowVal->Xoffset, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	connect(pwidget_->cpage->effects_->ShadowVal->Yoffset, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	connect(pwidget_->cpage->effects_->OutlineVal->LWidth, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	connect(pwidget_->cpage->effects_->UnderlineVal->LPos, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	connect(pwidget_->cpage->effects_->UnderlineVal->LWidth, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	connect(pwidget_->cpage->effects_->StrikeVal->LPos, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	connect(pwidget_->cpage->effects_->StrikeVal->LWidth, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->ShadowVal->Xoffset, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->ShadowVal->Yoffset, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->OutlineVal->LWidth, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->UnderlineVal->LPos, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->UnderlineVal->LWidth, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->StrikeVal->LPos, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	connect(pwidget_->cpage->effects_->StrikeVal->LWidth, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
 	connect(pwidget_->cpage->fillColor_, SIGNAL(activated(const QString&)), this, SLOT(slotFillColor()));
 	connect(pwidget_->cpage->fillShade_, SIGNAL(clicked()), this, SLOT(slotFillShade()));
 	connect(pwidget_->cpage->strokeColor_, SIGNAL(activated(const QString&)), this, SLOT(slotStrokeColor()));
@@ -561,8 +571,7 @@ void SMParagraphStyle::setupConnections()
 	connect(pwidget_->cpage->widthSpaceSpin, SIGNAL(valueChanged(double)), this, SLOT(slotWordTracking()));
 	connect(pwidget_->cpage->baselineOffset_, SIGNAL(valueChanged(double)), this, SLOT(slotBaselineOffset()));
 	connect(pwidget_->cpage->fontFace_, SIGNAL(fontSelected(QString)), this, SLOT(slotFont(QString)));
-	connect(pwidget_->cpage->parentCombo, SIGNAL(activated(const QString&)),
-			this, SLOT(slotCharParentChanged(const QString&)));
+	connect(pwidget_->cpage->parentCombo, SIGNAL(activated(const QString&)), this, SLOT(slotCharParentChanged(const QString&)));
 }
 
 void SMParagraphStyle::removeConnections()
@@ -590,14 +599,29 @@ void SMParagraphStyle::removeConnections()
 	disconnect(pwidget_->minGlyphExtSpin, SIGNAL(valueChanged(double)),this,SLOT(slotMinGlyphExt()));
 	disconnect(pwidget_->maxGlyphExtSpin, SIGNAL(valueChanged(double)),this,SLOT(slotMaxGlyphExt()));
 	
-	disconnect(pwidget_, SIGNAL(useParentDropCap()), this, SLOT(slotParentDropCap()));
+	disconnect(pwidget_, SIGNAL(useParentParaEffects()), this, SLOT(slotParentParaEffects()));
 	disconnect(pwidget_->dropCapsBox, SIGNAL(toggled(bool)), this, SLOT(slotDropCap(bool)));
 	disconnect(pwidget_->dropCapLines_, SIGNAL(valueChanged(int)), this, SLOT(slotDropCapLines(int)));
-	disconnect(pwidget_->dropCapOffset_, SIGNAL(valueChanged(double)), this, SLOT(slotDropCapOffset()));
-	disconnect(pwidget_->dropCapCharStyleCombo, SIGNAL(activated(const QString&)), this, SLOT(slotDropCapCharStyle(const QString&)));
-
-	disconnect(pwidget_->parentCombo, SIGNAL(activated(const QString&)),
-			this, SLOT(slotParentChanged(const QString&)));
+	disconnect(pwidget_->parEffectOffset_, SIGNAL(valueChanged(double)), this, SLOT(slotParEffectOffset()));
+	disconnect(pwidget_->parEffectIndentBox, SIGNAL(toggled(bool)), this, SLOT(slotParEffectIndent(bool)));
+	disconnect(pwidget_->parEffectCharStyleCombo, SIGNAL(activated(const QString&)), this, SLOT(slotParEffectCharStyle(const QString&)));
+
+	disconnect(pwidget_->bulletBox, SIGNAL(toggled(bool)), this, SLOT(slotBullet(bool)));
+	disconnect(pwidget_->bulletStrEdit_, SIGNAL(editTextChanged(QString)), this, SLOT(slotBulletStr(QString)));
+	disconnect(pwidget_->numBox, SIGNAL(toggled(bool)), this, SLOT(slotNumeration(bool)));
+	disconnect(pwidget_->numComboBox, SIGNAL(activated(QString)), this, SLOT(slotNumName(QString)));
+	disconnect(pwidget_->numFormatCombo, SIGNAL(activated(int)), this, SLOT(slotNumFormat(int)));
+	disconnect(pwidget_->numLevelSpin, SIGNAL(valueChanged(int)), this, SLOT(slotNumLevel(int)));
+	disconnect(pwidget_->numStartSpin, SIGNAL(valueChanged(int)), this, SLOT(slotNumStart(int)));
+	disconnect(pwidget_->numRestartCombo, SIGNAL(activated(int)), this, SLOT(slotNumRestart(int)));
+	disconnect(pwidget_->numRestartOtherBox, SIGNAL(toggled(bool)), this, SLOT(slotNumOther(bool)));
+	disconnect(pwidget_->numRestartHigherBox, SIGNAL(toggled(bool)), this, SLOT(slotNumHigher(bool)));
+	disconnect(pwidget_->numPrefix, SIGNAL(textChanged(QString)), this, SLOT(slotNumPrefix(QString)));
+	disconnect(pwidget_->numSuffix, SIGNAL(textChanged(QString)), this, SLOT(slotNumSuffix(QString)));
+	disconnect(pwidget_->numNewLineEdit, SIGNAL(editingFinished()), this, SLOT(slotNumNew()));
+	disconnect(pwidget_->numNewLineEdit, SIGNAL(textChanged(QString)), this, SLOT(slotSelectionDirty()));
+	
+	disconnect(pwidget_->parentCombo, SIGNAL(activated(const QString&)), this, SLOT(slotParentChanged(const QString&)));
 
 	disconnect(pwidget_->keepLinesStart, SIGNAL(valueChanged(int)), this, SLOT(handleKeepLinesStart()));
 	disconnect(pwidget_->keepLinesEnd, SIGNAL(valueChanged(int)), this, SLOT(handleKeepLinesEnd()));
@@ -611,20 +635,13 @@ void SMParagraphStyle::removeConnections()
 
 	disconnect(pwidget_->cpage->fontFace_, SIGNAL(fontSelected(QString)), this, SLOT(slotFont(QString)));
 	disconnect(pwidget_->cpage->effects_, SIGNAL(State(int)), this, SLOT(slotEffects(int)));
-	disconnect(pwidget_->cpage->effects_->ShadowVal->Xoffset, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	disconnect(pwidget_->cpage->effects_->ShadowVal->Yoffset, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	disconnect(pwidget_->cpage->effects_->OutlineVal->LWidth, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	disconnect(pwidget_->cpage->effects_->UnderlineVal->LPos, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	disconnect(pwidget_->cpage->effects_->UnderlineVal->LWidth, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	disconnect(pwidget_->cpage->effects_->StrikeVal->LPos, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
-	disconnect(pwidget_->cpage->effects_->StrikeVal->LWidth, SIGNAL(valueChanged(double)),
-			this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->ShadowVal->Xoffset, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->ShadowVal->Yoffset, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->OutlineVal->LWidth, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->UnderlineVal->LPos, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->UnderlineVal->LWidth, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->StrikeVal->LPos, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
+	disconnect(pwidget_->cpage->effects_->StrikeVal->LWidth, SIGNAL(valueChanged(double)), this, SLOT(slotEffectProperties()));
 	disconnect(pwidget_->cpage->fillColor_, SIGNAL(activated(const QString&)), this, SLOT(slotFillColor()));
 	disconnect(pwidget_->cpage->fillShade_, SIGNAL(clicked()), this, SLOT(slotFillShade()));
 	disconnect(pwidget_->cpage->strokeColor_, SIGNAL(activated(const QString&)), this, SLOT(slotStrokeColor()));
@@ -637,8 +654,7 @@ void SMParagraphStyle::removeConnections()
 	disconnect(pwidget_->cpage->widthSpaceSpin, SIGNAL(valueChanged(double)), this, SLOT(slotWordTracking()));
 	disconnect(pwidget_->cpage->baselineOffset_, SIGNAL(valueChanged(double)), this, SLOT(slotBaselineOffset()));
 	disconnect(pwidget_->cpage->fontFace_, SIGNAL(fontSelected(QString)), this, SLOT(slotFont(QString)));
-	disconnect(pwidget_->cpage->parentCombo, SIGNAL(activated(const QString&)),
-			this, SLOT(slotCharParentChanged(const QString&)));
+	disconnect(pwidget_->cpage->parentCombo, SIGNAL(activated(const QString&)), this, SLOT(slotCharParentChanged(const QString&)));
 }
 
 void SMParagraphStyle::slotLineSpacingMode(int mode)
@@ -854,8 +870,15 @@ void SMParagraphStyle::slotMaxGlyphExt()
 void SMParagraphStyle::slotDropCap(bool isOn)
 {
 	for (int i = 0; i < selection_.count(); ++i)
+	{
 		selection_[i]->setHasDropCap(isOn);
-
+		if (isOn)
+		{
+			selection_[i]->setHasBullet(false);
+			selection_[i]->setHasNum(false);
+		}
+	}
+	
 	if (!selectionIsDirty_)
 	{
 		selectionIsDirty_ = true;
@@ -863,11 +886,15 @@ void SMParagraphStyle::slotDropCap(bool isOn)
 	}
 }
 
-void SMParagraphStyle::slotParentDropCap()
+void SMParagraphStyle::slotParentParaEffects()
 {
 	for (int i = 0; i < selection_.count(); ++i)
+	{
 		selection_[i]->resetHasDropCap();
-
+		selection_[i]->resetHasBullet();
+		selection_[i]->resetHasNum();
+	}
+	
 	if (!selectionIsDirty_)
 	{
 		selectionIsDirty_ = true;
@@ -891,20 +918,38 @@ void SMParagraphStyle::slotDropCapLines(int lines)
 	}
 }
 
-void SMParagraphStyle::slotDropCapOffset()
+void SMParagraphStyle::slotParEffectOffset()
 {
-	if (pwidget_->dropCapOffset_->useParentValue())
+	if (pwidget_->parEffectOffset_->useParentValue())
 		for (int i = 0; i < selection_.count(); ++i)
-			selection_[i]->resetDropCapOffset();
+			selection_[i]->resetParEffectOffset();
 	else 
 	{
 		double a, b, value;
 		int c;
 
-		pwidget_->dropCapOffset_->getValues(&a, &b, &c, &value);
+		pwidget_->parEffectOffset_->getValues(&a, &b, &c, &value);
 		value = value / unitRatio_;
 		for (int i = 0; i < selection_.count(); ++i)
-			selection_[i]->setDropCapOffset(value);
+			selection_[i]->setParEffectOffset(value);
+	}
+	
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotParEffectIndent(bool isOn)
+{
+	if (pwidget_->parEffectIndentBox->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetParEffectIndent();
+	else 
+	{
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setParEffectIndent(isOn);
 	}
 	
 	if (!selectionIsDirty_)
@@ -914,15 +959,249 @@ void SMParagraphStyle::slotDropCapOffset()
 	}
 }
 
-void SMParagraphStyle::slotDropCapCharStyle(const QString& name)
+void SMParagraphStyle::slotParEffectCharStyle(const QString& name)
 {
-	if (pwidget_->dropCapCharStyleCombo->useParentValue())
+	if (pwidget_->parEffectCharStyleCombo->useParentValue())
 		for (int i = 0; i < selection_.count(); ++i)
-			selection_[i]->resetDcCharStyleName();
+			selection_[i]->resetPeCharStyleName();
 	else
 		for (int i = 0; i < selection_.count(); ++i)
-			selection_[i]->setDcCharStyleName(name);
+			selection_[i]->setPeCharStyleName(name);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotBullet(bool isOn)
+{
+	for (int i = 0; i < selection_.count(); ++i)
+	{
+		selection_[i]->setHasBullet(isOn);
+		if (isOn)
+		{
+			selection_[i]->setBulletStr(pwidget_->bulletStrEdit_->currentText());
+			selection_[i]->setHasDropCap(false);
+			selection_[i]->setHasNum(false);
+		}
+	}
+	
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotBulletStr(const QString &str)
+{
+	QString bstr(str);
+	if (bstr.isEmpty())
+	{
+		bstr = pwidget_->bulletStrEdit_->itemText(0);
+		pwidget_->bulletStrEdit_->setEditText(bstr);
+	}
+	for (int i = 0; i < selection_.count(); ++i)
+		selection_[i]->setBulletStr(bstr);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumeration(bool isOn)
+{
+	for (int i = 0; i < selection_.count(); ++i)
+	{
+		selection_[i]->setHasNum(isOn);
+		if (isOn)
+		{
+			selection_[i]->setHasDropCap(false);
+			selection_[i]->setHasBullet(false);
+		}
+	}
+	
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumName(const QString &str)
+{
+	QString bstr(str);
+	if (!str.isEmpty())
+	{
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumName(bstr);
+		pwidget_->numComboBox->setCurrentItem(pwidget_->numComboBox->findText(selection_[0]->numName()));
+		pwidget_->numLevelSpin->setValue(selection_[0]->numLevel()+1);
+		NumStruct * numS = doc_->numerations.value(selection_[0]->numName());
+		if (numS)
+			pwidget_->numLevelSpin->setMaximum(numS->m_counters.count()+1);
+		else
+			pwidget_->numLevelSpin->setMaximum(1);
+	}
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumNew()
+{
+	QString newName = pwidget_->numNewLineEdit->text();
+	if (!newName.isEmpty())
+	{
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumName(newName);
+		doc_->setupNumerations();
+	}
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
 
+void SMParagraphStyle::slotSelectionDirty()
+{
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumFormat(int numFormat)
+{
+	if (pwidget_->numFormatCombo->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetNumFormat();
+	else
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumFormat(numFormat);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumLevel(int level)
+{
+	if (pwidget_->numLevelSpin->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetNumLevel();
+	else
+		for (int i = 0; i < selection_.count(); ++i)
+		{
+			selection_[i]->setNumLevel(level-1);
+		}
+	
+	if (level == 0)
+		slotNumHigher(false);
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumPrefix(const QString &str)
+{
+	for (int i = 0; i < selection_.count(); ++i)
+		selection_[i]->setNumPrefix(str);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumSuffix(const QString &str)
+{
+	for (int i = 0; i < selection_.count(); ++i)
+		selection_[i]->setNumSuffix(str);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumStart(int start)
+{
+	if (pwidget_->numStartSpin->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetNumStart();
+	else
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumStart(start);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumRestart(int restart)
+{
+	if (pwidget_->numRestartCombo->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetNumRestart();
+	else
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumRestart(restart);
+
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumOther(bool isOn)
+{
+	if (pwidget_->numRestartOtherBox->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetNumOther();
+	else 
+	{
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumOther(isOn);
+	}
+	
+	if (!selectionIsDirty_)
+	{
+		selectionIsDirty_ = true;
+		emit selectionDirty();
+	}
+}
+
+void SMParagraphStyle::slotNumHigher(bool isOn)
+{
+	if (pwidget_->numRestartHigherBox->useParentValue())
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->resetNumHigher();
+	else 
+	{
+		for (int i = 0; i < selection_.count(); ++i)
+			selection_[i]->setNumHigher(isOn);
+	}
+	
 	if (!selectionIsDirty_)
 	{
 		selectionIsDirty_ = true;
diff --git a/Scribus/scribus/ui/smtextstyles.h b/Scribus/scribus/ui/smtextstyles.h
index 002600d..1dfa578 100644
--- a/Scribus/scribus/ui/smtextstyles.h
+++ b/Scribus/scribus/ui/smtextstyles.h
@@ -71,11 +71,26 @@ private slots:
 	// pstyle
 	void slotLineSpacingMode(int mode);
 	void slotLineSpacing();
-	void slotParentDropCap();
+	void slotParentParaEffects();
 	void slotDropCap(bool isOn);
 	void slotDropCapLines(int lines);
-	void slotDropCapOffset();
-	void slotDropCapCharStyle(const QString &name);
+	void slotParEffectOffset();
+	void slotParEffectIndent(bool);
+	void slotParEffectCharStyle(const QString &name);
+	void slotBullet(bool isOn);
+	void slotBulletStr(const QString &str);
+	void slotNumeration(bool isOn);
+	void slotNumName(const QString &str);
+	void slotNumNew();
+	void slotSelectionDirty();
+	void slotNumFormat(int numFormat);
+	void slotNumLevel(int level);
+	void slotNumPrefix(const QString &str);
+	void slotNumSuffix(const QString &str);
+	void slotNumStart(int start);
+	void slotNumRestart(int restart);
+	void slotNumOther(bool isOn);
+	void slotNumHigher(bool isOn);
 	void slotSpaceAbove();
 	void slotSpaceBelow();
 	void slotAlignment();
diff --git a/Scribus/scribus/util.cpp b/Scribus/scribus/util.cpp
index 300dda8..874bafc 100644
--- a/Scribus/scribus/util.cpp
+++ b/Scribus/scribus/util.cpp
@@ -537,7 +537,7 @@ QString getFileNameByPage(ScribusDoc* currDoc, uint pageNo, QString extension)
 	return QString("%1-%2%3.%4").arg(defaultName).arg(QObject::tr("page", "page export")).arg(number, 3, 10, QChar('0')).arg(extension);
 }
 
-const QString getStringFromSequence(DocumentSectionType type, uint position, QString asterix)
+const QString getStringFromSequence(NumFormat type, uint position, QString asterix)
 {
 	QString retVal("");
 	switch( type )
@@ -1129,6 +1129,13 @@ void convertOldTable(ScribusDoc *m_Doc, PageItem* gItem, QList<PageItem*> &gpL,
 	delete gItem;
 }
 
+void setWidgetBoldFont(QWidget* w, bool wantBold)
+{
+	QFont f(w->font());
+	f.setBold(wantBold);
+	w->setFont(f);
+}
+
 void getUniqueName(QString &name, QStringList list, QString separator, bool prepend)
 {
 	if (!list.contains(name))
diff --git a/Scribus/scribus/util.h b/Scribus/scribus/util.h
index c62da88..28a16f4 100644
--- a/Scribus/scribus/util.h
+++ b/Scribus/scribus/util.h
@@ -131,7 +131,7 @@ QString SCRIBUS_API getFileNameByPage(ScribusDoc* currDoc, uint pageNo, QString
 void SCRIBUS_API sDebug(QString message);
 //asterix is QString used in numeration when number is presented as few chars, like *, **, *** etc
 //default is '*' but can be used any string
-const QString SCRIBUS_API getStringFromSequence(DocumentSectionType type, uint position, QString asterix="*");
+const QString SCRIBUS_API getStringFromSequence(NumFormat type, uint position, QString asterix="*");
 const QString SCRIBUS_API arabicToRoman(uint i);
 const QString SCRIBUS_API numberToLetterSequence(uint i);
 void SCRIBUS_API parsePagesString(QString pages, std::vector<int>* pageNs, int sourcePageCount);
@@ -154,6 +154,7 @@ void    SCRIBUS_API getDashArray(int dashtype, double linewidth, QVector<float>
 void SCRIBUS_API printBacktrace(int nFrames);
 void SCRIBUS_API convertOldTable(ScribusDoc *m_Doc, PageItem* gItem, QList<PageItem*> &gpL, QStack< QList<PageItem*> > *groupStackT = NULL, QList<PageItem *> *target = NULL);
 
+void SCRIBUS_API setWidgetBoldFont(QWidget* w, bool wantBold);
 /*!
  *\brief
  * check if name exists in list
numeration.diff (232,706 bytes)

JLuc

2012-12-05 13:38

developer   ~0029325

Last edited: 2012-12-05 13:39

View 2 revisions

AMOF i have not tested this feature yet but I shall test it by the 16th of december ... in case it is not commited yet.

ale

2012-12-12 15:00

manager   ~0029360

@cezary, craig && jean: please don't let slip this one. if any action is needed, please write a note.

JLuc

2012-12-14 16:14

developer   ~0029371

Last edited: 2012-12-14 16:40

View 2 revisions

Hello

my screen is 1366x768, and it cant display the new Edit Style window fully.
When the top of the dialog is aligned with the top of the screen, the bottom of the dialog is not displayed. Hence i cannot see nor click on the buttons, and cant change existing styles nor create new ones... So i think the "edit style" dialog would need to be refactored so as to propose all these new options :-)

Maybe enable to scroll its content or better : create a new "Advanced" tab ?

ale

2012-12-15 06:29

manager   ~0029373

with a bit of luck, once the new PP is there we will have smaller widgets... the future will be bright... if we survive the december 21st!

while adding a scroll bar would let some people to see the whole dialog, i'm not sure that it's such a good idea (i mean: if it's too big let's make it smaller :-)

and my first reaction to the idea of an advanced tab is not much warmer... what does "advanced" mean? if we really have to have tabs, then at least by topic... but, generally speaking, we are trying to avoid tabs...

all in all: we should improve the styles dialog and other dialogs, too. yes! but i'm not sure that the ticket on the list feature is the right place to discuss that...

christoph_s

2012-12-15 06:44

administrator   ~0029374

ale: any chance to add this to to the git branch anytime soon?

JLuc

2012-12-15 13:14

developer   ~0029387

OK depends on 0011258

ale

2012-12-15 14:22

manager   ~0029389

christoph: what should be added to a git branch?
there has been a numeration branch for some time, now...

if it's about any other topic, please let's discuss it in other tickets...

cezaryece

2012-12-15 16:59

developer   ~0029395

I think Christoph want to see it in trunk branch.
Lets do something to fit his needs...

christoph_s

2012-12-16 07:44

administrator   ~0029400

Sorry, my fault. I wasn't aware of a separate "numeration" branch (or its meaning). I thought, mistakenly, that the diff would be added to the "footnotes" branch.

(I still need to get used to git, obviously ;) )

JLuc

2012-12-16 10:26

developer   ~0029404

Last edited: 2012-12-16 10:40

View 5 revisions

I found a higher screen and could test some features of the enum branch. I created detailled reports in the "contributors branches" bug report project. Here is a summary as for now :

0011264 : Crasher when copy + paste twice the enum

0011263 : UI consistancy (radiobuttons should be used, not checkboxes). AMOF its a duplicate of 0011198

0011266 : Enum sometime start at begining+1
0011267 : after a while paragraphs are not enum'd anymore

0011265 is the most important : Enum so-called "styles" should be named "types" and so-called "sets" should be named "styles" and treated as such : appear in left select and have their own creation dialog.
It would bring consistancy with scribus overall "style" uses, and it would bring a solution to the "dialog is too high" issue, since the "set of feature that should be brought off the paragraph creation" tab is simply a (to be created) "create enum style" dialog.

Prefix and suffix work well

Dropcaps work well

As for Bullets :

- 0011270 : UI is very uncommon and nothing helps to use it

This patch brings a lot of very very good features.
It still needs to be worked on before reaching users, it is obviously on a good track. Please encourage cezariece !

cezaryece

2012-12-17 08:47

developer   ~0029423

JLuc: check in your reports - I send feedback requests for few of them.

cezaryece

2012-12-18 14:42

developer   ~0029442

New patch with fixed reported issues is prepared.

Issue History

Date Modified Username Field Change
2012-12-03 11:40 cezaryece New Issue
2012-12-03 11:40 cezaryece File Added: numeration.diff
2012-12-03 11:41 cezaryece Tag Attached: text
2012-12-03 11:41 cezaryece Tag Attached: text frames
2012-12-03 11:41 cezaryece Tag Attached: usability
2012-12-03 11:41 cezaryece Tag Attached: bullet
2012-12-03 11:41 cezaryece Tag Attached: lists
2012-12-03 11:41 cezaryece Tag Attached: numbering
2012-12-03 11:41 cezaryece Tag Attached: numeration
2012-12-03 11:44 cezaryece Relationship added related to 0000102
2012-12-03 11:44 cezaryece Relationship added related to 0002038
2012-12-05 13:38 JLuc Note Added: 0029325
2012-12-05 13:39 JLuc Note Edited: 0029325 View Revisions
2012-12-12 15:00 ale Note Added: 0029360
2012-12-14 16:14 JLuc Note Added: 0029371
2012-12-14 16:40 JLuc Note Edited: 0029371 View Revisions
2012-12-15 06:29 ale Note Added: 0029373
2012-12-15 06:44 christoph_s Note Added: 0029374
2012-12-15 13:14 JLuc Note Added: 0029387
2012-12-15 14:22 ale Note Added: 0029389
2012-12-15 16:59 cezaryece Note Added: 0029395
2012-12-16 07:44 christoph_s Note Added: 0029400
2012-12-16 10:26 JLuc Note Added: 0029404
2012-12-16 10:27 JLuc Note Edited: 0029404 View Revisions
2012-12-16 10:30 JLuc Note Edited: 0029404 View Revisions
2012-12-16 10:31 JLuc Note Edited: 0029404 View Revisions
2012-12-16 10:40 JLuc Note Edited: 0029404 View Revisions
2012-12-17 08:47 cezaryece Note Added: 0029423
2012-12-18 12:27 cezaryece File Added: numeration.patch
2012-12-18 14:41 cezaryece File Deleted: numeration.patch
2012-12-18 14:42 cezaryece Note Added: 0029442
2012-12-18 14:42 cezaryece Status new => closed
2012-12-18 14:42 cezaryece Assigned To => cezaryece
2012-12-18 14:42 cezaryece Resolution open => no change required
2012-12-18 22:36 cbradney Relationship added related to 0011277
2014-10-08 22:37 Kunda Tag Detached: bullet
2015-09-17 20:08 Kunda Category Story Editor / Text Frames => Story Ed/Txt Frames
2015-09-17 20:12 Kunda Category Story Ed/Txt Frames => Story Editor / Text Frames