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 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_dbaccess.hxx" 26 #ifndef DBAUI_TABLEDESIGNVIEW_HXX 27 #include "TableDesignView.hxx" 28 #endif 29 #ifndef _TOOLS_DEBUG_HXX 30 #include <tools/debug.hxx> 31 #endif 32 #ifndef DBUI_TABLECONTROLLER_HXX 33 #include "TableController.hxx" 34 #endif 35 #ifndef _DBA_DBACCESS_HELPID_HRC_ 36 #include "dbaccess_helpid.hrc" 37 #endif 38 #ifndef DBAUI_FIELDDESCRIPTIONS_HXX 39 #include "FieldDescriptions.hxx" 40 #endif 41 #ifndef DBAUI_TABLEEDITORCONTROL_HXX 42 #include "TEditControl.hxx" 43 #endif 44 #ifndef DBAUI_TABLEFIELDDESCRIPTION_HXX 45 #include "TableFieldDescWin.hxx" 46 #endif 47 #ifndef DBAUI_TABLEROW_HXX 48 #include "TableRow.hxx" 49 #endif 50 #ifndef _UTL_CONFIGMGR_HXX_ 51 #include <unotools/configmgr.hxx> 52 #endif 53 #ifndef _COMPHELPER_TYPES_HXX_ 54 #include <comphelper/types.hxx> 55 #endif 56 #ifndef _COM_SUN_STAR_DATATRANSFER_CLIPBOARD_XCLIPBOARD_HPP_ 57 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> 58 #endif 59 #ifndef INCLUDED_SVTOOLS_SYSLOCALE_HXX 60 #include <unotools/syslocale.hxx> 61 #endif 62 #ifndef DBAUI_TOOLS_HXX 63 #include "UITools.hxx" 64 #endif 65 66 67 using namespace ::dbaui; 68 using namespace ::utl; 69 using namespace ::com::sun::star::uno; 70 using namespace ::com::sun::star::datatransfer::clipboard; 71 using namespace ::com::sun::star::lang; 72 using namespace ::com::sun::star::beans; 73 74 //================================================================== 75 // class OTableBorderWindow 76 DBG_NAME(OTableBorderWindow) 77 //================================================================== 78 OTableBorderWindow::OTableBorderWindow(Window* pParent) : Window(pParent,WB_BORDER) 79 ,m_aHorzSplitter( this ) 80 { 81 DBG_CTOR(OTableBorderWindow,NULL); 82 83 ImplInitSettings( sal_True, sal_True, sal_True ); 84 ////////////////////////////////////////////////////////////////////// 85 // Childs erzeugen 86 m_pEditorCtrl = new OTableEditorCtrl( this); 87 m_pFieldDescWin = new OTableFieldDescWin( this ); 88 89 m_pFieldDescWin->SetHelpId(HID_TAB_DESIGN_DESCWIN); 90 91 // set depending windows and controls 92 m_pEditorCtrl->SetDescrWin(m_pFieldDescWin); 93 94 ////////////////////////////////////////////////////////////////////// 95 // Splitter einrichten 96 m_aHorzSplitter.SetSplitHdl( LINK(this, OTableBorderWindow, SplitHdl) ); 97 m_aHorzSplitter.Show(); 98 } 99 // ----------------------------------------------------------------------------- 100 OTableBorderWindow::~OTableBorderWindow() 101 { 102 ////////////////////////////////////////////////////////////////////// 103 // Childs zerstoeren 104 // ::dbaui::notifySystemWindow(this,m_pFieldDescWin,::comphelper::mem_fun(&TaskPaneList::RemoveWindow)); 105 m_pEditorCtrl->Hide(); 106 m_pFieldDescWin->Hide(); 107 108 { 109 ::std::auto_ptr<Window> aTemp(m_pEditorCtrl); 110 m_pEditorCtrl = NULL; 111 } 112 { 113 ::std::auto_ptr<Window> aTemp(m_pFieldDescWin); 114 m_pFieldDescWin = NULL; 115 } 116 117 DBG_DTOR(OTableBorderWindow,NULL); 118 } 119 // ----------------------------------------------------------------------------- 120 void OTableBorderWindow::Resize() 121 { 122 const long nSplitterHeight(3); 123 124 ////////////////////////////////////////////////////////////////////// 125 // Abmessungen parent window 126 Size aOutputSize( GetOutputSize() ); 127 long nOutputWidth = aOutputSize.Width(); 128 long nOutputHeight = aOutputSize.Height(); 129 long nSplitPos = m_aHorzSplitter.GetSplitPosPixel(); 130 131 ////////////////////////////////////////////////////////////////////// 132 // Verschiebebereich Splitter mittleres Drittel des Outputs 133 long nDragPosY = nOutputHeight/3; 134 long nDragSizeHeight = nOutputHeight/3; 135 m_aHorzSplitter.SetDragRectPixel( Rectangle(Point(0,nDragPosY), Size(nOutputWidth,nDragSizeHeight) ), this ); 136 if( (nSplitPos < nDragPosY) || (nSplitPos > (nDragPosY+nDragSizeHeight)) ) 137 nSplitPos = nDragPosY+nDragSizeHeight-5; 138 139 ////////////////////////////////////////////////////////////////////// 140 // Splitter setzen 141 m_aHorzSplitter.SetPosSizePixel( Point( 0, nSplitPos ), Size(nOutputWidth, nSplitterHeight)); 142 m_aHorzSplitter.SetSplitPosPixel( nSplitPos ); 143 144 ////////////////////////////////////////////////////////////////////// 145 // Fenster setzen 146 m_pEditorCtrl->SetPosSizePixel( Point(0, 0), Size(nOutputWidth , nSplitPos) ); 147 148 m_pFieldDescWin->SetPosSizePixel( Point(0, nSplitPos+nSplitterHeight), 149 Size(nOutputWidth, nOutputHeight-nSplitPos-nSplitterHeight) ); 150 } 151 //------------------------------------------------------------------------------ 152 IMPL_LINK( OTableBorderWindow, SplitHdl, Splitter*, pSplit ) 153 { 154 if(pSplit == &m_aHorzSplitter) 155 { 156 m_aHorzSplitter.SetPosPixel( Point( m_aHorzSplitter.GetPosPixel().X(),m_aHorzSplitter.GetSplitPosPixel() ) ); 157 Resize(); 158 } 159 return 0; 160 } 161 // ----------------------------------------------------------------------------- 162 void OTableBorderWindow::ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ) 163 { 164 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 165 166 if ( bFont ) 167 { 168 Font aFont = rStyleSettings.GetAppFont(); 169 if ( IsControlFont() ) 170 aFont.Merge( GetControlFont() ); 171 SetPointFont( aFont ); 172 // Set/*Zoomed*/PointFont( aFont ); 173 } 174 175 if ( bFont || bForeground ) 176 { 177 Color aTextColor = rStyleSettings.GetButtonTextColor(); 178 if ( IsControlForeground() ) 179 aTextColor = GetControlForeground(); 180 SetTextColor( aTextColor ); 181 } 182 183 if ( bBackground ) 184 { 185 if( IsControlBackground() ) 186 SetBackground( GetControlBackground() ); 187 else 188 SetBackground( rStyleSettings.GetFaceColor() ); 189 } 190 } 191 // ----------------------------------------------------------------------- 192 void OTableBorderWindow::DataChanged( const DataChangedEvent& rDCEvt ) 193 { 194 Window::DataChanged( rDCEvt ); 195 196 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 197 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 198 { 199 ImplInitSettings( sal_True, sal_True, sal_True ); 200 Invalidate(); 201 } 202 } 203 // ----------------------------------------------------------------------------- 204 void OTableBorderWindow::GetFocus() 205 { 206 Window::GetFocus(); 207 208 // forward the focus to the current cell of the editor control 209 if (m_pEditorCtrl) 210 m_pEditorCtrl->GrabFocus(); 211 } 212 213 //================================================================== 214 // class OTableDesignView 215 //================================================================== 216 DBG_NAME(OTableDesignView); 217 //------------------------------------------------------------------------------ 218 OTableDesignView::OTableDesignView( Window* pParent, 219 const Reference< XMultiServiceFactory >& _rxOrb, 220 OTableController& _rController 221 ) : 222 ODataView( pParent, _rController,_rxOrb ) 223 ,m_rController( _rController ) 224 ,m_eChildFocus(NONE) 225 { 226 DBG_CTOR(OTableDesignView,NULL); 227 228 try 229 { 230 m_aLocale = SvtSysLocale().GetLocaleData().getLocale(); 231 } 232 catch(Exception&) 233 { 234 } 235 236 m_pWin = new OTableBorderWindow(this); 237 m_pWin->Show(); 238 } 239 240 //------------------------------------------------------------------------------ 241 OTableDesignView::~OTableDesignView() 242 { 243 DBG_DTOR(OTableDesignView,NULL); 244 m_pWin->Hide(); 245 246 { 247 ::std::auto_ptr<Window> aTemp(m_pWin); 248 m_pWin = NULL; 249 } 250 } 251 252 // ----------------------------------------------------------------------------- 253 void OTableDesignView::initialize() 254 { 255 GetEditorCtrl()->Init(); 256 GetDescWin()->Init(); 257 // first call after the editctrl has been set 258 259 GetEditorCtrl()->Show(); 260 GetDescWin()->Show(); 261 262 GetEditorCtrl()->DisplayData(0); 263 } 264 //------------------------------------------------------------------------------ 265 266 //------------------------------------------------------------------------------ 267 void OTableDesignView::resizeDocumentView(Rectangle& _rPlayground) 268 { 269 m_pWin->SetPosSizePixel( _rPlayground.TopLeft(), _rPlayground.GetSize() ); 270 271 // just for completeness: there is no space left, we occupied it all ... 272 _rPlayground.SetPos( _rPlayground.BottomRight() ); 273 _rPlayground.SetSize( Size( 0, 0 ) ); 274 } 275 276 //------------------------------------------------------------------------------ 277 IMPL_LINK( OTableDesignView, SwitchHdl, Accelerator*, /*pAcc*/ ) 278 { 279 if( getController().isReadOnly() ) 280 return 0; 281 282 if( GetDescWin()->HasChildPathFocus() ) 283 { 284 GetDescWin()->LoseFocus(); 285 GetEditorCtrl()->GrabFocus(); 286 } 287 else 288 { 289 ::boost::shared_ptr<OTableRow> pRow = (*GetEditorCtrl()->GetRowList())[GetEditorCtrl()->GetCurRow()]; 290 OFieldDescription* pFieldDescr = pRow ? pRow->GetActFieldDescr() : NULL; 291 if ( pFieldDescr ) 292 GetDescWin()->GrabFocus(); 293 else 294 GetEditorCtrl()->GrabFocus(); 295 } 296 297 return 0; 298 } 299 //------------------------------------------------------------------------------ 300 long OTableDesignView::PreNotify( NotifyEvent& rNEvt ) 301 { 302 sal_Bool bHandled = sal_False; 303 switch(rNEvt.GetType()) 304 { 305 case EVENT_GETFOCUS: 306 if( GetDescWin() && GetDescWin()->HasChildPathFocus() ) 307 m_eChildFocus = DESCRIPTION; 308 else if ( GetEditorCtrl() && GetEditorCtrl()->HasChildPathFocus() ) 309 m_eChildFocus = EDITOR; 310 else 311 m_eChildFocus = NONE; 312 break; 313 } 314 315 return bHandled ? 1L : ODataView::PreNotify(rNEvt); 316 } 317 // ----------------------------------------------------------------------------- 318 IClipboardTest* OTableDesignView::getActiveChild() const 319 { 320 IClipboardTest* pTest = NULL; 321 switch(m_eChildFocus) 322 { 323 case DESCRIPTION: 324 pTest = GetDescWin(); 325 break; 326 case EDITOR: 327 pTest = GetEditorCtrl(); 328 break; 329 case NONE: 330 break; 331 } 332 return pTest; 333 } 334 // ----------------------------------------------------------------------------- 335 sal_Bool OTableDesignView::isCopyAllowed() 336 { 337 IClipboardTest* pTest = getActiveChild(); 338 return pTest && pTest->isCopyAllowed(); 339 } 340 // ----------------------------------------------------------------------------- 341 sal_Bool OTableDesignView::isCutAllowed() 342 { 343 IClipboardTest* pTest = getActiveChild(); 344 return pTest && pTest->isCutAllowed(); 345 } 346 // ----------------------------------------------------------------------------- 347 sal_Bool OTableDesignView::isPasteAllowed() 348 { 349 IClipboardTest* pTest = getActiveChild(); 350 return pTest && pTest->isPasteAllowed(); 351 } 352 // ----------------------------------------------------------------------------- 353 void OTableDesignView::copy() 354 { 355 IClipboardTest* pTest = getActiveChild(); 356 if ( pTest ) 357 pTest->copy(); 358 } 359 // ----------------------------------------------------------------------------- 360 void OTableDesignView::cut() 361 { 362 IClipboardTest* pTest = getActiveChild(); 363 if ( pTest ) 364 pTest->cut(); 365 } 366 // ----------------------------------------------------------------------------- 367 void OTableDesignView::paste() 368 { 369 IClipboardTest* pTest = getActiveChild(); 370 if ( pTest ) 371 pTest->paste(); 372 } 373 // ----------------------------------------------------------------------------- 374 // set the view readonly or not 375 void OTableDesignView::setReadOnly(sal_Bool _bReadOnly) 376 { 377 GetDescWin()->SetReadOnly(_bReadOnly); 378 GetEditorCtrl()->SetReadOnly(_bReadOnly); 379 } 380 // ----------------------------------------------------------------------------- 381 void OTableDesignView::reSync() 382 { 383 GetEditorCtrl()->DeactivateCell(); 384 ::boost::shared_ptr<OTableRow> pRow = (*GetEditorCtrl()->GetRowList())[GetEditorCtrl()->GetCurRow()]; 385 OFieldDescription* pFieldDescr = pRow ? pRow->GetActFieldDescr() : NULL; 386 if ( pFieldDescr ) 387 GetDescWin()->DisplayData(pFieldDescr); 388 } 389 // ----------------------------------------------------------------------------- 390 void OTableDesignView::GetFocus() 391 { 392 if ( GetEditorCtrl() ) 393 GetEditorCtrl()->GrabFocus(); 394 } 395 // ----------------------------------------------------------------------------- 396 397