<commit_before>/****************************************************************************

 This file is part of the GLC-lib library.
 Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net)
 Version 1.2.0, packaged on September 2009.

 http://glc-lib.sourceforge.net

 GLC-lib is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 GLC-lib is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with GLC-lib; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

 *****************************************************************************/

#include "glc_reptrackballmover.h"
#include "glc_viewport.h"
#include "../glc_factory.h"
#include <QGLContext>

using namespace glc;
//! The angle of arcs
#define ARCANGLE (30 * PI / 180)

GLC_RepTrackBallMover::GLC_RepTrackBallMover(GLC_Viewport* pViewport)
: GLC_RepMover(pViewport)
, m_Radius(1.0)
, m_pFactory(GLC_Factory::instance(QGLContext::currentContext()))
, m_MainCircle(m_Radius)
, m_Arc1(m_pFactory->createCircle(m_Radius, ARCANGLE))
, m_MatArc1()
, m_Arc2(m_pFactory->createCircle(m_Radius, ARCANGLE))
, m_MatArc2()
, m_Ratio(0.95)
{

	GLC_Material* pMat= new GLC_Material(m_MainColor);

	m_MainCircle.addMaterial(pMat);
	m_Arc1.geomAt(0)->addMaterial(pMat);
	m_Arc2.geomAt(0)->addMaterial(pMat);

	// 2 circle arcs position
	GLC_Matrix4x4 MatRot(Z_AXIS, -ARCANGLE / 2);
	GLC_Matrix4x4 MatInt(Y_AXIS, -PI / 2);
	MatRot= MatInt * MatRot;

	m_MatArc1= MatRot;

	MatInt.setMatRot(Z_AXIS, PI/2);
	MatRot= MatInt * MatRot;

	m_MatArc2= MatRot;

}

// Copy constructor
GLC_RepTrackBallMover::GLC_RepTrackBallMover(const GLC_RepTrackBallMover& repMover)
: GLC_RepMover(repMover)
, m_Radius(repMover.m_Radius)
, m_pFactory(repMover.m_pFactory)
, m_MainCircle(repMover.m_MainCircle)
, m_Arc1(repMover.m_Arc1.deepCopy())
, m_MatArc1(repMover.m_MatArc1)
, m_Arc2(repMover.m_Arc2.deepCopy())
, m_MatArc2(repMover.m_MatArc2)
, m_Ratio(repMover.m_Ratio)
{
	// Don't share material
	GLC_Material* pMat= new GLC_Material(m_MainColor);
	m_MainCircle.replaceMasterMaterial(pMat);
	m_Arc1.geomAt(0)->replaceMasterMaterial(pMat);
	m_Arc2.geomAt(0)->replaceMasterMaterial(pMat);
}

GLC_RepTrackBallMover::~GLC_RepTrackBallMover()
{

}

//////////////////////////////////////////////////////////////////////
// Get Functions
//////////////////////////////////////////////////////////////////////

// Return a clone of the repmover
GLC_RepMover* GLC_RepTrackBallMover::clone() const
{
	return new GLC_RepTrackBallMover(*this);
}

//////////////////////////////////////////////////////////////////////
// Set Functions
//////////////////////////////////////////////////////////////////////

// Set Arcs orientation and position in concordance with mouse position
void GLC_RepTrackBallMover::init(const GLC_Vector3d& vect, const GLC_Matrix4x4 &Matrice)
{
	GLC_Vector3d VectAngle(vect);
	VectAngle.setZ(0);
	VectAngle.setLenght(1);

	GLC_Matrix4x4 MatRot;
	double Angle;

	// Compute the 2 arcs orientation
	if (VectAngle.y() > 0)
	{	// Angle entre 0 et PI
		Angle= acos(VectAngle.x());
		MatRot.setMatRot(Z_AXIS, Angle);
	}
	else
	{	// Angle between 0 et -PI
		Angle= -acos(VectAngle.x());
		MatRot.setMatRot(Z_AXIS, Angle);
	}

	// Composition of orientation matrix and mapping matrix
	MatRot= Matrice * MatRot;

	m_Arc1.setMatrix(MatRot * m_MatArc1);
	m_Arc2.setMatrix(MatRot * m_MatArc2);
}

// Set Arcs position in concordance with mouse position
void GLC_RepTrackBallMover::update(const GLC_Matrix4x4 &Matrice)
{
	m_Arc1.multMatrix(Matrice);
	m_Arc2.multMatrix(Matrice);
}

// overload function setColor(color);
void GLC_RepTrackBallMover::setMainColor(const QColor& color)
{
	m_MainCircle.firstMaterial()->setDiffuseColor(color);
	GLC_RepMover::setMainColor(color);
}

//////////////////////////////////////////////////////////////////////
// OpenGL Functions
//////////////////////////////////////////////////////////////////////

// Virtual interface for OpenGL Geometry set up.
void GLC_RepTrackBallMover::glDraw()
{
	computeRadius();

	// orbit circle must be shown
	glDisable(GL_DEPTH_TEST);

	glPushMatrix();

	glLoadIdentity();

	const double depth= m_pViewport->nearClippingPlaneDist() + (m_pViewport->farClippingPlaneDist() - m_pViewport->nearClippingPlaneDist()) / 2.0;
	// Put circle at the middle of camera range of depth
	glTranslated(0, 0, - (depth) );

	// Save Positionning matrix of arcs
	const GLC_Matrix4x4 MatSavArc1(m_Arc1.matrix());
	const GLC_Matrix4x4 MatSavArc2(m_Arc2.matrix());

	// Scale Z to 0. Project arcs in the main circle plane
	// Avoid perspective problems
	GLC_Matrix4x4 MatScaling;
	MatScaling.setMatScaling(1,1,0);
	m_Arc1.multMatrix(MatScaling);
	m_Arc2.multMatrix(MatScaling);

	// Display arcs
	m_Arc1.glExecute();
	m_Arc2.glExecute();

	// Restore positionning matrix of arcs
	m_Arc1.setMatrix(MatSavArc1);
	m_Arc2.setMatrix(MatSavArc2);

	// Display base class (Main circle)
	m_MainCircle.glExecute(m_RenderProperties);

	glPopMatrix();

	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing

}

//////////////////////////////////////////////////////////////////////
// Private services Functions
//////////////////////////////////////////////////////////////////////

// Compute trackball radius
void GLC_RepTrackBallMover::computeRadius()
{
	int nRayonSph;
	const double winHSize= static_cast<double>(m_pViewport->viewHSize());
	const double winVSize= static_cast<double>(m_pViewport->viewVSize());

	if (winHSize > winVSize)
	{
		nRayonSph = static_cast<int>(m_Ratio * winVSize / 2.0);
	}
	else
	{
		nRayonSph = static_cast<int>(m_Ratio * winHSize / 2.0);
	}

	// Compute the length of camera's field of view
	const double ChampsVision = 2.0 * ( m_pViewport->nearClippingPlaneDist() + (m_pViewport->farClippingPlaneDist() - m_pViewport->nearClippingPlaneDist()) / 2.0) *  tan((m_pViewport->viewAngle() * PI / 180.0) / 2.0);

	// the side of camera's square is mapped on Vertical length of window
	// Circle radius in OpenGL unit = Radius(Pixel) * (dimend GL / dimens Pixel)
	const double RayonSph= fabs((static_cast<double>(nRayonSph) * ChampsVision / winVSize));

	if ((!qFuzzyCompare(RayonSph, 0.0) && !qFuzzyCompare(RayonSph - m_Radius, 0.0)) || (RayonSph < 2.0))
	{
		// Main circle radius
		m_MainCircle.setRadius(RayonSph);

		GLC_Circle* pCircle;
		// Arc 1 radius
		pCircle= static_cast<GLC_Circle*>(m_Arc1.geomAt(0));
		pCircle->setRadius(RayonSph);
		// Arc 2 radius
		pCircle= static_cast<GLC_Circle*>(m_Arc2.geomAt(0));
		pCircle->setRadius(RayonSph);
	}

}
<commit_msg>Code Cleanup : Simplify the track ball render.<commit_after>/****************************************************************************

 This file is part of the GLC-lib library.
 Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net)
 Version 1.2.0, packaged on September 2009.

 http://glc-lib.sourceforge.net

 GLC-lib is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.

 GLC-lib is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with GLC-lib; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

 *****************************************************************************/

#include "glc_reptrackballmover.h"
#include "glc_viewport.h"
#include "../glc_factory.h"
#include <QGLContext>

using namespace glc;
//! The angle of arcs
#define ARCANGLE (30 * PI / 180)

GLC_RepTrackBallMover::GLC_RepTrackBallMover(GLC_Viewport* pViewport)
: GLC_RepMover(pViewport)
, m_Radius(1.0)
, m_pFactory(GLC_Factory::instance(QGLContext::currentContext()))
, m_MainCircle(m_Radius)
, m_Arc1(m_pFactory->createCircle(m_Radius, ARCANGLE))
, m_MatArc1()
, m_Arc2(m_pFactory->createCircle(m_Radius, ARCANGLE))
, m_MatArc2()
, m_Ratio(0.95)
{

	GLC_Material* pMat= new GLC_Material(m_MainColor);

	m_MainCircle.addMaterial(pMat);
	m_Arc1.geomAt(0)->addMaterial(pMat);
	m_Arc2.geomAt(0)->addMaterial(pMat);

	// 2 circle arcs position
	GLC_Matrix4x4 MatRot(Z_AXIS, -ARCANGLE / 2);
	GLC_Matrix4x4 MatInt(Y_AXIS, -PI / 2);
	MatRot= MatInt * MatRot;

	m_MatArc1= MatRot;

	MatInt.setMatRot(Z_AXIS, PI/2);
	MatRot= MatInt * MatRot;

	m_MatArc2= MatRot;

}

// Copy constructor
GLC_RepTrackBallMover::GLC_RepTrackBallMover(const GLC_RepTrackBallMover& repMover)
: GLC_RepMover(repMover)
, m_Radius(repMover.m_Radius)
, m_pFactory(repMover.m_pFactory)
, m_MainCircle(repMover.m_MainCircle)
, m_Arc1(repMover.m_Arc1.deepCopy())
, m_MatArc1(repMover.m_MatArc1)
, m_Arc2(repMover.m_Arc2.deepCopy())
, m_MatArc2(repMover.m_MatArc2)
, m_Ratio(repMover.m_Ratio)
{
	// Don't share material
	GLC_Material* pMat= new GLC_Material(m_MainColor);
	m_MainCircle.replaceMasterMaterial(pMat);
	m_Arc1.geomAt(0)->replaceMasterMaterial(pMat);
	m_Arc2.geomAt(0)->replaceMasterMaterial(pMat);
}

GLC_RepTrackBallMover::~GLC_RepTrackBallMover()
{

}

//////////////////////////////////////////////////////////////////////
// Get Functions
//////////////////////////////////////////////////////////////////////

// Return a clone of the repmover
GLC_RepMover* GLC_RepTrackBallMover::clone() const
{
	return new GLC_RepTrackBallMover(*this);
}

//////////////////////////////////////////////////////////////////////
// Set Functions
//////////////////////////////////////////////////////////////////////

// Set Arcs orientation and position in concordance with mouse position
void GLC_RepTrackBallMover::init(const GLC_Vector3d& vect, const GLC_Matrix4x4 &Matrice)
{
	GLC_Vector3d VectAngle(vect);
	VectAngle.setZ(0);
	VectAngle.setLenght(1);

	GLC_Matrix4x4 MatRot;
	double Angle;

	// Compute the 2 arcs orientation
	if (VectAngle.y() > 0)
	{	// Angle entre 0 et PI
		Angle= acos(VectAngle.x());
		MatRot.setMatRot(Z_AXIS, Angle);
	}
	else
	{	// Angle between 0 et -PI
		Angle= -acos(VectAngle.x());
		MatRot.setMatRot(Z_AXIS, Angle);
	}

	// Composition of orientation matrix and mapping matrix
	MatRot= Matrice * MatRot;

	m_Arc1.setMatrix(MatRot * m_MatArc1);
	m_Arc2.setMatrix(MatRot * m_MatArc2);
}

