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/scribusdoc.cpp
===================================================================
--- scribus/scribusdoc.cpp	(wersja 16626)
+++ scribus/scribusdoc.cpp	(kopia robocza)
@@ -35,6 +35,7 @@
 #include <QPainter>
 #include <QPixmap>
 #include <QProgressBar>
+#include <QInputDialog>
 
 #include "canvas.h"
 #include "cmserrorhandling.h"
@@ -62,6 +63,7 @@
 #include "pagestructs.h"
 #include "prefsfile.h"
 #include "prefsmanager.h"
+#include "propertiespalette.h"
 #include "resourcecollection.h"
 #include "sccolorengine.h"
 #include "scmessagebox.h"
@@ -77,6 +79,7 @@
 #include "selection.h"
 #include "serializer.h"
 #include "storyeditor.h"
+#include "stylemanager.h"
 #include "text/nlsconfig.h"
 #include "undomanager.h"
 #include "undostate.h"
@@ -84,9 +87,9 @@
 #include "util.h"
 #include "util_icon.h"
 #include "util_math.h"
+#include "util_text.h"
 
 
-
 // static const bool FRAMESELECTION_EDITS_DEFAULTSTYLE = false;
 
 
@@ -1219,7 +1222,147 @@
 	}
 }
 
+void ScribusDoc::PStyleFromStyle(QString newName, ParagraphStyle currStyle, bool defStyle)
+{
+	StyleSet<ParagraphStyle> tmpStyles_;
+	ParagraphStyle newStyle;
+	newStyle.setStyle(currStyle);
+	newStyle.setName(newName);
+	if (defStyle)
+		newStyle.setDefaultStyle(true);
+	tmpStyles_.create(newStyle);
+	redefineStyles(tmpStyles_);
+}
 
+void ScribusDoc::setPStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	QString newName = getUniquePStyleName(this, currentStyle.parent());
+	bool ok=false;
+	while (!ok)
+	{
+		newName = QInputDialog::getText(scMW(), tr("Set name for new Paragraph Style"),
+										 tr("Name:"), QLineEdit::Normal,
+										 newName, &ok);
+		if (ok)
+		{
+			QString newName2 = getUniquePStyleName(this, newName);
+			// name was changed, let user decide it is good for him
+			if (newName2 != newName)
+				ok = false;
+			newName = newName2;
+		}
+		else
+			return;
+	}
+	PStyleFromStyle(newName, currentStyle);
+	changed();
+	scMW()->styleMgr()->setDoc(this);
+	scMW()->propertiesPalette->paraStyleCombo->updateFormatList();
+}
+
+void ScribusDoc::updatePStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+	PStyleFromStyle(currentStyle.parent(), currentStyle);
+	changed();
+	view()->DrawNew();
+	scMW()->styleMgr()->setDoc(this);
+}
+
+void ScribusDoc::defaultPStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+	PStyleFromStyle(CommonStrings::DefaultParagraphStyle, currentStyle, true);
+	changed();
+	view()->DrawNew();
+	scMW()->styleMgr()->setDoc(this);
+}
+
+void ScribusDoc::ChStyleFromStyle(QString newName, CharStyle currStyle, bool defStyle)
+{
+	StyleSet<CharStyle> tmpStyles_;
+	CharStyle newStyle;
+	newStyle.setStyle(currStyle);
+	newStyle.setName(newName);
+	if (defStyle)
+		newStyle.setDefaultStyle(true);
+	tmpStyles_.create(newStyle);
+	redefineCharStyles(tmpStyles_);
+}
+
+void ScribusDoc::setChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	QString newName = getUniqueChStyleName(this, currentStyle.charStyle().parent());
+	bool ok=false;
+	while (!ok)
+	{
+		newName = QInputDialog::getText(scMW(), tr("Set name for new Paragraph Style"),
+										 tr("Name:"), QLineEdit::Normal,
+										 newName, &ok);
+		if (ok)
+		{
+			QString newName2 = getUniquePStyleName(this, newName);
+			// name was changed, let user decide it is good for him
+			if (newName2 != newName)
+				ok = false;
+			newName = newName2;
+		}
+		else
+			return;
+	}
+	ChStyleFromStyle(newName, currentStyle.charStyle());
+	changed();
+	scMW()->styleMgr()->setDoc(this);
+	scMW()->propertiesPalette->paraStyleCombo->updateFormatList();
+}
+
+void ScribusDoc::updateChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	ChStyleFromStyle(currentStyle.charStyle().parent(), currentStyle.charStyle());
+	changed();
+	view()->DrawNew();
+	scMW()->styleMgr()->setDoc(this);
+}
+
+void ScribusDoc::defaultChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+	ChStyleFromStyle(CommonStrings::DefaultCharacterStyle, currentStyle.charStyle(), true);
+	changed();
+	view()->DrawNew();
+	scMW()->styleMgr()->setDoc(this);
+}
+
 void ScribusDoc::lockGuides(bool isLocked)
 {
 	if (GuideLock == isLocked)
Index: scribus/scribusdoc.h
===================================================================
--- scribus/scribusdoc.h	(wersja 16619)
+++ scribus/scribusdoc.h	(kopia robocza)
@@ -1232,6 +1232,21 @@
 	void updatePict(QString name);
 	void updatePictDir(QString name);
 	void removePict(QString name);
+
+	/**
+	 * @brief Create or update par/char styles by current style at cursor position
+	 * @param or from frame current style if not in edit mode
+	 */
+	void setPStyleCPos();
+	void updatePStyleCPos();
+	void defaultPStyleCPos();
+	void setChStyleCPos();
+	void updateChStyleCPos();
+	void defaultChStyleCPos();
+	/** functions for creating or update styles without GUI interaction */
+	void PStyleFromStyle(QString, ParagraphStyle, bool defStyle=false);
+	void ChStyleFromStyle(QString, CharStyle, bool defStyle=false);
+	
 };
 
 Q_DECLARE_METATYPE(ScribusDoc*);
