1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 #include "precompiled_sfx2.hxx" 23 24 #include "PanelTitleBar.hxx" 25 #include "sfx2/sfxresid.hxx" 26 #include "Sidebar.hrc" 27 28 #include "Paint.hxx" 29 #include "Panel.hxx" 30 #include "sfx2/sidebar/Theme.hxx" 31 #include "sfx2/sidebar/ControllerFactory.hxx" 32 #include "sfx2/sidebar/Tools.hxx" 33 #include <tools/svborder.hxx> 34 #include <vcl/gradient.hxx> 35 #include <vcl/image.hxx> 36 #include <toolkit/helper/vclunohelper.hxx> 37 38 using namespace css; 39 using namespace cssu; 40 41 namespace sfx2 { namespace sidebar { 42 43 static const sal_Int32 gaLeftIconPadding (5); 44 static const sal_Int32 gaRightIconPadding (5); 45 46 PanelTitleBar::PanelTitleBar ( 47 const ::rtl::OUString& rsTitle, 48 Window* pParentWindow, 49 Panel* pPanel) 50 : TitleBar(rsTitle, pParentWindow, GetBackgroundPaint()), 51 mbIsLeftButtonDown(false), 52 mpPanel(pPanel), 53 mnMenuItemIndex(1), 54 mxFrame(), 55 msMoreOptionsCommand(), 56 msAccessibleNamePrefix(String(SfxResId(SFX_STR_SIDEBAR_ACCESSIBILITY_PANEL_PREFIX))) 57 { 58 OSL_ASSERT(mpPanel != NULL); 59 60 #ifdef DEBUG 61 SetText(A2S("PanelTitleBar")); 62 #endif 63 } 64 65 PanelTitleBar::~PanelTitleBar (void) 66 { 67 } 68 69 void PanelTitleBar::SetMoreOptionsCommand ( 70 const ::rtl::OUString& rsCommandName, 71 const ::cssu::Reference<css::frame::XFrame>& rxFrame) 72 { 73 if ( ! rsCommandName.equals(msMoreOptionsCommand)) 74 { 75 if (msMoreOptionsCommand.getLength() > 0) 76 maToolBox.RemoveItem(maToolBox.GetItemPos(mnMenuItemIndex)); 77 78 msMoreOptionsCommand = rsCommandName; 79 mxFrame = rxFrame; 80 81 if (msMoreOptionsCommand.getLength() > 0) 82 { 83 maToolBox.InsertItem( 84 mnMenuItemIndex, 85 Theme::GetImage(Theme::Image_PanelMenu)); 86 Reference<frame::XToolbarController> xController ( 87 ControllerFactory::CreateToolBoxController( 88 &maToolBox, 89 mnMenuItemIndex, 90 msMoreOptionsCommand, 91 rxFrame, 92 VCLUnoHelper::GetInterface(&maToolBox), 93 0)); 94 maToolBox.SetController(mnMenuItemIndex, xController, msMoreOptionsCommand); 95 maToolBox.SetOutStyle(TOOLBOX_STYLE_FLAT); 96 maToolBox.SetQuickHelpText( 97 mnMenuItemIndex, 98 String(SfxResId(SFX_STR_SIDEBAR_MORE_OPTIONS))); 99 } 100 } 101 } 102 103 Rectangle PanelTitleBar::GetTitleArea (const Rectangle& rTitleBarBox) 104 { 105 if (mpPanel != NULL) 106 { 107 Image aImage (mpPanel->IsExpanded() 108 ? Theme::GetImage(Theme::Image_Expand) 109 : Theme::GetImage(Theme::Image_Collapse)); 110 return Rectangle( 111 aImage.GetSizePixel().Width() + gaLeftIconPadding + gaRightIconPadding, 112 rTitleBarBox.Top(), 113 rTitleBarBox.Right(), 114 rTitleBarBox.Bottom()); 115 } 116 else 117 return rTitleBarBox; 118 } 119 120 void PanelTitleBar::PaintDecoration (const Rectangle& rTitleBarBox) 121 { 122 (void)rTitleBarBox; 123 124 if (mpPanel != NULL) 125 { 126 Image aImage (mpPanel->IsExpanded() 127 ? Theme::GetImage(Theme::Image_Collapse) 128 : Theme::GetImage(Theme::Image_Expand)); 129 const Point aTopLeft ( 130 gaLeftIconPadding, 131 (GetSizePixel().Height()-aImage.GetSizePixel().Height())/2); 132 DrawImage(aTopLeft, aImage); 133 } 134 } 135 136 Paint PanelTitleBar::GetBackgroundPaint (void) 137 { 138 return Theme::GetPaint(Theme::Paint_PanelTitleBarBackground); 139 } 140 141 Color PanelTitleBar::GetTextColor (void) 142 { 143 return Theme::GetColor(Theme::Color_PanelTitleFont); 144 } 145 146 void PanelTitleBar::HandleToolBoxItemClick (const sal_uInt16 nItemIndex) 147 { 148 if (nItemIndex == mnMenuItemIndex) 149 if (msMoreOptionsCommand.getLength() > 0) 150 { 151 try 152 { 153 const util::URL aURL (Tools::GetURL(msMoreOptionsCommand)); 154 Reference<frame::XDispatch> xDispatch (Tools::GetDispatch(mxFrame, aURL)); 155 if (xDispatch.is()) 156 xDispatch->dispatch(aURL, Sequence<beans::PropertyValue>()); 157 } 158 catch(Exception& rException) 159 { 160 OSL_TRACE("caught exception: %s", 161 OUStringToOString(rException.Message, RTL_TEXTENCODING_ASCII_US).getStr()); 162 } 163 } 164 } 165 166 Reference<accessibility::XAccessible> PanelTitleBar::CreateAccessible (void) 167 { 168 const ::rtl::OUString sAccessibleName(msAccessibleNamePrefix + msTitle); 169 SetAccessibleName(sAccessibleName); 170 SetAccessibleDescription(sAccessibleName); 171 return TitleBar::CreateAccessible(); 172 } 173 174 void PanelTitleBar::MouseButtonDown (const MouseEvent& rMouseEvent) 175 { 176 if (rMouseEvent.IsLeft()) 177 { 178 mbIsLeftButtonDown = true; 179 CaptureMouse(); 180 } 181 } 182 183 void PanelTitleBar::MouseButtonUp (const MouseEvent& rMouseEvent) 184 { 185 if (IsMouseCaptured()) 186 ReleaseMouse(); 187 188 if (rMouseEvent.IsLeft()) 189 { 190 if (mbIsLeftButtonDown) 191 { 192 if (mpPanel != NULL) 193 { 194 mpPanel->SetExpanded( ! mpPanel->IsExpanded()); 195 Invalidate(); 196 } 197 } 198 } 199 if (mbIsLeftButtonDown) 200 mbIsLeftButtonDown = false; 201 } 202 203 void PanelTitleBar::DataChanged (const DataChangedEvent& rEvent) 204 { 205 maToolBox.SetItemImage( 206 mnMenuItemIndex, 207 Theme::GetImage(Theme::Image_PanelMenu)); 208 TitleBar::DataChanged(rEvent); 209 } 210 211 } } // end of namespace sfx2::sidebar 212 213 /* vim: set noet sw=4 ts=4: */ 214