Files
core/PdfReader/Src/Link.h
Ilya.Kirillov 65d72ae4ec Убраны лишние файлы. Все файлы сконвертированы в UTF8.
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62550 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-21 00:02:55 +03:00

494 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _PDF_READER_LINK_H
#define _PDF_READER_LINK_H
#include "Object.h"
namespace PdfReader
{
class StringExt;
class Array;
class Dict;
//-------------------------------------------------------------------------------------------------------------------------------
// LinkAction
//-------------------------------------------------------------------------------------------------------------------------------
enum LinkActionType
{
actionGoTo, // Go to destination
actionGoToR, // Go to destination в новом файле
actionLaunch, // Запускаем приложение (или открываем документ)
actionURI, // URI
actionNamed, // Named
actionMovie, // Movie
actionUnknown //
};
class LinkAction
{
public:
virtual ~LinkAction() {}
// Нормально ли создался объект LinkAction?
virtual bool CheckValidate() = 0;
// Тип LinkAction.
virtual LinkActionType GetType() = 0;
// Парсим Destination (старый вариант Аction) Name, String или Array.
static LinkAction *ParseDestination(Object *pObject);
// Парсим Action dictionary.
static LinkAction *ParseAction(Object *pObject, StringExt *seBaseURI = NULL);
// Достаем название файла для File specification.
static StringExt *GetFileSpecName(Object *pFileSpecObject);
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkDestination
//-------------------------------------------------------------------------------------------------------------------------------
enum LinkDestinationType
{
destXYZ,
destFit,
destFitH,
destFitV,
destFitR,
destFitB,
destFitBH,
destFitBV
};
class LinkDestination
{
public:
LinkDestination(Array *pArray);
LinkDestination *Copy()
{
return new LinkDestination(this);
}
bool CheckValidate()
{
return m_bValidate;
}
LinkDestinationType GetType()
{
return m_eType;
}
bool IsPageRef()
{
return m_bPageIsRef;
}
int GetPageNum()
{
return m_nPageNum;
}
Ref GetPageRef()
{
return m_oPageRef;
}
double GetLeft()
{
return m_dLeft;
}
double GetBottom()
{
return m_dBottom;
}
double GetRight()
{
return m_dRight;
}
double GetTop()
{
return m_dTop;
}
double GetZoom()
{
return m_dZoom;
}
bool GetChangeLeft()
{
return m_bChangeLeft;
}
bool GetChangeTop()
{
return m_bChangeTop;
}
bool GetChangeZoom()
{
return m_bChangeZoom;
}
private:
LinkDestination(LinkDestination *pDest);
private:
LinkDestinationType m_eType; // Тип
bool m_bPageIsRef; // Страница задана ссылкой или номером?
union
{
Ref m_oPageRef; // Ссылка на страницу
int m_nPageNum; // Относительный номер страницы
};
double m_dLeft; //
double m_dBottom; // Позиция
double m_dRight; //
double m_dTop; //
double m_dZoom; // Zoom
bool m_bChangeLeft; // Для destXYZ. В данном случае может измениться
bool m_bChangeTop; // как позиция, так и зуммирование
bool m_bChangeZoom; //
bool m_bValidate; //
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkGoTo
//-------------------------------------------------------------------------------------------------------------------------------
class LinkGoTo : public LinkAction
{
public:
LinkGoTo(Object *pDestObject);
virtual ~LinkGoTo();
virtual bool CheckValidate()
{
return m_pDestination || m_pNamedDestination;
}
virtual LinkActionType GetType()
{
return actionGoTo;
}
LinkDestination *GetDestination()
{
return m_pDestination;
}
StringExt *GetNamedDestination()
{
return m_pNamedDestination;
}
private:
LinkDestination *m_pDestination;
StringExt *m_pNamedDestination;
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkGoToR
//-------------------------------------------------------------------------------------------------------------------------------
class LinkGoToR : public LinkAction
{
public:
LinkGoToR(Object *pFileSpecObject, Object *pDestObject);
virtual ~LinkGoToR();
virtual bool CheckValidate()
{
return m_seFileName && (m_pDestination || m_pNamedDestination);
}
virtual LinkActionType GetType()
{
return actionGoToR;
}
StringExt *GetFileName()
{
return m_seFileName;
}
LinkDestination *GetDestination()
{
return m_pDestination;
}
StringExt *GetNamedDestination()
{
return m_pNamedDestination;
}
private:
StringExt *m_seFileName;
LinkDestination *m_pDestination;
StringExt *m_pNamedDestination;
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkLaunch
//-------------------------------------------------------------------------------------------------------------------------------
class LinkLaunch : public LinkAction
{
public:
LinkLaunch(Object *pActionObject);
virtual ~LinkLaunch();
virtual bool CheckValidate()
{
return m_seFileName != NULL;
}
virtual LinkActionType GetType()
{
return actionLaunch;
}
StringExt *GetFileName()
{
return m_seFileName;
}
StringExt *GetParameters()
{
return m_pParameters;
}
private:
StringExt *m_seFileName;
StringExt *m_pParameters;
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkURI
//-------------------------------------------------------------------------------------------------------------------------------
class LinkURI : public LinkAction
{
public:
LinkURI(Object *pURIObject, StringExt *seBaseURI);
virtual ~LinkURI();
virtual bool CheckValidate()
{
return m_seURI != NULL;
}
virtual LinkActionType GetType()
{
return actionURI;
}
StringExt *GetURI()
{
return m_seURI;
}
private:
StringExt *m_seURI;
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkNamed
//-------------------------------------------------------------------------------------------------------------------------------
class LinkNamed : public LinkAction
{
public:
LinkNamed(Object *pNameObject);
virtual ~LinkNamed();
virtual bool CheckValidate()
{
return m_seName != NULL;
}
virtual LinkActionType GetType()
{
return actionNamed;
}
StringExt *GetName()
{
return m_seName;
}
private:
StringExt *m_seName;
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkMovie
//-------------------------------------------------------------------------------------------------------------------------------
class LinkMovie : public LinkAction
{
public:
LinkMovie(Object *pAnnotObject, Object *pTitleObject);
virtual ~LinkMovie();
virtual bool CheckValidate()
{
return m_oAnnotRef.nNum >= 0 || m_seTitle != NULL;
}
virtual LinkActionType GetType()
{
return actionMovie;
}
bool HasAnnotRef()
{
return m_oAnnotRef.nNum >= 0;
}
Ref *GetAnnotRef()
{
return &m_oAnnotRef;
}
StringExt *GetTitle()
{
return m_seTitle;
}
private:
Ref m_oAnnotRef;
StringExt *m_seTitle;
};
//-------------------------------------------------------------------------------------------------------------------------------
// LinkUnknown
//-------------------------------------------------------------------------------------------------------------------------------
class LinkUnknown : public LinkAction
{
public:
LinkUnknown(char *sAction);
virtual ~LinkUnknown();
virtual bool CheckValidate()
{
return m_seAction != NULL;
}
virtual LinkActionType GetType()
{
return actionUnknown;
}
StringExt *GetAction()
{
return m_seAction;
}
private:
StringExt *m_seAction;
};
//-------------------------------------------------------------------------------------------------------------------------------
// Link
//-------------------------------------------------------------------------------------------------------------------------------
class Link
{
public:
Link(Dict *pDict, StringExt *seBaseURI);
~Link();
bool CheckValidate()
{
return m_bValid;
}
// Попала ли точка в рект
bool InRect(double dX, double dY)
{
return m_dLeft <= dX && dX <= m_dRight && m_dBottom <= dY && dY <= m_dTop;
}
LinkAction *GetAction()
{
return m_pAction;
}
void GetRect(double *pdLeft, double *pdBottom, double *pdRight, double *pdTop)
{
*pdLeft = m_dLeft;
*pdBottom = m_dBottom;
*pdRight = m_dRight;
*pdTop = m_dTop;
}
private:
double m_dLeft;
double m_dBottom;
double m_dRight;
double m_dTop;
LinkAction *m_pAction;
bool m_bValid;
};
//-------------------------------------------------------------------------------------------------------------------------------
// Links
//-------------------------------------------------------------------------------------------------------------------------------
class Links
{
public:
Links(Object *pAnnots, StringExt *seBaseURI);
~Links();
int GetLinksCount()
{
return m_nLinksCount;
}
Link *GetLink(int nIndex)
{
return m_ppLinks[nIndex];
}
// Если точка (dX, dY) попадает в Link, тогда возвращаем соответствующий Action.
LinkAction *Find(double dX, double dY);
// Проверяем попадает ли точка в Link.
bool OnLink(double dX, double dY);
private:
Link **m_ppLinks;
int m_nLinksCount;
};
}
#endif // _PDF_READER_LINK_H