Index: scribus/scribus.cpp
===================================================================
--- scribus/scribus.cpp	(wersja 16619)
+++ scribus/scribus.cpp	(kopia robocza)
@@ -212,6 +212,7 @@
 #include "util_ghostscript.h"
 #include "util_icon.h"
 #include "util_math.h"
+#include "util_text.h"
 #include "vruler.h"
 #include "loadsaveplugin.h"

@@ -7447,6 +7448,60 @@
        }
 }

+void ScribusMainWindow::setPStyleCPos()
+{
+	PageItem *currItem = doc->m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	StyleSet<ParagraphStyle> tmpStyles_;
+	ParagraphStyle newStyle;
+	newStyle.setStyle(doc->currentStyle);
+	newStyle.setName(getUniquePStyleName(doc, newStyle.parent()));
+	bool ok=false;
+	while (!ok)
+	{
+		QString newPSname = QInputDialog::getText(this, tr("Set name for new Paragraph Style"),
+										 tr("Name:"), QLineEdit::Normal,
+										 newStyle.name(), &ok);
+		if (ok)
+		{
+			QString uniqueName = getUniquePStyleName(doc, newPSname);
+			newStyle.setName(uniqueName);
+			if (uniqueName != newPSname)
+				ok = false;
+		}
+		else
+			return;
+	}
+	tmpStyles_.create(newStyle);
+	doc->redefineStyles(tmpStyles_);
+	doc->changed();
+	styleMgr()->setDoc(doc);
+	propertiesPalette->paraStyleCombo->updateFormatList();
+}
+
+void ScribusMainWindow::updatePStyleCPos()
+{
+	PageItem *currItem = doc->m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	StyleSet<ParagraphStyle> tmpStyles_;
+	ParagraphStyle newStyle;
+	newStyle.setStyle(doc->currentStyle);
+	newStyle.setName(newStyle.parent());
+	tmpStyles_.create(newStyle);
+	doc->redefineStyles(tmpStyles_);
+	doc->changed();
+	doc->view()->DrawNew();
+	styleMgr()->setDoc(doc);
+}
+
 void ScribusMainWindow::setNewCharStyle(const QString& name)
 {
        if (HaveDoc)
@@ -7466,7 +7521,66 @@
                setTBvals(currItem);
        }
 }
+void ScribusMainWindow::setChStyleCPos()
+{
+	PageItem *currItem = doc->m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;

+	StyleSet<CharStyle> tmpStyles_;
+	CharStyle newStyle;
+	newStyle.setStyle(doc->currentStyle.charStyle());
+	newStyle.setName(getUniqueChStyleName(doc, newStyle.parent()));
+	bool ok=false;
+	while (!ok)
+	{
+		QString newChSname = QInputDialog::getText(this, tr("Set name for new Paragraph Style"),
+										 tr("Name:"), QLineEdit::Normal,
+										 newStyle.name(), &ok);
+		if (ok)
+		{
+			QString uniqueName = getUniqueChStyleName(doc, newChSname);
+			newStyle.setName(uniqueName);
+			if (uniqueName != newChSname)
+				ok = false;
+		}
+		else
+			return;
+	}
+	tmpStyles_.create(newStyle);
+	doc->redefineCharStyles(tmpStyles_);
+	doc->changed();
+	styleMgr()->setDoc(doc);
+	propertiesPalette->charStyleCombo->updateFormatList();
+}
+
+void ScribusMainWindow::updateChStyleCPos()
+{
+	PageItem *currItem = doc->m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	CharStyle newStyle;
+	newStyle.setStyle(doc->currentStyle.charStyle());
+	newStyle.setName(newStyle.parent());
+
+	if (findCharStyle(doc, newStyle.name()) == -1)
+		setChStyleCPos();
+	else
+	{
+		StyleSet<CharStyle> tmpStyles_;
+		tmpStyles_.create(newStyle);
+		doc->redefineCharStyles(tmpStyles_);
+		doc->changed();
+		doc->view()->DrawNew();
+		styleMgr()->setDoc(doc);
+	}
+}
+
 void ScribusMainWindow::setAbsValue(int a)
 {
 //	doc->currentStyle = doc->docParagraphStyles[a];
Index: scribus/util_text.cpp
===================================================================
--- scribus/util_text.cpp	(wersja 16619)
+++ scribus/util_text.cpp	(kopia robocza)
@@ -50,3 +50,63 @@
        assert(false);
        return -1;
 }
