File.cxx 10.4 KB
Newer Older
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/*
 * 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 .
 */
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
19 20 21 22 23 24 25 26

#include "File.hxx"

#include <com/sun/star/form/FormComponentType.hpp>

#include "property.hrc"
#include "services.hxx"
#include <tools/debug.hxx>
27
#include <comphelper/container.hxx>
28
#include <comphelper/basicio.hxx>
29
#include <comphelper/guarding.hxx>
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
30 31 32 33 34

//.........................................................................
namespace frm
{
//.........................................................................
Ocke Janssen's avatar
Ocke Janssen committed
35 36 37 38 39 40 41 42 43 44 45
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::form;
using namespace ::com::sun::star::awt;
using namespace ::com::sun::star::io;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::util;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
46 47

//------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
48
InterfaceRef SAL_CALL OFileControlModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
49 50 51 52 53
{
    return *(new OFileControlModel(_rxFactory));
}

//------------------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
54
Sequence<Type> OFileControlModel::_getTypes()
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
55
{
Ocke Janssen's avatar
Ocke Janssen committed
56
    static Sequence<Type> aTypes;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
57 58 59
    if (!aTypes.getLength())
    {
        // my base class
Ocke Janssen's avatar
Ocke Janssen committed
60
        Sequence<Type> aBaseClassTypes = OControlModel::_getTypes();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
61

Ocke Janssen's avatar
Ocke Janssen committed
62 63 64
        Sequence<Type> aOwnTypes(1);
        Type* pOwnTypes = aOwnTypes.getArray();
        pOwnTypes[0] = getCppuType((Reference<XReset>*)NULL);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
65 66 67 68 69 70 71

        aTypes = concatSequences(aBaseClassTypes, aOwnTypes);
    }
    return aTypes;
}


Ocke Janssen's avatar
Ocke Janssen committed
72
// XServiceInfo
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
73
//------------------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
74
StringSequence  OFileControlModel::getSupportedServiceNames() throw(RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
75 76 77 78
{
    StringSequence aSupported = OControlModel::getSupportedServiceNames();
    aSupported.realloc(aSupported.getLength() + 1);

79
    OUString*pArray = aSupported.getArray();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
80 81 82 83
    pArray[aSupported.getLength()-1] = FRM_SUN_COMPONENT_FILECONTROL;
    return aSupported;
}

84 85
//------------------------------------------------------------------
DBG_NAME( OFileControlModel )
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
86
//------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
87
OFileControlModel::OFileControlModel(const Reference<XMultiServiceFactory>& _rxFactory)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
88 89 90
                    :OControlModel(_rxFactory, VCL_CONTROLMODEL_FILECONTROL)
                    ,m_aResetListeners(m_aMutex)
{
91
    DBG_CTOR( OFileControlModel, NULL );
Ocke Janssen's avatar
Ocke Janssen committed
92
    m_nClassId = FormComponentType::FILECONTROL;
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
93 94
}

95 96 97 98 99 100 101 102 103 104
//------------------------------------------------------------------
OFileControlModel::OFileControlModel( const OFileControlModel* _pOriginal, const Reference<XMultiServiceFactory>& _rxFactory )
    :OControlModel( _pOriginal, _rxFactory )
    ,m_aResetListeners( m_aMutex )
{
    DBG_CTOR( OFileControlModel, NULL );

    m_sDefaultValue = _pOriginal->m_sDefaultValue;
}

Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
105 106 107 108 109 110 111 112
//------------------------------------------------------------------
OFileControlModel::~OFileControlModel()
{
    if (!OComponentHelper::rBHelper.bDisposed)
    {
        acquire();
        dispose();
    }
113
    DBG_DTOR( OFileControlModel, NULL );
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
114 115
}

116 117 118
//------------------------------------------------------------------------------
IMPLEMENT_DEFAULT_CLONING( OFileControlModel )

Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
119
//------------------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
120
Any SAL_CALL OFileControlModel::queryAggregation(const Type& _rType) throw (RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
121
{
Ocke Janssen's avatar
Ocke Janssen committed
122
    Any aReturn = OControlModel::queryAggregation(_rType);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
123 124
    if (!aReturn.hasValue())
        aReturn = ::cppu::queryInterface(_rType
Ocke Janssen's avatar
Ocke Janssen committed
125
            ,static_cast<XReset*>(this)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
126 127 128 129 130 131 132 133 134 135 136
        );

    return aReturn;
}

// OComponentHelper
//-----------------------------------------------------------------------------
void OFileControlModel::disposing()
{
    OControlModel::disposing();

Ocke Janssen's avatar
Ocke Janssen committed
137
    EventObject aEvt(static_cast<XWeak*>(this));
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
138 139 140
    m_aResetListeners.disposeAndClear(aEvt);
}

141 142 143 144 145 146 147
//------------------------------------------------------------------------------
Any OFileControlModel::getPropertyDefaultByHandle( sal_Int32 _nHandle ) const
{
    Any aReturn;
    switch ( _nHandle )
    {
        case PROPERTY_ID_DEFAULT_TEXT:
148
            return makeAny( OUString() );
149 150 151 152
    }
    return OControlModel::getPropertyDefaultByHandle( _nHandle );
}

Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
153
//------------------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
154
void OFileControlModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
155 156 157 158 159 160 161 162 163 164
{
    switch (nHandle)
    {
        case PROPERTY_ID_DEFAULT_TEXT : rValue <<= m_sDefaultValue; break;
        default:
            OControlModel::getFastPropertyValue(rValue, nHandle);
    }
}

//------------------------------------------------------------------------------
165
void OFileControlModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& rValue) throw ( ::com::sun::star::uno::Exception)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
166 167 168 169
{
    switch (nHandle)
    {
        case PROPERTY_ID_DEFAULT_TEXT :
Ocke Janssen's avatar
Ocke Janssen committed
170
            DBG_ASSERT(rValue.getValueType().getTypeClass() == TypeClass_STRING, "OFileControlModel::setFastPropertyValue_NoBroadcast : invalid type !" );
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
171 172 173 174 175 176 177 178
            rValue >>= m_sDefaultValue;
            break;
        default:
            OControlModel::setFastPropertyValue_NoBroadcast(nHandle, rValue);
    }
}

//------------------------------------------------------------------------------
Ocke Janssen's avatar
Ocke Janssen committed
179 180
sal_Bool OFileControlModel::convertFastPropertyValue(Any& rConvertedValue, Any& rOldValue, sal_Int32 nHandle, const Any& rValue)
                            throw( IllegalArgumentException )
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
181 182 183 184 185 186 187 188 189 190 191
{
    switch (nHandle)
    {
        case PROPERTY_ID_DEFAULT_TEXT :
            return tryPropertyValue(rConvertedValue, rOldValue, rValue, m_sDefaultValue);
        default:
            return OControlModel::convertFastPropertyValue(rConvertedValue, rOldValue, nHandle, rValue);
    }
}

//------------------------------------------------------------------------------
192
void OFileControlModel::describeFixedProperties( Sequence< Property >& _rProps ) const
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
193
{
194
    BEGIN_DESCRIBE_PROPERTIES( 2, OControlModel )
195
        DECL_PROP1(DEFAULT_TEXT,    OUString,    BOUND);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
196
        DECL_PROP1(TABINDEX,        sal_Int16,          BOUND);
197
    END_DESCRIBE_PROPERTIES();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
198 199 200
}

//------------------------------------------------------------------------------
201
OUString SAL_CALL OFileControlModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
202
{
203
    return OUString(FRM_COMPONENT_FILECONTROL);   // old (non-sun) name for compatibility !
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
204 205 206
}

//------------------------------------------------------------------------------
207
void OFileControlModel::write(const Reference<stario::XObjectOutputStream>& _rxOutStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
208 209 210 211 212 213 214 215 216
{
    OControlModel::write(_rxOutStream);

    ::osl::MutexGuard aGuard(m_aMutex);

    // Version
    _rxOutStream->writeShort(0x0002);
    // Default-Wert
    _rxOutStream << m_sDefaultValue;
217
    writeHelpTextCompatibly(_rxOutStream);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
218 219 220
}

//------------------------------------------------------------------------------
221
void OFileControlModel::read(const Reference<stario::XObjectInputStream>& _rxInStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
222 223 224 225 226 227 228 229 230 231 232 233 234
{
    OControlModel::read(_rxInStream);
    ::osl::MutexGuard aGuard(m_aMutex);

    // Version
    sal_uInt16 nVersion = _rxInStream->readShort();
    // Default-Wert
    switch (nVersion)
    {
        case 1:
            _rxInStream >> m_sDefaultValue; break;
        case 2:
            _rxInStream >> m_sDefaultValue;
235
            readHelpTextCompatibly(_rxInStream);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
236 237
            break;
        default:
238
            OSL_FAIL("OFileControlModel::read : unknown version !");
239
            m_sDefaultValue = OUString();
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
240 241
    }

242
    // Display default values after read
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
243 244 245 246
//  _reset();
}

//-----------------------------------------------------------------------------
247
void SAL_CALL OFileControlModel::reset() throw ( ::com::sun::star::uno::RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
248 249
{
    ::cppu::OInterfaceIteratorHelper aIter(m_aResetListeners);
Ocke Janssen's avatar
Ocke Janssen committed
250
    EventObject aEvt(static_cast<XWeak*>(this));
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
251 252
    sal_Bool bContinue = sal_True;
    while (aIter.hasMoreElements() && bContinue)
Ocke Janssen's avatar
Ocke Janssen committed
253
        bContinue =((XResetListener*)aIter.next())->approveReset(aEvt);
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
254 255 256 257

    if (bContinue)
    {
        {
258
            // If Models are threadSave
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
259 260 261
            ::osl::MutexGuard aGuard(m_aMutex);
            _reset();
        }
262
        m_aResetListeners.notifyEach( &XResetListener::resetted, aEvt );
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
263 264 265 266
    }
}

//-----------------------------------------------------------------------------
267
void OFileControlModel::addResetListener(const Reference<XResetListener>& _rxListener) throw ( ::com::sun::star::uno::RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
268 269 270 271 272
{
    m_aResetListeners.addInterface(_rxListener);
}

//-----------------------------------------------------------------------------
273
void OFileControlModel::removeResetListener(const Reference<XResetListener>& _rxListener) throw ( ::com::sun::star::uno::RuntimeException)
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
274 275 276 277 278 279 280 281 282 283 284
{
    m_aResetListeners.removeInterface(_rxListener);
}

//------------------------------------------------------------------------------
void OFileControlModel::_reset()
{
    {   // release our mutex once (it's acquired in the calling method !), as setting aggregate properties
        // may cause any uno controls belonging to us to lock the solar mutex, which is potentially dangerous with
        // our own mutex locked
        MutexRelease aRelease(m_aMutex);
Ocke Janssen's avatar
Ocke Janssen committed
285
        m_xAggregateSet->setPropertyValue(PROPERTY_TEXT, makeAny(m_sDefaultValue));
Jens-Heiner Rechtien's avatar
Jens-Heiner Rechtien committed
286 287 288 289 290 291 292
    }
}

//.........................................................................
}   // namespace frm
//.........................................................................

293
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */