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,164 @@
        }
 }

+void ScribusDoc::setPStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;

+	StyleSet<ParagraphStyle> tmpStyles_;
+	ParagraphStyle newStyle;
+	newStyle.setStyle(currentStyle);
+	newStyle.setName(getUniquePStyleName(this, newStyle.parent()));
+	bool ok=false;
+	while (!ok)
+	{
+		QString newPSname = QInputDialog::getText(scMW(), tr("Set name for new Paragraph Style"),
+										 tr("Name:"), QLineEdit::Normal,
+										 newStyle.name(), &ok);
+		if (ok)
+		{
+			QString uniqueName = getUniquePStyleName(this, newPSname);
+			newStyle.setName(uniqueName);
+			// name was changed, let user decide it is good for him
+			if (uniqueName != newPSname)
+				ok = false;
+		}
+		else
+			return;
+	}
+	tmpStyles_.create(newStyle);
+	redefineStyles(tmpStyles_);
+	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;
+
+	StyleSet<ParagraphStyle> tmpStyles_;
+	ParagraphStyle newStyle;
+	newStyle.setStyle(currentStyle);
+	newStyle.setName(newStyle.parent());
+	tmpStyles_.create(newStyle);
+	redefineStyles(tmpStyles_);
+	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;
+
+	StyleSet<ParagraphStyle> tmpStyles_;
+	ParagraphStyle newStyle;
+	newStyle.setStyle(currentStyle);
+	newStyle.setName(CommonStrings::DefaultParagraphStyle);
+	newStyle.setDefaultStyle(true);
+
+	tmpStyles_.create(newStyle);
+	redefineStyles(tmpStyles_);
+	changed();
+	view()->DrawNew();
+	scMW()->styleMgr()->setDoc(this);
+}
+
+void ScribusDoc::setChStyleCPos()
+{
+	PageItem *currItem = m_Selection->itemAt(0);
+	if (!currItem->isTextFrame())
+		return;
+	if (currItem->CPos >= currItem->itemText.length())
+		return;
+
+	StyleSet<CharStyle> tmpStyles_;
+	CharStyle newStyle;
+	newStyle.setStyle(currentStyle.charStyle());
+	newStyle.setName(getUniqueChStyleName(this, newStyle.parent()));
+	bool ok=false;
+	while (!ok)
+	{
+		QString newChSname = QInputDialog::getText(scMW(), tr("Set name for new Paragraph Style"),
+										 tr("Name:"), QLineEdit::Normal,
+										 newStyle.name(), &ok);
+		if (ok)
+		{
+			QString uniqueName = getUniqueChStyleName(this, newChSname);
+			newStyle.setName(uniqueName);
+			// name was changed, let user decide it is good for him
+			if (uniqueName != newChSname)
+				ok = false;
+		}
+		else
+			return;
+	}
+	tmpStyles_.create(newStyle);
+	redefineCharStyles(tmpStyles_);
+	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;
+
+	CharStyle newStyle;
+	newStyle.setStyle(currentStyle.charStyle());
+	newStyle.setName(newStyle.parent());
+
+	if (findCharStyle(this, newStyle.name()) == -1)
+		setChStyleCPos();
+	else
+	{
+		StyleSet<CharStyle> tmpStyles_;
+		tmpStyles_.create(newStyle);
+		redefineCharStyles(tmpStyles_);
+		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;
+
+	CharStyle newStyle;
+	newStyle.setStyle(currentStyle.charStyle());
+	newStyle.setName(CommonStrings::DefaultCharacterStyle);
+	newStyle.setDefaultStyle(true);
+
+	StyleSet<CharStyle> tmpStyles_;
+	tmpStyles_.create(newStyle);
+	redefineCharStyles(tmpStyles_);
+	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,17 @@
        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();
 };

 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,17 @@
                                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->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("Styles from selection"));
+		}
                addSeparator();
                if (m_actionList.contains("fileImportImage"))
                        addAction(m_AP->scrActions["fileImportImage"]);