// Set Arcs position in concordance with mouse position
void GLC_RepTrackBallMover::update(const GLC_Matrix4x4 &Matrice)
{
	m_Arc1.multMatrix(Matrice);
	m_Arc2.multMatrix(Matrice);
}

// overload function setColor(color);
void GLC_RepTrackBallMover::setMainColor(const QColor& color)
{
	m_MainCircle.firstMaterial()->setDiffuseColor(color);
	GLC_RepMover::setMainColor(color);
}

//////////////////////////////////////////////////////////////////////
// OpenGL Functions
//////////////////////////////////////////////////////////////////////

// Virtual interface for OpenGL Geometry set up.
void GLC_RepTrackBallMover::glDraw()
{
	computeRadius();

	const double aspectRatio= static_cast<double>(m_pViewport->viewHSize())/static_cast<double>(m_pViewport->viewVSize());
	// orbit circle must be shown
	glDisable(GL_DEPTH_TEST);

	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	glOrtho(aspectRatio * -1.0 ,aspectRatio * 1.0 ,-1.0 ,1.0 ,-1.0 ,1.0);
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
	glLoadIdentity();

	// Display arcs
	m_Arc1.glExecute();
	m_Arc2.glExecute();

	// Display base class (Main circle)
	m_MainCircle.glExecute(m_RenderProperties);

	glPopMatrix();
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();
	glMatrixMode(GL_MODELVIEW);

	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing

}

//////////////////////////////////////////////////////////////////////
// Private services Functions
//////////////////////////////////////////////////////////////////////

// Compute trackball radius
void GLC_RepTrackBallMover::computeRadius()
{
	int nRayonSph;
	const double winHSize= static_cast<double>(m_pViewport->viewHSize());
	const double winVSize= static_cast<double>(m_pViewport->viewVSize());

	if (winHSize > winVSize)
	{
		nRayonSph = static_cast<int>(m_Ratio * winVSize / 2.0);
	}
	else
	{
		nRayonSph = static_cast<int>(m_Ratio * winHSize / 2.0);
	}

	// Compute the length of camera's field of view
	const double ChampsVision = 2.0;

	// the side of camera's square is mapped on Vertical length of window
	// Circle radius in OpenGL unit = Radius(Pixel) * (dimend GL / dimens Pixel)
	const double RayonSph= fabs((static_cast<double>(nRayonSph) * ChampsVision / winVSize));

	if ((!qFuzzyCompare(RayonSph, 0.0) && !qFuzzyCompare(RayonSph - m_Radius, 0.0)) || (RayonSph < 2.0))
	{
		// Main circle radius
		m_MainCircle.setRadius(RayonSph);

		GLC_Circle* pCircle;
		// Arc 1 radius
		pCircle= static_cast<GLC_Circle*>(m_Arc1.geomAt(0));
		pCircle->setRadius(RayonSph);
		// Arc 2 radius
		pCircle= static_cast<GLC_Circle*>(m_Arc2.geomAt(0));
		pCircle->setRadius(RayonSph);
	}

}
<|endoftext|>


<commit_before>/*
 * Copyright 2011 Intel Corporation.
 *
 * This program is licensed under the terms and conditions of the
 * Apache License, version 2.0.  The full text of the Apache License is at
 * http://www.apache.org/licenses/LICENSE-2.0
 */

#include "components.h"
#include "accountsmodelfactory.h"
#include "accountssortfilterproxymodel.h"
#include "contactssortfilterproxymodel.h"
#include "accounthelper.h"
#include "imaccountsmodel.h"
#include "imavatarimageprovider.h"

#include "../telepathy-qml-lib/chatagent.h"
#include "../telepathy-qml-lib/imchannelapprover.h"

#include <TelepathyQt4/Account>
#include <TelepathyQt4/Connection>
#include <TelepathyQt4/ChannelFactory>
#include <TelepathyQt4/Debug>
#include <TelepathyQt4Yell/Models/FlatModelProxy>

#include <TelepathyQt4Yell/Types>
#include <TelepathyQt4Yell/CallChannel>

#include <QtDebug>
#include <QtDeclarative/QDeclarativeEngine>
#include <QtDeclarative/qdeclarative.h>
#include <QSettings>
#include <QtGstQmlSink/qmlgstvideoitem.h>

//#include "imtextedit.h"

void Components::initializeEngine(QDeclarativeEngine *engine, const char *uri)
{
    qDebug() << "MeeGoIM initializeEngine" << uri;
    Q_ASSERT(engine);

    Tp::registerTypes();
    //Tp::enableDebug(true);
    Tp::enableWarnings(true);

    Tpy::registerTypes();

    mTpManager = new TelepathyManager(true);
    connect(mTpManager, SIGNAL(accountManagerReady()), SLOT(onAccountManagerReady()));

    mProtocolsModel = new IMProtocolsModel(this);
    mTpManager->setProtocolNames(mProtocolsModel->protocolNames());

    AccountsModelFactory *accountFactory = new AccountsModelFactory(mTpManager);
    connect(accountFactory, SIGNAL(modelCreated(IMAccountsModel*)),SLOT(onAccountsModelReady(IMAccountsModel*)));

    mRootContext = engine->rootContext();
    Q_ASSERT(mRootContext);

    mRootContext->setContextProperty(QString::fromLatin1("telepathyManager"), mTpManager);
    mRootContext->setContextProperty(QString::fromLatin1("protocolsModel"), mProtocolsModel);
    mRootContext->setContextProperty(QString::fromLatin1("accountFactory"), accountFactory);

    // create the notification manager
    mNotificationManager = new NotificationManager(this);
    mRootContext->setContextProperty(QString::fromLatin1("notificationManager"),
                                      mNotificationManager);

    // create the notification manager
    mRootContext->setContextProperty(QString::fromLatin1("settingsHelper"),
                                      SettingsHelper::self());

    // get the network status and load it
    mNetworkConfigManager = new QNetworkConfigurationManager();
    connect(mNetworkConfigManager, SIGNAL(onlineStateChanged(bool)), this, SLOT(onNetworkStatusChanged(bool)));
    onNetworkStatusChanged(mNetworkConfigManager->isOnline());
}

void Components::registerTypes(const char *uri)
{
    qmlRegisterType<AccountHelper>(uri, 0, 1, "AccountHelper");
    qmlRegisterType<QmlGstVideoItem>(uri, 0, 1, "VideoItem");
    qmlRegisterUncreatableType<IMAccountsModel>(uri, 0, 1, "IMAccountsModel", "This is a read-only type");
    qmlRegisterUncreatableType<Tpy::ContactModelItem>(uri, 0, 1,"ContactModelItem", "This is a read-only type");
    qmlRegisterUncreatableType<TelepathyManager>(uri, 0, 1, "TelepathyManager", "This is a read-only type");
    qmlRegisterUncreatableType<IMChannelApprover>(uri, 0, 1, "IMChannelApprover", "This is a read-only type");
    qmlRegisterUncreatableType<ChatAgent>(uri, 0, 1, "ChatAgent", "This is a read-only type");
    qmlRegisterUncreatableType<SimpleContactsListModel>(uri, 0, 1, "SimpleContactsListModel", "This is a read-only type");
}

void Components::onAccountManagerReady()
{
    // register the avatar image provider
    IMAvatarImageProvider::registerProvider(mRootContext->engine(), mTpManager->accountManager());
}

void Components::onAccountsModelReady(IMAccountsModel *model)
{
    mAccountsModel = model;
    mAccountsModel->setTelepathyManager(mTpManager);
    Tpy::FlatModelProxy *flatModel = new Tpy::FlatModelProxy(model);
    mMergedModel = new MergedModel(this);
    mMergedModel->addModel(flatModel);

    mGroupChatModel = new IMGroupChatModel(this);
    mMergedModel->addModel(mGroupChatModel);

    // initialize the accounts sorted model
    AccountsSortFilterProxyModel *accountsSortedModel = new AccountsSortFilterProxyModel(model, this);

    mContactsModel = new ContactsSortFilterProxyModel(mTpManager, mMergedModel, this);
    mRequestsModel = new ContactsSortFilterProxyModel(mTpManager, mMergedModel, this);
    mRequestsModel->setRequestsOnly(true);

    // this call will make sure that known contacts for each logged in account are loaded
    // after all components are in place
    onContactsUpgraded();

    // get last used account
    QSettings settings("MeeGo", "MeeGoIM");
    QString lastUsedAccount = settings.value("LastUsed/Account", QString()).toString();

    // the load order is inverted so that signals emitted by the accountsModel can guarantee that the
    // contactsModel is present
    mRootContext->setContextProperty(QString::fromLatin1("contactsModel"), mContactsModel);
    emit contactsModelCreated();
    mRootContext->setContextProperty(QString::fromLatin1("contactRequestModel"), mRequestsModel);
    emit requestsModelCreated();
    mRootContext->setContextProperty(QString::fromLatin1("accountsModel"), model);
    mRootContext->setContextProperty(QString::fromLatin1("accountsSortedModel"), accountsSortedModel);
    emit accountsModelCreated();

    connect(mTpManager, SIGNAL(handlerRegistered()), SLOT(onHandlerRegistered()));
    connect(mTpManager,
            SIGNAL(contactsUpgraded(QList<Tp::ContactPtr>)),
            SLOT(onContactsUpgraded()));
    connect(mNetworkConfigManager, SIGNAL(onlineStateChanged(bool)),
            mAccountsModel, SLOT(onNetworkStatusChanged(bool)));

    mAccountsModel->setNotificationManager(mNotificationManager);

    // this signals that all components have been loaded at this point
    // in turn, this signal can be used to call the tpManager and register
    // the handler and approver, if necessary
    mAccountsModel->onComponentsLoaded();

    loadLastUsedAccount(lastUsedAccount, model);
}

void Components::onContactsUpgraded()
{
    for (int i = 0; i < mAccountsModel->rowCount(); ++i) {
        QModelIndex index = mAccountsModel->index(i, 0, QModelIndex());
        Tpy::AccountsModelItem *accountItem = static_cast<Tpy::AccountsModelItem *>(index.data(Tpy::AccountsModel::ItemRole).value<QObject *>());
        accountItem->addKnownContacts();
    }
    mContactsModel->slotResetModel();
}

/**
  * This method checks whether the last used account is connected. If it is connected
  * it will trigger a signal to open the list of contacts for that account.
  * That is done through a signal in the contacts proxy model as a workaround because
  * this class cannot send a signal to the QML files on its own.
  */
void Components::loadLastUsedAccount(const QString accountId, IMAccountsModel *model)
{
    // if not empty
    if (accountId.isEmpty()) {
        return;
    }
    // locate the account object matching the id
    for (int i = 0; i < model->accountCount(); ++i) {
        QModelIndex index = model->index(i, 0, QModelIndex());
        Tp::AccountPtr account = model->accountForIndex(index);
        if (account->uniqueIdentifier() == accountId) {
            // only send the signal if the account is connected
            if (!account->connection().isNull()
                    && account->connection()->isValid()
                    && account->connection()->status() == Tp::ConnectionStatusConnected) {
                mContactsModel->filterByLastUsedAccount(accountId);
                break;
            }
        }
    }
}

void Components::onNetworkStatusChanged(bool isOnline)
{
    mRootContext->setContextProperty(QString::fromLatin1("networkOnline"), QVariant(isOnline));
}

