c# pdf viewer open source : Reorder pages in pdf online control application system web page azure windows console World%20of%20Warcraft%20Programming%20(2nd%20Edition)51-part1851

Chapter 25
Taking Protected Action in Combat 469
expanded click-casting, as in the following example addon for paladin char-
acters,
BlessedMenus
.Start by creating a
BlessedMenus
folder in your
AddOns
directory, then create the file
BlessedMenus.toc
and enter the following:
## Interface: 30300
## Title: BlessedMenus
## Notes: Creates menus on party frames to select spells to cast on them
BlessedMenus.xml
BlessedMenus.lua
Next, create the file
BlessedMenus.xml
in the same directory, and start by
entering the following:
<Ui xmlns=“http://www.blizzard.com/wow/ui/“
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“
xsi:schemaLocation=“http://www.blizzard.com/wow/ui/
http://wowprogramming.com/FrameXML/UI.xsd“>
<Button name=“BlessedMenusSpellButtonTemplate“ enableMouse=“true“ “ i
inherits=“SecureActionButtonTemplate“ virtual=“true“>
<Size x=“144“ y=“16“ />
<Layers>
<Layer level=“ARTWORK“>
<Texture parentKey=“icon“>
<Size x=“16“ y=“16“ />
<Anchors>
<Anchor point=“TOPLEFT“ />
</Anchors>
</Texture>
</Layer>
</Layers>
<ButtonText inherits=“GameFontHighlight“ justifyH=“LEFT“ />
<HighlightTexture alphaMode=“ADD“>
<Color r=“0.75“ g=“0.75“ b=“0.6“ a=“0.5“ />
</HighlightTexture>
</Button>
</Ui>
This is thebeginning of a templatethat youcan use for popup menu entries.
So far, it’s basically a horizontal bar containing a text string, with a small
icon at the left side. It has a plain yellow highlight texture to indicate which
menu itemis currently beingpointedat.Addthebasic action button attributes
between the
</Layers>
and
<ButtonText>
tags:
<Attributes>
<Attribute name=“type“ value=“spell“ />
<Attribute name=“useparent-unit“ value=“true“ type=“boolean“ />
</Attributes>
Reorder pages in pdf online - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
how to move pages within a pdf; reordering pages in pdf document
Reorder pages in pdf online - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
reorder pages in a pdf; change page order pdf
470
Part III
Advanced Addon Techniques
These define the consistent parts of the button behavior. All these menu
items will be spell buttons, and they will cast on the unit whose frame was
clicked to bring up the spell menu. Note that you use the
type
tag attribute
here to set the frame attribute to a value with the Lua type
“boolean“
.
Add a
Scripts
section immediately after the
Attributes
block and before
the
<ButtonText>
tag:
<Scripts>
<OnLoad>
self:GetFontString():SetPoint(“LEFT“, self.icon, “RIGHT“, 2, 1)
self:RegisterEvent(“PLAYER_ENTERING_WORLD“)
</OnLoad>
</Scripts>
The first line ensures that the button’s text is placed correctly in the button
(because the icon texture is created using a key rather than a name, you can’t
currentlyrefertoitfroman XML
<Anchor>
tag’s
relativeTo
attribute).Thelast
line prepares the button to deal with the fact that its spell icon isn’t available
when your addon first loads, which is fullyaddressed in the next handler (add
it right before the
</Scripts>
tag):
<OnEvent>
self.icon:SetTexture(GetSpellTexture(self:GetAttribute(“spell“)))
</OnEvent>
This handler is run in response to the
PLAYER_ENTERING_WORLD
event, when
the client has fully loaded spell icons. These icons are actually loaded by the
earlier
SPELLS_CHANGED
event,but that event doesnot firewhen you reload the
UI, so the more reliable
PLAYER_ENTERING_WORLD
is used. Also, if you watch
event traces, you will see that the
SPELL_CHANGED
event fires quite a number
of times during logging in. Waiting until thePLAYER_ENTERING_WORLD
event
helps you avoid all of these.
Paladins use three major groups of beneficial spells, so you’ll create three
menus,one for each. To facilitate that, create a menu templatein the same file,
right before the
</Ui>
tag:
<Frame name=“BlessedMenusMenuTemplate“ hidden=“true“ “ i
protected=“true“ virtual=“true“>
<Size x=“160“ y=“18“ />
<Backdrop bgFile=“Interface\Tooltips\UI-Tooltip-Background“ i
edgeFile=“Interface\Tooltips\UI-Tooltip-Border“ tile=“true“>
<EdgeSize val=“16“/>
<TileSize val=“16“/>
<BackgroundInsets left=“4“ right=“4“ top=“4“ bottom=“4“/>
<BorderColor r=“1“ g=“1“ b=“1“ />
<Color r=“0.09“ g=“0.09“ b=“0.19“ a=“1.0“ />
</Backdrop>
C# TIFF: How to Reorder, Rearrange & Sort TIFF Pages Using C# Code
Reorder, Rearrange and Sort TIFF Document Pages in C#.NET Application. C# TIFF Page Sorting Overview. Reorder TIFF Pages in C#.NET Application.
how to reorder pages in pdf preview; move pdf pages online
VB.NET PowerPoint: Sort and Reorder PowerPoint Slides by Using VB.
Sort and Reorder PowerPoint Slides Range with VB amount of robust PPT slides/pages editing methods powerful & profession imaging controls, PDF document, image
how to reverse page order in pdf; how to move pages in pdf acrobat
Chapter 25
Taking Protected Action in Combat 471
<Attributes>
<Attribute name=“useparent-unit“ value=“true“ type=“boolean“ />
</Attributes>
</Frame>
This creates a simple tooltip-type frame. Like the child buttons, the
useparent-unit
attribute is set so that unit requests on the buttons can pass
all the way up to whatever unit button currently owns the menu.Now thatthe
templates are ready,youcan save and close the XMLfile;the rest of the heavy
lifting is done dynamically atload time, so createthe file
BlessedMenus.lua
in
the
BlessedMenus
directory, if needed,and start it by entering the following:
local function BlessedMenu(name, ...)
local self = CreateFrame(“Frame“, name, nil, i
“BlessedMenusMenuTemplate“)
self.buttons = {}
for i=1, select(’#’, ...) do
local spellName = select(i, ...)
local button = CreateFrame(“Button“, nil, self, i
“BlessedMenusSpellButtonTemplate“)
self.buttons[i] = button
button:SetAttribute(“spell“, spellName)
button:SetText(spellName)
if i == 1 then
button:SetPoint(“TOPLEFT“, 8, -8)
else
button:SetPoint(“TOPLEFT“, self.buttons[i - 1], i
“BOTTOMLEFT“, 0, -2)
end
end
self:SetHeight(#self.buttons * 18 + 14)
return self
end
This function does all the work of creating a menuframe, as well as creating
and placing the choice buttons in the menu, which it does by name. Add the
following code to create three menus using this function:
local heals = BlessedMenu(“BlessedMenusHeals“,
“Holy Light“,
“Flash of Light“,
“Lay on Hands“
)
local hands = BlessedMenu(“BlessedMenusHands“,
“Hand of Protection“,
“Hand of Freedom“,
“Hand of Salvation“,
“Hand of Sacrifice“
)
Read PDF in Web Image Viewer| Online Tutorials
"This online guide content is Out Dated! Extract images from PDF documents; Add, reorder pages in PDF files; Save and print PDF as you wish;
how to rearrange pdf pages in preview; reorder pages of pdf
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
C# PDF Page Processing: Sort PDF Pages - online C#.NET tutorial page for how to reorder, sort, reorganize or re-arrange PDF document files using C#.NET code.
reorder pages in pdf preview; how to reorder pdf pages in
472
Part III
Advanced Addon Techniques
local blessings = BlessedMenu(“BlessedMenusBlessings“,
“Blessing of Might“,
“Blessing of Kings“,
“Blessing of Wisdom“
)
Now that you’ve defined the menus, it’s time to start preparing the code
that will drive the secure behaviors. Add the following:
local openSpellList = [[
local menu = IsAltKeyDown() and “blessings“
or IsControlKeyDown() and “heals“
or IsShiftKeyDown() and “hands“
menu = menu and self:GetFrameRef(menu)
if menu and menu:IsShown() and menu:GetParent() == self then
menu:Hide()
return
end
if menu then
menu:Hide()
menu:SetParent(self)
menu:SetPoint(“TOPLEFT“, “$cursor“)
menu:SetFrameLevel(self:GetFrameLevel() + 2)
menu:Show()
end
]]
This is the snippet code that the party and player buttons will run when
clickedwith certain modifiers,which youaddin amoment.Ituses information
about the current modifiers to determine which frame reference to retrieve
and open. If that menu is already open on the unit frame in question, it hides
it and takes no further action; if the menu is not open (hidden), or is open on
another unit frame,it is re-parentedto theframethatwas clicked,making sure
it appears above the frame clicked, and opened. It is also moved to appear
by the point clicked, using an arguments to
SetPoint()
,
$cursor
,that places
the point anchored by the mouse’s current location (it will not automatically
follow the mouse). But of course, the code will never run unless it is attached
to some frames; add the load-time code to do so just after the snippet:
for i, frame in ipairs{PlayerFrame, PartyMemberFrame1, i
PartyMemberFrame2, PartyMemberFrame3, PartyMemberFrame4} do
frame:SetAttribute(“shift-type1“, “spelllist“)
frame:SetAttribute(“ctrl-type1“, “spelllist“)
frame:SetAttribute(“alt-type1“, “spelllist“)
frame:SetAttribute(“_spelllist“, openSpellList)
SecureHandlerSetFrameRef(frame, “blessings“, BlessedMenusBlessings)
SecureHandlerSetFrameRef(frame, “heals“, BlessedMenusHeals)
SecureHandlerSetFrameRef(frame, “hands“, BlessedMenusHands)
end
VB.NET TIFF: Modify TIFF File by Adding, Deleting & Sort TIFF
Users can use it to reorder TIFF pages in ''' &ltsummary> ''' Sort TIFF document pages in designed powerful & profession imaging controls, PDF document, image
how to move pages around in a pdf document; reorder pages pdf
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
Online C# class source codes enable the ability to rotate single NET, add new PDF page, delete certain PDF page, reorder existing PDF pages and split
move pages in pdf; reverse page order pdf
Chapter 25
Taking Protected Action in Combat 473
This code starts by iterating over the player frame and the frames for all
party members and making the same changes to each one:
First, it sets
“spelllist“
as the type for modified left-clicks. This type is
not defined by the secure action button template, so it will look for a function
in
self.menu
or a snippet in
self:GetAttribute(“_spelllist“)
.You should
use the latter because setting a key on the frame would introduce taint. As
you did with the
ShyBars
example given before (the one that auto-hides the
extra action bars), you use
SecureHandlerSetFrameRef
to import references to
the actual frames into the environment for the snippet to access when it runs.
Figure 25-1 shows the BlessedMenus addon.
Figure 25-1: BlessedMenus in action
Acouple issues still exist with
BlessedMenus
;if you show one menu while
another one is open (such as by Shift+clicking, then Alt+clicking), they will
overlap, instead of closing the first one. Also, the menu does not disappear
when youchoosean option fromit.Youlearn howtoaddressboth these issues
in the following sections.
Preserving State and Controlling Information
The secure frame management system in versions 2.0–2.4 of WoW used a
single variable per header, called state, to summarize all the factors it used to
control frames.Itwaspossible tousemultiplecontrol factors, butifyouhadan
C# Word: How to Create Word Document Viewer in C#.NET Imaging
Offer mature Word file page manipulation functions (add, delete & reorder pages) in document viewer; (Directly see online document viewer demo here.).
pdf change page order acrobat; reorder pages in pdf reader
VB.NET TIFF: VB.NET Sample Code to Process & Manage TIFF Page
certain TIFF page, and sort & reorder TIFF pages in Process TIFF Pages Independently in VB.NET Code. powerful & profession imaging controls, PDF document, image
pdf page order reverse; change pdf page order reader
474
Part III
Advanced Addon Techniques
addon like the original version of Goose that could showor hide frames based
on three different factors (whether or not you were in stealth, in combat, or
mounted), it needed eight different states (two possibilities for combat times
two for stealth times two for mount equals eight) and it had to be able to
handle all the possible combinations of which state to go to when any one of
these factors changed.
Two things make the existing system generally easier to manage. First,
snippets are capable of examining the game state, attributes on relevant
frames, andsimilar factors, directly when triggeredtodeterminethe statethey
should set up. Second, the snippets associated with a frame can store as many
distinct pieces of information as they need to keep track of, in private globals.
Private Global Environments
Each function has an environment, which is a table where it stores and seeks
any global variable references made in its body. Because each new function
is created with the same environment as the function that created it, all the
functions created in the stock UI or addon files normally share the same
environment unless they specify otherwise at some point.
The functions created when the secure handler infrastructure compiles
snippets use their own environments, which is part of how their access to
game information that’s not supposed to be used for secure actions is strictly
controlled (such as how low on health your target is, for example). Because
functions are also normally found by calling global variables, functions that
retrieve prohibited information simply aren’t available from inside a secure
environment. But snippets running in that environment can also store their
own globals there, which persist from one call to another. Moreover, all the
snippets associated with a frame typically share an environment, allowing
them to share input into their frame’s state.
As a simple example of how this can be used, you can fix one of the issues
with
BlessedMenus
,namely, that when you open one menu on a frame and
then another, the first one stays open behind the second one.
Open
BlessedMenus.lua
and look for your definition of the
openSpellList
snippet. Alter it to look like this (changed lines are highlighted):
local openSpellList = [[
local menu = IsAltKeyDown() and “blessings“
or IsControlKeyDown() and “heals“
or IsShiftKeyDown() and “hands“
menu = menu and self:GetFrameRef(menu)
if lastMenu and lastMenu:IsShown() and i
lastMenu:GetParent() == self then
lastMenu:Hide()
if lastMenu == menu then
Chapter 25
Taking Protected Action in Combat 475
return
end
end
if menu then
menu:Hide()
menu:SetParent(self)
menu:SetPoint(“TOPLEFT“, “$cursor“)
menu:SetFrameLevel(self:GetFrameLevel() + 2)
menu:Show()
lastMenu = menu
end
]]
Every time you open a menu, you store it in the lastMenu variable. Then
when you go to later open another menu, you can hide whatever was shown
last.
lastMenu
isneithera localvariablenor anargumenttothe function, so Lua
will treat it as a global. However, you won’t see any changes to it outside the
snippet by looking in
_G.lastMenuOpened
;it’s a private global in the frame’s
own personal environment. You can use it as a way to track which menu you
last opened so that you can close it as needed before opening another one.
Secure API Functions
Private globals are usually used as a way for snippets to store internal state
information, but because functions in Lua are actually variables that contain
references tothose functions,the private environmentis also howsnippets are
restricted to secure portions of the API. The following standard Lua functions
work similarly inside a snippet to the way they do in the normal World of
Warcraft Lua environment:
type
,
select
,
tonumber
,
tostring
,
print
,
pairs
,
ipairs
,
next
,
unpack
,andthe
table
,
string
,and
math
libraries,as well as their
deprecatedglobal forms such as
tremove
.
The following WoW API functions are available to snippets in basically the
same form as they work in normal code:
SecureCmdOptionParse
GetMouseButtonClicked
GetShapeshiftForm
GetActionBarPage
IsStealthed, UnitExists
GetBonusBarOffset
UnitIsDead, UnitIsGhost
IsMounted, IsSwimming
UnitPlayerOrPetInParty
IsFlying
UnitPlayerOrPetInRaid
IsFlyableArea
IsRightAltKeyDown
IsIndoors
IsLeftAltKeyDown
IsOutdoors
IsAltKeyDown
GetBindingKey
IsRightControlKeyDown
HasAction
IsLeftControlKeyDown
IsHarmfulSpell
IsControlKeyDown
IsHarmfulItem
476
Part III
Advanced Addon Techniques
IsLeftShiftKeyDown
IsHelpfulSpell
IsRightShiftKeyDown
IsHelpfulItem
IsShiftKeyDown
RegisterStateDriver
IsModifierKeyDown
GetActionInfo
IsModifiedClick
Thefollowing playerinformation functions behavebasically thesame as the
equivalentunit information functions, but only allow youto inquireabout the
player:
PlayerCanAttack
PlayerIsChanneling
PlayerCanAssist
PlayerInCombat
UnitHasVehicleUI
is available inside the secure environment, but only
returns useful information for units that are friendly to the player:
true
for
friendly units that have a vehicle interface,
false
for friendly units that don’t,
and
nil
for all non-friendly units.
Two newplayerinformation functions are alsoavailable to snippets:
Player
InGroup
returns
“raid“
if the playeris in a raid group,
“party“
if the playeris
in a party butnota raid group, and
nil
if the playeris not in anygroup;
Player
PetSummary
returns the name and creature family of the player’s pet, if any.
The
table
module inside the secure environment includes one function
that is not part of the normal table module. For security reasons, the snippet
execution engine will not compile snippets thatcreate tables directly using the
table constructor
{}
.Instead, you can create tables for your snippets to store
information using
table.new(...)
.If arguments are supplied, they are added
to the new table under consecutive integer keys, starting from 1. There is no
way to initialize a table with non-integer keys using
table.new()
,but you can
set them afterward using conventional table syntax.
The other action the secure environment has to prohibit to snippets is the
creation of functions, but repetitive tasks can be executed in a similar way
using the
control
object provided in each frame’s environment.
The control Object
The secure environment provides something called a
control
object to serve
two principal functions: The first is to be able to trigger insecure functions
that have full access to presentational elements such as textures (but without
secure privileges to affect protected execution), and the second is to isolate
small chunks of repetitive code in snippets, so that they can be called like
functions.
When you haveto makecosmetic updates toa framebasedon changes to its
attributes or other triggers, youcan assign a function to a key on that frame in
advance. Then, when secure code running in that frame’s environment wants
to trigger that function, it can call
control:CallMethod(keyName, ...)
.This
will find
originalFrame
as the frame owning the secureenvironment, retrieve
Chapter 25
Taking Protected Action in Combat 477
originalFrame[keyName]
,and if it is a function, call it with
(originalFrame,
....)
as arguments. The call will be made insecurely, so the function will run
without any special privileges, but with full access to the global environment.
When the function returns, the snippet that called it remains secure, but any
returns fromthe method function called are discardedand notavailable to the
secure environment.
The
control
object can alsorun snippets, whetherprovidedas string literals
or stored in variables. The
control:Run(snippet, ...)
function will run the
specifiedsnippetwith theowning frame as
self
and the remainingarguments
passedasthevarargexpression.The
control:RunFor(frameHandle, snippet,
...)
function will run the supplied snippet with
frameHandle
as
self
,with
the rest of the arguments passed in the vararg expression, but still in the
environment of the frame calling
control:RunFor
.
The
control:RunAttribute(name, ...)
function is very similar to
control:Run
, but instead of taking snippet code directly, it retrieves the
snippet to run from
owningFrame:GetAttribute(name)
. This is presently
about the only way to securely interact with any attribute on a frame that
starts with an underscore.
The final method of the
control
object is largely obsolete, but can occasion-
ally used as a timesaver.
control:ChildUpdate(snippetID, message)
checks
each child of the calling frame for a
“_childupdate-“..snippetID
attribute
or a
“_childupdate“
attribute in that order. It then calls that snippet on that
child, with the child itself,
snippetID
,and
message
as arguments, in the child
frame’s environment.
Frame Handles
Because true tables can’t exist in WoW’s secure sandboxes (the objects manip-
ulated by the
table
library are actually special proxy objects), frames can’t be
importeddirectlyintosnippetcode.Toallowsecurecodetomanipulateframes,
proxy objects called frame handles are created. The
self
argument received by
most snippets is actually a frame handle, and
SecureHandlerSetFrameRef
stores a frame handle in an attribute on the target frame where it can be
retrieved.
For the most part, frame handles act like frames. They have many of the
same methods, but a few important distinctions exist:
Frame handles are actually userdata objects, so you cannot set values
on their keys as you can with frames.
Most frame handle methods throw an error if used during combat for
aframe handle that represents an unprotected frame.
Frame handles also have some changed methods, as well as a few
methods that don’t normally exist on real frames.
478
Part III
Advanced Addon Techniques
To get a taste for using frame handles, press Esc to enable your right action
bar, navigate to Interface Options, select ActionBars, and check the Right Bar
checkbox. Then run the following script in-game:
local function ConstructButton(name, parent, baseTexture)
local self = CreateFrame(“Button“, parent:GetName()..name, parent, i
“SecureHandlerClickTemplate“)
parent[name:lower()] = self
self:SetHeight(32)
self:SetWidth(32)
self:SetNormalTexture(baseTexture..“-Up“)
self:SetPushedTexture(baseTexture..“-Down“)
self:SetHighlightTexture(baseTexture..“-Highlight“, “ADD“)
return self
end
local advance = MultiBarRight.advance or ConstructButton(“Advance“, i
MultiBarRight, [[Interface\MainMenuBar\UI-MainMenu-ScrollUpButton]])
advance:SetPoint(“BOTTOM“, MultiBarRight, “TOP“)
advance:SetAttribute(“_onclick“, [[
bar = bar or self:GetParent()
local page = tonumber(bar:GetAttribute(’actionpage’)) or 4
if page <= 1 then
page = 7
end
bar:SetAttribute(“actionpage“, page - 1)
buttons = buttons or table.new(bar:GetChildren())
for i, button in ipairs(buttons) do
button:SetAttribute(“touch“)
end ]]
)
local regress = MultiBarRight.regress or ConstructButton(“Advance“, i
MultiBarRight, [[Interface\MainMenuBar\UI-MainMenu-ScrollDownButton]])
regress:SetPoint(“TOP“, MultiBarRight, “BOTTOM“)
regress:SetAttribute(“_onclick“, [[
bar = bar or self:GetParent()
local page = tonumber(bar:GetAttribute(’actionpage’)) or 2
if page >= 6 then
page = 0
end
bar:SetAttribute(“actionpage“, page + 1)
buttons = buttons or table.new(bar:GetChildren())
for i, button in ipairs(buttons) do
button:SetAttribute(“touch“)
end ]]
)
The first function creates a new button when called, and sets up certain
cosmetic details. The next block uses this function to create a button, and
attaches it to the rightmost extra action bar at the top end. Then it sets up a
Documents you may be interested
Documents you may be interested