Index: scribus/actionmanager.cpp
===================================================================
--- scribus/actionmanager.cpp	(wersja 16619)
+++ scribus/actionmanager.cpp	(kopia robocza)
@@ -474,6 +474,19 @@
 	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="itemPStyleFromTextSaveDefault";
+	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));
+	name="itemChStyleFromTextSaveDefault";
+	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()) );
@@ -1048,7 +1061,12 @@
 	disconnect( (*scrActions)["itemDelete"], 0, 0, 0);
 	disconnect( (*scrActions)["extrasHyphenateText"], 0, 0, 0 );
 	disconnect( (*scrActions)["extrasDeHyphenateText"], 0, 0, 0 );
-
+	disconnect( (*scrActions)["itemPStyleFromTextNew"], 0, 0, 0 );
+	disconnect( (*scrActions)["itemPStyleFromTextUpdate"], 0, 0, 0 );
+	disconnect( (*scrActions)["itemPStyleFromTextSaveDefault"], 0, 0, 0 );
+	disconnect( (*scrActions)["itemChStyleFromTextNew"], 0, 0, 0 );
+	disconnect( (*scrActions)["itemChStyleFromTextUpdate"], 0, 0, 0 );
+	disconnect( (*scrActions)["itemChStyleFromTextSaveDefault"], 0, 0, 0 );
 }
 
 void ActionManager::connectNewDocActions(ScribusDoc *currDoc)
@@ -1068,6 +1086,12 @@
 	connect( (*scrActions)["itemDelete"], SIGNAL(triggered()), currDoc, SLOT(itemSelection_DeleteItem()) );
 	connect( (*scrActions)["itemAdjustFrameToImage"], SIGNAL(triggered()), currDoc, SLOT(itemSelection_AdjustFrametoImageSize()) );
 	connect( (*scrActions)["itemAdjustImageToFrame"], SIGNAL(triggered()), currDoc, SLOT(itemSelection_AdjustImagetoFrameSize()) );
+	connect( (*scrActions)["itemPStyleFromTextNew"], SIGNAL(triggered()), currDoc, SLOT(setPStyleCPos()) );
+	connect( (*scrActions)["itemPStyleFromTextUpdate"], SIGNAL(triggered()), currDoc, SLOT(updatePStyleCPos()) );
+	connect( (*scrActions)["itemPStyleFromTextSaveDefault"], SIGNAL(triggered()), currDoc, SLOT(defaultPStyleCPos()) );
+	connect( (*scrActions)["itemChStyleFromTextNew"], SIGNAL(triggered()), currDoc, SLOT(setChStyleCPos()) );
+	connect( (*scrActions)["itemChStyleFromTextUpdate"], SIGNAL(triggered()), currDoc, SLOT(updateChStyleCPos()) );
+	connect( (*scrActions)["itemChStyleFromTextSaveDefault"], SIGNAL(triggered()), currDoc, SLOT(defaultChStyleCPos()) );
 }
 
 void ActionManager::disconnectNewViewActions()
@@ -1383,6 +1407,12 @@
 	(*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"));
+	(*scrActions)["itemPStyleFromTextUpdate"]->setTexts( tr("Update paragraph style"));
+	(*scrActions)["itemPStyleFromTextSaveDefault"]->setTexts( tr("Save as Default Paragraph Style"));
+	(*scrActions)["itemChStyleFromTextNew"]->setTexts( tr("Create character style"));
+	(*scrActions)["itemChStyleFromTextUpdate"]->setTexts( tr("Update character style"));
+	(*scrActions)["itemChStyleFromTextSaveDefault"]->setTexts( tr("Save as Default Character Style"));
 
 	//Insert Menu
 	(*scrActions)["insertFrame"]->setTexts( tr("&Frame..."));
Index: scribus/contextmenu.cpp
===================================================================
--- scribus/contextmenu.cpp	(wersja 16619)
+++ scribus/contextmenu.cpp	(kopia robocza)
@@ -90,6 +90,7 @@
 	QMenu *menuLevel = new QMenu(this);
 	QMenu *menuPDF = new QMenu(this);
 	QMenu *menuResolution = new QMenu(this);
+	QMenu *menuStyles = new QMenu(this);
 	
 	//<-- Add Info
 	//Test new method with image frames first
@@ -174,6 +175,18 @@
 				addSeparator();
 				addAction(m_AP->scrActions["toolsEditWithStoryEditor"]);
 			}
+		if (currItem->asTextFrame())
+		{
+			menuStyles->addAction(m_AP->scrActions["itemPStyleFromTextNew"]);
+			menuStyles->addAction(m_AP->scrActions["itemPStyleFromTextUpdate"]);
+			menuStyles->addAction(m_AP->scrActions["itemPStyleFromTextSaveDefault"]);
+			menuStyles->addSeparator();
+			menuStyles->addAction(m_AP->scrActions["itemChStyleFromTextNew"]);
+			menuStyles->addAction(m_AP->scrActions["itemChStyleFromTextUpdate"]);
+			menuStyles->addAction(m_AP->scrActions["itemChStyleFromTextSaveDefault"]);
+			QAction *act = addMenu(menuStyles);
+			act->setText( ScribusView::tr("Style from selection"));
+		}
 		addSeparator();
 		if (m_actionList.contains("fileImportImage"))
 			addAction(m_AP->scrActions["fileImportImage"]);
