diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-05-19 11:06:54 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-05-19 12:28:29 +0000 |
commit | 9f6ae2c3f1928f2962c70329595fd7a5e88fdc84 (patch) | |
tree | 36a1c51f253056a1bdf54120e5da932225c14267 /sfx2 | |
parent | 04ddc7b3d7b22721dd311a24ddd9822342120981 (diff) |
sfx2 classification toolbar: add a label next to the listbox
This is in preparation of adding two more listboxes; they would be
confusing without matching labels.
Change-Id: I7c1d880458a74d25463c60f9cfbf30f0a00f6442
Reviewed-on: https://gerrit.libreoffice.org/25149
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'sfx2')
-rw-r--r-- | sfx2/source/view/classificationcontroller.cxx | 130 | ||||
-rw-r--r-- | sfx2/source/view/view.src | 5 |
2 files changed, 118 insertions, 17 deletions
diff --git a/sfx2/source/view/classificationcontroller.cxx b/sfx2/source/view/classificationcontroller.cxx index 523e4e0b57c7..b1f83108579d 100644 --- a/sfx2/source/view/classificationcontroller.cxx +++ b/sfx2/source/view/classificationcontroller.cxx @@ -19,8 +19,11 @@ #include <vcl/svapp.hxx> #include <toolkit/helper/vclunohelper.hxx> #include <vcl/toolbox.hxx> +#include <vcl/fixed.hxx> #include <sfx2/viewfrm.hxx> #include <sfx2/classificationhelper.hxx> +#include <sfx2/sfx.hrc> +#include <sfx2/sfxresid.hxx> #include <cppuhelper/supportsservice.hxx> #include <comphelper/propertysequence.hxx> #include <comphelper/dispatchcommand.hxx> @@ -46,10 +49,12 @@ public: using ClassificationCategoriesControllerBase = cppu::ImplInheritanceHelper<svt::ToolboxController, lang::XServiceInfo>; +class ClassificationControl; + /// Controller for .uno:ClassificationApply. class ClassificationCategoriesController : public ClassificationCategoriesControllerBase { - VclPtr<ListBox> m_pCategories; + VclPtr<ClassificationControl> m_pClassification; rtl::Reference<comphelper::ConfigurationListener> m_xListener; ClassificationPropertyListener m_aPropertyListener; @@ -76,6 +81,22 @@ public: void removeEntries(); }; +/// Classification control is the parent of all widgets that belongs to ClassificationCategoriesController. +class SAL_WARN_UNUSED ClassificationControl : public vcl::Window +{ + VclPtr<FixedText> m_pLabel; + VclPtr<ListBox> m_pCategories; + void SetOptimalSize(); + virtual void DataChanged(const DataChangedEvent& rEvent) override; + +public: + ClassificationControl(vcl::Window* pParent); + virtual ~ClassificationControl(); + virtual void dispose() override; + virtual void Resize() override; + VclPtr<ListBox> getCategories(); +}; + ClassificationPropertyListener::ClassificationPropertyListener(const rtl::Reference<comphelper::ConfigurationListener>& xListener, ClassificationCategoriesController& rController) : ClassificationPropertyListenerBase(xListener, "WritePath") , m_rController(rController) @@ -90,7 +111,7 @@ void ClassificationPropertyListener::setProperty(const uno::Any& /*rProperty*/) ClassificationCategoriesController::ClassificationCategoriesController(const uno::Reference<uno::XComponentContext>& rContext) : ClassificationCategoriesControllerBase(rContext, uno::Reference<frame::XFrame>(), OUString(".uno:ClassificationApply")) - , m_pCategories(nullptr) + , m_pClassification(nullptr) , m_xListener(new comphelper::ConfigurationListener("/org.openoffice.Office.Paths/Paths/Classification")) , m_aPropertyListener(m_xListener, *this) { @@ -125,7 +146,7 @@ void ClassificationCategoriesController::dispose() throw (uno::RuntimeException, SolarMutexGuard aSolarMutexGuard; svt::ToolboxController::dispose(); - m_pCategories.disposeAndClear(); + m_pClassification.disposeAndClear(); m_aPropertyListener.dispose(); m_xListener->dispose(); } @@ -136,18 +157,16 @@ uno::Reference<awt::XWindow> ClassificationCategoriesController::createItemWindo ToolBox* pToolbar = dynamic_cast<ToolBox*>(pParent); if (pToolbar) { - m_pCategories = VclPtr<ListBox>::Create(pToolbar, WB_CLIPCHILDREN|WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_DROPDOWN|WB_SIMPLEMODE); - m_pCategories->SetSelectHdl(LINK(this, ClassificationCategoriesController, SelectHdl)); - // Same as SvxFontNameBox_Impl. - m_pCategories->SetSizePixel(m_pCategories->LogicToPixel(Size(60, 160), MAP_APPFONT)); + m_pClassification = VclPtr<ClassificationControl>::Create(pToolbar); + m_pClassification->getCategories()->SetSelectHdl(LINK(this, ClassificationCategoriesController, SelectHdl)); } - return uno::Reference<awt::XWindow>(VCLUnoHelper::GetInterface(m_pCategories)); + return uno::Reference<awt::XWindow>(VCLUnoHelper::GetInterface(m_pClassification)); } IMPL_LINK_NOARG_TYPED(ClassificationCategoriesController, SelectHdl, ListBox&, void) { - OUString aEntry = m_pCategories->GetSelectEntry(); + OUString aEntry = m_pClassification->getCategories()->GetSelectEntry(); uno::Sequence<beans::PropertyValue> aPropertyValues(comphelper::InitPropertySequence( { {"Name", uno::makeAny(aEntry)}, @@ -157,7 +176,7 @@ IMPL_LINK_NOARG_TYPED(ClassificationCategoriesController, SelectHdl, ListBox&, v void ClassificationCategoriesController::statusChanged(const frame::FeatureStateEvent& /*rEvent*/) throw (uno::RuntimeException, std::exception) { - if (!m_pCategories) + if (!m_pClassification) return; SfxObjectShell* pObjectShell = SfxObjectShell::Current(); @@ -165,26 +184,103 @@ void ClassificationCategoriesController::statusChanged(const frame::FeatureState return; SfxClassificationHelper aHelper(pObjectShell->getDocProperties()); - if (m_pCategories->GetEntryCount() == 0) + if (m_pClassification->getCategories()->GetEntryCount() == 0) { std::vector<OUString> aNames = aHelper.GetBACNames(); for (const OUString& rName : aNames) - m_pCategories->InsertEntry(rName); + m_pClassification->getCategories()->InsertEntry(rName); // Normally VclBuilder::makeObject() does this. - m_pCategories->EnableAutoSize(true); - m_pCategories->SetSizePixel(m_pCategories->GetOptimalSize()); + m_pClassification->getCategories()->EnableAutoSize(true); } // Restore state based on the doc. model. const OUString& rCategoryName = aHelper.GetBACName(); if (!rCategoryName.isEmpty()) - m_pCategories->SelectEntry(rCategoryName); + m_pClassification->getCategories()->SelectEntry(rCategoryName); } void ClassificationCategoriesController::removeEntries() { - if (m_pCategories) - m_pCategories->Clear(); + if (m_pClassification) + m_pClassification->getCategories()->Clear(); +} + +ClassificationControl::ClassificationControl(vcl::Window* pParent) + : Window(pParent, WB_DIALOGCONTROL) + , m_pLabel(nullptr) + , m_pCategories(nullptr) +{ + OUString aText = SfxResId(STR_CLASSIFIED_INTELLECTUAL_PROPERTY); + m_pLabel = VclPtr<FixedText>::Create(this); + Size aTextSize(m_pLabel->GetTextWidth(aText), m_pLabel->GetTextHeight()); + // Padding. + aTextSize.Width() += 6; + m_pLabel->SetText(aText); + m_pLabel->SetSizePixel(aTextSize); + m_pLabel->Show(); + + m_pCategories = VclPtr<ListBox>::Create(this, WB_CLIPCHILDREN|WB_LEFT|WB_VCENTER|WB_3DLOOK|WB_DROPDOWN|WB_SIMPLEMODE); + m_pCategories->Show(); + + SetOptimalSize(); +} + +ClassificationControl::~ClassificationControl() +{ + disposeOnce(); +} + +void ClassificationControl::dispose() +{ + m_pLabel.disposeAndClear(); + m_pCategories.disposeAndClear(); + vcl::Window::dispose(); +} + +void ClassificationControl::Resize() +{ + // Give the label what it wants, and the remaining size to the listbox. + Size aSize(GetOutputSizePixel()); + long nWLabel = m_pLabel->GetOutputSizePixel().Width(); + long nW = aSize.Width(); + long nH = aSize.Height(); + + long nPrefHeight = m_pLabel->get_preferred_size().Height(); + long nOffset = (nH - nPrefHeight) / 2; + m_pLabel->SetPosSizePixel(Point(0, nOffset), Size(nWLabel, nPrefHeight)); + + nPrefHeight = m_pCategories->get_preferred_size().Height(); + nOffset = (nH - nPrefHeight) / 2; + m_pCategories->SetPosSizePixel(Point(nWLabel, nOffset), Size(nW - nWLabel, nPrefHeight)); +} + +VclPtr<ListBox> ClassificationControl::getCategories() +{ + return m_pCategories; +} + +void ClassificationControl::SetOptimalSize() +{ + // Same as SvxColorDockingWindow. + const Size aLogicalAttrSize(150, 0); + Size aSize(LogicToPixel(aLogicalAttrSize,MAP_APPFONT)); + + Point aPosition = m_pCategories->GetPosPixel(); + + aSize.Height() = std::max(aSize.Height(), m_pLabel->get_preferred_size().Height()); + aSize.Height() = std::max(aSize.Height(), m_pCategories->get_preferred_size().Height()); + + aSize.Width() = aPosition.X() + aSize.Width(); + + SetSizePixel(aSize); +} + +void ClassificationControl::DataChanged(const DataChangedEvent& rEvent) +{ + if ((rEvent.GetType() == DataChangedEventType::SETTINGS) && (rEvent.GetFlags() & AllSettingsFlags::STYLE)) + SetOptimalSize(); + + Window::DataChanged(rEvent); } } // namespace sfx2 diff --git a/sfx2/source/view/view.src b/sfx2/source/view/view.src index 23b4682a4b28..787f5279b63e 100644 --- a/sfx2/source/view/view.src +++ b/sfx2/source/view/view.src @@ -106,6 +106,11 @@ String STR_DOC_CLASSIFICATION_TOO_LOW Text [ en-US ] = "This document has a lower classification level than the clipboard." ; }; +String STR_CLASSIFIED_INTELLECTUAL_PROPERTY +{ + Text [ en-US ] = "Intellectual Property:" ; +}; + PushButton BT_CHECKOUT { Pos = MAP_APPFONT( 0 , 0 ); |