Index: scribus/styles/charstyle.cpp
===================================================================
--- scribus/styles/charstyle.cpp	(wersja 17211)
+++ scribus/styles/charstyle.cpp	(kopia robocza)
@@ -409,6 +407,17 @@
 	updateFeatures();
 }
 
+void CharStyle::updateAttr(const CharStyle& other) 
+{
+#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
+	inh_##attr_NAME = other.inh_##attr_NAME; \
+	m_##attr_NAME = other.m_##attr_NAME;
+#include "charstyle.attrdefs.cxx"
+#undef ATTRDEF
+	updateFeatures();
+}
+
+
 void CharStyle::getNamedResources(ResourceCollection& lists) const
 {
 	for (const Style* sty = parentStyle(); sty != NULL; sty = sty->parentStyle())
Index: scribus/styles/charstyle.h
===================================================================
--- scribus/styles/charstyle.h	(wersja 17211)
+++ scribus/styles/charstyle.h	(kopia robocza)
@@ -137,6 +137,7 @@
 	void applyCharStyle(const CharStyle & other);
 	void eraseCharStyle(const CharStyle & other);
 	void setStyle(const CharStyle & other);
+	void updateAttr(const CharStyle & other);
 	void erase() { eraseCharStyle(*this); }
 	void eraseDirectFormatting();
 	
Index: scribus/styles/paragraphstyle.cpp
===================================================================
--- scribus/styles/paragraphstyle.cpp	(wersja 17211)
+++ scribus/styles/paragraphstyle.cpp	(kopia robocza)
@@ -229,7 +229,17 @@
 #undef ATTRDEF
 }
 
+void ParagraphStyle::updateAttr(const ParagraphStyle & other) 
+{
+	other.validate();
+	cstyle.applyCharStyle(other.charStyle());
+#define ATTRDEF(attr_TYPE, attr_GETTER, attr_NAME, attr_DEFAULT) \
+	m_##attr_NAME = other.m_##attr_NAME;
+#include "paragraphstyle.attrdefs.cxx"
+#undef ATTRDEF
+}
 
+
 void ParagraphStyle::getNamedResources(ResourceCollection& lists) const
 {
 	for (const Style *sty = parentStyle(); sty != NULL; sty = sty->parentStyle())
Index: scribus/styles/paragraphstyle.h
===================================================================
--- scribus/styles/paragraphstyle.h	(wersja 17211)
+++ scribus/styles/paragraphstyle.h	(kopia robocza)
@@ -89,6 +89,7 @@
 	void applyStyle(const ParagraphStyle& other);
 	void eraseStyle(const ParagraphStyle& other);
 	void setStyle(const ParagraphStyle& other);
+	void updateAttr(const ParagraphStyle & other); //only copy attributes values
 	void erase() { eraseStyle(*this); }
 
 	StyleContext* charStyleContext() { return & cstyleContext; }
Index: scribus/util_text.cpp
===================================================================
--- scribus/util_text.cpp	(wersja 17211)
+++ scribus/util_text.cpp	(kopia robocza)
@@ -50,3 +50,62 @@
 	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 17211)
+++ scribus/util_text.h	(kopia robocza)
@@ -19,6 +19,9 @@
 #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 17211)
+++ 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,6 +87,7 @@
 #include "util.h"
 #include "util_icon.h"
 #include "util_math.h"
+#include "util_text.h"
 
 
 
@@ -1284,7 +1288,215 @@
 	}
 }
 
+void ScribusDoc::PStyleFromStyle(QString newName, ParagraphStyle currStyle, bool update, bool defStyle)
+{
+	ParagraphStyle newStyle;
+	if (update)
+	{
+		if (currStyle.name().isEmpty() && currStyle.hasParent())
+			newStyle = *((ParagraphStyle*) currStyle.parentStyle());
+		else if (!currStyle.name().isEmpty())
+			newStyle = currStyle;
+		else
+		{
+			//FIX ME: name is empty and has not any parent = default style?
+			PStyleFromStyle(newName, currStyle, false, true);
+			return;
+		}
+		newStyle.updateAttr(currStyle);
+	}
+	else
+	{
+		newStyle.setStyle(currStyle);
+		newStyle.setName(newName);
+		if (defStyle)
+			newStyle.setDefaultStyle(true);
+	}
+	StyleSet<ParagraphStyle> tmpStyles_;
+	tmpStyles_.create(newStyle);
+	redefineStyles(tmpStyles_);
+}
 
