/************************************************************** * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "svx/sidebar/PopupContainer.hxx" #include "svx/sidebar/PopupControl.hxx" #include #include "LineWidthControl.hxx" #include 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& 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& 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