c# pdf viewer open source : Change page order pdf acrobat Library SDK component asp.net .net html mvc World%20of%20Warcraft%20Programming%20(2nd%20Edition)29-part1826

Chapter 13
Responding to Game Events 249
count = count,
quality = quality,
name = GetItemInfo(link),
link = link,
num = itemNum,
}
else
Finally, change the call to
table.sort
from
table.sort(sortTbl, itemNameSort)
to
table.sort(sortTbl, itemTimeNameSort)
Adding an OnEvent Handler
To actually catch the
BAG_UPDATE
events, you need to add an event handler.
Open
BagBuddy.xml
and add the following to the
<Scripts>
element in the
definition of the BagBuddy frame:
<OnEvent function=“BagBuddy_OnEvent“/>
Now open
BagBuddy.lua
and add this function definition somewhere
toward the end of the file:
function BagBuddy_OnEvent(self, event, ...)
if event == “ADDON_LOADED“ and ... == “BagBuddy“ then
if not BagBuddy_ItemTimes then
BagBuddy_ItemTimes = {}
end
for bag = 0, NUM_BAG_SLOTS do
-- Use the optional flag to skip updating times
BagBuddy_ScanBag(bag, true)
end
self:UnregisterEvent(“ADDON_LOADED“)
self:RegisterEvent(“BAG_UPDATE“)
elseif event == “BAG_UPDATE“ then
local bag = ...
if bag >= 0 then
BagBuddy_ScanBag(bag)
if BagBuddy:IsVisible() then
BagBuddy_Update()
end
end
end
end
Change page order pdf acrobat - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
move pages in pdf reader; how to move pages in pdf converter professional
Change page order pdf acrobat - 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
how to reorder pdf pages; reorder pages in pdf document
250
Part II
Programming in World of Warcraft
This handler is set to watch for two events:
ADDON_LOADED
and
BAG_UPDATE
.
ADDON_LOADED
is used as an initialization event because it indicates that an
addon is fully loaded. However, addons can sometimes load out of order
due to dependencies and other API calls, so you have to check the first
argument to the function to see which addon has finished loading.
When BagBuddy’s
ADDON_LOADED
event is encountered, the
BagBuddy_
ItemTimes
table is created and the initial scan is run for each of the player’s
bags. After that, the addon no longer cares about the
ADDON_LOADED
event, so
it un-registers it. Finally, the handler registers for the
BAG_UPDATE
event, so it
can detectchanges to the player’s inventory.
The
BAG_UPDATE
portion of the handler is very simple; it just checks to see
if the bag index is greater than or equal to
0
(the player’s backpack) and then
runs the bag scan. If the frame is visible, it calls
BagBuddy_Update()
to update
theframe.Thisensuresthatthe frameis alwaysshowingthelatestinformation.
Finally,youneedtoregisterforthe
ADDON_LOADED
event,soaddthefollowing
to the end of
BagBuddy_OnLoad()
:
self:RegisterEvent(“ADDON_LOADED“)
Now when you log into the game and loot some items, you should then see
them sorted with the most recently looted items shown first. In addition you
can still filter the items by rarity or name and have them sorted by loot time.
Cleaning Up
Right now the frame is visible when the game is loaded, and can’t easily be
re-opened once it’s been closed. In addition, it would be nice if the frame
would operate like the rest of the panels in the user interface. Luckily there’s
an easy system that allows you to do that.
At the top of
BagBuddy_OnLoad()
add the following code:
UIPanelWindows[“BagBuddy“] = {
area = “left“,
pushable = 1,
whileDead = 1,
}
UIPanelWindows
is a special global table that contains definitions of the
various panels that are controlled by the user interface. The key is the name
of the frame and the value is a table of options. In this case, you indicate
that the window should appear on the left side of the screen, can be pushed
toward the center by another panel, and should be visible while the player
is dead. Additionally, by adding your frame to the
UIPanelWindows
table, it
.NET PDF Document Viewing, Annotation, Conversion & Processing
Convert image files to PDF. File & Page Process. Re-order, rotate PDF pages. PDF Read. Print. Support for all the print modes in Acrobat PDF.
how to change page order in pdf acrobat; reorder pages in pdf preview
VB.NET PDF: How to Create Watermark on PDF Document within
create a watermark to PDF file in order to help or image (such as business's logo) on any desired PDF page. And with our PDF Watermark Creator, users need no
reorder pages in pdf online; change page order pdf acrobat
Chapter 13
Responding to Game Events 251
automatically gains the capability to be closed by pressing the Escape key
rather than having to click the close button.
Unfortunately, by the time the
BagBuddy_OnLoad()
function is run, the
frame will already have been shown, so it won’t be treated as one of the spe-
cial UI panels. Additionally, it doesn’t seem to make much sense to have
the frame shown every time the player logs in. Open
BagBuddy.xml
and
change the opening tag for BagBuddy to the following (the addition has been
highlighted):
<Frame name=“BagBuddy“ parent=“UIParent“ hidden=“true“>
Now when you’dlike to see the frame,youcan run the following command
and BagBuddy will behave the same as the other UI panels:
/run ShowUIPanel(BagBuddy)
Adding a Slash Command
You can make it easier to open BagBuddy by adding the following slash
command definition to the end of
BagBuddy.lua
:
SLASH_BAGBUDDY1 = “/bb“
SLASH_BAGBUDDY2 = “/bagbuddy“
SlashCmdList[“BAGBUDDY“] = function(msg, editbox)
BagBuddy.input:SetText(msg)
ShowUIPanel(BagBuddy)
end
This provides twonew slashcommands (
/bb
and
/bagbuddy
)thatboth work
in the same way. Any text typed after the slash command will be put into the
edit box and used as a name filter, then the panel is shown. Now instead of
running a script command, you can just type
/bb
to open the frame.
Slash commands are further discussed in Chapter 17.
Storing Data with SavedVariables
With this version of BagBuddy, the item times are reset every time the user
interface is reloaded. If you reload your user interface in the middle of a
questing session and then open BagBuddy, you will find that the items are
again sorted by name rather than by loot time, making that feature a bit
less useful. To fix this, you need some way to carry data from session to
session.
GIF to PDF Converter | Convert GIF to PDF, Convert PDF to GIF
as easy as printing; Support both single-page and batch Drop image to process GIF to PDF image conversion; Provide filter option to change brightness, color and
pdf reorder pages; how to reorder pages in a pdf document
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
It can be used standalone. JPEG to PDF Converter is able to convert image files to PDF directly without the software Adobe Acrobat Reader for conversion.
how to reorder pages in pdf preview; pdf reverse page order online
252
Part II
Programming in World of Warcraft
World of Warcraft offers a system that allows addons to register certain
global variables to be saved between game sessions. These are called saved
variables, named after the table of contents directive that is used to specify
them. There are two different types of saved variables:
SavedVariables—Account-wide, accessible to any character on a given
account.
SavedVariablesPerCharacter—Separate for each individual character,
so not even two characters on the same servercan share them.
Although you could obviously take a normal saved variable and partition
it so multiple users can use it without interfering with each other’s data,
each character truly has access to all of the data. On the other hand, there
is no way to simulate a normal saved variable with a per-character saved
variable because all saving and loading is handled directly by the game
client.
Registering a New Saved Variable
Using saved variables is quite easy; you just need to add a directive to your
addon’s table of contents file, and restart the game client. When the game
client is loaded, it loads any stored data and makes it available to your addon
(more on this later). When the game client is closed, a character logs out, or
the user interface is reloaded, the data is saved out to disk.
Start by adding a savedvariableto
BagBuddy.toc
.Open thefile and add the
following after the
## Notes
directive:
## SavedVariablesPerCharacter: BagBuddy_ItemTimes
There’s really no reason that users would need access to each other’s times,
so you can declare your saved variable to be per-character only.That way you
don’t have to be concerned about storing your data in any specific place;
you can just leave it in the table itself.
For this change to take effect, you will need to quit your client and re-open
it. Changes that are made to the metadata of an addon’s table of contents file
are refreshedonly when the client is opened, not on user interface reload.
Saved Variables and ADDON_LOADED
When an addon is beingloaded(thatis,when the code isactuallybeingparsed
andrun) anysavedvariablesarenotyetavailable.Oncetheaddon hasfinished
initializing, the client loads the saved variables and fires the
ADDON_LOADED
PDF to WORD Converter | Convert PDF to Word, Convert Word to PDF
PDF to Word Converter has accurate output, and PDF to Word Converter doesn't need the support of Adobe Acrobat & Microsoft Word.
reordering pages in pdf; how to move pages around in a pdf document
TIFF to PDF Converter | Convert TIFF to PDF, Convert PDF to TIFF
doesn't require other third-party such as Adobe Acrobat. a few clicks; Ability to convert PDF documents to and upgrade; Easy to convert multi-page PDF files to
change pdf page order online; rearrange pdf pages reader
Chapter 13
Responding to Game Events 253
event. Although the reasons for this weren’t discussedin the previous section,
that is why initialization is delayed until
ADDON_LOADED
.
Using Items from BagBuddy
Finding items in your inventory is great, but it would be nicer to be able to
click to use them once you’ve found them. This can be accomplished using
securetemplates,which are discussed in Chapter15.Fornow,youcan make the
following changes to your code to enable that functionality.
In
BagBuddy_OnLoad()
,change the loop that creates itemslots to register for
right-clicks (change is highlighted):
-- Create the item slots
self.items = {}
for idx = 1, 24 do
local item = CreateFrame(“Button“, “BagBuddy_Item“ .. idx, self, i
“BagBuddyItemTemplate“)
item:RegisterForClicks(“RightButtonUp“)
self.items[idx] = item
if idx == 1 then
item:SetPoint(“TOPLEFT“, 40, -73)
elseif idx == 7 or idx == 13 or idx == 19 then
item:SetPoint(“TOPLEFT“, self.items[idx-6], “BOTTOMLEFT“, 0, -7)
else
item:SetPoint(“TOPLEFT“, self.items[idx-1], “TOPRIGHT“, 12, 0)
end
end
In
BagBuddy_Update()
,addthe followinghighlightedline in the conditional
that indicates there is an item in the slot. This sets the button up to use the
named itemwhen it is right-clicked.
if entry then
-- There is an item in this slot
button:SetAttribute(“item2“, entry.name)
button.link = entry.link
button.icon:SetTexture(entry.texture)
The last two changes must be made in
BagBuddy.xml
.First, change the
opening tag for
BagBuddyItemTemplate
from
<Button name=“BagBuddyItemTemplate“ virtual=“true“>
DICOM to PDF Converter | Convert DICOM to PDF, Convert PDF to
Adobe Acrobat or any other print drivers when they use DICOM to PDF Converter. Additionally, high-quality image conversion of DICOM & PDF files in single page
pdf change page order online; reorder pages in pdf file
BMP to PDF Converter | Convert Bitmap to PDF, Convert PDF to BMP
interface; Powerful image converter for Bitmap and PDF files; No need for Adobe Acrobat Reader & print driver during conversion; Support
move pages in a pdf; reorder pdf pages reader
254
Part II
Programming in World of Warcraft
to
<Button name=“BagBuddyItemTemplate“ i
inherits=“SecureActionButtonTemplate“ virtual=“true“>
Finally, add an attribute definition between the
</Layers>
tag and the
<Scripts>
tag for
BagBuddyItemTemplate
:
<Attributes>
<Attribute name=“type2“ type=“string“ value=“item“/>
</Attributes>
Now when you open BagBuddy, you should be able to use items (such as
food, potions, bandages, and quest items) by right-clicking on them.
Finding the Right Event Using /eventtrace
One of themostchallenging aspects of writingan addon forWorld of Warcraft
is finding the right events to ensure your addon functions properly. Some
applications are very simple,such as using
UNIT_HEALTH
to monitor the health
of an in-game unit. Others, such as those dealing with the player’s containers
and inventory, can be a bit tricky to deal with at times.
The
Blizzard_DebugTools
addon included with the default user interface
provides the slash command
/eventtrace
that makes tracking down event
information a bit easier. The command has a few different forms:
/eventtrace start
—Start capturing events, whetheror not the window
is shown.
/eventtrace stop
—Stop capturing events.
/eventtrace
—Show the window if it is currently hidden, and start
capturing events if the window hasn’t been shown before. Otherwise,
hide the window.
/eventtrace <num>
—If the addon is not currently capturing events,
capture exactly
<num>
events and then stop capturing events.
The results are displayed for you in an easy-to-navigate window, shown in
Figure 13-2.
You can scroll through the resulting events to view their arguments and
the time at which they were called. In addition, the event trace will show you
how much time elapsed between two events (if any) and how many times the
screen was updated.
When you need to find out what events fires under a certain situation (such
as when you cast a spell on an enemy), you can start an event trace and
replicate the situation. Then you can stop the event trace and explore the
events that fired to get the information you need.
Chapter 13
Responding to Game Events 255
Figure 13-2: /eventtrace window showing event information
Summary
This chapter explored how the game client notifies addons of changes to the
state of the game.You added event handling to BagBuddy to track changes to
the player’s inventory. The last few chapters have introduced you to all of the
vital parts of creating an addon. The next chapter pulls everything together to
create another fully-functional addon called CombatTracker.
The Code
BagBuddy.lua
function BagBuddy
OnLoad(self)
UIPanelWindows[“BagBuddy“] = {
area = “left“,
pushable = 1,
whileDead = 1,
}
SetPortraitToTexture(self.portrait, i
“Interface\\Icons\\INV
Misc
EngGizmos
30“)
-- Create the item slots
256
Part II
Programming in World of Warcraft
self.items = {}
for idx = 1, 24 do
local item = CreateFrame(“Button“, “BagBuddy
Item“ .. idx, i
self, “BagBuddyItemTemplate“)
item:RegisterForClicks(“RightButtonUp“)
self.items[idx] = item
if idx == 1 then
item:SetPoint(“TOPLEFT“, 40, -73)
elseif idx == 7 or idx == 13 or idx == 19 then
item:SetPoint(“TOPLEFT“, self.items[idx-6], “BOTTOMLEFT“, 0, -7)
else
item:SetPoint(“TOPLEFT“, self.items[idx-1], “TOPRIGHT“, 12, 0)
end
end
-- Create the filter buttons
self.filters = {}
for idx=0,5 do
local button = CreateFrame(“CheckButton“,
“BagBuddy
Filter“ .. idx, self, “BagBuddyFilterTemplate“)
SetItemButtonTexture(button, i
“Interface\\ICONS\\INV
Misc
Gem
Pearl
03“)
self.filters[idx] = button
if idx == 0 then
button:SetPoint(“BOTTOMLEFT“, 40, 200)
else
button:SetPoint(“TOPLEFT“, self.filters[idx-1], “TOPRIGHT“, 12, 0)
end
button.icon:SetVertexColor(GetItemQualityColor(idx))
button:SetChecked(false)
button.quality = idx
button.glow:Hide()
end
self.filters[-1] = self.filters[0]
-- Initialize to show the first page
self.page = 1
self.bagCounts = {}
self:RegisterEvent(“ADDON
LOADED“)
end
local function itemNameSort(a, b)
return a.name < b.name
end
local function itemTimeNameSort(a, b)
Chapter 13
Responding to Game Events 257
-- If the two items were looted at the same time
local aTime = BagBuddy
ItemTimes[a.num]
local bTime = BagBuddy
ItemTimes[b.num]
if aTime == bTime then
return a.name < b.name
else
return aTime >= bTime
end
end
function BagBuddy
Update()
local items = {}
local nameFilter = BagBuddy.input:GetText():lower()
-- Scan through the bag slots, looking for items
for bag = 0, NUM
BAG
SLOTS do
for slot = 0, GetContainerNumSlots(bag) do
local texture, count, locked, quality, readable, lootable, i
link = GetContainerItemInfo(bag, slot)
if texture then
local shown = true
if BagBuddy.qualityFilter then
shown = shown and BagBuddy.filters[quality]:GetChecked()
end
if #nameFilter > 0 then
local lowerName = GetItemInfo(link):lower()
shown = shown and string.find(lowerName, nameFilter, 1, true)
end
if shown then
-- If an item is found, grab item number and store other data
local itemNum = tonumber(link:match(“|Hitem:(%d+):“))
if not items[itemNum] then
items[itemNum] = {
texture = texture,
count = count,
quality = quality,
name = GetItemInfo(link),
link = link,
num = itemNum,
}
else
-- The item already exists, just update the count
items[itemNum].count = items[itemNum].count + count
end
258
Part II
Programming in World of Warcraft
end
end
end
end
local sortTbl = {}
for link, entry in pairs(items) do
table.insert(sortTbl, entry)
end
table.sort(sortTbl, itemTimeNameSort)
-- Now update the BagBuddyFrame with the listed items (in order)
local max = BagBuddy.page * 24
local min = max - 23
for idx = min, max do
local button = BagBuddy.items[idx - min + 1]
local entry = sortTbl[idx]
if entry then
-- There is an item in this slot
button:SetAttribute(“item2“, entry.name)
button.link = entry.link
button.icon:SetTexture(entry.texture)
if entry.count > 1 then
button.count:SetText(entry.count)
button.count:Show()
else
button.count:Hide()
end
if entry.quality > 1 then
button.glow:SetVertexColor(GetItemQualityColor(entry.quality))
button.glow:Show()
else
button.glow:Hide()
end
button:Show()
else
button.link = nil
button:Hide()
end
end
-- Update page buttons
if min > 1 then
BagBuddy.prev:Enable()
else
BagBuddy.prev:Disable()
Documents you may be interested
Documents you may be interested