void Components::onHandlerRegistered()
{
    // only do it if the handler has been created
    if (mTpManager->channelHandler()) {
        connect(mTpManager->channelHandler(),
                SIGNAL(textChannelAvailable(QString,Tp::TextChannelPtr)),
                mAccountsModel,
                SLOT(onTextChannelAvailable(QString,Tp::TextChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(callChannelAvailable(QString,Tpy::CallChannelPtr)),
                mAccountsModel,
                SLOT(onCallChannelAvailable(QString,Tpy::CallChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(incomingFileTransferChannelAvailable(QString,Tp::IncomingFileTransferChannelPtr)),
                mAccountsModel,
                SLOT(onIncomingFileTransferChannelAvailable(QString,Tp::IncomingFileTransferChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(outgoingFileTransferChannelAvailable(QString,Tp::OutgoingFileTransferChannelPtr,Tp::ChannelRequestPtr)),
                mAccountsModel,
                SLOT(onOutgoingFileTransferChannelAvailable(QString,Tp::OutgoingFileTransferChannelPtr, Tp::ChannelRequestPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(serverAuthChannelAvailable(QString,Tp::ChannelPtr)),
                mAccountsModel,
                SLOT(onServerAuthChannelAvailable(QString,Tp::ChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(textChannelAvailable(QString,Tp::TextChannelPtr)),
                mGroupChatModel,
                SLOT(onTextChannelAvailable(QString,Tp::TextChannelPtr)));
    }
}

Q_EXPORT_PLUGIN2(components, Components);
<commit_msg>Initialization of telepathy logger and telepathy qt4 logger library<commit_after>/*
 * Copyright 2011 Intel Corporation.
 *
 * This program is licensed under the terms and conditions of the
 * Apache License, version 2.0.  The full text of the Apache License is at
 * http://www.apache.org/licenses/LICENSE-2.0
 */

#include "components.h"
#include "accountsmodelfactory.h"
#include "accountssortfilterproxymodel.h"
#include "contactssortfilterproxymodel.h"
#include "accounthelper.h"
#include "imaccountsmodel.h"
#include "imavatarimageprovider.h"

#include "../telepathy-qml-lib/chatagent.h"
#include "../telepathy-qml-lib/imchannelapprover.h"

#include <TelepathyQt4/Account>
#include <TelepathyQt4/Connection>
#include <TelepathyQt4/ChannelFactory>
#include <TelepathyQt4/Debug>
#include <TelepathyQt4Logger/Init>
#include <TelepathyQt4Yell/Models/FlatModelProxy>

#include <TelepathyQt4Yell/Types>
#include <TelepathyQt4Yell/CallChannel>

#include <QtDebug>
#include <QtDeclarative/QDeclarativeEngine>
#include <QtDeclarative/qdeclarative.h>
#include <QSettings>
#include <QtGstQmlSink/qmlgstvideoitem.h>

#include <glib-object.h>

//#include "imtextedit.h"

void Components::initializeEngine(QDeclarativeEngine *engine, const char *uri)
{
    qDebug() << "MeeGoIM initializeEngine" << uri;
    Q_ASSERT(engine);

    // needed for tp-logger
    g_type_init();

    Tp::registerTypes();
    //Tp::enableDebug(true);
    Tp::enableWarnings(true);

    Tpy::registerTypes();

    Tpl::init();

    mTpManager = new TelepathyManager(true);
    connect(mTpManager, SIGNAL(accountManagerReady()), SLOT(onAccountManagerReady()));

    mProtocolsModel = new IMProtocolsModel(this);
    mTpManager->setProtocolNames(mProtocolsModel->protocolNames());

    AccountsModelFactory *accountFactory = new AccountsModelFactory(mTpManager);
    connect(accountFactory, SIGNAL(modelCreated(IMAccountsModel*)),SLOT(onAccountsModelReady(IMAccountsModel*)));

    mRootContext = engine->rootContext();
    Q_ASSERT(mRootContext);

    mRootContext->setContextProperty(QString::fromLatin1("telepathyManager"), mTpManager);
    mRootContext->setContextProperty(QString::fromLatin1("protocolsModel"), mProtocolsModel);
    mRootContext->setContextProperty(QString::fromLatin1("accountFactory"), accountFactory);

    // create the notification manager
    mNotificationManager = new NotificationManager(this);
    mRootContext->setContextProperty(QString::fromLatin1("notificationManager"),
                                      mNotificationManager);

    // create the notification manager
    mRootContext->setContextProperty(QString::fromLatin1("settingsHelper"),
                                      SettingsHelper::self());

    // get the network status and load it
    mNetworkConfigManager = new QNetworkConfigurationManager();
    connect(mNetworkConfigManager, SIGNAL(onlineStateChanged(bool)), this, SLOT(onNetworkStatusChanged(bool)));
    onNetworkStatusChanged(mNetworkConfigManager->isOnline());
}

void Components::registerTypes(const char *uri)
{
    qmlRegisterType<AccountHelper>(uri, 0, 1, "AccountHelper");
    qmlRegisterType<QmlGstVideoItem>(uri, 0, 1, "VideoItem");
    qmlRegisterUncreatableType<IMAccountsModel>(uri, 0, 1, "IMAccountsModel", "This is a read-only type");
    qmlRegisterUncreatableType<Tpy::ContactModelItem>(uri, 0, 1,"ContactModelItem", "This is a read-only type");
    qmlRegisterUncreatableType<TelepathyManager>(uri, 0, 1, "TelepathyManager", "This is a read-only type");
    qmlRegisterUncreatableType<IMChannelApprover>(uri, 0, 1, "IMChannelApprover", "This is a read-only type");
    qmlRegisterUncreatableType<ChatAgent>(uri, 0, 1, "ChatAgent", "This is a read-only type");
    qmlRegisterUncreatableType<SimpleContactsListModel>(uri, 0, 1, "SimpleContactsListModel", "This is a read-only type");
}

void Components::onAccountManagerReady()
{
    // register the avatar image provider
    IMAvatarImageProvider::registerProvider(mRootContext->engine(), mTpManager->accountManager());
}

void Components::onAccountsModelReady(IMAccountsModel *model)
{
    mAccountsModel = model;
    mAccountsModel->setTelepathyManager(mTpManager);
    Tpy::FlatModelProxy *flatModel = new Tpy::FlatModelProxy(model);
    mMergedModel = new MergedModel(this);
    mMergedModel->addModel(flatModel);

    mGroupChatModel = new IMGroupChatModel(this);
    mMergedModel->addModel(mGroupChatModel);

    // initialize the accounts sorted model
    AccountsSortFilterProxyModel *accountsSortedModel = new AccountsSortFilterProxyModel(model, this);

    mContactsModel = new ContactsSortFilterProxyModel(mTpManager, mMergedModel, this);
    mRequestsModel = new ContactsSortFilterProxyModel(mTpManager, mMergedModel, this);
    mRequestsModel->setRequestsOnly(true);

    // this call will make sure that known contacts for each logged in account are loaded
    // after all components are in place
    onContactsUpgraded();

    // get last used account
    QSettings settings("MeeGo", "MeeGoIM");
    QString lastUsedAccount = settings.value("LastUsed/Account", QString()).toString();

    // the load order is inverted so that signals emitted by the accountsModel can guarantee that the
    // contactsModel is present
    mRootContext->setContextProperty(QString::fromLatin1("contactsModel"), mContactsModel);
    emit contactsModelCreated();
    mRootContext->setContextProperty(QString::fromLatin1("contactRequestModel"), mRequestsModel);
    emit requestsModelCreated();
    mRootContext->setContextProperty(QString::fromLatin1("accountsModel"), model);
    mRootContext->setContextProperty(QString::fromLatin1("accountsSortedModel"), accountsSortedModel);
    emit accountsModelCreated();

    connect(mTpManager, SIGNAL(handlerRegistered()), SLOT(onHandlerRegistered()));
    connect(mTpManager,
            SIGNAL(contactsUpgraded(QList<Tp::ContactPtr>)),
            SLOT(onContactsUpgraded()));
    connect(mNetworkConfigManager, SIGNAL(onlineStateChanged(bool)),
            mAccountsModel, SLOT(onNetworkStatusChanged(bool)));

    mAccountsModel->setNotificationManager(mNotificationManager);

    // this signals that all components have been loaded at this point
    // in turn, this signal can be used to call the tpManager and register
    // the handler and approver, if necessary
    mAccountsModel->onComponentsLoaded();

    loadLastUsedAccount(lastUsedAccount, model);
}

void Components::onContactsUpgraded()
{
    for (int i = 0; i < mAccountsModel->rowCount(); ++i) {
        QModelIndex index = mAccountsModel->index(i, 0, QModelIndex());
        Tpy::AccountsModelItem *accountItem = static_cast<Tpy::AccountsModelItem *>(index.data(Tpy::AccountsModel::ItemRole).value<QObject *>());
        accountItem->addKnownContacts();
    }
    mContactsModel->slotResetModel();
}

/**
  * This method checks whether the last used account is connected. If it is connected
  * it will trigger a signal to open the list of contacts for that account.
  * That is done through a signal in the contacts proxy model as a workaround because
  * this class cannot send a signal to the QML files on its own.
  */
void Components::loadLastUsedAccount(const QString accountId, IMAccountsModel *model)
{
    // if not empty
    if (accountId.isEmpty()) {
        return;
    }
    // locate the account object matching the id
    for (int i = 0; i < model->accountCount(); ++i) {
        QModelIndex index = model->index(i, 0, QModelIndex());
        Tp::AccountPtr account = model->accountForIndex(index);
        if (account->uniqueIdentifier() == accountId) {
            // only send the signal if the account is connected
            if (!account->connection().isNull()
                    && account->connection()->isValid()
                    && account->connection()->status() == Tp::ConnectionStatusConnected) {
                mContactsModel->filterByLastUsedAccount(accountId);
                break;
            }
        }
    }
}

void Components::onNetworkStatusChanged(bool isOnline)
{
    mRootContext->setContextProperty(QString::fromLatin1("networkOnline"), QVariant(isOnline));
}

void Components::onHandlerRegistered()
{
    // only do it if the handler has been created
    if (mTpManager->channelHandler()) {
        connect(mTpManager->channelHandler(),
                SIGNAL(textChannelAvailable(QString,Tp::TextChannelPtr)),
                mAccountsModel,
                SLOT(onTextChannelAvailable(QString,Tp::TextChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(callChannelAvailable(QString,Tpy::CallChannelPtr)),
                mAccountsModel,
                SLOT(onCallChannelAvailable(QString,Tpy::CallChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(incomingFileTransferChannelAvailable(QString,Tp::IncomingFileTransferChannelPtr)),
                mAccountsModel,
                SLOT(onIncomingFileTransferChannelAvailable(QString,Tp::IncomingFileTransferChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(outgoingFileTransferChannelAvailable(QString,Tp::OutgoingFileTransferChannelPtr,Tp::ChannelRequestPtr)),
                mAccountsModel,
                SLOT(onOutgoingFileTransferChannelAvailable(QString,Tp::OutgoingFileTransferChannelPtr, Tp::ChannelRequestPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(serverAuthChannelAvailable(QString,Tp::ChannelPtr)),
                mAccountsModel,
                SLOT(onServerAuthChannelAvailable(QString,Tp::ChannelPtr)));
        connect(mTpManager->channelHandler(),
                SIGNAL(textChannelAvailable(QString,Tp::TextChannelPtr)),
                mGroupChatModel,
                SLOT(onTextChannelAvailable(QString,Tp::TextChannelPtr)));
    }
}

Q_EXPORT_PLUGIN2(components, Components);
<|endoftext|>


<commit_before><commit_msg>Added get_weapon_type() method.<commit_after><|endoftext|>


<commit_before>/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: stdmenu.hxx,v $
 *
 *  $Revision: 1.5 $
 *
 *  last change: $Author: rt $ $Date: 2005-09-08 13:57:48 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/

#ifndef _STDMENU_HXX
#define _STDMENU_HXX

#ifndef INCLUDED_SVTDLLAPI_H
#include "svtools/svtdllapi.h"
#endif

#ifndef _LINK_HXX
#include <tools/link.hxx>
#endif
#ifndef _INTN_HXX
#include <tools/intn.hxx>
#endif
#ifndef _MENU_HXX
#include <vcl/menu.hxx>
#endif

class FontList;
class FontInfo;

/*************************************************************************

Beschreibung
============

class FontNameMenu

Beschreibung

Erlaubt die Auswahl von Fonts. Das Menu wird ueber Fill mit den FontNamen
gefuellt. Fill sortiert automatisch die FontNamen (inkl. aller Umlaute und
sprachabhaengig). Mit SetCurName()/GetCurName() kann der aktuelle Fontname
gesetzt/abgefragt werden. Wenn SetCurName() mit einem leeren String
aufgerufen wird, wird kein Eintrag als aktueller angezeigt (fuer DontKnow).
Vor dem Selectaufruf wird der ausgewaehlte Name automatisch als aktueller
gesetzt und wuerde beim naechsten Aufruf auch als aktueller Name angezeigt
werden. Deshalb sollte vor PopupMenu::Execute() gegebenenfalls mit
SetCurName() der aktuelle Fontname gesetzt werden.

Da die Id's und der interne Aufbau des Menus nicht bekannt ist, muss ein
Select-Handler gesetzt werden, um die Auswahl eines Namens mitzubekommen.

In dieses Menu koennen keine weiteren Items eingefuegt werden.

Spaeter soll auch das Menu die gleichen Bitmaps anzeigen, wie die
FontNameBox. Auf den Systemen, wo Menues nicht automatisch scrollen,
wird spaeter wohl ein A-Z Menu ziwschengeschaltet. Da ein Menu bei vielen
installierten Fonts bisher schon immer lange gebraucht hat, sollte dieses
Menu schon jetzt nur einmal erzeugt werden (da sonst das Kontextmenu bis
zu 10-Sekunden fuer die Erzeugung brauchen koennte).

Querverweise

FontList; FontStyleMenu; FontSizeMenu; FontNameBox

--------------------------------------------------------------------------

class FontStyleMenu

Beschreibung

Erlaubt die Auswahl eines FontStyles. Mit Fill wird das FontStyleMenu mit
den Styles zum uebergebenen Font gefuellt. Nachgebildete Styles werden
immer mit eingefuegt (kann sich aber noch aendern, da vielleicht
nicht alle Applikationen [StarDraw,Formel,FontWork] mit Syntetic-Fonts
umgehen koennen). Mit SetCurStyle()/GetCurStyle() kann der aktuelle Fontstyle
gesetzt/abgefragt werden. Der Stylename muss mit FontList::GetStyleName()
ermittelt werden. Wenn SetCurStyle() mit einem leeren String aufgerufen wird,
wird kein Eintrag als aktueller angezeigt (fuer DontKnow). Vor dem Selectaufruf
wird der ausgewaehlte Style automatisch als aktueller gesetzt und wuerde beim
naechsten Aufruf auch als aktueller Style angezeigt werden. Deshalb sollte vor
PopupMenu::Execute() gegebenenfalls mit SetCurStyle() der aktuelle Style
gesetzt werden. Da die Styles vom ausgewaehlten Font abhaengen, sollte
nach einer Aenderung des Fontnamen das Menu mit Fill mit den Styles des
Fonts neu gefuellt werden.

Mit GetCurStyle() kann der ausgewaehlte Style abgefragt
werden. Mit Check wird der Style gecheckt/uncheckt, welcher aktiv
ist. Der Stylename muss mit FontList::GetStyleName() ermittelt werden. Vor
dem Selectaufruf wird der ausgewaehlte Style automatisch gecheckt. Mit
UncheckAllStyles() koennen alle Fontstyles geuncheckt werden (zum Beispiel
fuer DontKnow).

Da die Id's und der interne Aufbau des Menus nicht bekannt ist, muss ein
Select-Handler gesetzt werden, um die Auswahl eines Styles mitzubekommen.

An dieses Menu kann ueber MENU_APPEND weitere Items eingefuegt werden.
Bei Fill werden nur Items entfernt, die die Id zwischen FONTSTYLEMENU_FIRSTID
und FONTSTYLEMENU_LASTID haben.

Querverweise

FontList; FontNameMenu; FontSizeMenu; FontStyleBox

--------------------------------------------------------------------------

class FontSizeMenu

Beschreibung

Erlaubt die Auswahl von Fontgroessen. Ueber Fill wird das FontSizeMenu
gefuellt und ueber GetCurHeight() kann die ausgewaehlte Fontgroesse
abgefragt werden. Mit SetCurHeight()/GetCurHeight() kann die aktuelle
Fontgroesse gesetzt/abgefragt werden. Wenn SetCurHeight() mit 0 aufgerufen
wird, wird kein Eintrag als aktueller angezeigt (fuer DontKnow). Vor dem
Selectaufruf wird die ausgewaehlte Groesse automatisch als aktuelle gesetzt
und wuerde beim naechsten Aufruf auch als aktuelle Groesse angezeigt werden.
Deshalb sollte vor PopupMenu::Execute() gegebenenfalls mit SetCurHeight()
die aktuelle Groesse gesetzt werden. Da die Groessen vom ausgewaehlten Font
abhaengen, sollte nach einer Aenderung des Fontnamen das Menu mit Fill mit
den Groessen des Fonts neu gefuellt werden.

Da die Id's und der interne Aufbau des Menus nicht bekannt ist, muss ein
Select-Handler gesetzt werden, um die Auswahl einer Groesse mitzubekommen.

Alle Groessen werden in 10tel Point angegeben.

In dieses Menu koennen keine weiteren Items eingefuegt werden.

Spaeter soll das Menu je nach System die Groessen anders darstelllen. Zum
Beispiel koennte der Mac spaeter vielleicht einmal die Groessen als Outline
darstellen, die als Bitmap-Fonts vorhanden sind.

Querverweise

FontList; FontNameMenu; FontStyleMenu; FontSizeBox

*************************************************************************/

// ----------------
// - FontNameMenu -
// ----------------

class SVT_DLLPUBLIC FontNameMenu : public PopupMenu
{
private:
    XubString       maCurName;
    Link            maSelectHdl;
    Link            maHighlightHdl;

public:
                    FontNameMenu();
    virtual         ~FontNameMenu();

    virtual void    Select();
    virtual void    Highlight();

    void            Fill( const FontList* pList );

    void            SetCurName( const XubString& rName );
    const XubString& GetCurName() const { return maCurName; }

    void            SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
    const Link&     GetSelectHdl() const { return maSelectHdl; }
    void            SetHighlightHdl( const Link& rLink ) { maHighlightHdl = rLink; }
    const Link&     GetHighlightHdl() const { return maHighlightHdl; }
};

// -----------------
// - FontStyleMenu -
// -----------------

#define FONTSTYLEMENU_FIRSTID       62000
#define FONTSTYLEMENU_LASTID        62999

class FontStyleMenu : public PopupMenu
{
private:
    XubString       maCurStyle;
    Link            maSelectHdl;
    Link            maHighlightHdl;

    BOOL            ImplIsAlreadyInserted( const XubString& rStyleName, USHORT nCount );

public:
                    FontStyleMenu();
    virtual         ~FontStyleMenu();

    virtual void    Select();
    virtual void    Highlight();

    void            Fill( const XubString& rName, const FontList* pList );
    void            SetCurStyle( const XubString& rStyle );
    const XubString& GetCurStyle() const { return maCurStyle; }

    void            SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
    const Link&     GetSelectHdl() const { return maSelectHdl; }
    void            SetHighlightHdl( const Link& rLink ) { maHighlightHdl = rLink; }
    const Link&     GetHighlightHdl() const { return maHighlightHdl; }
};

// ----------------
// - FontSizeMenu -
// ----------------

class SVT_DLLPUBLIC FontSizeMenu : public PopupMenu
{
private:
    International   OLDMEMBER_TO_BE_REMOVED;
    long*           mpHeightAry;
    long            mnCurHeight;
    Link            maSelectHdl;
    Link            maHighlightHdl;

public:
                    FontSizeMenu();
                    ~FontSizeMenu();

    virtual void    Select();
    virtual void    Highlight();

    void            Fill( const FontInfo& rInfo, const FontList* pList );

    void            SetCurHeight( long nHeight );
    long            GetCurHeight() const { return mnCurHeight; }

    void            SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
    const Link&     GetSelectHdl() const { return maSelectHdl; }
    void            SetHighlightHdl( const Link& rLink ) { maHighlightHdl = rLink; }
    const Link&     GetHighlightHdl() const { return maHighlightHdl; }
};

#endif  // _STDMENU_HXX
<commit_msg>INTEGRATION: CWS pj45 (1.5.132); FILE MERGED 2005/12/17 18:02:22 pjanik 1.5.132.1: #i58068#: Add visibility markup (patch from Naren Devaiah, Intel, JCA).<commit_after>/*************************************************************************
 *
 *  OpenOffice.org - a multi-platform office productivity suite
 *
 *  $RCSfile: stdmenu.hxx,v $
 *
 *  $Revision: 1.6 $
 *
 *  last change: $Author: obo $ $Date: 2005-12-21 17:54:26 $
 *
 *  The Contents of this file are made available subject to
 *  the terms of GNU Lesser General Public License Version 2.1.
 *
 *
 *    GNU Lesser General Public License Version 2.1
 *    =============================================
 *    Copyright 2005 by Sun Microsystems, Inc.
 *    901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *    This library is free software; you can redistribute it and/or
 *    modify it under the terms of the GNU Lesser General Public
 *    License version 2.1, as published by the Free Software Foundation.
 *
 *    This library is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *    Lesser General Public License for more details.
 *
 *    You should have received a copy of the GNU Lesser General Public
 *    License along with this library; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *    MA  02111-1307  USA
 *
 ************************************************************************/

#ifndef _STDMENU_HXX
#define _STDMENU_HXX

#ifndef INCLUDED_SVTDLLAPI_H
#include "svtools/svtdllapi.h"
#endif

#ifndef _LINK_HXX
#include <tools/link.hxx>
#endif
#ifndef _INTN_HXX
#include <tools/intn.hxx>
#endif
#ifndef _MENU_HXX
#include <vcl/menu.hxx>
#endif

class FontList;
class FontInfo;

/*************************************************************************

Beschreibung
============

class FontNameMenu

Beschreibung

Erlaubt die Auswahl von Fonts. Das Menu wird ueber Fill mit den FontNamen
gefuellt. Fill sortiert automatisch die FontNamen (inkl. aller Umlaute und
sprachabhaengig). Mit SetCurName()/GetCurName() kann der aktuelle Fontname
gesetzt/abgefragt werden. Wenn SetCurName() mit einem leeren String
aufgerufen wird, wird kein Eintrag als aktueller angezeigt (fuer DontKnow).
Vor dem Selectaufruf wird der ausgewaehlte Name automatisch als aktueller
gesetzt und wuerde beim naechsten Aufruf auch als aktueller Name angezeigt
werden. Deshalb sollte vor PopupMenu::Execute() gegebenenfalls mit
SetCurName() der aktuelle Fontname gesetzt werden.

Da die Id's und der interne Aufbau des Menus nicht bekannt ist, muss ein
Select-Handler gesetzt werden, um die Auswahl eines Namens mitzubekommen.

In dieses Menu koennen keine weiteren Items eingefuegt werden.

Spaeter soll auch das Menu die gleichen Bitmaps anzeigen, wie die
FontNameBox. Auf den Systemen, wo Menues nicht automatisch scrollen,
wird spaeter wohl ein A-Z Menu ziwschengeschaltet. Da ein Menu bei vielen
installierten Fonts bisher schon immer lange gebraucht hat, sollte dieses
Menu schon jetzt nur einmal erzeugt werden (da sonst das Kontextmenu bis
zu 10-Sekunden fuer die Erzeugung brauchen koennte).

Querverweise

FontList; FontStyleMenu; FontSizeMenu; FontNameBox

--------------------------------------------------------------------------

class FontStyleMenu

Beschreibung

Erlaubt die Auswahl eines FontStyles. Mit Fill wird das FontStyleMenu mit
den Styles zum uebergebenen Font gefuellt. Nachgebildete Styles werden
immer mit eingefuegt (kann sich aber noch aendern, da vielleicht
nicht alle Applikationen [StarDraw,Formel,FontWork] mit Syntetic-Fonts
umgehen koennen). Mit SetCurStyle()/GetCurStyle() kann der aktuelle Fontstyle
gesetzt/abgefragt werden. Der Stylename muss mit FontList::GetStyleName()
ermittelt werden. Wenn SetCurStyle() mit einem leeren String aufgerufen wird,
wird kein Eintrag als aktueller angezeigt (fuer DontKnow). Vor dem Selectaufruf
wird der ausgewaehlte Style automatisch als aktueller gesetzt und wuerde beim
naechsten Aufruf auch als aktueller Style angezeigt werden. Deshalb sollte vor
PopupMenu::Execute() gegebenenfalls mit SetCurStyle() der aktuelle Style
gesetzt werden. Da die Styles vom ausgewaehlten Font abhaengen, sollte
nach einer Aenderung des Fontnamen das Menu mit Fill mit den Styles des
Fonts neu gefuellt werden.

Mit GetCurStyle() kann der ausgewaehlte Style abgefragt
werden. Mit Check wird der Style gecheckt/uncheckt, welcher aktiv
ist. Der Stylename muss mit FontList::GetStyleName() ermittelt werden. Vor
dem Selectaufruf wird der ausgewaehlte Style automatisch gecheckt. Mit
UncheckAllStyles() koennen alle Fontstyles geuncheckt werden (zum Beispiel
fuer DontKnow).

Da die Id's und der interne Aufbau des Menus nicht bekannt ist, muss ein
Select-Handler gesetzt werden, um die Auswahl eines Styles mitzubekommen.

An dieses Menu kann ueber MENU_APPEND weitere Items eingefuegt werden.
Bei Fill werden nur Items entfernt, die die Id zwischen FONTSTYLEMENU_FIRSTID
und FONTSTYLEMENU_LASTID haben.

Querverweise

FontList; FontNameMenu; FontSizeMenu; FontStyleBox

--------------------------------------------------------------------------

class FontSizeMenu

Beschreibung

Erlaubt die Auswahl von Fontgroessen. Ueber Fill wird das FontSizeMenu
gefuellt und ueber GetCurHeight() kann die ausgewaehlte Fontgroesse
abgefragt werden. Mit SetCurHeight()/GetCurHeight() kann die aktuelle
Fontgroesse gesetzt/abgefragt werden. Wenn SetCurHeight() mit 0 aufgerufen
wird, wird kein Eintrag als aktueller angezeigt (fuer DontKnow). Vor dem
Selectaufruf wird die ausgewaehlte Groesse automatisch als aktuelle gesetzt
und wuerde beim naechsten Aufruf auch als aktuelle Groesse angezeigt werden.
Deshalb sollte vor PopupMenu::Execute() gegebenenfalls mit SetCurHeight()
die aktuelle Groesse gesetzt werden. Da die Groessen vom ausgewaehlten Font
abhaengen, sollte nach einer Aenderung des Fontnamen das Menu mit Fill mit
den Groessen des Fonts neu gefuellt werden.

Da die Id's und der interne Aufbau des Menus nicht bekannt ist, muss ein
Select-Handler gesetzt werden, um die Auswahl einer Groesse mitzubekommen.

Alle Groessen werden in 10tel Point angegeben.

In dieses Menu koennen keine weiteren Items eingefuegt werden.

Spaeter soll das Menu je nach System die Groessen anders darstelllen. Zum
Beispiel koennte der Mac spaeter vielleicht einmal die Groessen als Outline
darstellen, die als Bitmap-Fonts vorhanden sind.

Querverweise

FontList; FontNameMenu; FontStyleMenu; FontSizeBox

*************************************************************************/

// ----------------
// - FontNameMenu -
// ----------------

class SVT_DLLPUBLIC FontNameMenu : public PopupMenu
{
private:
    XubString       maCurName;
    Link            maSelectHdl;
    Link            maHighlightHdl;

public:
                    FontNameMenu();
    virtual         ~FontNameMenu();

    virtual void    Select();
    virtual void    Highlight();

    void            Fill( const FontList* pList );

    void            SetCurName( const XubString& rName );
    const XubString& GetCurName() const { return maCurName; }

    void            SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
    const Link&     GetSelectHdl() const { return maSelectHdl; }
    void            SetHighlightHdl( const Link& rLink ) { maHighlightHdl = rLink; }
    const Link&     GetHighlightHdl() const { return maHighlightHdl; }
};

// -----------------
// - FontStyleMenu -
// -----------------

#define FONTSTYLEMENU_FIRSTID       62000
#define FONTSTYLEMENU_LASTID        62999

class SVT_DLLPUBLIC FontStyleMenu : public PopupMenu
{
private:
    XubString       maCurStyle;
    Link            maSelectHdl;
    Link            maHighlightHdl;

    SVT_DLLPRIVATE BOOL         ImplIsAlreadyInserted( const XubString& rStyleName, USHORT nCount );

public:
                    FontStyleMenu();
    virtual         ~FontStyleMenu();

    virtual void    Select();
    virtual void    Highlight();

    void            Fill( const XubString& rName, const FontList* pList );
    void            SetCurStyle( const XubString& rStyle );
    const XubString& GetCurStyle() const { return maCurStyle; }

    void            SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
    const Link&     GetSelectHdl() const { return maSelectHdl; }
    void            SetHighlightHdl( const Link& rLink ) { maHighlightHdl = rLink; }
    const Link&     GetHighlightHdl() const { return maHighlightHdl; }
};

// ----------------
// - FontSizeMenu -
// ----------------

class SVT_DLLPUBLIC FontSizeMenu : public PopupMenu
{
private:
    International   OLDMEMBER_TO_BE_REMOVED;
    long*           mpHeightAry;
    long            mnCurHeight;
    Link            maSelectHdl;
    Link            maHighlightHdl;

public:
                    FontSizeMenu();
                    ~FontSizeMenu();

    virtual void    Select();
    virtual void    Highlight();

    void            Fill( const FontInfo& rInfo, const FontList* pList );

    void            SetCurHeight( long nHeight );
    long            GetCurHeight() const { return mnCurHeight; }

    void            SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; }
    const Link&     GetSelectHdl() const { return maSelectHdl; }
    void            SetHighlightHdl( const Link& rLink ) { maHighlightHdl = rLink; }
    const Link&     GetHighlightHdl() const { return maHighlightHdl; }
};

#endif  // _STDMENU_HXX
<|endoftext|>


<commit_before>#include <v8.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <common.h>
#include <dirent.h>
#include <string.h>

v8::Handle<v8::Value> _directory(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    if (args.Length() < 1 || args.This()->InternalFieldCount() == 0) {
	return v8::ThrowException(v8::String::New("Invalid call format. Use 'new Directory(name)'"));
    }

    args.This()->SetInternalField(0, args[0]);
    return args.This();
}

v8::Handle<v8::Value> _create(const v8::Arguments& args) {
    v8::HandleScope handle_scope;

    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    int mode;
    if (args.Length() == 0) {
	mode = 0777;
    } else {
	mode = args[0]->Int32Value();
    }

    int result = mkdir(*name, mode);
    if (result != 0) {
	return v8::ThrowException(v8::String::New("Cannot create directory'"));
    }

    return args.This();
}

v8::Handle<v8::Value> _listfiles(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));

    DIR * dp;
    struct dirent * ep;

    v8::Handle<v8::Array> result = v8::Array::New();

    dp = opendir(*name);
    if (dp == NULL) { return v8::ThrowException(v8::String::New("Directory cannot be opened")); }
    int cnt = 0;
    while ((ep = readdir(dp))) {
	if (ep->d_type == DT_REG) {
	    result->Set(v8::Integer::New(cnt++), v8::String::New(ep->d_name));
	}
    }
    closedir(dp);
    return result;
}

v8::Handle<v8::Value> _listdirectories(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));

    DIR * dp;
    struct dirent * ep;

    v8::Handle<v8::Array> result = v8::Array::New();

    dp = opendir(*name);
    if (dp == NULL) { return v8::ThrowException(v8::String::New("Directory cannot be opened")); }
    int cnt = 0;
    while ((ep = readdir(dp))) {
	if (ep->d_type == DT_DIR) {
	    if (strcmp(ep->d_name, ".") != 0 && strcmp(ep->d_name, "..") != 0) {
		result->Set(v8::Integer::New(cnt++), v8::String::New(ep->d_name));
	    }
	}
    }
    closedir(dp);
    return result;
}

v8::Handle<v8::Value> _file(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    if (args.Length() < 1 || args.This()->InternalFieldCount() == 0) {
	return v8::ThrowException(v8::String::New("Invalid call format. Use 'new File(name)'"));
    }

    args.This()->SetInternalField(0, args[0]);
    args.This()->SetInternalField(1, v8::Boolean::New(false));
    return args.This();
}

v8::Handle<v8::Value> _open(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    if (args.Length() < 1) {
	return v8::ThrowException(v8::String::New("Bad argument count. Use 'file.open(mode)'"));
    }
    v8::String::Utf8Value mode(args[0]);
    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);
    if (!file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File already opened"));
    }

    FILE * f;
    f = fopen(*name, *mode);

    if (!f) {
	return v8::ThrowException(v8::String::New("Cannot open file"));
    }

    struct stat st;
    if (stat(*name, &st) == 0) {
	args.This()->SetInternalField(2, v8::Integer::New(st.st_size));
    }
    args.This()->SetInternalField(1, v8::External::New((void *)f));
    args.This()->SetInternalField(3, v8::Integer::New(0));

    return args.This();
}

v8::Handle<v8::Value> _close(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("Cannot close non-opened file"));
    }

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());
    fclose(f);
    args.This()->SetInternalField(1, v8::Boolean::New(false));
    return args.This();
}

v8::Handle<v8::Value> _read(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be opened before reading"));
    }

    long size = args.This()->GetInternalField(2)->IntegerValue();
    long pos = args.This()->GetInternalField(3)->IntegerValue();

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());

    long avail = size-pos;
    if (!avail) { return v8::Boolean::New(false); }

    if (args.Length() && args[0]->IsNumber()) {
        int len = args[0]->IntegerValue();
	if (len < avail) { avail = len; }
    }
    char buf[avail];
    fread(buf, sizeof(char), avail, f);
    pos += avail;

    args.This()->SetInternalField(3, v8::Integer::New(pos));

   if (args.Length() > 1 && args[1]->IsTrue()) {
       return char2array(buf, avail);
   } else {
       return char2string(buf, avail);
    }
}

v8::Handle<v8::Value> _rewind(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);
    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be opened before rewinding"));
    }

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());
    rewind(f);

    args.This()->SetInternalField(3, v8::Integer::New(0));
    return args.This();
}

v8::Handle<v8::Value> _write(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be opened before writing"));
    }

    if (args.Length() < 1) {
	return v8::ThrowException(v8::String::New("Bad argument count. Use 'file.write(data)'"));
    }

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());

    if (args[0]->IsArray()) {
	v8::Handle<v8::Array> arr = v8::Handle<v8::Array>::Cast(args[0]);
	int len = arr->Length();

	int max = 4096;
	int current = 0;
	char buf[max];
	for (int i=0;i<len;i++) {
    	    v8::Handle<v8::Integer> a = v8::Integer::New(arr->Get(v8::Integer::New(i))->IntegerValue());
	    buf[current++] = (char) a->Int32Value();
	    if (current == max) {
    		fwrite(buf, sizeof(char), current, f);
		current = 0;
	    }
	}
	if (current) { fwrite(buf, sizeof(char), current, f); }

    } else {
	v8::String::Utf8Value data(args[0]);

	fwrite(*data, sizeof(char), args[0]->ToString()->Utf8Length(), f);
    }

    return args.This();
}

v8::Handle<v8::Value> _remove(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (!file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be closed before deleting"));
    }

    if (!remove(*name)) {
	return v8::ThrowException(v8::String::New("Cannot remove file"));
    }

    return args.This();
}

v8::Handle<v8::Value> _getsize(const v8::Arguments& args) {
    v8::HandleScope handle_scope;

    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    struct stat st;
    if (stat(*name, &st) == 0) {
	return v8::Integer::New(st.st_size);
    } else {
	return v8::Boolean::New(false);
    }
}

v8::Handle<v8::Value> _tostring(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    return args.This()->GetInternalField(0);

}

void SetupIo(v8::Handle<v8::Object> target) {
  v8::HandleScope handle_scope;

  v8::Handle<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(_file);
  ft->SetClassName(v8::String::New("File"));
  v8::Handle<v8::ObjectTemplate> ot = ft->InstanceTemplate();
  ot->SetInternalFieldCount(4); /* filename, handle, size, position */

  v8::Handle<v8::ObjectTemplate> pt = ft->PrototypeTemplate();
  pt->Set("open", v8::FunctionTemplate::New(_open));
  pt->Set("read", v8::FunctionTemplate::New(_read));
  pt->Set("rewind", v8::FunctionTemplate::New(_rewind));
  pt->Set("close", v8::FunctionTemplate::New(_close));
  pt->Set("write", v8::FunctionTemplate::New(_write));
  pt->Set("remove", v8::FunctionTemplate::New(_remove));
  pt->Set("getSize", v8::FunctionTemplate::New(_getsize));
  pt->Set("toString", v8::FunctionTemplate::New(_tostring));

  target->Set(v8::String::New("File"), ft->GetFunction());

  ft = v8::FunctionTemplate::New(_directory);
  ft->SetClassName(v8::String::New("Directory"));
  ot = ft->InstanceTemplate();
  ot->SetInternalFieldCount(1); /* dirname */

  pt = ft->PrototypeTemplate();
  pt->Set("create", v8::FunctionTemplate::New(_create));
  pt->Set("listFiles", v8::FunctionTemplate::New(_listfiles));
  pt->Set("listDirectories", v8::FunctionTemplate::New(_listdirectories));
  pt->Set("toString", v8::FunctionTemplate::New(_tostring));

  target->Set(v8::String::New("Directory"), ft->GetFunction());

}
<commit_msg>File/directory removing and existance test<commit_after>#include <v8.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <common.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>

v8::Handle<v8::Value> _directory(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    if (args.Length() < 1 || args.This()->InternalFieldCount() == 0) {
	return v8::ThrowException(v8::String::New("Invalid call format. Use 'new Directory(name)'"));
    }

    args.This()->SetInternalField(0, args[0]);
    return args.This();
}

v8::Handle<v8::Value> _create(const v8::Arguments& args) {
    v8::HandleScope handle_scope;

    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    int mode;
    if (args.Length() == 0) {
	mode = 0777;
    } else {
	mode = args[0]->Int32Value();
    }

    int result = mkdir(*name, mode);
    if (result != 0) {
	return v8::ThrowException(v8::String::New("Cannot create directory'"));
    }

    return args.This();
}

v8::Handle<v8::Value> _listfiles(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));

    DIR * dp;
    struct dirent * ep;

    v8::Handle<v8::Array> result = v8::Array::New();

    dp = opendir(*name);
    if (dp == NULL) { return v8::ThrowException(v8::String::New("Directory cannot be opened")); }
    int cnt = 0;
    while ((ep = readdir(dp))) {
	if (ep->d_type == DT_REG) {
	    result->Set(v8::Integer::New(cnt++), v8::String::New(ep->d_name));
	}
    }
    closedir(dp);
    return result;
}

