/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

#ifndef __ACCCOMMON_H_
#define __ACCCOMMON_H_


//using namespace com::sun::star::accessibility;
//using namespace com::sun::star::uno;


//for MAccessible.cpp
struct ltComp
{
    bool operator()(REFGUID  rguid1, REFGUID  rguid2) const
    {
        if(((PLONG) &rguid1)[0] < ((PLONG) &rguid2)[0])
            return TRUE;
        else if(((PLONG) &rguid1)[0] > ((PLONG) &rguid2)[0])
            return FALSE;
        if(((PLONG) &rguid1)[1] < ((PLONG) &rguid2)[1])
            return TRUE;
        else if(((PLONG) &rguid1)[1] > ((PLONG) &rguid2)[1])
            return FALSE;
        if(((PLONG) &rguid1)[2] < ((PLONG) &rguid2)[2])
            return TRUE;
        else if(((PLONG) &rguid1)[2] > ((PLONG) &rguid2)[2])
            return FALSE;
        if(((PLONG) &rguid1)[3] < ((PLONG) &rguid2)[3])
            return TRUE;
        else if(((PLONG) &rguid1)[3] > ((PLONG) &rguid2)[3])
            return FALSE;
        return FALSE;
    }
};

#define BEGIN_AGGOBJECT_MAP(x) \
	static _UNO_AGGMAP_ENTRY* WINAPI _GetAggEntries() { \
	static _UNO_AGGMAP_ENTRY _aggentries[] = {
#define END_AGGOBJECT_MAP()   {NULL, NULL,NULL}}; \
	return _aggentries;}
#define AGGOBJECT_ENTRY(iid, clsid, ifindex) {&iid, \
	CComAggregateCreator< CComObject<CMAccessible>, &clsid >::CreateInstance,\
	XI_##ifindex},

enum DM_NIR {
    DM_FIRSTCHILD = 0x00,
    DM_LASTCHILD = 0x01,
    DM_NEXTCHILD = 0x02,
    DM_PREVCHILD = 0x03
};

inline BOOL ImplIsEqualGUID(REFGUID rguid1, REFGUID rguid2)
{
    return (
               ((PLONG) &rguid1)[0] == ((PLONG) &rguid2)[0] &&
               ((PLONG) &rguid1)[1] == ((PLONG) &rguid2)[1] &&
               ((PLONG) &rguid1)[2] == ((PLONG) &rguid2)[2] &&
               ((PLONG) &rguid1)[3] == ((PLONG) &rguid2)[3]);
}
#define InlineIsEqualGUID ImplIsEqualGUID
//End

//for AccAction.cpp
#define CODEENTRY(key) \
	{KEYCODE_##key, L#key}
#define countof(x)	(sizeof(x)/sizeof(x[0]))

#define SELECT       L"Select"
#define PRESS        L"Press"
#define UNCHECK      L"UnCheck"
#define CHECK        L"Check"
//End

static DWORD GetMSAAStateFromUNO(short xState);

#endif