+QString ScribusDoc::setPStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return "";
+
+	QString newName = getUniquePStyleName(this, currItem->currentStyle().parent());
+	if (ScCore->usingGUI())
+	{
+		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 "";
+		}
+	}
+	ParagraphStyle curStyle = currItem->currentStyle();
+	curStyle.charStyle().applyCharStyle(currItem->currentCharStyle());
+	PStyleFromStyle(newName, curStyle, false);
+	changed();
+	if (ScCore->usingGUI())
+	{
+		scMW()->styleMgr()->setDoc(this);
+		scMW()->propertiesPalette->paraStyleCombo->updateFormatList();
+	}
+	return newName;
+}
+
+void ScribusDoc::updatePStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	ParagraphStyle curStyle = currItem->currentStyle();
+	curStyle.charStyle().applyCharStyle(currItem->currentCharStyle());
+	QString newPName;
+	if (currItem->currentStyle().hasParent())
+		newPName = currItem->itemText.paragraphStyle().parent();
+	else if (currItem->itemText.paragraphStyle().hasName())
+		newPName = currItem->itemText.paragraphStyle().name();
+	else
+		newPName = CommonStrings::DefaultParagraphStyle;
+	PStyleFromStyle(newPName, curStyle, true);
+	changed();
+	if (ScCore->usingGUI())
+	{
+		view()->DrawNew();
+		scMW()->styleMgr()->setDoc(this);
+	}
+}
+
+void ScribusDoc::defaultPStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	ParagraphStyle curStyle = currItem->currentStyle();
+	curStyle.charStyle().applyCharStyle(currItem->currentCharStyle());
+	PStyleFromStyle(CommonStrings::DefaultParagraphStyle, curStyle, false, true);
+	changed();
+	if (ScCore->usingGUI())
+	{
+		view()->DrawNew();
+		scMW()->styleMgr()->setDoc(this);
+	}
+}
+
+void ScribusDoc::ChStyleFromStyle(QString newName, CharStyle currStyle, bool update, bool defStyle)
+{
+	CharStyle newStyle;
+	if (update)
+	{
+		if (currStyle.name().isEmpty() && currStyle.hasParent())
+			newStyle = *((CharStyle*) currStyle.parentStyle());
+		else if (!currStyle.name().isEmpty())
+			newStyle = currStyle;
+		else
+		{
+			//FIX ME: name is empty and has not any parent = default style?
+			ChStyleFromStyle(newName, currStyle, false, true);
+			return;
+		}
+		newStyle.updateAttr(currStyle);
+	}
+	else
+	{
+		newStyle.setStyle(currStyle);
+		newStyle.setName(newName);
+		if (defStyle)
+			newStyle.setDefaultStyle(true);
+	}
+
+	StyleSet<CharStyle> tmpStyles_;
+	tmpStyles_.create(newStyle);
+	redefineCharStyles(tmpStyles_);
+}
+
+QString ScribusDoc::setChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return "";
+	if (currItem->itemText.cursorPosition() >= currItem->itemText.length())
+		return "";
+
+	QString newName = getUniqueChStyleName(this, currItem->currentCharStyle().parent());
+	if (ScCore->usingGUI())
+	{
+		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, currItem->currentCharStyle(), false);
+	changed();
+	if (ScCore->usingGUI())
+	{
+		scMW()->styleMgr()->setDoc(this);
+		scMW()->propertiesPalette->paraStyleCombo->updateFormatList();
+	}
+	return newName;
+}
+
+void ScribusDoc::updateChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->itemText.cursorPosition() >= currItem->itemText.length())
+		return;
+
+	ChStyleFromStyle(currItem->currentCharStyle().parent(), currItem->currentCharStyle(), true);
+	changed();
+	if (ScCore->usingGUI())
+	{
+		view()->DrawNew();
+		scMW()->styleMgr()->setDoc(this);
+	}
+}
+
+void ScribusDoc::defaultChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->itemText.cursorPosition() >= currItem->itemText.length())
+		return;
+	ChStyleFromStyle(CommonStrings::DefaultCharacterStyle, currItem->currentCharStyle(), false, true);
+	changed();
+	if (ScCore->usingGUI())
+	{
+		view()->DrawNew();
+		scMW()->styleMgr()->setDoc(this);
+	}
+}
+
 void ScribusDoc::lockGuides(bool isLocked)
 {
 	if (GuideLock == isLocked)
Index: scribus/scribusdoc.h
===================================================================
--- scribus/scribusdoc.h	(wersja 17211)
+++ scribus/scribusdoc.h	(kopia robocza)
@@ -479,8 +479,23 @@
 	 * @param newNameForOld a map which maps the name of any style to remove to a new stylename
 	 */
 	void replaceCharStyles(const QMap<QString,QString>& newNameForOld);
-
 	/**
+	 * @brief Create or update par/char styles by current style at cursor position
+	 * @param or from frame current style if not in edit mode
+	 */
+public slots:
+	QString setPStyleCPos();
+	void updatePStyleCPos();
+	void defaultPStyleCPos();
+	QString setChStyleCPos();
+	void updateChStyleCPos();
+	void defaultChStyleCPos();
+private:
+	/** functions for creating or update styles without GUI interaction */
+	void PStyleFromStyle(QString, ParagraphStyle, bool update, bool defStyle=false);
+	void ChStyleFromStyle(QString, CharStyle, bool update, bool defStyle=false);
+public:
+	/**
 	 * @brief Should guides be locked or not
 	 * @param isLocked If true guides on pages cannot be moved if false they
 	 * can be dragged to new positions.
Index: scribus/actionmanager.cpp
===================================================================
--- scribus/actionmanager.cpp	(wersja 17211)
+++ scribus/actionmanager.cpp	(kopia robocza)
@@ -474,6 +474,20 @@
 	name="itemConvertToTextFrame";
 	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
 
+	//create styles from current local style
+	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 +1062,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 +1087,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 +1408,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("&Frames..."));
Index: scribus/contextmenu.cpp
===================================================================
--- scribus/contextmenu.cpp	(wersja 17211)
+++ 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
@@ -181,6 +182,18 @@
 			if (QApplication::clipboard()->mimeData()->hasImage())
 				addAction(m_AP->scrActions["editPasteImageFromClipboard"]);
 		}
+		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"));
+		}
 		if (m_actionList.contains("itemAdjustFrameToImage"))
 			addAction(m_AP->scrActions["itemAdjustFrameToImage"]);
 		if (m_actionList.contains("itemAdjustImageToFrame"))