v8::Handle<v8::Value> _listdirectories(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));

    DIR * dp;
    struct dirent * ep;

    v8::Handle<v8::Array> result = v8::Array::New();

    dp = opendir(*name);
    if (dp == NULL) { return v8::ThrowException(v8::String::New("Directory cannot be opened")); }
    int cnt = 0;
    while ((ep = readdir(dp))) {
	if (ep->d_type == DT_DIR) {
	    if (strcmp(ep->d_name, ".") != 0 && strcmp(ep->d_name, "..") != 0) {
		result->Set(v8::Integer::New(cnt++), v8::String::New(ep->d_name));
	    }
	}
    }
    closedir(dp);
    return result;
}

v8::Handle<v8::Value> _file(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    if (args.Length() < 1 || args.This()->InternalFieldCount() == 0) {
	return v8::ThrowException(v8::String::New("Invalid call format. Use 'new File(name)'"));
    }

    args.This()->SetInternalField(0, args[0]);
    args.This()->SetInternalField(1, v8::Boolean::New(false));
    return args.This();
}

v8::Handle<v8::Value> _open(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    if (args.Length() < 1) {
	return v8::ThrowException(v8::String::New("Bad argument count. Use 'file.open(mode)'"));
    }
    v8::String::Utf8Value mode(args[0]);
    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);
    if (!file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File already opened"));
    }

    FILE * f;
    f = fopen(*name, *mode);

    if (!f) {
	return v8::ThrowException(v8::String::New("Cannot open file"));
    }

    struct stat st;
    if (stat(*name, &st) == 0) {
	args.This()->SetInternalField(2, v8::Integer::New(st.st_size));
    }
    args.This()->SetInternalField(1, v8::External::New((void *)f));
    args.This()->SetInternalField(3, v8::Integer::New(0));

    return args.This();
}

v8::Handle<v8::Value> _close(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("Cannot close non-opened file"));
    }

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());
    fclose(f);
    args.This()->SetInternalField(1, v8::Boolean::New(false));
    return args.This();
}

v8::Handle<v8::Value> _read(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be opened before reading"));
    }

    long size = args.This()->GetInternalField(2)->IntegerValue();
    long pos = args.This()->GetInternalField(3)->IntegerValue();

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());

    long avail = size-pos;
    if (!avail) { return v8::Boolean::New(false); }

    if (args.Length() && args[0]->IsNumber()) {
        int len = args[0]->IntegerValue();
	if (len < avail) { avail = len; }
    }
    char buf[avail];
    fread(buf, sizeof(char), avail, f);
    pos += avail;

    args.This()->SetInternalField(3, v8::Integer::New(pos));

   if (args.Length() > 1 && args[1]->IsTrue()) {
       return char2array(buf, avail);
   } else {
       return char2string(buf, avail);
    }
}

v8::Handle<v8::Value> _rewind(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);
    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be opened before rewinding"));
    }

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());
    rewind(f);

    args.This()->SetInternalField(3, v8::Integer::New(0));
    return args.This();
}

v8::Handle<v8::Value> _write(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::Handle<v8::Value> file = args.This()->GetInternalField(1);

    if (file->IsFalse()) {
	return v8::ThrowException(v8::String::New("File must be opened before writing"));
    }

    if (args.Length() < 1) {
	return v8::ThrowException(v8::String::New("Bad argument count. Use 'file.write(data)'"));
    }

    FILE * f = reinterpret_cast<FILE *>(v8::Handle<v8::External>::Cast(file)->Value());

    if (args[0]->IsArray()) {
	v8::Handle<v8::Array> arr = v8::Handle<v8::Array>::Cast(args[0]);
	int len = arr->Length();

	int max = 4096;
	int current = 0;
	char buf[max];
	for (int i=0;i<len;i++) {
    	    v8::Handle<v8::Integer> a = v8::Integer::New(arr->Get(v8::Integer::New(i))->IntegerValue());
	    buf[current++] = (char) a->Int32Value();
	    if (current == max) {
    		fwrite(buf, sizeof(char), current, f);
		current = 0;
	    }
	}
	if (current) { fwrite(buf, sizeof(char), current, f); }

    } else {
	v8::String::Utf8Value data(args[0]);

	fwrite(*data, sizeof(char), args[0]->ToString()->Utf8Length(), f);
    }

    return args.This();
}

