xref: /trunk/main/forms/source/richtext/clipboarddispatcher.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_forms.hxx"
30*cdf0e10cSrcweir #include "clipboarddispatcher.hxx"
31*cdf0e10cSrcweir #include <editeng/editview.hxx>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir /** === begin UNO includes === **/
34*cdf0e10cSrcweir #include <com/sun/star/lang/DisposedException.hpp>
35*cdf0e10cSrcweir /** === end UNO includes === **/
36*cdf0e10cSrcweir #include <svtools/cliplistener.hxx>
37*cdf0e10cSrcweir #include <svtools/transfer.hxx>
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir //........................................................................
40*cdf0e10cSrcweir namespace frm
41*cdf0e10cSrcweir {
42*cdf0e10cSrcweir //........................................................................
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
45*cdf0e10cSrcweir     using namespace ::com::sun::star::frame;
46*cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
47*cdf0e10cSrcweir     using namespace ::com::sun::star::util;
48*cdf0e10cSrcweir     using namespace ::com::sun::star::beans;
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir     //====================================================================
51*cdf0e10cSrcweir     namespace
52*cdf0e10cSrcweir     {
53*cdf0e10cSrcweir         static URL createClipboardURL( OClipboardDispatcher::ClipboardFunc _eFunc )
54*cdf0e10cSrcweir         {
55*cdf0e10cSrcweir             URL aURL;
56*cdf0e10cSrcweir             switch ( _eFunc )
57*cdf0e10cSrcweir             {
58*cdf0e10cSrcweir             case OClipboardDispatcher::eCut:
59*cdf0e10cSrcweir                 aURL.Complete = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Cut" ) );
60*cdf0e10cSrcweir                 break;
61*cdf0e10cSrcweir             case OClipboardDispatcher::eCopy:
62*cdf0e10cSrcweir                 aURL.Complete = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Copy" ) );
63*cdf0e10cSrcweir                 break;
64*cdf0e10cSrcweir             case OClipboardDispatcher::ePaste:
65*cdf0e10cSrcweir                 aURL.Complete = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Paste" ) );
66*cdf0e10cSrcweir                 break;
67*cdf0e10cSrcweir             }
68*cdf0e10cSrcweir             return aURL;
69*cdf0e10cSrcweir         }
70*cdf0e10cSrcweir     }
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir     //====================================================================
73*cdf0e10cSrcweir     //= OClipboardDispatcher
74*cdf0e10cSrcweir     //====================================================================
75*cdf0e10cSrcweir     //--------------------------------------------------------------------
76*cdf0e10cSrcweir     OClipboardDispatcher::OClipboardDispatcher( EditView& _rView, ClipboardFunc _eFunc )
77*cdf0e10cSrcweir         :ORichTextFeatureDispatcher( _rView, createClipboardURL( _eFunc ) )
78*cdf0e10cSrcweir         ,m_eFunc( _eFunc )
79*cdf0e10cSrcweir         ,m_bLastKnownEnabled( sal_True )
80*cdf0e10cSrcweir     {
81*cdf0e10cSrcweir     }
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir     //--------------------------------------------------------------------
84*cdf0e10cSrcweir     sal_Bool OClipboardDispatcher::implIsEnabled( ) const
85*cdf0e10cSrcweir     {
86*cdf0e10cSrcweir         sal_Bool bEnabled = sal_False;
87*cdf0e10cSrcweir         switch ( m_eFunc )
88*cdf0e10cSrcweir         {
89*cdf0e10cSrcweir         case eCut:
90*cdf0e10cSrcweir             bEnabled = !getEditView()->IsReadOnly() && getEditView()->HasSelection();
91*cdf0e10cSrcweir             break;
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir         case eCopy:
94*cdf0e10cSrcweir             bEnabled = getEditView()->HasSelection();
95*cdf0e10cSrcweir             break;
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir         case ePaste:
98*cdf0e10cSrcweir             bEnabled = !getEditView()->IsReadOnly();
99*cdf0e10cSrcweir             break;
100*cdf0e10cSrcweir         }
101*cdf0e10cSrcweir         return bEnabled;
102*cdf0e10cSrcweir     }
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir     //--------------------------------------------------------------------
105*cdf0e10cSrcweir     FeatureStateEvent OClipboardDispatcher::buildStatusEvent() const
106*cdf0e10cSrcweir     {
107*cdf0e10cSrcweir         FeatureStateEvent aEvent( ORichTextFeatureDispatcher::buildStatusEvent() );
108*cdf0e10cSrcweir         aEvent.IsEnabled = implIsEnabled();
109*cdf0e10cSrcweir         return aEvent;
110*cdf0e10cSrcweir     }
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir     //--------------------------------------------------------------------
113*cdf0e10cSrcweir     void OClipboardDispatcher::invalidateFeatureState_Broadcast()
114*cdf0e10cSrcweir     {
115*cdf0e10cSrcweir         sal_Bool bEnabled = implIsEnabled();
116*cdf0e10cSrcweir         if ( m_bLastKnownEnabled == bEnabled )
117*cdf0e10cSrcweir             // nothing changed -> no notification
118*cdf0e10cSrcweir             return;
119*cdf0e10cSrcweir         m_bLastKnownEnabled = bEnabled;
120*cdf0e10cSrcweir 
121*cdf0e10cSrcweir         ORichTextFeatureDispatcher::invalidateFeatureState_Broadcast();
122*cdf0e10cSrcweir     }
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir     //--------------------------------------------------------------------
125*cdf0e10cSrcweir     void SAL_CALL OClipboardDispatcher::dispatch( const URL& /*_rURL*/, const Sequence< PropertyValue >& /*Arguments*/ ) throw (RuntimeException)
126*cdf0e10cSrcweir     {
127*cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
128*cdf0e10cSrcweir         if ( !getEditView() )
129*cdf0e10cSrcweir             throw DisposedException();
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir         switch ( m_eFunc )
132*cdf0e10cSrcweir         {
133*cdf0e10cSrcweir         case eCut:
134*cdf0e10cSrcweir             getEditView()->Cut();
135*cdf0e10cSrcweir             break;
136*cdf0e10cSrcweir 
137*cdf0e10cSrcweir         case eCopy:
138*cdf0e10cSrcweir             getEditView()->Copy();
139*cdf0e10cSrcweir             break;
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir         case ePaste:
142*cdf0e10cSrcweir             getEditView()->Paste();
143*cdf0e10cSrcweir             break;
144*cdf0e10cSrcweir         }
145*cdf0e10cSrcweir     }
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir     //====================================================================
148*cdf0e10cSrcweir     //= OPasteClipboardDispatcher
149*cdf0e10cSrcweir     //====================================================================
150*cdf0e10cSrcweir     //--------------------------------------------------------------------
151*cdf0e10cSrcweir     OPasteClipboardDispatcher::OPasteClipboardDispatcher( EditView& _rView )
152*cdf0e10cSrcweir         :OClipboardDispatcher( _rView, ePaste )
153*cdf0e10cSrcweir         ,m_pClipListener( NULL )
154*cdf0e10cSrcweir         ,m_bPastePossible( sal_False )
155*cdf0e10cSrcweir     {
156*cdf0e10cSrcweir         m_pClipListener = new TransferableClipboardListener( LINK( this, OPasteClipboardDispatcher, OnClipboardChanged ) );
157*cdf0e10cSrcweir         m_pClipListener->acquire();
158*cdf0e10cSrcweir         m_pClipListener->AddRemoveListener( _rView.GetWindow(), sal_True );
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir         // initial state
161*cdf0e10cSrcweir         TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( _rView.GetWindow() ) );
162*cdf0e10cSrcweir         m_bPastePossible = ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) || aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
163*cdf0e10cSrcweir     }
164*cdf0e10cSrcweir 
165*cdf0e10cSrcweir     //--------------------------------------------------------------------
166*cdf0e10cSrcweir     OPasteClipboardDispatcher::~OPasteClipboardDispatcher()
167*cdf0e10cSrcweir     {
168*cdf0e10cSrcweir         if ( !isDisposed() )
169*cdf0e10cSrcweir         {
170*cdf0e10cSrcweir             acquire();
171*cdf0e10cSrcweir             dispose();
172*cdf0e10cSrcweir         }
173*cdf0e10cSrcweir     }
174*cdf0e10cSrcweir 
175*cdf0e10cSrcweir     //--------------------------------------------------------------------
176*cdf0e10cSrcweir     IMPL_LINK( OPasteClipboardDispatcher, OnClipboardChanged, TransferableDataHelper*, _pDataHelper )
177*cdf0e10cSrcweir     {
178*cdf0e10cSrcweir         OSL_ENSURE( _pDataHelper, "OPasteClipboardDispatcher::OnClipboardChanged: ooops!" );
179*cdf0e10cSrcweir         m_bPastePossible = _pDataHelper->HasFormat( SOT_FORMAT_STRING )
180*cdf0e10cSrcweir                         || _pDataHelper->HasFormat( SOT_FORMAT_RTF );
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir         invalidate();
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir         return 0L;
185*cdf0e10cSrcweir     }
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir     //--------------------------------------------------------------------
188*cdf0e10cSrcweir     void OPasteClipboardDispatcher::disposing( ::osl::ClearableMutexGuard& _rClearBeforeNotify )
189*cdf0e10cSrcweir     {
190*cdf0e10cSrcweir         OSL_ENSURE( getEditView() && getEditView()->GetWindow(), "OPasteClipboardDispatcher::disposing: EditView should not (yet) be disfunctional here!" );
191*cdf0e10cSrcweir         if ( getEditView() && getEditView()->GetWindow() && m_pClipListener )
192*cdf0e10cSrcweir             m_pClipListener->AddRemoveListener( getEditView()->GetWindow(), sal_False );
193*cdf0e10cSrcweir         m_pClipListener->release();
194*cdf0e10cSrcweir         m_pClipListener = NULL;
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir         OClipboardDispatcher::disposing( _rClearBeforeNotify );
197*cdf0e10cSrcweir     }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir     //--------------------------------------------------------------------
200*cdf0e10cSrcweir     sal_Bool OPasteClipboardDispatcher::implIsEnabled( ) const
201*cdf0e10cSrcweir     {
202*cdf0e10cSrcweir         return m_bPastePossible && OClipboardDispatcher::implIsEnabled();
203*cdf0e10cSrcweir     }
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir //........................................................................
206*cdf0e10cSrcweir }   // namespace frm
207*cdf0e10cSrcweir //........................................................................
208*cdf0e10cSrcweir 
209