+
+int findCharStyle(ScribusDoc* doc, const QString &name)
+{
+	for (int i=0; i < doc->charStyles().count(); ++i)
+	{
+		if (name == doc->charStyles()[i].name()) {
+			return i;
+		}
+	}
+	assert(false);
+	return -1;
+}
+
+QString getUniquePStyleName(ScribusDoc* doc, const QString &name)
+{
+	int id = 0;
+	bool done = false;
+	QString s(name);
+
+	while (!done)
+	{
+start:
+		++id;
+		for (int i = 0; i < doc->paragraphStyles().count(); ++i)
+		{
+			if (doc->paragraphStyles()[i].name() == s)
+			{
+				s = name + " (" + QString::number(id) + ")";
+				goto start;
+			}
+		}
+		done = true;
+	}
+
+	return s;
+}
+
+QString getUniqueChStyleName(ScribusDoc* doc, const QString &name)
+{
+	int id = 0;
+	bool done = false;
+	QString s(name);
+
+	while (!done)
+	{
+start:
+		++id;
+		for (int i = 0; i < doc->charStyles().count(); ++i)
+		{
+			if (doc->charStyles()[i].name() == s)
+			{
+				s = name + " (" + QString::number(id) + ")";
+				goto start;
+			}
+		}
+		done = true;
+	}
+
+	return s;
+}
Index: scribus/util_text.h
===================================================================
--- scribus/util_text.h	(wersja 16619)
+++ scribus/util_text.h	(kopia robocza)
@@ -13,12 +13,16 @@
 #include "styles/charstyle.h"
 #include "styles/paragraphstyle.h"
 #include "scribusapi.h"
+#include <QString>

 class  ScribusDoc;

 #ifndef NLS_CONFORMANCE
 int SCRIBUS_API findParagraphStyle(ScribusDoc* doc, const ParagraphStyle& parStyle);
 int SCRIBUS_API findParagraphStyle(ScribusDoc* doc, const QString &name);
+int SCRIBUS_API findCharStyle(ScribusDoc* doc, const QString &name);
+QString SCRIBUS_API getUniquePStyleName(ScribusDoc* doc, const QString &name);
+QString SCRIBUS_API getUniqueChStyleName(ScribusDoc* doc, const QString &name);
 #endif


Index: scribus/actionmanager.cpp
===================================================================
--- scribus/actionmanager.cpp	(wersja 16619)
+++ scribus/actionmanager.cpp	(kopia robocza)
@@ -474,6 +474,15 @@
        name="itemConvertToTextFrame";
        scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));

+	name="itemPStyleFromTextNew";
+	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
+	name="itemPStyleFromTextUpdate";
+	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
+	name="itemChStyleFromTextNew";
+	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
+	name="itemChStyleFromTextUpdate";
+	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
+
        connect( (*scrActions)["itemDuplicate"], SIGNAL(triggered()), mainWindow, SLOT(duplicateItem()) );
        connect( (*scrActions)["itemMulDuplicate"], SIGNAL(triggered()), mainWindow, SLOT(duplicateItemMulti()) );
        connect( (*scrActions)["itemGroup"], SIGNAL(triggered()), mainWindow, SLOT(GroupObj()) );
@@ -485,6 +494,11 @@
        connect( (*scrActions)["itemAttributes"], SIGNAL(triggered()), mainWindow, SLOT(objectAttributes()) );
        connect( (*scrActions)["itemShapeEdit"], SIGNAL(triggered()), mainWindow, SLOT(toggleNodeEdit()) );
        connect( (*scrActions)["itemImageInfo"], SIGNAL(triggered()), mainWindow, SLOT(getImageInfo()) );
+
+	connect( (*scrActions)["itemPStyleFromTextNew"], SIGNAL(triggered()), mainWindow, SLOT(setPStyleCPos()) );
+	connect( (*scrActions)["itemPStyleFromTextUpdate"], SIGNAL(triggered()), mainWindow, SLOT(updatePStyleCPos()) );
+	connect( (*scrActions)["itemChStyleFromTextNew"], SIGNAL(triggered()), mainWindow, SLOT(setChStyleCPos()) );
+	connect( (*scrActions)["itemChStyleFromTextUpdate"], SIGNAL(triggered()), mainWindow, SLOT(updateChStyleCPos()) );
 }

 void ActionManager::initInsertMenuActions()
@@ -1383,6 +1397,10 @@
        (*scrActions)["itemConvertToOutlines"]->setTexts( tr("&Outlines", "Convert to oulines"));
        (*scrActions)["itemConvertToPolygon"]->setTexts( tr("&Polygon"));
        (*scrActions)["itemConvertToTextFrame"]->setTexts( tr("&Text Frame"));
+	(*scrActions)["itemPStyleFromTextNew"]->setTexts( tr("Create paragraph style with style at cursor position"));
+	(*scrActions)["itemPStyleFromTextUpdate"]->setTexts( tr("Update paragraph style with style at cursor position"));
+	(*scrActions)["itemChStyleFromTextNew"]->setTexts( tr("Create character style with style at cursor position"));
+	(*scrActions)["itemChStyleFromTextUpdate"]->setTexts( tr("Update character style with style at cursor position"));

        //Insert Menu
        (*scrActions)["insertFrame"]->setTexts( tr("&Frame..."));
@@ -1764,7 +1782,7 @@
        itmenu->second << "typeEffectNormal" << "typeEffectUnderline" << "typeEffectUnderlineWords" << "typeEffectStrikeThrough" << "typeEffectAllCaps" << "typeEffectSmallCaps" << "typeEffectSuperscript" << "typeEffectSubscript" << "typeEffectOutline" << "typeEffectShadow" << "styleImageEffects" << "styleTabulators";
        //Item
        ++itmenu;
-	itmenu->second << "itemDuplicate" << "itemMulDuplicate" << "itemDelete" << "itemGroup" << "itemUngroup" << "itemLock" << "itemLockSize" << "itemImageIsVisible" << "itemUpdateImage" << "itemAdjustFrameToImage" << "itemAdjustImageToFrame" << "itemExtendedImageProperties" << "itemPreviewLow" << "itemPreviewNormal" << "itemPreviewFull" << "itemRaise" << "itemLower" << "itemRaiseToTop" << "itemLowerToBottom" << "itemSendToPattern" << "itemAttributes" << "itemPDFIsAnnotation" << "itemPDFIsBookmark" << "itemPDFAnnotationProps" << "itemPDFFieldProps" << "itemShapeEdit" << "itemConvertToBezierCurve" << "itemConvertToImageFrame" << "itemConvertToOutlines" << "itemConvertToPolygon" << "itemConvertToTextFrame" << "itemAttachTextToPath" << "itemDetachTextFromPath" << "itemCombinePolygons" << "itemSplitPolygons";
+	itmenu->second << "itemDuplicate" << "itemMulDuplicate" << "itemDelete" << "itemGroup" << "itemUngroup" << "itemLock" << "itemLockSize" << "itemImageIsVisible" << "itemUpdateImage" << "itemAdjustFrameToImage" << "itemAdjustImageToFrame" << "itemExtendedImageProperties" << "itemPreviewLow" << "itemPreviewNormal" << "itemPreviewFull" << "itemRaise" << "itemLower" << "itemRaiseToTop" << "itemLowerToBottom" << "itemSendToPattern" << "itemAttributes" << "itemPDFIsAnnotation" << "itemPDFIsBookmark" << "itemPDFAnnotationProps" << "itemPDFFieldProps" << "itemShapeEdit" << "itemConvertToBezierCurve" << "itemConvertToImageFrame" << "itemConvertToOutlines" << "itemConvertToPolygon" << "itemConvertToTextFrame" << "itemAttachTextToPath" << "itemDetachTextFromPath" << "itemCombinePolygons" << "itemSplitPolygons" << "itemPStyleFromTextNew" << "itemPStyleFromTextUpdate" << "itemChStyleFromTextNew" << "itemChStyleFromTextUpdate";
        //Insert
        ++itmenu;
        itmenu->second
Index: scribus/scribus.h
===================================================================
--- scribus/scribus.h	(wersja 16619)
+++ scribus/scribus.h	(kopia robocza)
@@ -485,7 +485,11 @@
 //	void saveStyles(StilFormate *dia); //still required for style save from SE
        void setNewAlignment(int a);
        void setNewParStyle(const QString& name);
+	void setPStyleCPos();
+	void updatePStyleCPos();
        void setNewCharStyle(const QString& name);
+	void setChStyleCPos();
+	void updateChStyleCPos();
        void setAbsValue(int a);
        void selectItemsFromOutlines(PageItem *ite);
        void selectItemsFromOutlines(int Page, int Item, bool single = false);
Index: scribus/contextmenu.cpp
===================================================================
--- scribus/contextmenu.cpp	(wersja 16619)
+++ scribus/contextmenu.cpp	(kopia robocza)
@@ -174,6 +174,13 @@
                                addSeparator();
                                addAction(m_AP->scrActions["toolsEditWithStoryEditor"]);
                        }
+		if (currItem->asTextFrame())
+		{
+			addAction(m_AP->scrActions["itemPStyleFromTextNew"]);
+			addAction(m_AP->scrActions["itemPStyleFromTextUpdate"]);
+			addAction(m_AP->scrActions["itemChStyleFromTextNew"]);
+			addAction(m_AP->scrActions["itemChStyleFromTextUpdate"]);
+		}
                addSeparator();
                if (m_actionList.contains("fileImportImage"))
                        addAction(m_AP->scrActions["fileImportImage"]);