v8::Handle<v8::Value> _remove(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));

    if (remove(*name) != 0) {
	return v8::ThrowException(v8::String::New("Cannot remove file/dir"));
    }

    return args.This();
}

v8::Handle<v8::Value> _getsize(const v8::Arguments& args) {
    v8::HandleScope handle_scope;

    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    struct stat st;
    if (stat(*name, &st) == 0) {
	return v8::Integer::New(st.st_size);
    } else {
	return v8::Boolean::New(false);
    }
}

v8::Handle<v8::Value> _tostring(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    return args.This()->GetInternalField(0);
}

v8::Handle<v8::Value> _exists(const v8::Arguments& args) {
    v8::HandleScope handle_scope;
    v8::String::Utf8Value name(args.This()->GetInternalField(0));
    int result = access(*name, F_OK);
    return v8::Boolean::New(result == 0);
}

void SetupIo(v8::Handle<v8::Object> target) {
  v8::HandleScope handle_scope;

  v8::Handle<v8::FunctionTemplate> ft = v8::FunctionTemplate::New(_file);
  ft->SetClassName(v8::String::New("File"));
  v8::Handle<v8::ObjectTemplate> ot = ft->InstanceTemplate();
  ot->SetInternalFieldCount(4); /* filename, handle, size, position */

  v8::Handle<v8::ObjectTemplate> pt = ft->PrototypeTemplate();
  pt->Set("open", v8::FunctionTemplate::New(_open));
  pt->Set("read", v8::FunctionTemplate::New(_read));
  pt->Set("rewind", v8::FunctionTemplate::New(_rewind));
  pt->Set("close", v8::FunctionTemplate::New(_close));
  pt->Set("write", v8::FunctionTemplate::New(_write));
  pt->Set("remove", v8::FunctionTemplate::New(_remove));
  pt->Set("getSize", v8::FunctionTemplate::New(_getsize));
  pt->Set("toString", v8::FunctionTemplate::New(_tostring));
  pt->Set("exists", v8::FunctionTemplate::New(_exists));

  target->Set(v8::String::New("File"), ft->GetFunction());

  ft = v8::FunctionTemplate::New(_directory);
  ft->SetClassName(v8::String::New("Directory"));
  ot = ft->InstanceTemplate();
  ot->SetInternalFieldCount(1); /* dirname */

  pt = ft->PrototypeTemplate();
  pt->Set("create", v8::FunctionTemplate::New(_create));
  pt->Set("listFiles", v8::FunctionTemplate::New(_listfiles));
  pt->Set("listDirectories", v8::FunctionTemplate::New(_listdirectories));
  pt->Set("toString", v8::FunctionTemplate::New(_tostring));
  pt->Set("exists", v8::FunctionTemplate::New(_exists));
  pt->Set("remove", v8::FunctionTemplate::New(_remove));

  target->Set(v8::String::New("Directory"), ft->GetFunction());

}
<|endoftext|>


<commit_before>/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2008 by Sun Microsystems, Inc.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * $RCSfile: svdedxv.hxx,v $
 * $Revision: 1.4 $
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

#ifndef _SVDEDXV_HXX
#define _SVDEDXV_HXX

#include <rtl/ref.hxx>
#include "svx/svxdllapi.h"
#include <svx/svdglev.hxx>

#include <svx/selectioncontroller.hxx>

//************************************************************
//   Vorausdeklarationen
//************************************************************

class SdrOutliner;
class OutlinerView;
class EditStatus;
class EditFieldInfo;
class ImpSdrEditPara;

namespace com { namespace sun { namespace star { namespace uno {
    class Any;
} } } }

namespace sdr {
    class SelectionController;
}

//************************************************************
//   Defines
//************************************************************

