diff options
Diffstat (limited to '')
-rw-r--r-- | dbaccess/source/ui/control/sqledit.cxx | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/dbaccess/source/ui/control/sqledit.cxx b/dbaccess/source/ui/control/sqledit.cxx new file mode 100644 index 000000000..ccbe210af --- /dev/null +++ b/dbaccess/source/ui/control/sqledit.cxx @@ -0,0 +1,248 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * 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 . + */ + +#include <sal/config.h> + +#include <cassert> + +#include <com/sun/star/beans/XMultiPropertySet.hpp> +#include <com/sun/star/beans/XPropertiesChangeListener.hpp> +#include <com/sun/star/container/XHierarchicalNameAccess.hpp> +#include <officecfg/Office/Common.hxx> +#include <sqledit.hxx> +#include <QueryTextView.hxx> +#include <querycontainerwindow.hxx> +#include <helpids.h> +#include <undosqledit.hxx> +#include <QueryDesignView.hxx> +#include <svx/svxids.hrc> +#include <vcl/settings.hxx> +#include <cppuhelper/implbase.hxx> +#include <i18nlangtag/languagetag.hxx> +#include <vcl/event.hxx> +#include <vcl/svapp.hxx> + +using namespace dbaui; + +class OSqlEdit::ChangesListener: + public cppu::WeakImplHelper< css::beans::XPropertiesChangeListener > +{ +public: + explicit ChangesListener(OSqlEdit & editor): editor_(editor) {} + +private: + virtual ~ChangesListener() override {} + + virtual void SAL_CALL disposing(css::lang::EventObject const &) override + { + osl::MutexGuard g(editor_.m_mutex); + editor_.m_notifier.clear(); + } + + virtual void SAL_CALL propertiesChange( + css::uno::Sequence< css::beans::PropertyChangeEvent > const &) override + { + SolarMutexGuard g; + editor_.ImplSetFont(); + } + + OSqlEdit & editor_; +}; + +OSqlEdit::OSqlEdit( OQueryTextView* pParent ) : + MultiLineEditSyntaxHighlight( pParent, WB_LEFT | WB_VSCROLL | WB_BORDER ) + ,m_pView(pParent) + ,m_bAccelAction( false ) + ,m_bStopTimer(false ) +{ + SetHelpId( HID_CTL_QRYSQLEDIT ); + SetModifyHdl( LINK(this, OSqlEdit, ModifyHdl) ); + + m_timerUndoActionCreation.SetTimeout(1000); + m_timerUndoActionCreation.SetInvokeHandler(LINK(this, OSqlEdit, OnUndoActionTimer)); + + m_timerInvalidate.SetTimeout(200); + m_timerInvalidate.SetInvokeHandler(LINK(this, OSqlEdit, OnInvalidateTimer)); + m_timerInvalidate.Start(); + + ImplSetFont(); + // Listen for change of Font and Color Settings: + // Using "this" in ctor is a little fishy, but should work here at least as + // long as there are no derivations: + m_listener = new ChangesListener(*this); + css::uno::Reference< css::beans::XMultiPropertySet > n( + officecfg::Office::Common::Font::SourceViewFont::get(), + css::uno::UNO_QUERY_THROW); + { + osl::MutexGuard g(m_mutex); + m_notifier = n; + } + css::uno::Sequence< OUString > s(2); + s[0] = "FontHeight"; + s[1] = "FontName"; + n->addPropertiesChangeListener(s, m_listener.get()); + m_ColorConfig.AddListener(this); + + //#i97044# + EnableFocusSelectionHide( false ); +} + +OSqlEdit::~OSqlEdit() +{ + disposeOnce(); +} + +void OSqlEdit::dispose() +{ + if (m_timerUndoActionCreation.IsActive()) + m_timerUndoActionCreation.Stop(); + css::uno::Reference< css::beans::XMultiPropertySet > n; + { + osl::MutexGuard g(m_mutex); + n = m_notifier; + } + if (n.is()) { + n->removePropertiesChangeListener(m_listener.get()); + } + m_ColorConfig.RemoveListener(this); + m_pView.clear(); + MultiLineEditSyntaxHighlight::dispose(); +} + +void OSqlEdit::KeyInput( const KeyEvent& rKEvt ) +{ + OJoinController& rController = m_pView->getContainerWindow()->getDesignView()->getController(); + rController.InvalidateFeature(SID_CUT); + rController.InvalidateFeature(SID_COPY); + + // Is this a cut, copy, paste event? + KeyFuncType aKeyFunc = rKEvt.GetKeyCode().GetFunction(); + if( (aKeyFunc==KeyFuncType::CUT)||(aKeyFunc==KeyFuncType::COPY)||(aKeyFunc==KeyFuncType::PASTE) ) + m_bAccelAction = true; + + MultiLineEditSyntaxHighlight::KeyInput( rKEvt ); + + if( m_bAccelAction ) + m_bAccelAction = false; +} + + +void OSqlEdit::GetFocus() +{ + m_strOrigText =GetText(); + MultiLineEditSyntaxHighlight::GetFocus(); +} + +IMPL_LINK_NOARG(OSqlEdit, OnUndoActionTimer, Timer *, void) +{ + OUString aText = GetText(); + if(aText == m_strOrigText) + return; + + OJoinController& rController = m_pView->getContainerWindow()->getDesignView()->getController(); + SfxUndoManager& rUndoMgr = rController.GetUndoManager(); + std::unique_ptr<OSqlEditUndoAct> pUndoAct(new OSqlEditUndoAct( this )); + + pUndoAct->SetOriginalText( m_strOrigText ); + rUndoMgr.AddUndoAction( std::move(pUndoAct) ); + + rController.InvalidateFeature(SID_UNDO); + rController.InvalidateFeature(SID_REDO); + + m_strOrigText =aText; +} + +IMPL_LINK_NOARG(OSqlEdit, OnInvalidateTimer, Timer *, void) +{ + OJoinController& rController = m_pView->getContainerWindow()->getDesignView()->getController(); + rController.InvalidateFeature(SID_CUT); + rController.InvalidateFeature(SID_COPY); + if(!m_bStopTimer) + m_timerInvalidate.Start(); +} + +IMPL_LINK_NOARG(OSqlEdit, ModifyHdl, Edit&, void) +{ + if (m_timerUndoActionCreation.IsActive()) + m_timerUndoActionCreation.Stop(); + m_timerUndoActionCreation.Start(); + + OJoinController& rController = m_pView->getContainerWindow()->getDesignView()->getController(); + if (!rController.isModified()) + rController.setModified( true ); + + rController.InvalidateFeature(SID_SBA_QRY_EXECUTE); + rController.InvalidateFeature(SID_CUT); + rController.InvalidateFeature(SID_COPY); +} + +void OSqlEdit::SetText(const OUString& rNewText) +{ + if (m_timerUndoActionCreation.IsActive()) + { // create the trailing undo-actions + m_timerUndoActionCreation.Stop(); + LINK(this, OSqlEdit, OnUndoActionTimer).Call(nullptr); + } + + MultiLineEditSyntaxHighlight::SetText(rNewText); + m_strOrigText =rNewText; +} + +void OSqlEdit::stopTimer() +{ + m_bStopTimer = true; + if (m_timerInvalidate.IsActive()) + m_timerInvalidate.Stop(); +} + +void OSqlEdit::startTimer() +{ + m_bStopTimer = false; + if (!m_timerInvalidate.IsActive()) + m_timerInvalidate.Start(); +} + +void OSqlEdit::ConfigurationChanged( utl::ConfigurationBroadcaster* pOption, ConfigurationHints ) +{ + assert( pOption == &m_ColorConfig ); + (void) pOption; // avoid warnings + MultiLineEditSyntaxHighlight::UpdateData(); +} + +void OSqlEdit::ImplSetFont() +{ + AllSettings aSettings = GetSettings(); + StyleSettings aStyleSettings = aSettings.GetStyleSettings(); + OUString sFontName( + officecfg::Office::Common::Font::SourceViewFont::FontName::get(). + value_or( OUString() ) ); + if ( sFontName.isEmpty() ) + { + vcl::Font aTmpFont( OutputDevice::GetDefaultFont( DefaultFontType::FIXED, Application::GetSettings().GetUILanguageTag().getLanguageType(), GetDefaultFontFlags::NONE, this ) ); + sFontName = aTmpFont.GetFamilyName(); + } + Size aFontSize( + 0, officecfg::Office::Common::Font::SourceViewFont::FontHeight::get() ); + vcl::Font aFont( sFontName, aFontSize ); + aStyleSettings.SetFieldFont(aFont); + aSettings.SetStyleSettings(aStyleSettings); + SetSettings(aSettings); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |