/*
Copyright 2008 Stefano Chizzolini. http://clown.stefanochizzolini.it
Contributors:
* Stefano Chizzolini (original code developer, http://www.stefanochizzolini.it)
This file should be part of the source code distribution of "PDF Clown library"
(the Program): see the accompanying README files for more info.
This Program 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.
This Program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY, either expressed or implied; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more details.
You should have received a copy of the GNU General Public License along with this
Program (see README files); if not, go to the GNU website (http://www.gnu.org/).
Redistribution and use, with or without modification, are permitted provided that such
redistributions retain the above copyright notice, license and disclaimer, along with
this list of conditions.
*/
using it.stefanochizzolini.clown.bytes;
using it.stefanochizzolini.clown.documents;
using it.stefanochizzolini.clown.files;
using it.stefanochizzolini.clown.objects;
using System;
namespace it.stefanochizzolini.clown.documents.interaction.actions{
/**
<summary>Action to be performed by the viewer application [PDF:1.6:8.5].</summary>
*/
public class Action
: PdfObjectWrapper<PdfDictionary>
{
#region static
#region interface
#region public
/**
<summary>Wraps an action reference into an action object.</summary>
<param name="reference">Reference to an action object.</param>
<returns>Action object associated to the reference.</returns>
*/
public static Action Wrap(
PdfReference reference
)
{return Wrap(reference,null);}
/**
<summary>Wraps an action base object into an action object.</summary>
<param name="baseObject">Action base object.</param>
<param name="container">Action base object container.</param>
<returns>Action object associated to the base object.</returns>
*/
public static Action Wrap(
PdfDirectObject baseObject,
PdfIndirectObject container
)
{
/*
NOTE: This is a factory method for any action-derived object.
*/
if(baseObject == null)
return null;
PdfDictionary dataObject = (PdfDictionary)File.Resolve(baseObject);
if(!dataObject[PdfName.Type].Equals(PdfName.Action))
return null;
PdfName actionType = (PdfName)dataObject[PdfName.S];
if(actionType.Equals(PdfName.GoTo)) return new GoToLocal(baseObject,container);
if(actionType.Equals(PdfName.GoToR)) return new GoToRemote(baseObject,container);
if(actionType.Equals(PdfName.GoToE)) return new GoToEmbedded(baseObject,container);
if(actionType.Equals(PdfName.Launch)) return new Launch(baseObject,container);
if(actionType.Equals(PdfName.Thread)) return new GoToThread(baseObject,container);
if(actionType.Equals(PdfName.URI)) return new GoToURI(baseObject,container);
if(actionType.Equals(PdfName.Sound)) return new PlaySound(baseObject,container);
if(actionType.Equals(PdfName.Movie)) return new PlayMovie(baseObject,container);
if(actionType.Equals(PdfName.Hide)) return new ToggleVisibility(baseObject,container);
if(actionType.Equals(PdfName.Named))
{
PdfName actionName = (PdfName)dataObject[PdfName.N];
if(actionName.Equals(PdfName.NextPage)) return new GoToNextPage(baseObject,container);
if(actionName.Equals(PdfName.PrevPage)) return new GoToPreviousPage(baseObject,container);
if(actionName.Equals(PdfName.FirstPage)) return new GoToFirstPage(baseObject,container);
if(actionName.Equals(PdfName.LastPage)) return new GoToLastPage(baseObject,container);
// Non-standard named action.
return new NamedAction(baseObject,container);
}
if(actionType.Equals(PdfName.SubmitForm)) return new SubmitForm(baseObject,container);
if(actionType.Equals(PdfName.ResetForm)) return new ResetForm(baseObject,container);
if(actionType.Equals(PdfName.ImportData)) return new ImportData(baseObject,container);
if(actionType.Equals(PdfName.JavaScript)) return new JavaScript(baseObject,container);
if(actionType.Equals(PdfName.SetOCGState)) return new SetOcgState(baseObject,container);
if(actionType.Equals(PdfName.Rendition)) return new Rendition(baseObject,container);
if(actionType.Equals(PdfName.Trans)) return new DoTransition(baseObject,container);
if(actionType.Equals(PdfName.GoTo3DView)) return new GoTo3dView(baseObject,container);
// Non-standard action.
return new Action(baseObject,container);
}
#endregion
#endregion
#endregion
#region dynamic
#region constructors
/**
<summary>Creates a new action within the given document context.</summary>
*/
protected Action(
Document context,
PdfName actionType
) : base(
context.File,
new PdfDictionary(
new PdfName[]
{
PdfName.Type,
PdfName.S
},
new PdfDirectObject[]
{
PdfName.Action,
actionType
}
)
)
{}
protected Action(
PdfDirectObject baseObject,
PdfIndirectObject container
) : base(baseObject,container)
{}
#endregion
#region interface
#region public
/**
<summary>Gets/Sets the actions to be performed after the current one.</summary>
*/
public ChainedActions Actions
{
get
{
PdfDirectObject nextObject = BaseDataObject[PdfName.Next];
if(nextObject == null)
return null;
return new ChainedActions(nextObject,Container,this);
}
set
{BaseDataObject[PdfName.Next] = value.BaseObject;}
}
public override object Clone(
Document context
)
{throw new NotImplementedException();}
#endregion
#endregion
#endregion
}
}
|