enum SdrEndTextEditKind {SDRENDTEXTEDIT_UNCHANGED, // Textobjekt unveraendert
                         SDRENDTEXTEDIT_CHANGED,   // Textobjekt wurde geaendert
                         SDRENDTEXTEDIT_DELETED,   // Textobjekt implizit geloescht
                         SDRENDTEXTEDIT_SHOULDBEDELETED}; // Fuer Writer: Textobjekt sollte geloescht werden

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//   @@@@  @@@@@  @@@@@@  @@@@@ @@@@@  @@ @@@@@@  @@ @@ @@ @@@@@ @@   @@
//  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@   @@
//  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@ @ @@
//  @@  @@ @@@@@      @@  @@@@  @@  @@ @@   @@    @@@@@ @@ @@@@  @@@@@@@
//  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@     @@@  @@ @@    @@@@@@@
//  @@  @@ @@  @@ @@  @@  @@    @@  @@ @@   @@     @@@  @@ @@    @@@ @@@
//   @@@@  @@@@@   @@@@   @@@@@ @@@@@  @@   @@      @   @@ @@@@@ @@   @@
//
// - Allgemeines Edit fuer objektspeziefische Eigenschaften
// - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
// - Macromodus
//
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView
{
    friend class                SdrPageView;
    friend class                ImpSdrEditPara;

protected:
    // TextEdit
    SdrObjectWeakRef            mxTextEditObj;          // Aktuell im TextEdit befindliches Obj
    SdrPageView*                pTextEditPV;
    SdrOutliner*                pTextEditOutliner;     // Na eben der Outliner fuers TextEdit
    OutlinerView*               pTextEditOutlinerView; // die aktuelle View des Outliners
    Window*                     pTextEditWin;          // passendes Win zu pTextEditOutlinerView
    Cursor*                     pTextEditCursorMerker; // Zum Restaurieren des Cursors am jeweiligen Win
    ImpSdrEditPara*             pEditPara; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
    SdrObject*                  pMacroObj;
    SdrPageView*                pMacroPV;
    Window*                     pMacroWin;

    Rectangle                   aTextEditArea;
    Rectangle                   aMinTextEditArea;
    Link                        aOldCalcFieldValueLink; // Zum rufen des alten Handlers
    Point                       aMacroDownPos;

    USHORT                      nMacroTol;

    unsigned                    bTextEditDontDelete : 1;   // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
    unsigned                    bTextEditOnlyOneView : 1;  // Nur eine OutlinerView (f. Rechtschreibpruefung)
    unsigned                    bTextEditNewObj : 1;       // Aktuell editiertes Objekt wurde gerade neu erzeugt
    unsigned                    bQuickTextEditMode : 1;    // persistent(->CrtV). Default=TRUE
    unsigned                    bMacroMode : 1;            // persistent(->CrtV). Default=TRUE
    unsigned                    bMacroDown : 1;

    rtl::Reference< sdr::SelectionController > mxSelectionController;
    rtl::Reference< sdr::SelectionController > mxLastSelectionController;

private:
    SVX_DLLPRIVATE void ImpClearVars();

protected:
    OutlinerView* ImpFindOutlinerView(Window* pWin) const;

    // Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
    // pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
    OutlinerView* ImpMakeOutlinerView(Window* pWin, BOOL bNoPaint, OutlinerView* pGivenView) const;
    void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect) const;
    void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;

    // Hintergrundfarbe fuer die Outlinerviews bestimmen
    Color ImpGetTextEditBackgroundColor() const;

    // Feststellen, ob der gesamte Text markiert ist. Liefert auch TRUE wenn
    // kein Text vorhanden ist.
    BOOL ImpIsTextEditAllSelected() const;
    void ImpMakeTextCursorAreaVisible();

    // Handler fuer AutoGrowing Text bei aktivem Outliner
    DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
    DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);

    void ImpMacroUp(const Point& rUpPos);
    void ImpMacroDown(const Point& rDownPos);

protected:
    // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
    SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
    virtual ~SdrObjEditView();

public:
    // Actionhandling fuer Macromodus
    virtual BOOL IsAction() const;
    virtual void MovAction(const Point& rPnt);
    virtual void EndAction();
    virtual void BrkAction();
    virtual void BckAction();
    virtual void TakeActionRect(Rectangle& rRect) const;

    virtual void SFX_NOTIFY(SfxBroadcaster& rBC, const TypeId& rBCType, const SfxHint& rHint, const TypeId& rHintType);
    virtual void ModelHasChanged();

    //************************************************************************
    // TextEdit ueber einen Outliner
    //************************************************************************
    // QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
    // editiert werden sollen. Default=TRUE. Persistent.
    void SetQuickTextEditMode(BOOL bOn) { bQuickTextEditMode=bOn; }
    BOOL IsQuickTextEditMode() const { return bQuickTextEditMode; }

    // Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
    // angemeldete Win verwendet.
    // Der Cursor des Fensters an dem Editiert wird wird bei
    // SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
    // Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
    // Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
    // Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
    // Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
    // nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
    // spaeter via delete zerstoert (falls bDontDeleteOutliner=FALSE). Die
    // SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
    // dieser Instanz und ausserdem auch den StatusEventHdl.
    // Ebenso kann eine spezifische OutlinerView vorgegeben werden.

    virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
        SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
        sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
    // bDontDeleteReally ist ein Spezialparameter fuer den Writer.
    // Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
    // nicht geloescht. Stattdessen gibt es dann einen Returncode
    // SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
    // der besagt, dass das Objekt geloescht werden sollte.
    virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
    virtual bool IsTextEdit() const;

    // TRUE=Es wird ein Textrahmen (OBJ_TEXT,OBJ_OUTLINETEXT,...) editiert
    // ansonsten handelt es sich um ein beschriftetes Zeichenobjekt, an dem
    // der Text ja bekanntlich hor. und vert. zentriert wird.
    BOOL IsTextEditFrame() const;

    // Diese Methode liefert TRUE, wenn der Punkt rHit innerhalb der
    // des Objektbereichs oder der OutlinerView liegt.
    BOOL IsTextEditHit(const Point& rHit, short nTol) const;

    // Diese Methode liefert TRUE, wenn der Punkt rHit innerhalb des
    // Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
    // umschliesst.
    BOOL IsTextEditFrameHit(const Point& rHit) const;

    // Bei aktiver Selektion, also zwischen MouseButtonDown und
    // MouseButtonUp liefert diese Methode immer TRUE.
    BOOL IsTextEditInSelectionMode() const;

    // Folgende Methode addiert einen passenden Offset zum MouseEvent
    // um diesen an den Outliner weiterzureichen.
    void AddTextEditOfs(MouseEvent& rMEvt) const;

    // Wer das z.Zt. im TextEdit befindliche Objekt braucht:
    SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }

    // info about TextEditPageView. Default is 0L.
    virtual SdrPageView* GetTextEditPageView() const;

    // Das aktuelle Win des Outliners
    Window* GetTextEditWin() const { return pTextEditWin; }
    void SetTextEditWin(Window* pWin);

    // An den hier abgeholten Outliner kann man schliesslich
    // Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
    // Undo/Redo rufen, etc.
    const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
    SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
    const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
    OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }

    virtual BOOL KeyInput(const KeyEvent& rKEvt, Window* pWin);
    virtual BOOL MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
    virtual BOOL MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
    virtual BOOL MouseMove(const MouseEvent& rMEvt, Window* pWin);
    virtual BOOL Command(const CommandEvent& rCEvt, Window* pWin);
    BOOL Cut(ULONG nFormat=SDR_ANYFORMAT);
    BOOL Yank(ULONG nFormat=SDR_ANYFORMAT);
    BOOL Paste(Window* pWin=NULL, ULONG nFormat=SDR_ANYFORMAT);

    // #97766# make virtual to change implementation e.g. for SdOutlineView
    virtual sal_uInt16 GetScriptType() const;

    /* new interface src537 */
    BOOL GetAttributes(SfxItemSet& rTargetSet, BOOL bOnlyHardAttr=FALSE) const;

    BOOL SetAttributes(const SfxItemSet& rSet, BOOL bReplaceAll);
    SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(BOOL& rOk) const;
    BOOL SetStyleSheet(SfxStyleSheet* pStyleSheet, BOOL bDontRemoveHardAttr);

    // Intern: Beim Splitteraufziehen neue OutlinerView...
    virtual void AddWindowToPaintView(OutputDevice* pNewWin);
    virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);

    //************************************************************************
    // Object-MacroModus (z.B. Rect als Button oder sowas):
    //************************************************************************
    // Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
    // SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
    // Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==TRUE).
    void SetMacroMode(BOOL bOn) { bMacroMode=bOn; }
    BOOL IsMacroMode() const { return bMacroMode; }
    BOOL BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
    BOOL BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
    void MovMacroObj(const Point& rPnt);
    void BrkMacroObj();
    BOOL EndMacroObj();
    BOOL IsMacroObj() const { return pMacroObj!=NULL; }
    BOOL IsMacroObjDown() const { return bMacroDown; }

    /** fills the given any with a XTextCursor for the current text selection.
        Leaves the any untouched if there currently is no text selected */
    void getTextSelection( ::com::sun::star::uno::Any& rSelection );

    virtual void MarkListHasChanged();

    rtl::Reference< sdr::SelectionController > getSelectionController() const { return mxSelectionController; }
};

#endif //_SVDEDXV_HXX

