[PATCH libreoffice-4-0] Templates Manager: UI for renaming templates and folders, fd...
Bosdonnat Cedric (via Code Review)
gerrit at gerrit.libreoffice.org
Mon Feb 11 09:15:30 PST 2013
Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/2108
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/08/2108/1
Templates Manager: UI for renaming templates and folders, fdo#60579
After thinking this was a feature regression, I finally discovered that
the old template manager couldn't rename templates. This commit is
bringing back some previously unused code dropped in an ealier commit.
Even though this is a UI change, no new string is added by this commit.
Conflicts:
sfx2/inc/sfx2/templateview.hxx
sfx2/source/control/templatelocalview.cxx
sfx2/source/control/templateview.cxx
Change-Id: I2e4a89c2e68f7e04b0fca3fc161920505ac715b4
---
M sfx2/inc/sfx2/doctempl.hxx
M sfx2/inc/sfx2/templatelocalview.hxx
M sfx2/inc/sfx2/templateview.hxx
M sfx2/inc/sfx2/templateviewitem.hxx
M sfx2/inc/sfx2/thumbnailview.hxx
M sfx2/inc/sfx2/thumbnailviewitem.hxx
M sfx2/source/control/templatelocalview.cxx
M sfx2/source/control/templateview.cxx
M sfx2/source/control/templateviewitem.cxx
M sfx2/source/control/thumbnailview.cxx
M sfx2/source/control/thumbnailviewitem.cxx
M sfx2/source/doc/doctempl.cxx
12 files changed, 257 insertions(+), 5 deletions(-)
diff --git a/sfx2/inc/sfx2/doctempl.hxx b/sfx2/inc/sfx2/doctempl.hxx
index 507117c..b9ca56d 100644
--- a/sfx2/inc/sfx2/doctempl.hxx
+++ b/sfx2/inc/sfx2/doctempl.hxx
@@ -96,6 +96,21 @@
sal_Bool InsertDir(const String &rText, sal_uInt16 nRegion);
sal_Bool SetName(const String &rName, sal_uInt16 nRegion, sal_uInt16 nIdx);
+ /** Change the name of an entry or a directory
+
+ \param rName
+ The new name to set
+ \param nRegion
+ The id of the region to rename or containing the template to rename
+ \param nIdx
+ The id of the template to rename or USHRT_MAX to rename the region.
+
+ \return
+ sal_True if the action could be performed, sal_False otherwise
+
+ */
+ sal_Bool SetName(const rtl::OUString &rName, sal_uInt16 nRegion, sal_uInt16 nIdx);
+
sal_Bool CopyTo(sal_uInt16 nRegion, sal_uInt16 nIdx, const String &rName) const;
sal_Bool CopyFrom(sal_uInt16 nRegion, sal_uInt16 nIdx, String &rName);
diff --git a/sfx2/inc/sfx2/templatelocalview.hxx b/sfx2/inc/sfx2/templatelocalview.hxx
index e11c42b..dbf00ef 100644
--- a/sfx2/inc/sfx2/templatelocalview.hxx
+++ b/sfx2/inc/sfx2/templatelocalview.hxx
@@ -71,6 +71,8 @@
bool isTemplateNameUnique (const sal_uInt16 nRegionItemId, const OUString &rName) const;
+ virtual void renameItem(ThumbnailViewItem* pItem, rtl::OUString sNewTitle);
+
private:
virtual void OnItemDblClicked (ThumbnailViewItem *pRegionItem);
diff --git a/sfx2/inc/sfx2/templateview.hxx b/sfx2/inc/sfx2/templateview.hxx
index 6e81ea4..07b8487 100644
--- a/sfx2/inc/sfx2/templateview.hxx
+++ b/sfx2/inc/sfx2/templateview.hxx
@@ -39,6 +39,8 @@
void setDblClickHdl (const Link &rLink) { maDblClickHdl = rLink; }
void setCloseHdl (const Link &rLink) { maAllButton.SetClickHdl(rLink); }
+ void setMasterView(TemplateAbstractView* pMasterView) { mpMasterView = pMasterView; }
+ virtual void renameItem(ThumbnailViewItem* pItem, rtl::OUString sNewTitle);
protected:
@@ -47,6 +49,7 @@
virtual void OnItemDblClicked (ThumbnailViewItem *pItem);
private:
+ TemplateAbstractView* mpMasterView;
Control maButtons;
PushButton maAllButton;
diff --git a/sfx2/inc/sfx2/templateviewitem.hxx b/sfx2/inc/sfx2/templateviewitem.hxx
index b19a060..0a3cb3e 100644
--- a/sfx2/inc/sfx2/templateviewitem.hxx
+++ b/sfx2/inc/sfx2/templateviewitem.hxx
@@ -42,6 +42,10 @@
virtual void Paint (drawinglayer::processor2d::BaseProcessor2D *pProcessor,
const ThumbnailItemAttributes *pAttrs);
+
+ sal_uInt16 mnRegionId;
+ sal_uInt16 mnDocId;
+
private:
rtl::OUString maPath;
diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx
index 9548bd1..a33e762 100644
--- a/sfx2/inc/sfx2/thumbnailview.hxx
+++ b/sfx2/inc/sfx2/thumbnailview.hxx
@@ -238,6 +238,8 @@
virtual void Resize();
+ virtual void renameItem(ThumbnailViewItem* pItem, rtl::OUString sNewTitle);
+
protected:
virtual void MouseButtonDown( const MouseEvent& rMEvt );
diff --git a/sfx2/inc/sfx2/thumbnailviewitem.hxx b/sfx2/inc/sfx2/thumbnailviewitem.hxx
index 18b7eae..2acc8de 100644
--- a/sfx2/inc/sfx2/thumbnailviewitem.hxx
+++ b/sfx2/inc/sfx2/thumbnailviewitem.hxx
@@ -25,6 +25,7 @@
#include <drawinglayer/primitive2d/baseprimitive2d.hxx>
#include <osl/mutex.hxx>
#include <vcl/bitmapex.hxx>
+#include <vcl/vclmedit.hxx>
#include "sfx2/dllapi.h"
#include <com/sun/star/accessibility/XAccessible.hpp>
@@ -88,12 +89,17 @@
void setHighlight (bool state);
+ void setEditTitle (bool edit, bool bChangeFocus = true);
+ void updateTitleEditSize ();
+ virtual void setTitle (const rtl::OUString& rTitle);
+
::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
GetAccessible( bool bIsTransientChildrenDisabled );
void setDrawArea (const Rectangle &area);
const Rectangle& getDrawArea () const { return maDrawArea; }
+ Rectangle getTextArea () const;
virtual void calculateItemsPosition (const long nThumbnailHeight, const long nDisplayHeight,
const long nPadding, sal_uInt32 nMaxTextLenght,
@@ -118,6 +124,9 @@
Point maPrev1Pos;
Rectangle maDrawArea;
Link maClickHdl;
+ bool mbEditTitle;
+ VclMultiLineEdit* mpTitleED;
+ Rectangle maTextEditMaxArea;
};
#endif // THUMBNAILVIEWITEM_HXX
diff --git a/sfx2/source/control/templatelocalview.cxx b/sfx2/source/control/templatelocalview.cxx
index 76516d7..2bbf0d0 100644
--- a/sfx2/source/control/templatelocalview.cxx
+++ b/sfx2/source/control/templatelocalview.cxx
@@ -37,6 +37,7 @@
mpDocTemplates(new SfxDocumentTemplates)
{
mpItemView->SetColor(GetSettings().GetStyleSettings().GetFieldColor());
+ mpItemView->setMasterView(this);
}
TemplateLocalView::~TemplateLocalView()
@@ -63,7 +64,7 @@
OUString aName = mpDocTemplates->GetName(i,j);
OUString aURL = mpDocTemplates->GetPath(i,j);
- TemplateItemProperties aProperties;;
+ TemplateItemProperties aProperties;
aProperties.nId = j+1;
aProperties.nDocId = j;
aProperties.nRegionId = i;
@@ -604,6 +605,24 @@
showOverlay(true);
}
+void TemplateLocalView::renameItem(ThumbnailViewItem* pItem, rtl::OUString sNewTitle)
+{
+ sal_uInt16 nRegionId = 0;
+ sal_uInt16 nDocId = USHRT_MAX;
+ TemplateViewItem* pDocItem = dynamic_cast<TemplateViewItem*>( pItem );
+ TemplateContainerItem* pContainerItem = dynamic_cast<TemplateContainerItem*>( pItem );
+ if ( pDocItem )
+ {
+ nRegionId = pDocItem->mnRegionId;
+ nDocId = pDocItem->mnDocId;
+ }
+ else if ( pContainerItem )
+ {
+ nRegionId = pContainerItem->mnId - 1;
+ }
+ mpDocTemplates->SetName( sNewTitle, nRegionId, nDocId );
+}
+
static void lcl_updateThumbnails (TemplateContainerItem *pItem)
{
pItem->maPreview1.Clear();
diff --git a/sfx2/source/control/templateview.cxx b/sfx2/source/control/templateview.cxx
index 9758065..90e86ec 100644
--- a/sfx2/source/control/templateview.cxx
+++ b/sfx2/source/control/templateview.cxx
@@ -9,6 +9,7 @@
#include "templatedlg.hxx"
#include <sfx2/templateview.hxx>
+#include <sfx2/templateabstractview.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <basegfx/point/b2dpoint.hxx>
@@ -34,6 +35,7 @@
TemplateView::TemplateView (Window *pParent)
: ThumbnailView(pParent,WB_VSCROLL),
+ mpMasterView(NULL),
maButtons(this, SfxResId(CONTROL_BUTTONS)),
maAllButton(&maButtons, SfxResId(BTN_ALL_TEMPLATES)),
maFTName(&maButtons, SfxResId(FT_NAME)),
@@ -61,6 +63,8 @@
const TemplateItemProperties *pCur = &rTemplates[i];
pItem->mnId = pCur->nId;
+ pItem->mnDocId = pCur->nDocId;
+ pItem->mnRegionId = pCur->nRegionId;
pItem->maTitle = pCur->aName;
pItem->setPath(pCur->aPath);
pItem->maPreview1 = pCur->aThumbnail;
@@ -101,6 +105,12 @@
maDblClickHdl.Call(pItem);
}
+void TemplateView::renameItem(ThumbnailViewItem* pItem, rtl::OUString sNewTitle)
+{
+ if (mpMasterView)
+ mpMasterView->renameItem(pItem, sNewTitle);
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/templateviewitem.cxx b/sfx2/source/control/templateviewitem.cxx
index 9f06ebb..94ce4d3 100644
--- a/sfx2/source/control/templateviewitem.cxx
+++ b/sfx2/source/control/templateviewitem.cxx
@@ -28,7 +28,9 @@
using namespace drawinglayer::primitive2d;
TemplateViewItem::TemplateViewItem (ThumbnailView &rView)
- : ThumbnailViewItem(rView)
+ : ThumbnailViewItem(rView),
+ mnRegionId(USHRT_MAX),
+ mnDocId(USHRT_MAX)
{
}
diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx
index 62324a7..9a29381 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -505,6 +505,9 @@
deselectItems( );
pItem->setSelection(true);
+ bool bClickOnTitle = pItem->getTextArea().IsInside(rMEvt.GetPosPixel());
+ pItem->setEditTitle(bClickOnTitle);
+
if (!pItem->isHighlighted())
DrawItem(pItem);
@@ -881,6 +884,7 @@
{
if (mItemList[i]->isSelected())
{
+ mItemList[i]->setEditTitle(false);
mItemList[i]->setSelection(false);
maItemStateHdl.Call(mItemList[i]);
@@ -976,6 +980,11 @@
Invalidate();
}
+void ThumbnailView::renameItem(ThumbnailViewItem*, rtl::OUString)
+{
+ // Do nothing by default
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/thumbnailviewitem.cxx b/sfx2/source/control/thumbnailviewitem.cxx
index 2e6eb96..c228bab 100644
--- a/sfx2/source/control/thumbnailviewitem.cxx
+++ b/sfx2/source/control/thumbnailviewitem.cxx
@@ -19,6 +19,7 @@
#include <sfx2/thumbnailviewitem.hxx>
+#include "thumbnailview.hxx"
#include "thumbnailviewacc.hxx"
#include <basegfx/matrix/b2dhommatrixtools.hxx>
@@ -42,6 +43,66 @@
using namespace drawinglayer::attribute;
using namespace drawinglayer::primitive2d;
+class ResizableMultiLineEdit : public VclMultiLineEdit
+{
+ private:
+ ThumbnailViewItem* mpItem;
+ bool mbIsInGrabFocus;
+
+ public:
+ ResizableMultiLineEdit (Window* pParent, ThumbnailViewItem* pItem);
+ ~ResizableMultiLineEdit ();
+
+ void SetInGrabFocus(bool bInGrabFocus) { mbIsInGrabFocus = bInGrabFocus; }
+
+ virtual long PreNotify(NotifyEvent& rNEvt);
+ virtual void Modify();
+};
+
+ResizableMultiLineEdit::ResizableMultiLineEdit (Window* pParent, ThumbnailViewItem* pItem) :
+ VclMultiLineEdit (pParent, WB_CENTER | WB_BORDER),
+ mpItem(pItem),
+ mbIsInGrabFocus(false)
+{
+}
+
+ResizableMultiLineEdit::~ResizableMultiLineEdit ()
+{
+}
+
+long ResizableMultiLineEdit::PreNotify(NotifyEvent& rNEvt)
+{
+ long nDone = 0;
+ if( rNEvt.GetType() == EVENT_KEYINPUT )
+ {
+ const KeyEvent& rKEvt = *rNEvt.GetKeyEvent();
+ KeyCode aCode = rKEvt.GetKeyCode();
+ switch (aCode.GetCode())
+ {
+ case KEY_RETURN:
+ mpItem->setTitle( GetText() );
+ case KEY_ESCAPE:
+ mpItem->setEditTitle(false);
+ nDone = 1;
+ break;
+ default:
+ break;
+ }
+ }
+ else if ( rNEvt.GetType() == EVENT_LOSEFOCUS && !mbIsInGrabFocus )
+ {
+ mpItem->setTitle( GetText() );
+ mpItem->setEditTitle(false, false);
+ }
+ return nDone ? nDone : VclMultiLineEdit::PreNotify(rNEvt);
+}
+
+void ResizableMultiLineEdit::Modify()
+{
+ VclMultiLineEdit::Modify();
+ mpItem->updateTitleEditSize();
+}
+
ThumbnailViewItem::ThumbnailViewItem(ThumbnailView &rView)
: mrParent(rView)
, mnId(0)
@@ -49,11 +110,16 @@
, mbSelected(false)
, mbHover(false)
, mpxAcc(NULL)
+ , mbEditTitle(false)
+ , mpTitleED(NULL)
+ , maTextEditMaxArea()
{
+ mpTitleED = new ResizableMultiLineEdit(&rView, this);
}
ThumbnailViewItem::~ThumbnailViewItem()
{
+ delete mpTitleED;
if( mpxAcc )
{
static_cast< ThumbnailViewItemAcc* >( mpxAcc->get() )->ParentDestroyed();
@@ -64,6 +130,8 @@
void ThumbnailViewItem::show (bool bVisible)
{
mbVisible = bVisible;
+ if (!mbVisible)
+ mpTitleED->Show(false);
}
void ThumbnailViewItem::setSelection (bool state)
@@ -74,6 +142,53 @@
void ThumbnailViewItem::setHighlight (bool state)
{
mbHover = state;
+}
+
+void ThumbnailViewItem::setEditTitle (bool edit, bool bChangeFocus)
+{
+ mbEditTitle = edit;
+ mpTitleED->Show(edit);
+ if (edit)
+ {
+ mpTitleED->SetText(maTitle);
+ updateTitleEditSize();
+ static_cast<ResizableMultiLineEdit*>(mpTitleED)->SetInGrabFocus(true);
+ mpTitleED->GrabFocus();
+ static_cast<ResizableMultiLineEdit*>(mpTitleED)->SetInGrabFocus(false);
+ }
+ else if (bChangeFocus)
+ {
+ mrParent.GrabFocus();
+ }
+}
+
+Rectangle ThumbnailViewItem::getTextArea() const
+{
+ Rectangle aTextArea(maTextEditMaxArea);
+
+ TextEngine aTextEngine;
+ aTextEngine.SetMaxTextWidth(maDrawArea.getWidth());
+ aTextEngine.SetText(maTitle);
+
+ long nTxtHeight = aTextEngine.GetTextHeight() + 6;
+ if (nTxtHeight < aTextArea.GetHeight())
+ aTextArea.SetSize(Size(aTextArea.GetWidth(), nTxtHeight));
+
+ return aTextArea;
+}
+
+void ThumbnailViewItem::updateTitleEditSize()
+{
+ Rectangle aTextArea = getTextArea();
+ Point aPos = aTextArea.TopLeft();
+ Size aSize = aTextArea.GetSize();
+ mpTitleED->SetPosSizePixel(aPos, aSize);
+}
+
+void ThumbnailViewItem::setTitle (const rtl::OUString& rTitle)
+{
+ mrParent.renameItem(this, rTitle);
+ maTitle = rTitle;
}
uno::Reference< accessibility::XAccessible > ThumbnailViewItem::GetAccessible( bool bIsTransientChildrenDisabled )
@@ -108,9 +223,15 @@
maPrev1Pos = aPos;
// Calculate text position
- aPos.Y() = maDrawArea.getY() + nThumbnailHeight + nPadding + aTextDev.getTextHeight();
+ aPos.Y() = maDrawArea.getY() + nThumbnailHeight + nPadding * 2;
aPos.X() = maDrawArea.Left() + (aRectSize.Width() - aTextDev.getTextWidth(maTitle,0,nMaxTextLenght))/2;
maTextPos = aPos;
+
+ // Calculate the text edit max area
+ aPos = Point(maDrawArea.getX() + nPadding, maTextPos.getY());
+ Size aEditSize(maDrawArea.GetWidth() - nPadding * 2,
+ maDrawArea.Bottom() - maTextPos.Y());
+ maTextEditMaxArea = Rectangle( aPos, aEditSize );
}
void ThumbnailViewItem::setSelectClickHdl (const Link &link)
@@ -162,8 +283,7 @@
// Draw text below thumbnail
aPos = maTextPos;
-
- addTextPrimitives( maTitle, pAttrs, maTextPos, aSeq );
+ addTextPrimitives( maTitle, pAttrs, aPos, aSeq );
pProcessor->process(aSeq);
}
@@ -172,6 +292,8 @@
{
drawinglayer::primitive2d::TextLayouterDevice aTextDev;
+ aPos.setY(aPos.getY() + aTextDev.getTextHeight());
+
rtl::OUString aText (rText);
TextEngine aTextEngine;
diff --git a/sfx2/source/doc/doctempl.cxx b/sfx2/source/doc/doctempl.cxx
index aa3c603..6678600 100644
--- a/sfx2/source/doc/doctempl.cxx
+++ b/sfx2/source/doc/doctempl.cxx
@@ -1098,6 +1098,61 @@
return sal_False;
}
+sal_Bool SfxDocumentTemplates::SetName( const OUString& rName, sal_uInt16 nRegion, sal_uInt16 nIdx )
+
+{
+ DocTemplLocker_Impl aLocker( *pImp );
+
+ if ( ! pImp->Construct() )
+ return sal_False;
+
+ RegionData_Impl *pRegion = pImp->GetRegion( nRegion );
+ DocTempl_EntryData_Impl *pEntry = NULL;
+
+ if ( !pRegion )
+ return sal_False;
+
+ uno::Reference< XDocumentTemplates > xTemplates = pImp->getDocTemplates();
+ OUString aEmpty;
+
+ if ( nIdx == USHRT_MAX )
+ {
+ if ( pRegion->GetTitle() == rName )
+ return sal_True;
+
+ // we have to rename a region
+ if ( xTemplates->renameGroup( pRegion->GetTitle(), rName ) )
+ {
+ pRegion->SetTitle( rName );
+ pRegion->SetTargetURL( aEmpty );
+ pRegion->SetHierarchyURL( aEmpty );
+ return sal_True;
+ }
+ }
+ else
+ {
+ pEntry = pRegion->GetEntry( nIdx );
+
+ if ( !pEntry )
+ return sal_False;
+
+ if ( pEntry->GetTitle() == rName )
+ return sal_True;
+
+ if ( xTemplates->renameTemplate( pRegion->GetTitle(),
+ pEntry->GetTitle(),
+ rName ) )
+ {
+ pEntry->SetTitle( rName );
+ pEntry->SetTargetURL( aEmpty );
+ pEntry->SetHierarchyURL( aEmpty );
+ return sal_True;
+ }
+ }
+
+ return sal_False;
+}
+
//------------------------------------------------------------------------
sal_Bool SfxDocumentTemplates::SetName
--
To view, visit https://gerrit.libreoffice.org/2108
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I2e4a89c2e68f7e04b0fca3fc161920505ac715b4
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Bosdonnat Cedric <cedric.bosdonnat at free.fr>
More information about the LibreOffice
mailing list