blob: d21442a70bdb8ac7e4284f57e256ad90e11f4ace [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <sfx2/sidebar/ResourceDefinitions.hrc>
#include <sfx2/sidebar/Theme.hxx>
#include <sfx2/sidebar/ControlFactory.hxx>
#include <sfx2/sidebar/Layouter.hxx>
#include <LinePropertyPanel.hxx>
#include <LinePropertyPanel.hrc>
#include <svx/dialogs.hrc>
#include <svx/dialmgr.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <svx/xlnclit.hxx>
#include <svx/xtable.hxx>
#include <svx/xdash.hxx>
#include <svx/drawitem.hxx>
#include <svx/svxitems.hrc>
#include <svtools/valueset.hxx>
#include <unotools/pathoptions.hxx>
#include <unotools/viewoptions.hxx>
#include <comphelper/processfactory.hxx>
#include <i18npool/mslangid.hxx>
#include <svx/xlineit0.hxx>
#include <svx/xlndsit.hxx>
#include <vcl/svapp.hxx>
#include <svx/xlnwtit.hxx>
#include <vcl/lstbox.hxx>
#include <svx/tbxcolorupdate.hxx>
#include <vcl/toolbox.hxx>
#include <svx/xlntrit.hxx>
#include <svx/xlnstit.hxx>
#include <svx/xlnedit.hxx>
#include <svx/xlncapit.hxx>
#include <svx/xlinjoit.hxx>
#include "svx/sidebar/PopupContainer.hxx"
#include "svx/sidebar/PopupControl.hxx"
#include <svx/sidebar/ColorControl.hxx>
#include "LineWidthControl.hxx"
#include <boost/bind.hpp>
using namespace css;
using namespace cssu;
using ::sfx2::sidebar::Layouter;
using ::sfx2::sidebar::Theme;
#define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
namespace {
short GetItemId_Impl_line( ValueSet& rValueSet, const Color& rCol )
{
if(rCol == COL_AUTO)
return 0;
bool bFound = false;
sal_uInt16 nCount = rValueSet.GetItemCount();
sal_uInt16 n = 1;
while ( !bFound && n <= nCount )
{
Color aValCol = rValueSet.GetItemColor(n);
bFound = ( aValCol.GetRed() == rCol.GetRed()
&& aValCol.GetGreen() == rCol.GetGreen()
&& aValCol.GetBlue() == rCol.GetBlue() );
if ( !bFound )
n++;
}
return bFound ? n : -1;
}
void FillLineEndListBox(ListBox& rListBoxStart, ListBox& rListBoxEnd, const XLineEndListSharedPtr aList)
{
const sal_uInt32 nCount(aList.get() ? aList->Count() : 0);
const String sNone(SVX_RES(RID_SVXSTR_NONE));
rListBoxStart.SetUpdateMode(false);
rListBoxEnd.SetUpdateMode(false);
rListBoxStart.Clear();
rListBoxEnd.Clear();
// add 'none' entries
rListBoxStart.InsertEntry(sNone);
rListBoxEnd.InsertEntry(sNone);
for(sal_uInt32 i(0); i < nCount; i++)
{
XLineEndEntry* pEntry = aList->GetLineEnd(i);
const Bitmap aBitmap = aList->GetUiBitmap(i);
if(!aBitmap.IsEmpty())
{
Bitmap aCopyStart(aBitmap);
Bitmap aCopyEnd(aBitmap);
// delete pBitmap;
const Size aBmpSize(aCopyStart.GetSizePixel());
const Rectangle aCropRectStart(Point(), Size(aBmpSize.Width() / 2, aBmpSize.Height()));
const Rectangle aCropRectEnd(Point(aBmpSize.Width() / 2, 0), Size(aBmpSize.Width() / 2, aBmpSize.Height()));
aCopyStart.Crop(aCropRectStart);
rListBoxStart.InsertEntry(
pEntry->GetName(),
aCopyStart);
aCopyEnd.Crop(aCropRectEnd);
rListBoxEnd.InsertEntry(
pEntry->GetName(),
aCopyEnd);
}
else
{
rListBoxStart.InsertEntry(pEntry->GetName());
rListBoxEnd.InsertEntry(pEntry->GetName());
}
}
rListBoxStart.SetUpdateMode(true);
rListBoxEnd.SetUpdateMode(true);
}
void FillLineStyleListBox(ListBox& rListBox, const XDashListSharedPtr aList)
{
const sal_uInt32 nCount(aList.get() ? aList->Count() : 0);
rListBox.SetUpdateMode(false);
rListBox.Clear();
// entry for 'none'
rListBox.InsertEntry(aList->GetStringForUiNoLine());
// entry for solid line
rListBox.InsertEntry(aList->GetStringForUiSolidLine(), aList->GetBitmapForUISolidLine());
for(sal_uInt32 i(0); i < nCount; i++)
{
XDashEntry* pEntry = aList->GetDash(i);
const Bitmap aBitmap = aList->GetUiBitmap(i);
if(!aBitmap.IsEmpty())
{
rListBox.InsertEntry(
pEntry->GetName(),
aBitmap);
// delete pBitmap;
}
else
{
rListBox.InsertEntry(pEntry->GetName());
}
}
rListBox.SetUpdateMode(true);
}
} // end of anonymous namespace
// namespace open
namespace svx { namespace sidebar {
LinePropertyPanel::LinePropertyPanel(
Window* pParent,
const cssu::Reference<css::frame::XFrame>& rxFrame,
SfxBindings* pBindings)
: Control(
pParent,
SVX_RES(RID_SIDEBAR_LINE_PANEL)),
mpFTWidth(new FixedText(this, SVX_RES(FT_WIDTH))),
mpTBWidthBackground(sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this)),
mpTBWidth(sfx2::sidebar::ControlFactory::CreateToolBox(mpTBWidthBackground.get(), SVX_RES(TB_WIDTH))),
mpFTColor(new FixedText(this, SVX_RES(FT_COLOR))),
mpTBColorBackground(sfx2::sidebar::ControlFactory::CreateToolBoxBackground(this)),
mpTBColor(sfx2::sidebar::ControlFactory::CreateToolBox(mpTBColorBackground.get(), SVX_RES(TB_COLOR))),
mpFTStyle(new FixedText(this, SVX_RES(FT_STYLE))),
mpLBStyle(new ListBox(this, SVX_RES(LB_STYLE))),
mpFTTrancparency(new FixedText(this, SVX_RES(FT_TRANSPARENT))),
mpMFTransparent(new MetricField(this, SVX_RES(MF_TRANSPARENT))),
mpFTArrow(new FixedText(this, SVX_RES(FT_ARROW))),
mpLBStart(new ListBox(this, SVX_RES(LB_START))),
mpLBEnd(new ListBox(this, SVX_RES(LB_END))),
mpFTEdgeStyle(new FixedText(this, SVX_RES(FT_EDGESTYLE))),
mpLBEdgeStyle(new ListBox(this, SVX_RES(LB_EDGESTYLE))),
mpFTCapStyle(new FixedText(this, SVX_RES(FT_CAPSTYLE))),
mpLBCapStyle(new ListBox(this, SVX_RES(LB_CAPSTYLE))),
maStyleControl(SID_ATTR_LINE_STYLE, *pBindings, *this),
maDashControl (SID_ATTR_LINE_DASH, *pBindings, *this),
maWidthControl(SID_ATTR_LINE_WIDTH, *pBindings, *this),
maColorControl(SID_ATTR_LINE_COLOR, *pBindings, *this),
maStartControl(SID_ATTR_LINE_START, *pBindings, *this),
maEndControl(SID_ATTR_LINE_END, *pBindings, *this),
maLineEndListControl(SID_LINEEND_LIST, *pBindings, *this),
maLineStyleListControl(SID_DASH_LIST, *pBindings, *this),
maTransControl(SID_ATTR_LINE_TRANSPARENCE, *pBindings, *this),
maEdgeStyle(SID_ATTR_LINE_JOINT, *pBindings, *this),
maCapStyle(SID_ATTR_LINE_CAP, *pBindings, *this),
maColor(COL_BLACK),
mpColorUpdater(new ::svx::ToolboxButtonColorUpdater(SID_ATTR_LINE_COLOR, TBI_COLOR, mpTBColor.get(), TBX_UPDATER_MODE_CHAR_COLOR_NEW)),
mpStyleItem(),
mpDashItem(),
mnTrans(0),
meMapUnit(SFX_MAPUNIT_MM),
mnWidthCoreValue(0),
maLineEndList(),
maLineStyleList(),
mpStartItem(0),
mpEndItem(0),
maColorPopup(this, ::boost::bind(&LinePropertyPanel::CreateColorPopupControl, this, _1)),
maLineWidthPopup(this, ::boost::bind(&LinePropertyPanel::CreateLineWidthPopupControl, this, _1)),
maIMGColor(SVX_RES(IMG_COLOR)),
maIMGNone(SVX_RES(IMG_NONE_ICON)),
mpIMGWidthIcon(),
mpIMGWidthIconH(),
mxFrame(rxFrame),
mpBindings(pBindings),
mbColorAvailable(true),
mbWidthValuable(true),
maLayouter(*this)
{
Initialize();
FreeResource();
// Setup the grid layouter.
const sal_Int32 nMappedToolBoxWidth (Layouter::MapWidth(*this, TOOLBOX_WIDTH));
maLayouter.GetCell(0,0).SetControl(*mpFTWidth);
maLayouter.GetCell(1,0).SetControl(*mpTBWidthBackground).SetFixedWidth();
maLayouter.GetCell(0,2).SetControl(*mpFTColor);
maLayouter.GetCell(1,2).SetControl(*mpTBColorBackground).SetFixedWidth();
maLayouter.GetCell(2,0).SetControl(*mpFTStyle);
maLayouter.GetCell(3,0).SetControl(*mpLBStyle);
maLayouter.GetCell(2,2).SetControl(*mpFTTrancparency);
maLayouter.GetCell(3,2).SetControl(*mpMFTransparent);
maLayouter.GetCell(4,0).SetControl(*mpFTArrow).SetGridWidth(3);
maLayouter.GetCell(5,0).SetControl(*mpLBStart);
maLayouter.GetCell(5,2).SetControl(*mpLBEnd);
maLayouter.GetCell(6,0).SetControl(*mpFTEdgeStyle);
maLayouter.GetCell(7,0).SetControl(*mpLBEdgeStyle);
maLayouter.GetCell(6,2).SetControl(*mpFTCapStyle);
maLayouter.GetCell(7,2).SetControl(*mpLBCapStyle);
maLayouter.GetColumn(0)
.SetWeight(1)
.SetLeftPadding(Layouter::MapWidth(*this,SECTIONPAGE_MARGIN_HORIZONTAL))
.SetMinimumWidth(nMappedToolBoxWidth);
maLayouter.GetColumn(1)
.SetWeight(0)
.SetMinimumWidth(Layouter::MapWidth(*this, CONTROL_SPACING_HORIZONTAL));
maLayouter.GetColumn(2)
.SetWeight(1)
.SetRightPadding(Layouter::MapWidth(*this,SECTIONPAGE_MARGIN_HORIZONTAL))
.SetMinimumWidth(nMappedToolBoxWidth);
// Make controls that display text handle short widths more
// graceful.
Layouter::PrepareForLayouting(*mpFTWidth);
Layouter::PrepareForLayouting(*mpFTColor);
Layouter::PrepareForLayouting(*mpFTStyle);
Layouter::PrepareForLayouting(*mpFTTrancparency);
Layouter::PrepareForLayouting(*mpFTArrow);
Layouter::PrepareForLayouting(*mpFTEdgeStyle);
Layouter::PrepareForLayouting(*mpFTCapStyle);
}
LinePropertyPanel::~LinePropertyPanel()
{
// Destroy the toolboxes, then their background windows.
mpTBWidth.reset();
mpTBColor.reset();
mpTBWidthBackground.reset();
mpTBColorBackground.reset();
}
void LinePropertyPanel::Initialize()
{
mpFTWidth->SetBackground(Wallpaper());
mpFTColor->SetBackground(Wallpaper());
mpFTStyle->SetBackground(Wallpaper());
mpFTTrancparency->SetBackground(Wallpaper());
mpFTArrow->SetBackground(Wallpaper());
mpFTEdgeStyle->SetBackground(Wallpaper());
mpFTCapStyle->SetBackground(Wallpaper());
mpIMGWidthIcon.reset(new Image[8]);
mpIMGWidthIcon[0] = Image(SVX_RES(IMG_WIDTH1_ICON));
mpIMGWidthIcon[1] = Image(SVX_RES(IMG_WIDTH2_ICON));
mpIMGWidthIcon[2] = Image(SVX_RES(IMG_WIDTH3_ICON));
mpIMGWidthIcon[3] = Image(SVX_RES(IMG_WIDTH4_ICON));
mpIMGWidthIcon[4] = Image(SVX_RES(IMG_WIDTH5_ICON));
mpIMGWidthIcon[5] = Image(SVX_RES(IMG_WIDTH6_ICON));
mpIMGWidthIcon[6] = Image(SVX_RES(IMG_WIDTH7_ICON));
mpIMGWidthIcon[7] = Image(SVX_RES(IMG_WIDTH8_ICON));
//high contrast
mpIMGWidthIconH.reset(new Image[8]);
mpIMGWidthIconH[0] = Image(SVX_RES(IMG_WIDTH1_ICON_H));
mpIMGWidthIconH[1] = Image(SVX_RES(IMG_WIDTH2_ICON_H));
mpIMGWidthIconH[2] = Image(SVX_RES(IMG_WIDTH3_ICON_H));
mpIMGWidthIconH[3] = Image(SVX_RES(IMG_WIDTH4_ICON_H));
mpIMGWidthIconH[4] = Image(SVX_RES(IMG_WIDTH5_ICON_H));
mpIMGWidthIconH[5] = Image(SVX_RES(IMG_WIDTH6_ICON_H));
mpIMGWidthIconH[6] = Image(SVX_RES(IMG_WIDTH7_ICON_H));
mpIMGWidthIconH[7] = Image(SVX_RES(IMG_WIDTH8_ICON_H));
meMapUnit = maWidthControl.GetCoreMetric();
mpTBColor->SetItemImage(TBI_COLOR, maIMGColor);
Size aTbxSize( mpTBColor->CalcWindowSizePixel() );
mpTBColor->SetOutputSizePixel( aTbxSize );
mpTBColor->SetItemBits( TBI_COLOR, mpTBColor->GetItemBits( TBI_COLOR ) | TIB_DROPDOWNONLY );
mpTBColor->SetQuickHelpText(TBI_COLOR,String(SVX_RES(STR_QH_TB_COLOR))); //Add
mpTBColor->SetBackground(Wallpaper());
mpTBColor->SetPaintTransparent(true);
Link aLink = LINK(this, LinePropertyPanel, ToolboxColorSelectHdl);
mpTBColor->SetDropdownClickHdl ( aLink );
mpTBColor->SetSelectHdl ( aLink );
FillLineStyleList();
SelectLineStyle();
aLink = LINK( this, LinePropertyPanel, ChangeLineStyleHdl );
mpLBStyle->SetSelectHdl( aLink );
mpLBStyle->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Style")));
mpLBStyle->AdaptDropDownLineCountToMaximum();
mpTBWidth->SetItemImage(TBI_WIDTH, mpIMGWidthIcon[0]);
aTbxSize = mpTBWidth->CalcWindowSizePixel() ;
mpTBWidth->SetOutputSizePixel( aTbxSize );
mpTBWidth->SetItemBits( TBI_WIDTH, mpTBWidth->GetItemBits( TBI_WIDTH ) | TIB_DROPDOWNONLY );
mpTBWidth->SetQuickHelpText(TBI_WIDTH,String(SVX_RES(STR_QH_TB_WIDTH))); //Add
mpTBWidth->SetBackground(Wallpaper());
mpTBWidth->SetPaintTransparent(true);
aLink = LINK(this, LinePropertyPanel, ToolboxWidthSelectHdl);
mpTBWidth->SetDropdownClickHdl ( aLink );
mpTBWidth->SetSelectHdl ( aLink );
FillLineEndList();
SelectEndStyle(true);
SelectEndStyle(false);
aLink = LINK( this, LinePropertyPanel, ChangeStartHdl );
mpLBStart->SetSelectHdl( aLink );
mpLBStart->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Beginning Style"))); //wj acc
mpLBStart->AdaptDropDownLineCountToMaximum();
aLink = LINK( this, LinePropertyPanel, ChangeEndHdl );
mpLBEnd->SetSelectHdl( aLink );
mpLBEnd->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Ending Style"))); //wj acc
mpLBEnd->AdaptDropDownLineCountToMaximum();
aLink = LINK(this, LinePropertyPanel, ChangeTransparentHdl);
mpMFTransparent->SetModifyHdl(aLink);
mpMFTransparent->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Transparency"))); //wj acc
mpTBWidth->SetAccessibleRelationLabeledBy(mpFTWidth.get());
mpTBColor->SetAccessibleRelationLabeledBy(mpFTColor.get());
mpLBStyle->SetAccessibleRelationLabeledBy(mpFTStyle.get());
mpMFTransparent->SetAccessibleRelationLabeledBy(mpFTTrancparency.get());
mpLBStart->SetAccessibleRelationLabeledBy(mpFTArrow.get());
mpLBEnd->SetAccessibleRelationLabeledBy(mpLBEnd.get());
aLink = LINK( this, LinePropertyPanel, ChangeEdgeStyleHdl );
mpLBEdgeStyle->SetSelectHdl( aLink );
mpLBEdgeStyle->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Corner Style")));
aLink = LINK( this, LinePropertyPanel, ChangeCapStyleHdl );
mpLBCapStyle->SetSelectHdl( aLink );
mpLBCapStyle->SetAccessibleName(::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Cap Style")));
}
void LinePropertyPanel::SetupIcons(void)
{
if(Theme::GetBoolean(Theme::Bool_UseSymphonyIcons))
{
// todo
}
else
{
// todo
}
}
LinePropertyPanel* LinePropertyPanel::Create (
Window* pParent,
const cssu::Reference<css::frame::XFrame>& rxFrame,
SfxBindings* pBindings)
{
if (pParent == NULL)
throw lang::IllegalArgumentException(A2S("no parent Window given to LinePropertyPanel::Create"), NULL, 0);
if ( ! rxFrame.is())
throw lang::IllegalArgumentException(A2S("no XFrame given to LinePropertyPanel::Create"), NULL, 1);
if (pBindings == NULL)
throw lang::IllegalArgumentException(A2S("no SfxBindings given to LinePropertyPanel::Create"), NULL, 2);
return new LinePropertyPanel(
pParent,
rxFrame,
pBindings);
}
void LinePropertyPanel::DataChanged(
const DataChangedEvent& rEvent)
{
(void)rEvent;
SetupIcons();
}
void LinePropertyPanel::NotifyItemUpdate(
sal_uInt16 nSID,
SfxItemState eState,
const SfxPoolItem* pState,
const bool bIsEnabled)
{
(void)bIsEnabled;
const bool bDisabled(SFX_ITEM_DISABLED == eState);
switch(nSID)
{
case SID_ATTR_LINE_COLOR:
{
if(bDisabled)
{
mpFTColor->Disable();
mpTBColor->Disable();
}
else
{
mpFTColor->Enable();
mpTBColor->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineColorItem* pItem = dynamic_cast< const XLineColorItem* >(pState);
if(pItem)
{
maColor = pItem->GetColorValue();
mbColorAvailable = true;
mpColorUpdater->Update(maColor);
break;
}
}
mbColorAvailable = false;
mpColorUpdater->Update(COL_WHITE);
break;
}
case SID_ATTR_LINE_DASH:
case SID_ATTR_LINE_STYLE:
{
if(bDisabled)
{
mpFTStyle->Disable();
mpLBStyle->Disable();
}
else
{
mpFTStyle->Enable();
mpLBStyle->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
if(nSID == SID_ATTR_LINE_STYLE)
{
const XLineStyleItem* pItem = dynamic_cast< const XLineStyleItem* >(pState);
if(pItem)
{
mpStyleItem.reset(pState ? (XLineStyleItem*)pItem->Clone() : 0);
}
}
else // if(nSID == SID_ATTR_LINE_DASH)
{
const XLineDashItem* pItem = dynamic_cast< const XLineDashItem* >(pState);
if(pItem)
{
mpDashItem.reset(pState ? (XLineDashItem*)pItem->Clone() : 0);
}
}
}
else
{
if(nSID == SID_ATTR_LINE_STYLE)
{
mpStyleItem.reset(0);
}
else
{
mpDashItem.reset(0);
}
}
SelectLineStyle();
break;
}
case SID_ATTR_LINE_TRANSPARENCE:
{
if(bDisabled)
{
mpFTTrancparency->Disable();
mpMFTransparent->Disable();
}
else
{
mpFTTrancparency->Enable();
mpMFTransparent->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineTransparenceItem* pItem = dynamic_cast< const XLineTransparenceItem* >(pState);
if(pItem)
{
mnTrans = pItem->GetValue();
mpMFTransparent->SetValue(mnTrans);
break;
}
}
mpMFTransparent->SetValue(0);//add
mpMFTransparent->SetText(String());
break;
}
case SID_ATTR_LINE_WIDTH:
{
if(bDisabled)
{
mpTBWidth->Disable();
mpFTWidth->Disable();
}
else
{
mpTBWidth->Enable();
mpFTWidth->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineWidthItem* pItem = dynamic_cast< const XLineWidthItem* >(pState);
if(pItem)
{
mnWidthCoreValue = pItem->GetValue();
mbWidthValuable = true;
SetWidthIcon();
break;
}
}
mbWidthValuable = false;
SetWidthIcon();
break;
}
case SID_ATTR_LINE_START:
{
if(bDisabled)
{
mpFTArrow->Disable();
mpLBStart->Disable();
}
else
{
mpFTArrow->Enable();
mpLBStart->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineStartItem* pItem = dynamic_cast< const XLineStartItem* >(pState);
if(pItem)
{
mpStartItem.reset(pItem ? (XLineStartItem*)pItem->Clone() : 0);
SelectEndStyle(true);
break;
}
}
mpStartItem.reset(0);
SelectEndStyle(true);
break;
}
case SID_ATTR_LINE_END:
{
if(bDisabled)
{
mpFTArrow->Disable();
mpLBEnd->Disable();
}
else
{
mpFTArrow->Enable();
mpLBEnd->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineEndItem* pItem = dynamic_cast< const XLineEndItem* >(pState);
if(pItem)
{
mpEndItem.reset(pItem ? (XLineEndItem*)pItem->Clone() : 0);
SelectEndStyle(false);
break;
}
}
mpEndItem.reset(0);
SelectEndStyle(false);
break;
}
case SID_LINEEND_LIST:
{
FillLineEndList();
SelectEndStyle(true);
SelectEndStyle(false);
break;
}
case SID_DASH_LIST:
{
FillLineStyleList();
SelectLineStyle();
break;
}
case SID_ATTR_LINE_JOINT:
{
if(bDisabled)
{
mpLBEdgeStyle->Disable();
mpFTEdgeStyle->Disable();
}
else
{
mpLBEdgeStyle->Enable();
mpFTEdgeStyle->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineJointItem* pItem = dynamic_cast< const XLineJointItem* >(pState);
if(pItem)
{
sal_uInt16 nEntryPos(0);
switch(pItem->GetValue())
{
case com::sun::star::drawing::LineJoint_MIDDLE:
case com::sun::star::drawing::LineJoint_ROUND:
{
nEntryPos = 1;
break;
}
case com::sun::star::drawing::LineJoint_NONE:
{
nEntryPos = 2;
break;
}
case com::sun::star::drawing::LineJoint_MITER:
{
nEntryPos = 3;
break;
}
case com::sun::star::drawing::LineJoint_BEVEL:
{
nEntryPos = 4;
break;
}
default:
break;
}
if(nEntryPos)
{
mpLBEdgeStyle->SelectEntryPos(nEntryPos - 1);
break;
}
}
}
mpLBEdgeStyle->SetNoSelection();
break;
}
case SID_ATTR_LINE_CAP:
{
if(bDisabled)
{
mpLBCapStyle->Disable();
mpFTCapStyle->Disable();
}
else
{
mpLBCapStyle->Enable();
mpLBCapStyle->Enable();
}
if(eState >= SFX_ITEM_DEFAULT)
{
const XLineCapItem* pItem = dynamic_cast< const XLineCapItem* >(pState);
if(pItem)
{
sal_uInt16 nEntryPos(0);
switch(pItem->GetValue())
{
case com::sun::star::drawing::LineCap_BUTT:
{
nEntryPos = 1;
break;
}
case com::sun::star::drawing::LineCap_ROUND:
{
nEntryPos = 2;
break;
}
case com::sun::star::drawing::LineCap_SQUARE:
{
nEntryPos = 3;
break;
}
default:
break;
}
if(nEntryPos)
{
mpLBCapStyle->SelectEntryPos(nEntryPos - 1);
break;
}
}
}
mpLBCapStyle->SetNoSelection();
break;
}
}
}
SfxBindings* LinePropertyPanel::GetBindings()
{
return mpBindings;
}
IMPL_LINK( LinePropertyPanel, ImplPopupModeEndHdl, FloatingWindow*, EMPTYARG )
{
return 0;
}
IMPL_LINK(LinePropertyPanel, ToolboxColorSelectHdl,ToolBox*, pToolBox)
{
sal_uInt16 nId = pToolBox->GetCurItemId();
if(nId == TBI_COLOR)
{
maColorPopup.Show(*pToolBox);
maColorPopup.SetCurrentColor(maColor, mbColorAvailable);
}
return 0;
}
IMPL_LINK(LinePropertyPanel, ChangeLineStyleHdl, ToolBox*, /* pToolBox */)
{
const sal_uInt16 nPos(mpLBStyle->GetSelectEntryPos());
if(LISTBOX_ENTRY_NOTFOUND != nPos && nPos != mpLBStyle->GetSavedValue())
{
if(0 == nPos)
{
// XLINE_NONE
const XLineStyleItem aItem(XLINE_NONE);
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SFX_CALLMODE_RECORD, &aItem, 0L);
}
else if(1 == nPos)
{
// XLINE_SOLID
const XLineStyleItem aItem(XLINE_SOLID);
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SFX_CALLMODE_RECORD, &aItem, 0L);
}
else if(maLineStyleList.get() && maLineStyleList->Count() > (long)(nPos - 2))
{
// XLINE_DASH
const XLineStyleItem aItemA(XLINE_DASH);
const XDashEntry* pDashEntry = maLineStyleList->GetDash(nPos - 2);
OSL_ENSURE(pDashEntry, "OOps, got empty XDash from XDashList (!)");
const XLineDashItem aItemB(
pDashEntry ? pDashEntry->GetName() : String(),
pDashEntry ? pDashEntry->GetDash() : XDash());
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SFX_CALLMODE_RECORD, &aItemA, 0L);
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_DASH, SFX_CALLMODE_RECORD, &aItemB, 0L);
}
}
return 0;
}
IMPL_LINK(LinePropertyPanel, ChangeStartHdl, void*, EMPTYARG)
{
sal_uInt16 nPos = mpLBStart->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND && nPos != mpLBStart->GetSavedValue() )
{
XLineStartItem* pItem = NULL;
if( nPos == 0 )
pItem = new XLineStartItem();
else if( maLineEndList.get() && maLineEndList->Count() > (long) ( nPos - 1 ) )
pItem = new XLineStartItem( mpLBStart->GetSelectEntry(),maLineEndList->GetLineEnd( nPos - 1 )->GetLineEnd() );
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINEEND_STYLE, SFX_CALLMODE_RECORD, pItem, 0L);
delete pItem;
}
return 0;
}
IMPL_LINK(LinePropertyPanel, ChangeEndHdl, void*, EMPTYARG)
{
sal_uInt16 nPos = mpLBEnd->GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND && nPos != mpLBEnd->GetSavedValue() )
{
XLineEndItem* pItem = NULL;
if( nPos == 0 )
pItem = new XLineEndItem();
else if( maLineEndList.get() && maLineEndList->Count() > (long) ( nPos - 1 ) )
pItem = new XLineEndItem( mpLBEnd->GetSelectEntry(), maLineEndList->GetLineEnd( nPos - 1 )->GetLineEnd() );
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINEEND_STYLE, SFX_CALLMODE_RECORD, pItem, 0L);
delete pItem;
}
return 0;
}
IMPL_LINK(LinePropertyPanel, ChangeEdgeStyleHdl, void*, EMPTYARG)
{
const sal_uInt16 nPos(mpLBEdgeStyle->GetSelectEntryPos());
if(LISTBOX_ENTRY_NOTFOUND != nPos && nPos != mpLBEdgeStyle->GetSavedValue())
{
XLineJointItem* pItem = 0;
switch(nPos)
{
case 0: // rounded
{
pItem = new XLineJointItem(com::sun::star::drawing::LineJoint_ROUND);
break;
}
case 1: // none
{
pItem = new XLineJointItem(com::sun::star::drawing::LineJoint_NONE);
break;
}
case 2: // mitered
{
pItem = new XLineJointItem(com::sun::star::drawing::LineJoint_MITER);
break;
}
case 3: // beveled
{
pItem = new XLineJointItem(com::sun::star::drawing::LineJoint_BEVEL);
break;
}
}
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_JOINT, SFX_CALLMODE_RECORD, pItem, 0L);
delete pItem;
}
return 0;
}
IMPL_LINK(LinePropertyPanel, ChangeCapStyleHdl, void*, EMPTYARG)
{
const sal_uInt16 nPos(mpLBCapStyle->GetSelectEntryPos());
if(LISTBOX_ENTRY_NOTFOUND != nPos && nPos != mpLBCapStyle->GetSavedValue())
{
XLineCapItem* pItem = 0;
switch(nPos)
{
case 0: // flat
{
pItem = new XLineCapItem(com::sun::star::drawing::LineCap_BUTT);
break;
}
case 1: // round
{
pItem = new XLineCapItem(com::sun::star::drawing::LineCap_ROUND);
break;
}
case 2: // square
{
pItem = new XLineCapItem(com::sun::star::drawing::LineCap_SQUARE);
break;
}
}
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_CAP, SFX_CALLMODE_RECORD, pItem, 0L);
delete pItem;
}
return 0;
}
IMPL_LINK(LinePropertyPanel, ToolboxWidthSelectHdl,ToolBox*, pToolBox)
{
if (pToolBox->GetCurItemId() == TBI_WIDTH)
{
maLineWidthPopup.SetWidthSelect(mnWidthCoreValue, mbWidthValuable, meMapUnit);
maLineWidthPopup.Show(*pToolBox);
}
return 0;
}
IMPL_LINK( LinePropertyPanel, ChangeTransparentHdl, void *, EMPTYARG )
{
sal_uInt16 nVal = (sal_uInt16)mpMFTransparent->GetValue();
XLineTransparenceItem aItem( nVal );
GetBindings()->GetDispatcher()->Execute(SID_ATTR_LINE_STYLE, SFX_CALLMODE_RECORD, &aItem, 0L);
return( 0L );
}
namespace
{
Color GetTransparentColor (void)
{
return COL_TRANSPARENT;
}
} // end of anonymous namespace
PopupControl* LinePropertyPanel::CreateColorPopupControl (PopupContainer* pParent)
{
return new ColorControl(
pParent,
mpBindings,
SVX_RES(RID_POPUPPANEL_LINEPAGE_COLOR),
SVX_RES(VS_COLOR),
::boost::bind(GetTransparentColor),
::boost::bind(&LinePropertyPanel::SetColor, this, _1, _2),
pParent,
0);
}
PopupControl* LinePropertyPanel::CreateLineWidthPopupControl (PopupContainer* pParent)
{
return new LineWidthControl(pParent, *this);
}
void LinePropertyPanel::EndLineWidthPopupMode (void)
{
maLineWidthPopup.Hide();
}
void LinePropertyPanel::Resize (void)
{
maLayouter.Layout();
}
void LinePropertyPanel::SetWidthIcon(int n)
{
if(n==0)
mpTBWidth->SetItemImage( TBI_WIDTH, maIMGNone);
else
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[n-1] : mpIMGWidthIcon[n-1]);
}
void LinePropertyPanel::SetWidthIcon()
{
if(!mbWidthValuable)
{
mpTBWidth->SetItemImage( TBI_WIDTH, maIMGNone);
return;
}
long nVal = LogicToLogic(mnWidthCoreValue * 10,(MapUnit)meMapUnit , MAP_POINT);
if(nVal <= 6)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[0] : mpIMGWidthIcon[0]);
else if(nVal > 6 && nVal <= 9)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[1] : mpIMGWidthIcon[1]);
else if(nVal > 9 && nVal <= 12)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[2] : mpIMGWidthIcon[2]);
else if(nVal > 12 && nVal <= 19)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[3] : mpIMGWidthIcon[3]);
else if(nVal > 19 && nVal <= 26)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[4] : mpIMGWidthIcon[4]);
else if(nVal > 26 && nVal <= 37)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[5] : mpIMGWidthIcon[5]);
else if(nVal > 37 && nVal <=52)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[6] : mpIMGWidthIcon[6]);
else if(nVal > 52)
mpTBWidth->SetItemImage( TBI_WIDTH, GetDisplayBackground().GetColor().IsDark() ? mpIMGWidthIconH[7] : mpIMGWidthIcon[7]);
}
void LinePropertyPanel::SetColor (
const String& rsColorName,
const Color aColor)
{
XLineColorItem aColorItem(rsColorName, aColor);
mpBindings->GetDispatcher()->Execute(SID_ATTR_LINE_COLOR, SFX_CALLMODE_RECORD, &aColorItem, 0L);
maColor = aColor;
}
void LinePropertyPanel::SetWidth(long nWidth)
{
mnWidthCoreValue = nWidth;
mbWidthValuable = true;
}
void LinePropertyPanel::FillLineEndList()
{
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( pSh && pSh->GetItem( SID_LINEEND_LIST ) )
{
mpLBStart->Enable();
SvxLineEndListItem aItem( *(const SvxLineEndListItem*)(pSh->GetItem( SID_LINEEND_LIST ) ) );
maLineEndList = aItem.GetLineEndList();
if(maLineEndList.get())
{
FillLineEndListBox(*mpLBStart, *mpLBEnd, maLineEndList);
}
mpLBStart->SelectEntryPos(0);
mpLBEnd->SelectEntryPos(0);
}
else
{
mpLBStart->Disable();
mpLBEnd->Disable();
}
}
void LinePropertyPanel::FillLineStyleList()
{
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( pSh && pSh->GetItem( SID_DASH_LIST ) )
{
mpLBStyle->Enable();
SvxDashListItem aItem( *(const SvxDashListItem*)(pSh->GetItem( SID_DASH_LIST ) ) );
maLineStyleList = aItem.GetDashList();
if(maLineStyleList.get())
{
FillLineStyleListBox(*mpLBStyle, maLineStyleList);
}
mpLBStyle->SelectEntryPos(0);
}
else
{
mpLBStyle->Disable();
}
}
void LinePropertyPanel::SelectLineStyle()
{
if( !mpStyleItem.get() || !mpDashItem.get() )
{
mpLBStyle->SetNoSelection();
mpLBStyle->Disable();
return;
}
const XLineStyle eXLS(mpStyleItem ? (XLineStyle)mpStyleItem->GetValue() : XLINE_NONE);
bool bSelected(false);
switch(eXLS)
{
case XLINE_NONE:
break;
case XLINE_SOLID:
mpLBStyle->SelectEntryPos(1);
bSelected = true;
break;
default:
if(mpDashItem && maLineStyleList.get())
{
const XDash& rDash = mpDashItem->GetDashValue();
for(sal_Int32 a(0);!bSelected && a < maLineStyleList->Count(); a++)
{
XDashEntry* pEntry = maLineStyleList->GetDash(a);
const XDash& rEntry = pEntry->GetDash();
if(rDash == rEntry)
{
mpLBStyle->SelectEntryPos((sal_uInt16)a + 2);
bSelected = true;
}
}
}
break;
}
if(!bSelected)
mpLBStyle->SelectEntryPos( 0 );
}
void LinePropertyPanel::SelectEndStyle(bool bStart)
{
sal_Bool bSelected(false);
if(bStart)
{
if( !mpStartItem.get() )
{
mpLBStart->SetNoSelection();
mpLBStart->Disable();
return;
}
if(mpStartItem && maLineEndList.get())
{
const basegfx::B2DPolyPolygon& rItemPolygon = mpStartItem->GetLineStartValue();
for(sal_Int32 a(0);!bSelected && a < maLineEndList->Count(); a++)
{
XLineEndEntry* pEntry = maLineEndList->GetLineEnd(a);
const basegfx::B2DPolyPolygon& rEntryPolygon = pEntry->GetLineEnd();
if(rItemPolygon == rEntryPolygon)
{
mpLBStart->SelectEntryPos((sal_uInt16)a + 1);
bSelected = true;
}
}
}
if(!bSelected)
{
mpLBStart->SelectEntryPos( 0 );
}
}
else
{
if( !mpEndItem.get() )
{
mpLBEnd->SetNoSelection();
mpLBEnd->Disable();
return;
}
if(mpEndItem && maLineEndList.get())
{
const basegfx::B2DPolyPolygon& rItemPolygon = mpEndItem->GetLineEndValue();
for(sal_Int32 a(0);!bSelected && a < maLineEndList->Count(); a++)
{
XLineEndEntry* pEntry = maLineEndList->GetLineEnd(a);
const basegfx::B2DPolyPolygon& rEntryPolygon = pEntry->GetLineEnd();
if(rItemPolygon == rEntryPolygon)
{
mpLBEnd->SelectEntryPos((sal_uInt16)a + 1);
bSelected = true;
}
}
}
if(!bSelected)
{
mpLBEnd->SelectEntryPos( 0 );
}
}
}
} } // end of namespace svx::sidebar
// eof