<commit_msg>INTEGRATION: CWS impressodf12 (1.4.26); FILE MERGED 2008/05/26 11:35:45 cl 1.4.26.1: #i35937# code cleanup after bullet rework<commit_after>/*************************************************************************
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * Copyright 2008 by Sun Microsystems, Inc.
 *
 * OpenOffice.org - a multi-platform office productivity suite
 *
 * $RCSfile: svdedxv.hxx,v $
 * $Revision: 1.5 $
 *
 * This file is part of OpenOffice.org.
 *
 * OpenOffice.org is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 3
 * only, as published by the Free Software Foundation.
 *
 * OpenOffice.org is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License version 3 for more details
 * (a copy is included in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU Lesser General Public License
 * version 3 along with OpenOffice.org.  If not, see
 * <http://www.openoffice.org/license.html>
 * for a copy of the LGPLv3 License.
 *
 ************************************************************************/

#ifndef _SVDEDXV_HXX
#define _SVDEDXV_HXX

#include <rtl/ref.hxx>
#include "svx/svxdllapi.h"
#include <svx/svdglev.hxx>

#include <svx/selectioncontroller.hxx>

//************************************************************
//   Vorausdeklarationen
//************************************************************

class SdrOutliner;
class OutlinerView;
class EditStatus;
class EditFieldInfo;
class ImpSdrEditPara;
struct PasteOrDropInfos;

namespace com { namespace sun { namespace star { namespace uno {
    class Any;
} } } }

namespace sdr {
    class SelectionController;
}

//************************************************************
//   Defines
//************************************************************

enum SdrEndTextEditKind {SDRENDTEXTEDIT_UNCHANGED, // Textobjekt unveraendert
                         SDRENDTEXTEDIT_CHANGED,   // Textobjekt wurde geaendert
                         SDRENDTEXTEDIT_DELETED,   // Textobjekt implizit geloescht
                         SDRENDTEXTEDIT_SHOULDBEDELETED}; // Fuer Writer: Textobjekt sollte geloescht werden

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//   @@@@  @@@@@  @@@@@@  @@@@@ @@@@@  @@ @@@@@@  @@ @@ @@ @@@@@ @@   @@
//  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@   @@
//  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@    @@ @@ @@ @@    @@ @ @@
//  @@  @@ @@@@@      @@  @@@@  @@  @@ @@   @@    @@@@@ @@ @@@@  @@@@@@@
//  @@  @@ @@  @@     @@  @@    @@  @@ @@   @@     @@@  @@ @@    @@@@@@@
//  @@  @@ @@  @@ @@  @@  @@    @@  @@ @@   @@     @@@  @@ @@    @@@ @@@
//   @@@@  @@@@@   @@@@   @@@@@ @@@@@  @@   @@      @   @@ @@@@@ @@   @@
//
// - Allgemeines Edit fuer objektspeziefische Eigenschaften
// - Textedit fuer alle vom SdrTextObj abgeleiteten Zeichenobjekte
// - Macromodus
//
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

class SVX_DLLPUBLIC SdrObjEditView: public SdrGlueEditView
{
    friend class                SdrPageView;
    friend class                ImpSdrEditPara;

protected:
    // TextEdit
    SdrObjectWeakRef            mxTextEditObj;          // Aktuell im TextEdit befindliches Obj
    SdrPageView*                pTextEditPV;
    SdrOutliner*                pTextEditOutliner;     // Na eben der Outliner fuers TextEdit
    OutlinerView*               pTextEditOutlinerView; // die aktuelle View des Outliners
    Window*                     pTextEditWin;          // passendes Win zu pTextEditOutlinerView
    Cursor*                     pTextEditCursorMerker; // Zum Restaurieren des Cursors am jeweiligen Win
    ImpSdrEditPara*             pEditPara; // Da hau' ich erstmal alles rein um kompatibel zu bleiben...
    SdrObject*                  pMacroObj;
    SdrPageView*                pMacroPV;
    Window*                     pMacroWin;

    Rectangle                   aTextEditArea;
    Rectangle                   aMinTextEditArea;
    Link                        aOldCalcFieldValueLink; // Zum rufen des alten Handlers
    Point                       aMacroDownPos;

    USHORT                      nMacroTol;

    unsigned                    bTextEditDontDelete : 1;   // Outliner und View bei SdrEndTextEdit nicht deleten (f. Rechtschreibpruefung)
    unsigned                    bTextEditOnlyOneView : 1;  // Nur eine OutlinerView (f. Rechtschreibpruefung)
    unsigned                    bTextEditNewObj : 1;       // Aktuell editiertes Objekt wurde gerade neu erzeugt
    unsigned                    bQuickTextEditMode : 1;    // persistent(->CrtV). Default=TRUE
    unsigned                    bMacroMode : 1;            // persistent(->CrtV). Default=TRUE
    unsigned                    bMacroDown : 1;

    rtl::Reference< sdr::SelectionController > mxSelectionController;
    rtl::Reference< sdr::SelectionController > mxLastSelectionController;

private:
    SVX_DLLPRIVATE void ImpClearVars();

protected:
    OutlinerView* ImpFindOutlinerView(Window* pWin) const;

    // Eine neue OutlinerView auf dem Heap anlegen und alle erforderlichen Parameter setzen.
    // pTextEditObj, pTextEditPV und pTextEditOutliner muessen initiallisiert sein.
    OutlinerView* ImpMakeOutlinerView(Window* pWin, BOOL bNoPaint, OutlinerView* pGivenView) const;
    void ImpPaintOutlinerView(OutlinerView& rOutlView, const Rectangle& rRect) const;
    void ImpInvalidateOutlinerView(OutlinerView& rOutlView) const;

    // Hintergrundfarbe fuer die Outlinerviews bestimmen
    Color ImpGetTextEditBackgroundColor() const;

    // Feststellen, ob der gesamte Text markiert ist. Liefert auch TRUE wenn
    // kein Text vorhanden ist.
    BOOL ImpIsTextEditAllSelected() const;
    void ImpMakeTextCursorAreaVisible();

    // Handler fuer AutoGrowing Text bei aktivem Outliner
    DECL_LINK(ImpOutlinerStatusEventHdl,EditStatus*);
    DECL_LINK(ImpOutlinerCalcFieldValueHdl,EditFieldInfo*);

    void ImpMacroUp(const Point& rUpPos);
    void ImpMacroDown(const Point& rDownPos);

       DECL_LINK( BeginPasteOrDropHdl, PasteOrDropInfos* );
    DECL_LINK( EndPasteOrDropHdl, PasteOrDropInfos* );

protected:
    // #i71538# make constructors of SdrView sub-components protected to avoid incomplete incarnations which may get casted to SdrView
    SdrObjEditView(SdrModel* pModel1, OutputDevice* pOut = 0L);
    virtual ~SdrObjEditView();

public:
    // Actionhandling fuer Macromodus
    virtual BOOL IsAction() const;
    virtual void MovAction(const Point& rPnt);
    virtual void EndAction();
    virtual void BrkAction();
    virtual void BckAction();
    virtual void TakeActionRect(Rectangle& rRect) const;

    virtual void SFX_NOTIFY(SfxBroadcaster& rBC, const TypeId& rBCType, const SfxHint& rHint, const TypeId& rHintType);
    virtual void ModelHasChanged();

    //************************************************************************
    // TextEdit ueber einen Outliner
    //************************************************************************
    // QuickTextEditMode bedeutet, dass Objekte mit Text sofort beim Anklicken
    // editiert werden sollen. Default=TRUE. Persistent.
    void SetQuickTextEditMode(BOOL bOn) { bQuickTextEditMode=bOn; }
    BOOL IsQuickTextEditMode() const { return bQuickTextEditMode; }

    // Starten des TextEditMode. Ist pWin==NULL, wird das erste an der View
    // angemeldete Win verwendet.
    // Der Cursor des Fensters an dem Editiert wird wird bei
    // SdrBeginTextEdit() gemerkt und bei SdrEndTextEdit() wieder restauriert.
    // Die App muss sicherstellen, das die zum Zeitpunkt des BegEdit am
    // Windows angemeldete Cursorinstanz beim SdrEndTextEdit noch gueltig ist.
    // Ueber den Parameter pEditOutliner kann die Applikation einen eigenen
    // Outliner vorgeben, der zum Editieren verwendet wird. Dieser gehoert
    // nach Aufruf von SdrBeginTextEdit der SdrObjEditView und wird von dieser
    // spaeter via delete zerstoert (falls bDontDeleteOutliner=FALSE). Die
    // SdrObjEditView setzt dann das Modusflag (EditEngine/Outliner) an
    // dieser Instanz und ausserdem auch den StatusEventHdl.
    // Ebenso kann eine spezifische OutlinerView vorgegeben werden.

    virtual sal_Bool SdrBeginTextEdit(SdrObject* pObj, SdrPageView* pPV = 0L, ::Window* pWin = 0L, sal_Bool bIsNewObj = sal_False,
        SdrOutliner* pGivenOutliner = 0L, OutlinerView* pGivenOutlinerView = 0L,
        sal_Bool bDontDeleteOutliner = sal_False, sal_Bool bOnlyOneView = sal_False, sal_Bool bGrabFocus = sal_True);
    // bDontDeleteReally ist ein Spezialparameter fuer den Writer.
    // Ist dieses Flag gesetzt, dann wird ein evtl. leeres Textobjekt
    // nicht geloescht. Stattdessen gibt es dann einen Returncode
    // SDRENDTEXTEDIT_SHOULDBEDELETED (anstelle von SDRENDTEXTEDIT_BEDELETED)
    // der besagt, dass das Objekt geloescht werden sollte.
    virtual SdrEndTextEditKind SdrEndTextEdit(sal_Bool bDontDeleteReally = sal_False);
    virtual bool IsTextEdit() const;

    // TRUE=Es wird ein Textrahmen (OBJ_TEXT,OBJ_OUTLINETEXT,...) editiert
    // ansonsten handelt es sich um ein beschriftetes Zeichenobjekt, an dem
    // der Text ja bekanntlich hor. und vert. zentriert wird.
    BOOL IsTextEditFrame() const;

    // Diese Methode liefert TRUE, wenn der Punkt rHit innerhalb der
    // des Objektbereichs oder der OutlinerView liegt.
    BOOL IsTextEditHit(const Point& rHit, short nTol) const;

    // Diese Methode liefert TRUE, wenn der Punkt rHit innerhalb des
    // Handle-dicken Rahmens liegt, der die OutlinerView bei TextFrames
    // umschliesst.
    BOOL IsTextEditFrameHit(const Point& rHit) const;

    // Bei aktiver Selektion, also zwischen MouseButtonDown und
    // MouseButtonUp liefert diese Methode immer TRUE.
    BOOL IsTextEditInSelectionMode() const;

    // Folgende Methode addiert einen passenden Offset zum MouseEvent
    // um diesen an den Outliner weiterzureichen.
    void AddTextEditOfs(MouseEvent& rMEvt) const;

    // Wer das z.Zt. im TextEdit befindliche Objekt braucht:
    SdrObject* GetTextEditObject() const { return mxTextEditObj.get(); }

    // info about TextEditPageView. Default is 0L.
    virtual SdrPageView* GetTextEditPageView() const;

    // Das aktuelle Win des Outliners
    Window* GetTextEditWin() const { return pTextEditWin; }
    void SetTextEditWin(Window* pWin);

    // An den hier abgeholten Outliner kann man schliesslich
    // Events versenden, Attribute setzen, Cut/Copy/Paste rufen,
    // Undo/Redo rufen, etc.
    const SdrOutliner* GetTextEditOutliner() const { return pTextEditOutliner; }
    SdrOutliner* GetTextEditOutliner() { return pTextEditOutliner; }
    const OutlinerView* GetTextEditOutlinerView() const { return pTextEditOutlinerView; }
    OutlinerView* GetTextEditOutlinerView() { return pTextEditOutlinerView; }

    virtual BOOL KeyInput(const KeyEvent& rKEvt, Window* pWin);
    virtual BOOL MouseButtonDown(const MouseEvent& rMEvt, Window* pWin);
    virtual BOOL MouseButtonUp(const MouseEvent& rMEvt, Window* pWin);
    virtual BOOL MouseMove(const MouseEvent& rMEvt, Window* pWin);
    virtual BOOL Command(const CommandEvent& rCEvt, Window* pWin);
    BOOL Cut(ULONG nFormat=SDR_ANYFORMAT);
    BOOL Yank(ULONG nFormat=SDR_ANYFORMAT);
    BOOL Paste(Window* pWin=NULL, ULONG nFormat=SDR_ANYFORMAT);

    // #97766# make virtual to change implementation e.g. for SdOutlineView
    virtual sal_uInt16 GetScriptType() const;

    /* new interface src537 */
    BOOL GetAttributes(SfxItemSet& rTargetSet, BOOL bOnlyHardAttr=FALSE) const;

    BOOL SetAttributes(const SfxItemSet& rSet, BOOL bReplaceAll);
    SfxStyleSheet* GetStyleSheet() const; // SfxStyleSheet* GetStyleSheet(BOOL& rOk) const;
    BOOL SetStyleSheet(SfxStyleSheet* pStyleSheet, BOOL bDontRemoveHardAttr);

    // Intern: Beim Splitteraufziehen neue OutlinerView...
    virtual void AddWindowToPaintView(OutputDevice* pNewWin);
    virtual void DeleteWindowFromPaintView(OutputDevice* pOldWin);

    //************************************************************************
    // Object-MacroModus (z.B. Rect als Button oder sowas):
    //************************************************************************
    // Persistent. Default TRUE. SvDraw wertet das Flag u.a. bei
    // SdrView::GetPreferedPointer() aus. Hat nur Wirkung, wenn das Dokument
    // Draw-Objekte mit Macrofunktionalitaet hat (SdrObject::HasMacro()==TRUE).
    void SetMacroMode(BOOL bOn) { bMacroMode=bOn; }
    BOOL IsMacroMode() const { return bMacroMode; }
    BOOL BegMacroObj(const Point& rPnt, short nTol, SdrObject* pObj, SdrPageView* pPV, Window* pWin);
    BOOL BegMacroObj(const Point& rPnt, SdrObject* pObj, SdrPageView* pPV, Window* pWin) { return BegMacroObj(rPnt,-2,pObj,pPV,pWin); }
    void MovMacroObj(const Point& rPnt);
    void BrkMacroObj();
    BOOL EndMacroObj();
    BOOL IsMacroObj() const { return pMacroObj!=NULL; }
    BOOL IsMacroObjDown() const { return bMacroDown; }

    /** fills the given any with a XTextCursor for the current text selection.
        Leaves the any untouched if there currently is no text selected */
    void getTextSelection( ::com::sun::star::uno::Any& rSelection );

    virtual void MarkListHasChanged();

    rtl::Reference< sdr::SelectionController > getSelectionController() const { return mxSelectionController; }

protected:
    virtual void OnBeginPasteOrDrop( PasteOrDropInfos* pInfos );
    virtual void OnEndPasteOrDrop( PasteOrDropInfos* pInfos );

};

#endif //_SVDEDXV_HXX

<|endoftext|>