Hi Bjoern, I have hit a problem that i don't fully understand. Disabled items are SfxVoidItem with Which 0, but inserted with different one. State of Item is check with TYPE Macro as below
> if ( (*ppFnd)->Type() == TYPE(SfxVoidItem) ) > return SFX_ITEM_DISABLED; > So it just type that decides about disabled state of item. I've changed places where conditions like > if( !(*ppFnd)->Which() ) > to > if ( (*ppFnd)->ISA(SfxVoidItem) ) > because I saw in an assert that this is used. At this moment problem started, code compiles but fails at runtime with segfault at itemset.cxx:313 (line like above) I've checked with gdb that there is no method ISA, but IsA. With the changed method to IsA code does not compile. > (gdb) call (*ppFnd)->IsA(SfxVoidItem) > $1 = {sal_Bool (const SfxPoolItem * const, TypeId)} 0x44980824 > <SfxPoolItem::IsA(void* (*)()) const> > (gdb) call (*ppFnd)->ISA(SfxVoidItem) > There is no member or method named ISA. > Moreover I tried the way with Type and TYPE with no success, gdb output below: > Program received signal SIGSEGV, Segmentation fault. > 0x4496cb31 in SfxItemSet::~SfxItemSet (this=0xbfff51e8, > __in_chrg=<optimized out>) at > /home/maciej/programowanie/libreoffice/libo/svl/source/items/itemset.cxx:314 > 314 if( (*ppFnd)->Type() == TYPE(SfxVoidItem) ) > (gdb) call (*ppFnd)->Type() > Cannot access memory at address 0xfca0f97 > (gdb) call (*ppFnd)->Which() > $1 = 4040 > (gdb) call (SfxPoolItem *)(*ppFnd)->Type() > Cannot access memory at address 0xfca0f97 > (gdb) ptype (*ppFnd) > type = const class SfxPoolItem { > private: > sal_uLong nRefCount; > sal_uInt16 nWhich; > sal_uInt16 nKind; > > void SetRefCount(sal_uLong); > void SetKind(sal_uInt16); > public: > sal_uLong AddRef(sal_uLong) const; > private: > sal_uLong ReleaseRef(sal_uLong) const; > long Delete_Impl(void *); > protected: > SfxPoolItem(sal_uInt16); > SfxPoolItem(const SfxPoolItem &); > public: > static void * CreateType(void); > static TypeId StaticType(void); > static sal_Bool IsOf(TypeId); > virtual TypeId Type(void) const; > virtual sal_Bool IsA(TypeId) const; > ~SfxPoolItem(int); > void SetWhich(sal_uInt16); > sal_uInt16 Which(void) const; > virtual int operator==(const SfxPoolItem &) const; > int operator!=(const SfxPoolItem &) const; > virtual int Compare(const SfxPoolItem &) const; > virtual int Compare(const SfxPoolItem &, const IntlWrapper &) const; > virtual SfxItemPresentation GetPresentation(SfxItemPresentation, > SfxMapUnit, SfxMapUnit, String &, const IntlWrapper *) const; > virtual sal_uInt16 GetVersion(sal_uInt16) const; > virtual bool ScaleMetrics(long, long); > virtual bool HasMetrics(void) const; > virtual bool QueryValue(com::sun::star::uno::Any &, sal_uInt8) const; > virtual bool PutValue(const com::sun::star::uno::Any &, sal_uInt8); > virtual SfxPoolItem * Create(SvStream &, sal_uInt16) const; > virtual SvStream & Store(SvStream &, sal_uInt16) const; > virtual SfxPoolItem * Clone(SfxItemPool *) const; > virtual SfxPoolItem * CloneAtWhich(sal_uInt16, SfxItemPool *) const; > sal_uLong GetRefCount(void) const; > sal_uInt16 GetKind(void) const; > static rtl::OUString readByteString(SvStream &); > static void writeByteString(SvStream &, const rtl::OUString &); > static rtl::OUString readUnicodeString(SvStream &, bool); > static void writeUnicodeString(SvStream &, const rtl::OUString &); > private: > SfxPoolItem & operator=(const SfxPoolItem &); > } * > (gdb) call (*ppFnd)->StaticType() > $2 = (void *(*)(void)) 0x4498077e <SfxPoolItem::CreateType()> Thanks in advance for help :) Maciek
_______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice