diff options
| author | Bitflash <btf01@proton.me> | 2026-07-28 12:55:04 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-28 12:55:04 -0300 |
| commit | 663784eae9b04ec71e3e1eebf445910e5a8add42 (patch) | |
| tree | 1482b0778a11c1b46cfbd476a5d91e12ef31204b /src | |
| parent | 1d0314c0d220231afc56193ba66b70234fa24092 (diff) | |
Merge PR #6 (large refactor), preserving main's fixes (#9)
* Add Linux GUI installer via Wine
* Fix launcher creation and add BTF_RELAY env var support
* Pool server, Linux GUI, unified binary, README update
* Root Makefile: make linux / make windows, cleaner README
* Remove headless.cpp
* Fix XPM color count mismatch causing toolbar image errors on Linux
* XPM icons: same code on Windows and Linux, no ifdefs around image loading
* Fix GTK icon crash and Linux printf format
* btfrv: 10s socket timeout on relay connects
* Faster peer discovery: more dials per pass, shorter backoff and sleep
* Parallel btf peer connections
* Fix GetMyExternalIP - was disabled, now uses modern IP echo services
* Fix tunnel disconnect on idle and restore external IP detection
* Filter stale Nostr descriptors
* Sort peers by freshness, fresh first
* Pool: add .btf Stratum listener — miners connect via rendezvous, no port forwarding needed
* btf pool: self-replacing listeners, one per relay, no queuing between miners
* Mining modes: solo/operator/participant — pool server on-demand, participant Stratum client
* Status bar: show external IP and .btf address
* README: clean rewrite, concept-first, minimal
* make linux produces AppImage
* make linux produces AppImage
* Pool dashboard: connect instructions, tabs, share bars
* Perf fixes: GetMyExternalIP threaded, btf listener counted
* Perf fixes: GetMyExternalIP threaded, btf listener counted
* Fix pool payouts: defer until coinbase maturity
* Pool: clean mode switching, IP warning
* Pool: clean mode switching
* Fix gPoolRunning: remove static
* AppImage: use real icon from bitcoin.ico
* Fix exit crash; Mining menu
* Fix exit crash; Mining menu
* Fix exit crash; Mining menu
* Fix exit crash; Mining menu
* Fix exit crash; Mining menu
* Windows build: use mingw32-make
* Windows build: simpler make invocation
* Add deps-windows target
* Windows build fixes
* Windows build fixes
* Windows makefile: fix obj dir
* Windows: output to repo root
* Windows: bundle DLLs into zip
* Replace wxWidgets with ImGui+GLFW: same build on Linux and Windows
* Fix %I64d that slipped back through rebase (main.h, net.h)
* MinGW: add _mkdir shim for non-MSVC Windows; fix %I64d
* Fix gPoolRunning extern outside ifndef _WIN32
* Remove -lboost_system: boost is header-only in this codebase
* Status bar: copy buttons for IP and .btf address
* Windows: add app icon via windres, strip wx stuff from rc file
* Clean GUI: single Options menu item, bigger font, better spacing, cleaner options dialog; update README
* GUI: embed Roboto font at 16px for clear readability on all platforms
* Windows: windres depends on obj dir target
* Fix balance hidden off-screen: put on own line below address bar
* Windows: inline mkdir in every rule, remove dir target that confused make
* Windows: move all target to top so it's the default rule
* Fix pool server not starting: always start when operator selected, re-sync dialog state on open
* Write debug.log to data directory (AppData/Roaming/Bitflash on Windows)
* Participant miner: use wallet address as username so payouts go to wallet
* Add .gitattributes to lock LF line endings, prevent CRLF drift
* Refactor pool mining to btf-only transport
* Persist pool settings and startup wiring
* Prune stale peers and expose pool queries
* Fix build regressions and add CLI mode/arg parity
* Fix rpc miner stats declaration order
* Centralize pool runtime extern declarations
* Separate operator/participant dashboards and restore peer stats
* Add live telemetry strip and clearer per-mode runtime metrics
* Reduce mining dashboard clutter and remove manual pool entry
* Count only authorized pool miners
* Seed initial pool job on startup
* Use a real share target for pool work
* Switch pool accounting to round-based shares
* Fix nostr pool announcer stats call sites
* Fix pool stats definition order
* Improve pool worker status display
* Add mutex include for participant status
* Replace ImClamp in dashboard layout
* Clarify participant work status
* Log participant status transitions
* Reduce peer discovery log noise
* Add participant status badge
* Track participant auth acknowledgements
* Log and validate pool job delivery
* Stop persisting mining mode/pool settings across restarts
LoadWallet() runs after CLI flags are parsed in main_gui.cpp, and was
restoring nMineMode/strParticipantPool/strPoolName/strPoolDashboardUrl/
dPoolFeePercent/fGenerateBitcoins from wallet.dat every time, silently
overwriting whatever was just set on the command line or in the current
Options session -- no error, no log line. This is why pool name/address
could show correctly in the UI but stay stale in the logs (UI held the
in-memory value just set; logs eventually reflected whatever LoadWallet
clobbered it back to), and why mode changed behavior across restarts.
Mode/pool config is now decided fresh every launch: CLI flags if given,
otherwise the compiled-in default. Nothing is written back to wallet.dat
for these settings anymore, so there's nothing left to go stale or fight
over load order.
* Add explicit Relay mode as the new startup default
4th mining mode: node runs/syncs, never mines, no pool server -- an
explicit option instead of an implicit side-effect of 'Solo + never
click Start Mining'. Now the compiled-in default (was Solo).
- main.h: MINE_RELAY = 0, renumbered other modes (nothing compares
nMineMode against raw integers elsewhere, verified).
- main.cpp: default nMineMode = MINE_RELAY; BitcoinMiner() early-returns
for Relay, mirroring the existing Participant-mode guard.
- gui.cpp: added Relay radio button, status label, and telemetry-strip
text. Start/Stop Mining button is hidden for Relay (meaningless -- it
never mines by definition); OK forces fGenerateBitcoins off if you
switch into Relay while previously mining.
* Announce pool changes immediately instead of waiting up to 60s
ThreadBtfPoolAnnouncer re-read strPoolName/dPoolFeePercent/etc live, but
only once per iteration of its 60s sleep loop, so a pool name/fee change
in Options could take up to a minute to reach other nodes.
- nostr.h/.cpp: add gAnnounceNow flag; the announcer's sleep loop now
wakes early and publishes immediately when it's set, then clears it.
- gui.cpp: Options OK handler sets gAnnounceNow when operator pool
settings actually changed (name/dashboard/fee/mode), so a saved
change is announced right away instead of on the next tick.
* Give each pool miner a distinct extranonce2 so jobs no longer overlap
mining.notify previously broadcast one identical 80-byte header (baked
from a single server-side extraNonce) to every connected miner, so any
two miners on the same job searched the exact same nNonce space instead
of disjoint ranges.
Each Miner connection is now assigned a unique extranonce2 on connect.
BuildMinerBlock() takes the shared job template and appends that miner's
extranonce2 to the coinbase scriptSig, recomputing the merkle root, so
every miner gets its own header variant of the same job. mining.submit
validates and, on a full block, assembles the block using that same
miner-specific variant (via m->extranonce2), not the shared template.
No client-side protocol change needed: main.cpp's participant miner
already just takes whatever header bytes mining.notify hands it and
submits (jobId, nonce) back, so it works unmodified against per-miner
headers.
Still simplified vs standard Stratum (no coinb1/coinb2/merkle-branch
wire split, no mining.extranonce.subscribe reply payload) since this
protocol was already a custom simplification pre-existing this fix.
Syntax-checked with g++ -fsyntax-only (full link needs secp256k1/
RandomX/GLFW not present in this sandbox).
* Fix debug.log never being written on the real Windows build
printf-to-debug.log routing was gated on:
#if defined(_WINDOWS) || !defined(_WIN32)
_WINDOWS is only ever defined by the legacy, unused MSVC makefile.vc.
The actual Windows build (makefile.mingw) never defines it, and _WIN32
IS defined there (mingw builtin), so on real Windows this condition was
always false || false = false. printf() fell through to plain libc
printf (stdout only), so debug.log was never created, and output was
only visible if the process happened to be run attached to a console.
OutputDebugStringF() was already platform-safe internally (always
writes debug.log; only echoes to console when not on Windows), so the
outer condition was pure dead weight. Made the routing unconditional.
* Reduce base UI font size one more step (16px -> 14px)
* Remove Start/Stop Mining button; mining state follows selected mode
The button let a user configure a pool then click a separate toggle,
creating states where the button's label/action didn't match what the
selected mode actually needed. OK now starts/stops the miner thread
itself based on nMineMode: Relay clears fGenerateBitcoins, the other
three modes set it and spawn ThreadBitcoinMiner if it isn't already
running (guarded by vfThreadRunning[3]).
* Fix participant miner stuck waiting for notify after buffered multi-line recv
Root cause of the operator/participant pairing successfully but no work
ever flowing: PoolParticipantMiner()'s receive loop only pulled one line
out of the socket per select() wakeup. The server sends the authorize
reply, mining.set_difficulty, and mining.notify back-to-back on the same
connection, and these often land in a single TCP segment — one recv()
inside StratumRecvLine() buffers all three lines into 'buf', but only the
first was extracted and processed. The remaining lines (frequently
mining.notify itself) sat in 'buf' indefinitely, because select() only
reports readability of the OS socket, not whether our own buffer still
holds unprocessed complete lines — and the server had nothing further to
send once the initial burst was over, so select() never fired again.
Fix: drain any complete line already sitting in 'buf' first; only fall
back to select()+recv() when 'buf' has no complete line left.
* Fix mining.submit rejecting every share due to wrong param-count check
Server required params.size() >= 4 for mining.submit, but the client
only ever sends 3: [username, jobId, nonceHex] (indices 0-2, matching
what the handler actually reads: p[1]=jobId, p[2]=nonceHex). Every
submission was bounced with 'bad params' before its nonce was ever
checked against the job, producing an endless share-sent/share-rejected
loop with no other visible cause. Likely a leftover from the standard
5-field Stratum mining.submit shape, which this simplified 3-field
protocol never matched. Threshold corrected to size() >= 3.
* Fix mining.submit rejecting legitimate shares that weren't also winning blocks
Pool share difficulty is intentionally ~256x easier than full network
difficulty (MakeShareTarget() shifts the block target left 8 bits), so
miners are expected to submit many shares per actual block found. But
the handler replied to the miner based on ProcessBlock()/CheckBlock()
success — validation against the much harder network target — rather
than on whether the share met pool difficulty. Every legitimate share
that wasn't also a winning block (the vast majority, by design) failed
CheckBlock()'s nBits check and got reported to the miner as rejected.
Now: reply(true) as soon as a submission clears pool-share difficulty.
Only if it ALSO clears full network difficulty (job.target, not
job.shareTarget) does it get submitted as a block — with no second
reply sent, since the share was already acknowledged.
* Fix dead-peer dial priority: freshness sort was undone by full shuffle
ConnectDiscoveredBtfPeers sorted candidates newest-first, then immediately
shuffled the whole list, making the freshness sort a no-op — every pass was
fully random. Meanwhile g_btfPeerFails was tracked but never used to
prioritize, so a peer that had failed 20 times in a row got equal footing
with an untried or previously-successful peer; the only effect was backoff,
capped at 15 minutes, so dead descriptors cycled back into the dial pool
constantly.
- Track successful connections (g_btfPeerEverConnected) and use it, plus
fail history, to order candidates in tiers: known-good, then untried,
then known-bad (worst offenders last). Freshness order is preserved
within each tier instead of being discarded.
- Raise the backoff cap for chronic failures (6+ in a row) from 15 minutes
to 6 hours, so descriptors that are clearly dead stop consuming dial
budget every pass while still getting retried eventually.
* Batch-resolve .btf descriptors to stop hammering public relays during dial passes
Root cause of 'stuck at 1 peer' despite good peer discovery: each parallel
dial thread in ConnectDiscoveredBtfPeers called ConnectNodeBtf, which itself
walked all configured relays (relay.damus.io, nos.lol, relay.nostr.band,
relay.snort.social) to resolve that one peer's descriptor. With up to
BTF_DIALS_PER_PASS (12) threads dialing at once, a single pass could fire up
to 12 * nNostrRelays near-simultaneous fresh connections at the same handful
of public relays -- easily enough to trip rate limits or get handshakes
refused (exactly what the logs showed: 'handshake refused by relay.damus.io',
repeated connect failures to relay.nostr.band / relay.snort.social). Peers
that were genuinely reachable looked dead simply because their descriptor
couldn't be fetched under that load, and then got penalized as known-bad by
the dial-priority tiering from the previous fix.
- Add BtfResolveMany: resolves every still-unresolved candidate's descriptor
in a single Nostr REQ per relay (multiple authors in one filter), instead
of one relay connection per candidate. A 12-candidate pass now costs at
most a few relay round-trips total instead of dozens.
- Add ConnectNodeBtfResolved / ConnectNodeBtfTail (net.cpp): given an
already-resolved descriptor, dial straight to the peer's rendezvous node
with zero further relay contact. ConnectDiscoveredBtfPeers now batch-
resolves all candidates up front, then fans out tunnel-only connect
threads in parallel -- no thundering herd against the relays.
- Candidates that fail to resolve are recorded as a failure immediately
(same backoff/fail-count bookkeeping as before) instead of spawning a
thread with nothing to dial.
* Stop reconnecting to relays constantly: pool one persistent connection per relay
Real root cause of the ongoing 'handshake refused' / 'connect failed' spam
and peer count stuck at 0-1: every relay-touching operation (startup self-
test, per-pass seeding, batch descriptor resolve, pool announce, pool query)
opened its own brand-new CWebSocket every single time it ran. Two independent
threads (ThreadNostrSeed and ThreadBtfPoolAnnouncer) each reconnect from
scratch on their own ~60s cycle, so a node could fire well over a dozen
fresh TCP+TLS+WS handshakes at the same 4 public relays inside any given
minute. Public relays -- relay.damus.io especially -- rate-limit new
connections per source IP fairly aggressively, so this node was effectively
DoS-ing itself: peers were genuinely reachable, but their descriptors
couldn't be fetched because the relay had already started refusing this
node's own repeated reconnects.
- Add a small per-relay connection pool (g_relayPool) and an RAII
CRelayLease that reuses a relay's live socket across calls instead of
reconnecting every time, only reconnecting when a socket actually drops
or was never established.
- Route every relay call site through it: the startup self-test, the
self-test loop, SeedFromRelay, BtfResolve, BtfResolveMany,
BtfPublishPoolAnnouncement, BtfQueryPoolAnnouncement.
- Only log 'connected to <relay>' on an actual fresh (re)connect, not on
every pass that's just reusing an already-live socket, so the log
reflects what's really happening instead of implying constant churn.
This cuts fresh relay connections from several per minute down to
essentially one per relay for the life of the process (until a relay
actually drops the connection), which should make the rate-limit-driven
refusals go away and let descriptor resolution -- and therefore dialing --
actually succeed at the rate the peer list implies it should.
* Fix wallet crash on rejected send; remove legacy IP-based peer discovery
- SendMoney() no longer throws when a committed tx is rejected by
AcceptTransaction() (e.g. raced input already spent). It now unwinds
the wallet state via RollbackTransactionSpent() and returns false,
which the GUI already handles as 'Transaction failed.'
- Removed the dead IP-based peer discovery/connect path now that
discovery is entirely Nostr/.btf: CAddrDB/addr.dat, mapAddresses,
AddAddress, ConnectNode(CAddress), FindNode(CAddress), ConnectSocket
(SOCKS4 proxy helper), addrProxy, ThreadOpenConnections/2 class-C
dialer and its thread spawn, the addr/getaddr P2P handlers, and the
dead vAddrToSend/setAddrKnown fields on CNode.
- Deleted irc.cpp/irc.h (already-disabled legacy seed code) and
scrubbed references from headers_core.h and all four makefiles.
* Raise peer connection target and add dial diversity; fix IPv4-only relay connect
- BTF_TARGET_CONN: 8 -> 24. With ~100 known .btf peers, average degree
needs only to exceed ln(N)~=4.6 for the network to stay connected
with overwhelming probability (Erdos-Renyi); 24 is a healthy margin.
- ConnectDiscoveredBtfPeers now splits each pass's dial budget ~70/30
between the existing reliability-tiered order and a random sample
from the full fresh peer pool. Pure reliability bias means every
node converges on the same 'known good' hub set, which correlates
peer sets across the network -- a relay outage then drops the same
edges everywhere at once instead of independent ones. The random
slice keeps a floor of uncorrelated edges.
- CWebSocket::Connect (relay websocket) now resolves with AF_UNSPEC
and tries every returned address (IPv6 or IPv4) in turn instead of
hard-failing on AF_INET-only resolution, which was one plausible
cause of the relay.nostr.band:443 connect failures (CDN-fronted
relays increasingly rate-limit/filter the v4 path).
* Remove accidentally committed build binary; ignore src/bitflash
* Fix pool participants getting stuck after the first job
JobWatcherFn only rebuilt/broadcast a new Stratum job when a new block
arrived on this node or no job existed yet. Once a job was built after
startup, gHaveJob stayed true forever unless *this* node found the
block, so with no new block (slow interval, or this node just not
seeing one) every connected miner sat hashing the exact same job --
stale timestamp, stale mempool snapshot -- indefinitely. From the
miner's side that's indistinguishable from being stuck: it worked at
connect (gets the one-time job sent on authorize) and then nothing
ever arrives again.
Added a 60s periodic refresh so the job (and therefore mining.notify)
gets rebroadcast on a timer too, same as a normal stratum pool, not
only on new-block/no-job events.
* Diversify Nostr discovery relay list
Went from 4 relays to 7, and reduced Cloudflare concentration: previously
2 of 4 (damus.io, snort.social) sat behind the same CDN, so a Cloudflare-
side issue could take out half the list even though they're nominally
independent relays. Kept damus.io (most established) as the one CF-fronted
entry and filled the rest with different hosts (nos.lol, nostr.band on
Hetzner, nostr21.com, offchain.pub, nostr.mom, primal.net) so peer
discovery doesn't have a single shared upstream as a point of failure.
7 relays is within the commonly recommended 5-10 range for redundancy.
* Fix data race in RebuildJob: chain-state reads weren't holding cs_main
pindexBest, nBestHeight, GetNextWorkRequired() and GetMedianTimePast()
were all read without cs_main. A block being accepted concurrently by
the P2P thread could interleave with this: pindexPrev captured from the
old best block, but nBestHeight already bumped to the new one by the
time job.height is computed, or pindexBest reassigned mid-read. That
mismatch would make QueuePayouts() schedule a payout for the wrong
maturity height for whatever block gets found against that job.
Wrapped the whole chain-state snapshot in one CRITICAL_BLOCK(cs_main),
consistent with how the rest of the codebase touches this state.
* add operator fee
* Add categorized, burst-collapsing logging for pool/worker/payout flow
debug.log was growing unboundedly because every printf() call wrote
unconditionally, so loops that log once per item (discovered peers,
connect attempts) produced a near-identical line per address with no
cap. Add LogPrint(category, ...): a drop-in printf replacement that
tags each call with a subsystem (pool/worker/payout/net/nostr) and
collapses repeated calls from the same call site into one line per
3s window plus a '(xN similar in 3s)' summary, so log growth is
bounded by elapsed time instead of event count.
Wire it through the whole pool -> work -> payout pipeline (rpc.cpp
operator side, main.cpp participant/worker side, net.cpp/nostr.cpp
peer & relay discovery), and along the way fix several previously
*silent* failure points that produced exactly the reported symptom
(worker stuck asking for work, nothing logged):
- Relay listener registration failing: no log at all, so a pool with
every relay down looked identical to a healthy idle pool.
- No relays configured: silent infinite 5s retry loop.
- Initial job seed failing at pool startup: silent.
- JobWatcher: added a stuck-job watchdog that, after 15s with no
job available, logs a specific diagnosis (no chain tip yet vs.
RebuildJob() failing) instead of retrying forever in silence.
- QueuePayouts(): a block found with zero recorded shares queued no
payout and logged nothing.
- FlushMaturePayouts(): an unparseable payout address was skipped
with no log.
- Participant miner: the 'waiting for pool notify' stall was only
ever shown as a transient GUI status string, never written to
debug.log. Now logs on a 15s cadence while stalled, and after 120s
proactively drops the tunnel so the existing reconnect-in-10s loop
gets a fresh attempt instead of hanging indefinitely.
- Participant miner: share rejections were only a transient GUI
status string; now logged with the pool's rejection reason.
All edited files verified with g++ -fsyntax-only (gnu++14).
* Fix two bugs causing worker stuck + log bloat
1. Worker stuck asking for work (main.cpp):
The participant miner checked msg["result"].is_boolean() to detect
the mining.subscribe acknowledgement (id==1), but the pool sends
an array ([[["mining.notify",sid],sid,4]]) as per Stratum spec,
not a boolean. is_boolean() always returned false, so gotSubscribeAck
was never set true. This didn't directly block authorize (id==2 path
is independent), but it did mean the status never advanced through
"subscribed", leaving the progress logging misleading. More
importantly, the same wrong assumption meant any pool that also
gated job dispatch on a prior subscribe confirmation would leave the
worker stuck forever with no diagnosis.
Fix: accept any non-null result for id==1 (the array is the
session/extranonce info; its contents don't matter for our use case).
2. Log bloat from ProcessMessages (main.cpp):
ProcessMessages() used a bare printf() which fired unconditionally
for every P2P message received -- the bulk of debug.log was this one
line repeating thousands of times. Convert to LogPrint("net", ...)
so it is gated behind fDebug (off by default) and burst-collapsed
by the dedup introduced in the previous commit.
* Fix log bloat, em-dashes, dead code, status bar, Connected/Detected peers
Log bloat:
- Gate all per-message/per-block/per-loop printf in main.cpp, net.h,
net.cpp behind LogAcceptsCategory("net") -- only visible with -debug.
This includes: received:/sending: hex dumps, got inventory, askfor,
getblocks, getdata, received block, AddToWallet, RelayWalletTransactions,
ProcessMessage FAILED, mining loop N-transactions line, retarget block,
socket recv/send errors. AddToBlockIndex new best and ProcessBlock
ACCEPTED intentionally left always-on (one line per block).
- PoolParticipantMiner: status -> now LogPrint(worker) not printf.
Em-dashes:
- Replace all UTF-8 em-dashes (0xE2 0x80 0x94) with ASCII '--' in
every source file (rpc.cpp, gui.cpp, main.cpp, main_gui.cpp, net.cpp,
nostr.cpp, util.cpp, btfrv.cpp, db.cpp, db.h, main.h, headers.h,
headers_core.h, util.h). 40 occurrences across 14 files.
Dead code:
- Remove unused gJobSeq atomic from rpc.cpp (written, never read).
- Fix minerReward: was computed but payout loop used blockReward directly
(operator fee was advertised but never deducted). Now payout correctly
uses minerReward = blockReward * (1 - feeFrac).
Status bar / peers:
- Add GetDiscoveredPeerCount() to nostr.cpp/nostr.h (reads g_btfPeers
size under cs_btfPeers).
- Replace scrollable inline status text with DrawStatusBar(): a separate
ImGui overlay window pinned to bottom of screen (NoScrollbar,
NoBringToDisplayFront). Labels changed from 'Peers N' to
'Connected peers: N Detected peers: N'.
* Rewrite gui.cpp: proper fixed status bar, scrollable content child
Layout architecture:
- DrawMainWindow() covers the full display width, height minus STATUS_BAR_H
(22px). NoScrollbar + NoScrollWithMouse on the outer window so the
chrome (menu, address/balance strip, telemetry strip, separators) never
scrolls.
- A BeginChild("##scroll") fills the remaining height after the fixed
chrome, sized to GetContentRegionAvail().y -- which is already the space
between the cursor and the bottom of the outer window. All mode-specific
content (transaction table, participant pool list, operator workers/payouts)
lives inside this child. Content that overflows gets a scrollbar; nothing
bleeds past the outer window edge.
- DrawStatusBar() is a separate overlay window pinned to the bottom 22px,
drawn last so it is always on top. NoBringToDisplayFront is NOT used here
-- drawing last is sufficient and avoids interaction issues with dialogs.
- Status bar background is fully opaque (not alpha-blended) so it never
shows content behind it.
Labels and content:
- 'Peers N' replaced with 'Connected peers: N Detected peers: N'
using GetDiscoveredPeerCount().
- Mining indicator: '* Mode' instead of the 'filled circle' Unicode glyph
that renders as boxes on some Linux font configs.
- FmtAge used consistently; 'blocks deep' shortened to 'N deep' in tx list.
- Options dialog: em-dashes removed from RadioButton labels (ASCII '--').
- Removed usedY dead variable (GetCursorPosY() result was unused).
* Fix blocking bugs, dead code, pool/participant flow correctness
Bugs fixed:
StratumRecvLine blocking (main.cpp):
The participant miner's recv loop called recv() with no timeout after
select() said the socket was readable. If the server sent a partial
line (split across two TCP segments), the second recv() would block
indefinitely waiting for the rest -- the classic 'stuck asking for
work' hang even though the pool was alive and had sent data.
Fix: single non-blocking recv() pass (MSG_DONTWAIT on Linux,
FIONREAD+recv on Windows). If no complete line is in the buffer yet,
return false; the outer select() loop retries when more data arrives.
BroadcastJob holding mutex during send() (rpc.cpp):
BroadcastJob() held gMinersMutex across all SendLine() calls.
send() can block if a slow miner's TCP receive buffer is full.
With the mutex held, MinerThreadFn could not acquire it to remove a
disconnecting miner, causing a deadlock-adjacent stall: broadcast
blocked on slow miner, disconnect blocked on broadcast, new jobs
not delivered. Fix: snapshot {fd, authorised, address, extranonce2}
under the mutex, release it, then send to each fd outside the lock.
Dead code removed (rpc.cpp):
- gRpcUser, gRpcPassword: defined, never read or set by anything.
- dHashesPerSec, nHPSTimerStart: leftover Bitcoin 0.1 stubs, unused.
- IsInitialBlockDownload(): stub that returned pindexBest==NULL,
never called anywhere in this codebase.
- struct Share: declared with three fields, never instantiated.
- Duplicate comment block before payout section.
Other cleanup (main.cpp):
- STUCK_NO_JOB_TIMEOUT_SECS moved from inside the loop body to file
scope (was 'static const' inside a loop -- correct but confusing).
- pblock->print() in solo miner gated behind LogAcceptsCategory("net")
-- was unconditionally dumping a full block to stdout on every solve.
- ERROR in BitcoinMiner printf converted to LogPrint("net").
* Pool/participant: fix recv blocking, BroadcastJob mutex, listener spawn, escaped em-dash
main.cpp -- StratumRecvLine rewrite:
The previous version called recv() in a while loop -- if select() said
the socket was readable but only a partial line had arrived, the second
recv() call would block indefinitely waiting for the rest of the line.
This was the root cause of the recurring stuck-worker bug.
Rewrite: single non-blocking recv (MSG_DONTWAIT on Linux, FIONREAD+recv
on Windows). If no complete newline is in the buffer yet, return false
immediately; the outer 50ms select() loop retries when more data arrives.
This means the hash loop always stays responsive regardless of network
fragmentation.
rpc.cpp -- BroadcastJob mutex held across send():
BroadcastJob held gMinersMutex for the entire duration of sending jobs
to all connected miners. send() can block if a slow miner's TCP buffer
is full. With the mutex held, MinerThreadFn could not acquire it to
clean up a disconnecting miner, stalling the whole broadcast.
Fix: snapshot {fd, authorised, address, extranonce2} under the mutex,
release it, then send to each fd without holding any lock.
rpc.cpp -- LaunchThread failure not handled in BtfStratumAcceptOneFn:
The replacement listener thread was launched via LaunchThread() which
wraps _beginthread() but discarded the return value. If _beginthread
fails (thread limit, OOM), the listener count stayed at 1 with no thread
behind it -- that relay would get no new listener until the 30s outer
loop in BtfStratumAcceptFn fired. Fix: call _beginthread() directly,
check the return value, decrement and log on failure.
rpc.cpp -- escaped em-dash in log string:
BtfStratumAcceptFn had a literal \xe2\x80\x94 in a LogPrint format
string that survived the em-dash sweep (it was source-encoded, not a
UTF-8 byte in the file). Replaced with '--'.
* Rewrite pool server: single event loop, no per-miner threads
Replace the old architecture (one thread per connected miner + separate
JobWatcher thread + BtfStratumAcceptFn thread with listener count tracking)
with a clean two-layer design:
Accept layer (one thread per relay, AcceptOneFn):
Each relay gets exactly one persistent thread. It loops: calls blocking
RvServiceRegister (waits for a miner to knock), then BtfServiceWrap
(echan handshake), then pushes the finished plain socket to a small
lock-protected queue, then loops immediately to accept the next miner.
No listener count tracking. No replacement thread spawning. No races
around spawn failure. The relay always has exactly one pending accept.
Event loop (PoolEventLoop, runs on the ThreadRPCServer thread):
Single thread owns all connected miner sockets. Each tick:
1. Drain the accept queue -- pick up any newly-connected miners.
2. Check for a new block -- rebuild job and broadcast if so.
3. No-job watchdog -- log and retry if job is missing too long.
4. Periodic job refresh -- restamp nTime every 60s.
5. select() over all miner fds with 50ms timeout.
6. For each readable fd: non-blocking RecvLine, drain all complete
lines, dispatch each to HandleLine, collect dead fds.
7. Refresh GUI stats snapshot every 2s.
Because the event loop is the only writer to gMiners, no mutex is needed
on the miner list. The only mutexes remaining are:
- gStatsMutex: guards the GUI-visible snapshot (StatsSnapshot,
gWorkerStats, gPayoutViews) written by the event loop and read by
GUI threads via GetPoolOperatorStats/GetPoolWorkerStats/GetPendingPayouts.
- gReadyMutex: guards the accept queue between AcceptOneFn threads
and the event loop.
Other improvements in this rewrite:
- gPendingPayouts is event-loop-only (no mutex needed).
- Round share tracking lives in the event loop (roundShareCount map +
roundShareTotal counter) -- zeroed on block found, no per-miner stat
mutex needed mid-round.
- QueuePayouts takes the share snapshot as a parameter instead of
reaching into gMinerStats under a separate mutex.
- BroadcastJob no longer snapshots miners to avoid a mutex -- it runs
directly in the event loop with exclusive access to gMiners.
- AcceptOneFn backs off 30s on relay registration failure instead of
returning -- one relay going down doesn't kill the accept thread.
- No goto. No per-thread dynamic allocation for listener contexts on
each accepted connection.
* Thorough logging and correctness fixes across the full pool/participant flow
Every failure point in the operator->miner->payout chain now logs exactly
what broke, with enough context to diagnose without a debugger.
Operator side (rpc.cpp):
RebuildJob: logs 'no chain tip (pindexBest is null)' on failure instead
of silently returning false.
HandleLine:
- JSON parse errors logged with the raw line (first 80 chars)
- subscribe: logs fd and session id
- authorize: logs address, worker, and whether the address is valid
- submit: logs stale-job case with submitted vs current job id;
logs high-hash with actual hash and target values;
logs valid shares with nonce and running session count;
logs BLOCK CANDIDATE separately from BLOCK ACCEPTED/REJECTED so
a ProcessBlock failure is unambiguous
- unknown method logged (reveals miner software quirks)
- reply() logs send failures with method name
QueuePayouts: logs total payout amount, miner count, fee applied, and
how many miners were below dust threshold.
FlushMaturePayouts: logs 'insufficient funds or wallet locked?' on
SendMoney failure instead of just 'FAILED'.
BroadcastJob: logs job id and miner count on every broadcast.
Event loop: logs when each new miner socket enters the loop; logs
disconnect with session and round share counts.
No-job watchdog: RebuildJob retried every 5s (not every 50ms tick),
eliminating cs_main hammering when there is no chain tip.
AcceptLoopFn: re-polls BtfAllRelays every 60s so relays discovered
after startup are picked up; logs each new relay thread spawned.
AcceptOneFn: logs relay name on start/stop; logs BtfServiceWrap
(echan handshake) failure separately from RvServiceRegister failure.
RecvLine: disconnected out-param distinguishes 'socket closed' from
'no complete line yet', preventing incorrect disconnection on partial recv.
Participant side (main.cpp):
StratumRecvLine: same disconnected out-param fix as RecvLine in rpc.cpp.
Previously a false return could mean either 'disconnect' or 'no data yet',
causing spurious reconnects when a partial line arrived.
PoolParticipantMiner rewritten with step-by-step logging:
Step 1 resolve: logs specific failure (no descriptor vs bad format)
Step 2 tunnel: logs relay and failure reason
Step 3 address: warns explicitly if payout address cannot be determined
Step 4 subscribe/authorize: logs each send and each response
Step 5 RandomX: logs VM mode
Step 6 main loop:
- malformed mining.notify (wrong param count or short header/target)
logged with sizes instead of silently ignored
- authorize rejected: logs reason, does not disconnect (some pools
reject bad addresses but still send work)
- share accepted/rejected: logs share id and rejection reason
- unknown server method logged
- pool disconnect logged with handshake state at that moment
(gotSubscribeAck, gotAuthorizeAck, haveJob) so you know exactly
how far the connection got
- nonce space exhausted logged (was silent before)
- on exit: logs total hashes, shares sent, shares accepted
* Fix build error: ImGuiWindowFlags_NoBringToDisplayFront -> NoBringToFrontOnFocus
NoBringToDisplayFront does not exist in this version of ImGui (v1.89.x).
The correct flag is ImGuiWindowFlags_NoBringToFrontOnFocus (bit 13).
Used in two places: ##statusbar and ##main windows.
Also remove dead variable usedY (GetCursorPosY() result assigned but
never read) and replace the confusing 'ImGuiWindowFlags_NoScrollbar * 0'
expression (evaluates to 0 but looks like a mistake) with a plain 0 in
the BeginChild call.
* Remove duplicate status logging from SetParticipantMiningStatus
Every transition in PoolParticipantMiner already has a direct LogPrint
with full context (addresses, job ids, nonces, error reasons). The
LogPrint inside SetParticipantMiningStatus was firing on top of those,
producing redundant 'PoolParticipantMiner: status -> ...' lines after
every meaningful log entry. SetParticipantMiningStatus now just updates
the GUI string silently.
* Implement vardiff: stable share rate instead of fixed difficulty
Previously the pool set shareTarget = blockTarget >> 8 for every miner
forever. This meant at low network difficulty a fast miner found shares
every few nonces (dozens per second), while at high difficulty a slow
miner might go hours without one -- both are bad for fair payout
accounting and pool stability.
Pool (rpc.cpp):
Per-miner difficulty that adjusts to target one share every 15 seconds.
After every 5 shares, check actual seconds/share vs target. If the
ratio is off by more than 50% (VARDIFF_RETARGET_RATIO), recompute:
new_difficulty = current_difficulty / (actual_secs_per_share / target)
i.e. shares coming too fast -> difficulty goes up; too slow -> down.
Only apply if the change exceeds 10% to avoid jitter.
Difficulty is bounded to [0.001, 1e12].
Each miner gets their own shareTarget derived from their difficulty via
ShareTargetFromDifficulty(), which maps Stratum difficulty to a uint256
target using the Bitcoin difficulty-1 base (0x1d00ffff compact).
New difficulty is sent to the miner via mining.set_difficulty.
Participant (main.cpp):
Apply the received difficulty value from mining.set_difficulty.
Previously the handler was a no-op ('acknowledge only'); now it parses
the difficulty double and logs the change. The share target used for
comparison comes from the pool's mining.notify p[3] field, which the
pool updates after each vardiff adjustment -- this is the standard
approach and matches how cpuminer, xmrig etc. handle it.
With vardiff, share rate is roughly constant regardless of miner speed
or network difficulty. Payouts are proportional to shares submitted,
so each miner's payout accurately reflects their CPU contribution.
* Fix share target mismatch: pool rejected shares it should have accepted
Root cause: the pool put job.shareTarget (from blockTarget<<8, a fixed
per-job value) into mining.notify p[3], but checked m->shareTarget
(from ShareTargetFromDifficulty, the vardiff value) on submit. With
difficulty=1.0, ShareTargetFromDifficulty gives a much HARDER target
than blockTarget<<8, so shares that the participant thought were valid
(passed the easier notify target) were rejected by the pool (failed the
harder difficulty-1 target).
Fix: MakeNotifyParams now takes the per-miner shareTarget as an explicit
parameter. SendJob passes m->shareTarget. Both sides -- the participant
reading p[3] and HandleLine checking m->shareTarget on submit -- now use
exactly the same value. Single source of truth.
Cleanup:
- Remove shareTarget field from StratumJob (was only set, never read
after the MakeNotifyParams call was fixed).
- Remove MakeShareTarget() function (was only used to populate that
now-dead field).
- Participant set_difficulty log: 'initial' vs 'updated' instead of
'unchanged' (first connect sends 1.0 which matches the default 1.0,
so it was misleadingly logged as 'unchanged').
* Fix double broadcast, correct block reward calculation, improve payout log
Double broadcast (event loop vs HandleLine):
When a pool miner finds a block, HandleLine calls RebuildJob() +
BroadcastJob(true) immediately. The event loop then detects
nBestHeight changed (step 2) and was calling RebuildJob() +
BroadcastJob(true) again -- miners received duplicate job broadcasts.
Fix: step 2 now checks gHaveJob before rebuilding. If HandleLine
already built and broadcast a job for this height (gHaveJob=true),
step 2 just logs 'job already broadcast by submit handler' and skips.
If the block came from an external peer (not our miner), gHaveJob is
false and step 2 handles it as before.
Block reward calculation in QueuePayouts:
Was calling CBlock().GetBlockValue(0) on an empty block object.
GetBlockValue uses nBestHeight globally, which by the time QueuePayouts
runs has already been incremented to the height AFTER the found block.
Fix: compute subsidy directly as '50 COIN >> (blockHeight / 210000)'
using the actual found height. At current scale this makes no difference
(same subsidy for thousands of blocks) but is now correct by construction.
Payout log now shows:
- Full block subsidy
- Miner share after fee
- Operator fee amount in BTF (not just percentage)
- Number of recipients, maturity height, dust-filtered count
Example: '[payout] block 2096: subsidy 50.00 BTF, miners get 49.00
(fee 2.00% = 1.00 to operator), 3 recipients, matures height 2196'
* Fix 6 bugs found in full flow re-read
Bug 1 -- Double broadcast (re-applied fix that was lost):
When HandleLine accepted a block it called RebuildJob()+BroadcastJob(true).
The event loop then detected nBestHeight changed and did it again. Miners
received two back-to-back mining.notify clean=true, wasting their work.
Fix: step 2 of event loop checks gHaveJob before rebuilding. If HandleLine
already built a fresh job (gHaveJob=true), step 2 just logs and skips.
Bug 3 -- Disconnect log showed global totals, not session totals:
gParticipantSharesSent/Accepted accumulate since node start, not since the
last connect. Added sessionSharesSent/sessionSharesAccepted local counters
that reset each time PoolParticipantMiner() is called.
Bug 4 -- Dead function ParticipantShareTargetFromDiff (main.cpp):
Defined but never called anywhere. Removed.
Bug 5 -- Invalid-address miner shares silently burned:
If a miner authorized with an invalid address, their share of the block
reward was neither paid out nor logged -- it just vanished. QueuePayouts
now validates addresses up front, logs the forfeited amount explicitly
('X BTF forfeited (bad address)'), and excludes those entries so the
payout log is accurate.
Bug 6 -- SendMoney called from event loop (stalls miner I/O):
FlushMaturePayouts called SendMoney which takes cs_main. If the P2P
thread held cs_main (processing a block), the event loop would stall
for seconds, causing all connected miners to time out waiting for
responses. Fix: FlushMaturePayouts now only moves matured entries to
gPayoutExecQueue (fast, no locks except a brief mutex). A new
PayoutThreadFn thread drains the queue and calls SendMoney
independently, so the event loop is never blocked by wallet I/O.
Bug 7 -- Dead goto + dead HandleLine return-false path:
HandleLine always returns true; the goto next_miner path was never
reached. Removed goto and simplified the select drain loop.
* Fix share-target scale mismatch and dead pool hashrate reporting
- ShareTargetFromDifficulty() based Stratum difficulty 1 on Bitcoin's
SHA256 diff-1 constant (0x1d00ffff, ~2^32 hashes/share) instead of
this chain's actual PoW floor (bnProofOfWorkLimit = ~uint256(0)>>12,
~2^12 hashes/share). That's a ~2^20 (~1,048,576x) mismatch: at the
supposedly-easy difficulty of 1.0, workers were being asked for
shares roughly a million times harder than the chain's own easiest
target. Vardiff never gets a chance to correct this because it only
retargets after real shares come in, and none were coming in. Fixed
by basing the diff-1 reference on bnProofOfWorkLimit instead.
- Pool hashrate was never computed anywhere despite the data (per-miner
difficulty + share timing) being available: ThreadBtfPoolAnnouncer in
nostr.cpp hardcoded ann.hashRate = 0.0, PoolWorkerStatView had no
hashrate field, and the GUI workers table had no column for it.
Added an EWMA hashrate estimate per miner (updated on each accepted
share from expected-hashes-at-difficulty / time-since-last-share),
threaded it through GetPoolOperatorStats/GetPoolWorkerStats, the pool
announcement payload, and the GUI (new Hashrate column + totals in
the telemetry line).
Verified: full clean build via src/Makefile (secp256k1 + RandomX deps
built from source, g++ 13, all four touched files compile and link).
* Remove stale wxWidgets-era build files and orphaned assets
These predate the ImGui/GLFW migration (83af065) and are dead weight:
- src/makefile.linux, build-linux.sh: superseded by src/Makefile +
root Makefile (make linux). The old ones reference obj/uibase.o and
obj/ui.o, which don't exist -- they never worked post-migration.
- src/makefile.vc: MSVC build for the old wx UI (obj\ui.obj,
obj\uibase.obj, obj\irc.obj) -- irc.cpp doesn't even exist anymore,
and nothing invokes this makefile. Windows builds go through
makefile.mingw via the root Makefile's target.
- src/ui.rc, src/uiproject.fbp: wxFormBuilder project/resource files
for the old wx UI. The current Windows resource file is bitflash.rc.
- src/rc/{addressbook,send}*.bmp, check.ico, bitcoin_bc_original.ico:
icons used only by the old wx UI. bitcoin.ico (used by bitflash.rc)
is kept.
Verified nothing includes uibase.h/ui.h/irc.h anywhere, and did a full
clean rebuild afterward (secp256k1 + RandomX from source, src/Makefile)
to confirm removal doesn't break the real build.
* Mine with RandomX fast (2GB dataset) mode instead of light mode forever
RandomXInitDataset() was fully implemented and ready to switch mining
into fast mode, but nothing ever called it -- not in PoolParticipantMiner()
(pool worker), not in the solo BitcoinMiner() loop. RandomXCreateMinerVM()
falls back to light mode whenever the dataset isn't built, so every miner,
participant or solo, has always been hashing in light/cache-only mode.
Light mode exists for cheap single-hash verification (which is why the
pool's own share verification correctly stays on it) -- it recomputes
dataset items on the fly for every hash, which is dramatically slower
than fast mode's direct dataset lookups. Combined with the share-target
scale bug fixed in e87a905, this compounds into exactly the symptom
reported: a participant sitting there hashing for many minutes per share
instead of the vardiff-targeted ~15s, even after the target fix landed.
Fix: build the ~2GB dataset once (multi-threaded, sized to
hardware_concurrency) before mining starts, in both the participant and
solo paths, so RandomXCreateMinerVM() actually gets to use fast mode.
Verified: full clean rebuild via src/Makefile.
* Add vardiff stall watchdog: force difficulty down on zero shares, not just share count
ShareTargetFromDifficulty already fixed the diff-1 scale mismatch (chain
floor vs Bitcoin's SHA256 diff-1), so difficulty 1 correctly means ~4096
expected hashes on this chain, not ~2^32. That part was already correct.
But the normal vardiff retarget in HandleLine only runs after
VARDIFF_SHARES_PER_CHECK (5) shares arrive. A miner that never finds even
one share -- e.g. stuck in RandomX light/cache mode instead of the fast
2GB dataset, or just slower hardware than the target assumes -- never
reaches that check, so it can sit at its initial/current difficulty
indefinitely with vardiff having no samples to act on.
Add a time-based fallback in PoolEventLoop: if a miner's vardiff window
has been open for VARDIFF_STALL_SECS (90s, 6x the 15s target) with zero
shares, force difficulty down by VARDIFF_STALL_CUT (4x) regardless of
share count, and re-notify via mining.set_difficulty. Once a miner is
already at VARDIFF_MIN, log it plainly as a hashrate/connectivity issue
instead of a difficulty issue, so it's not confused with the same-looking
but different problem this was actually fixed for before.
* Fix PrintException rethrow killing the whole node on any transient exception
The uploaded participant log shows the real bug behind the mining stalls:
the node process itself was dying and restarting from scratch every
minute or two ('UNKNOWN EXCEPTION ... in ThreadMessageHandler()' /
'ThreadSocketHandler()'), wiping the RandomX dataset/cache and losing all
progress toward a share -- not a difficulty problem.
Every background thread (ThreadMessageHandler, ThreadSocketHandler,
ThreadBtfConnect, the Nostr helpers) wraps its real work in a
'try { Foo2() } catch(...) { log, sleep 5s, loop again }' self-healing
retry pattern specifically so one bad exception doesn't take the whole
node down. But PrintException(), called from inside every one of those
catch blocks, ended with 'if (!fShutdown) throw;' -- re-throwing the just-
caught exception during ordinary operation. Nothing above the retry loop
catches it, so it escapes the thread and std::terminate()s the entire
process on the very first transient error (a flaky relay connect, a
malformed message, whatever). The comment's intent (suppress noise while
already shutting down) was inverted from what the surrounding retry loops
actually need.
Removed the rethrow. Threads now log the exception and let their own
retry loop handle it, as designed.
* Push a fresh job immediately after any difficulty change, not just on next broadcast
mining.set_difficulty alone doesn't change what the worker actually hashes
against -- the participant only reads its share target from
mining.notify's params[3] (see main.cpp's mining.notify handler); the
set_difficulty message just updates a locally-logged currentDifficulty
value. So both the normal vardiff retarget (in HandleLine, on 5 shares)
and the new stall watchdog were updating m->shareTarget and telling the
worker about the new difficulty, but the worker kept hashing against its
old target until the next natural job broadcast -- a new block, or the
60s trickle refresh. That could delay any difficulty correction by up to
a minute for no reason.
Call SendJob(m, false) right after each set_difficulty send so the
updated shareTarget reaches the worker in the very next tick instead of
waiting on the next unrelated broadcast.
* Build RandomX dataset before stratum handshake, not after
Worker was sending mining.subscribe/authorize, then blocking for the
duration of the synchronous ~2GB RandomX dataset build, and only then
reading the socket. The pool's replies (subscribe ack, authorize ack,
set_difficulty, first job) sat unread in the OS receive buffer for that
entire window -- nothing was lost, but with the build taking anywhere
from seconds to a couple minutes depending on core count, the worker
looked and logged as permanently stuck on 'waiting for pool response'
when it just wasn't listening yet.
Move the dataset build ahead of the subscribe/authorize sends so the
socket is actively being read the moment the pool replies. Also add
missing RandomXDestroyMinerVM cleanup on the two early-return paths
that now happen after VM creation.
* Reset round shares on externally-found blocks, not just our own
Round shares were only cleared in HandleLine() after our own miner's
block got accepted. When the chain height advanced because someone
else found the block, the main loop rebuilt the job but left
roundShareCount/roundShareTotal/Miner::roundShares untouched, so they
kept accumulating across rounds instead of resetting.
* Show pool hashrate in participant view; show immature coinbase value with maturity countdown
* Persist pending payouts to disk -- survive operator restarts
* Fix log escapes, stall timeout 90->45s, save-before-exec ordering, Immature tx status
* Sort transactions by nTimeReceived not chain median time -- new txs always on top
* Sort txs by chain depth not nTimeReceived -- survives resync, unconfirmed always first
* Fix orphan block false-positive payout; meaningful tx status instead of raw depth
* Show Orphaned status in red for orphaned coinbases; distinguish from genuinely unconfirmed
---------
Co-authored-by: Vic-Nas <nasci.victorio@gmail.com>
Co-authored-by: Bitflash Pool Dev <pool@bitflash>
Co-authored-by: Victorio Nascimento <155357371+Vic-Nas@users.noreply.github.com>
Co-authored-by: Claude <claude@anthropic.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile | 4 | ||||
| -rw-r--r-- | src/btfrv.cpp | 4 | ||||
| -rw-r--r-- | src/db.cpp | 97 | ||||
| -rw-r--r-- | src/db.h | 15 | ||||
| -rw-r--r-- | src/gui.cpp | 701 | ||||
| -rw-r--r-- | src/headers.h | 2 | ||||
| -rw-r--r-- | src/headers_core.h | 5 | ||||
| -rw-r--r-- | src/irc.cpp | 271 | ||||
| -rw-r--r-- | src/irc.h | 7 | ||||
| -rw-r--r-- | src/main.cpp | 631 | ||||
| -rw-r--r-- | src/main.h | 23 | ||||
| -rw-r--r-- | src/main_gui.cpp | 4 | ||||
| -rw-r--r-- | src/makefile.linux | 55 | ||||
| -rw-r--r-- | src/makefile.mingw | 4 | ||||
| -rw-r--r-- | src/makefile.vc | 77 | ||||
| -rw-r--r-- | src/net.cpp | 391 | ||||
| -rw-r--r-- | src/net.h | 31 | ||||
| -rw-r--r-- | src/nostr.cpp | 518 | ||||
| -rw-r--r-- | src/nostr.h | 26 | ||||
| -rw-r--r-- | src/rc/addressbook16.bmp | bin | 1334 -> 0 bytes | |||
| -rw-r--r-- | src/rc/addressbook16mask.bmp | bin | 126 -> 0 bytes | |||
| -rw-r--r-- | src/rc/addressbook20.bmp | bin | 1478 -> 0 bytes | |||
| -rw-r--r-- | src/rc/addressbook20mask.bmp | bin | 142 -> 0 bytes | |||
| -rw-r--r-- | src/rc/bitcoin_bc_original.ico | bin | 22486 -> 0 bytes | |||
| -rw-r--r-- | src/rc/check.ico | bin | 766 -> 0 bytes | |||
| -rw-r--r-- | src/rc/send16.bmp | bin | 1334 -> 0 bytes | |||
| -rw-r--r-- | src/rc/send16mask.bmp | bin | 126 -> 0 bytes | |||
| -rw-r--r-- | src/rc/send16masknoshadow.bmp | bin | 126 -> 0 bytes | |||
| -rw-r--r-- | src/rc/send20.bmp | bin | 1478 -> 0 bytes | |||
| -rw-r--r-- | src/rc/send20mask.bmp | bin | 142 -> 0 bytes | |||
| -rw-r--r-- | src/rpc.cpp | 1544 | ||||
| -rw-r--r-- | src/ui.rc | 14 | ||||
| -rw-r--r-- | src/uiproject.fbp | 11825 | ||||
| -rw-r--r-- | src/util.cpp | 108 | ||||
| -rw-r--r-- | src/util.h | 42 |
35 files changed, 2647 insertions, 13752 deletions
diff --git a/src/Makefile b/src/Makefile index 3280fd3..c0b6e1d 100644 --- a/src/Makefile +++ b/src/Makefile | |||
| @@ -21,14 +21,14 @@ LIBS = -L$(SECP_LIB) -lsecp256k1 \ | |||
| 21 | -lglfw -lGL | 21 | -lglfw -lGL |
| 22 | 22 | ||
| 23 | HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ | 23 | HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ |
| 24 | key.h bignum.h script.h db.h base58.h net.h irc.h nostr.h \ | 24 | key.h bignum.h script.h db.h base58.h net.h nostr.h \ |
| 25 | randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h compat.h | 25 | randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h compat.h |
| 26 | 26 | ||
| 27 | IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \ | 27 | IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \ |
| 28 | obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o | 28 | obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o |
| 29 | 29 | ||
| 30 | NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ | 30 | NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ |
| 31 | obj/market.o obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ | 31 | obj/market.o obj/sha.o obj/nostr.o obj/randomx_pow.o \ |
| 32 | obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o | 32 | obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o |
| 33 | 33 | ||
| 34 | GUI_OBJS = obj/gui.o obj/main_gui.o | 34 | GUI_OBJS = obj/gui.o obj/main_gui.o |
diff --git a/src/btfrv.cpp b/src/btfrv.cpp index 812d077..0d02ca8 100644 --- a/src/btfrv.cpp +++ b/src/btfrv.cpp | |||
| @@ -101,7 +101,7 @@ static SOCKET ConnectTo(const char* host, unsigned short port) | |||
| 101 | 101 | ||
| 102 | // Apply a short timeout only for the connect() and initial handshake so an | 102 | // Apply a short timeout only for the connect() and initial handshake so an |
| 103 | // unresponsive relay doesn't block the thread. Once the tunnel is live the | 103 | // unresponsive relay doesn't block the thread. Once the tunnel is live the |
| 104 | // timeout is cleared — a forwarding pipe must block indefinitely on recv(). | 104 | // timeout is cleared -- a forwarding pipe must block indefinitely on recv(). |
| 105 | #ifdef _WIN32 | 105 | #ifdef _WIN32 |
| 106 | DWORD tvShort = 10000; | 106 | DWORD tvShort = 10000; |
| 107 | setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tvShort, sizeof(tvShort)); | 107 | setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tvShort, sizeof(tvShort)); |
| @@ -118,7 +118,7 @@ static SOCKET ConnectTo(const char* host, unsigned short port) | |||
| 118 | } | 118 | } |
| 119 | freeaddrinfo(res); | 119 | freeaddrinfo(res); |
| 120 | 120 | ||
| 121 | // Clear the timeout — the socket is now a live tunnel and must not | 121 | // Clear the timeout -- the socket is now a live tunnel and must not |
| 122 | // time out when idle. recv() will block until data arrives or peer closes. | 122 | // time out when idle. recv() will block until data arrives or peer closes. |
| 123 | #ifdef _WIN32 | 123 | #ifdef _WIN32 |
| 124 | DWORD tvOff = 0; | 124 | DWORD tvOff = 0; |
| @@ -392,77 +392,8 @@ bool CTxDB::LoadBlockIndex() | |||
| 392 | 392 | ||
| 393 | 393 | ||
| 394 | 394 | ||
| 395 | // | 395 | // Legacy IP-based peer address database (CAddrDB / addr.dat) removed -- |
| 396 | // CAddrDB | 396 | // peer discovery is entirely Nostr/.btf-based now. |
| 397 | // | ||
| 398 | |||
| 399 | bool CAddrDB::WriteAddress(const CAddress& addr) | ||
| 400 | { | ||
| 401 | return Write(make_pair(string("addr"), addr.GetKey()), addr); | ||
| 402 | } | ||
| 403 | |||
| 404 | bool CAddrDB::LoadAddresses() | ||
| 405 | { | ||
| 406 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 407 | { | ||
| 408 | // Load user provided addresses | ||
| 409 | CAutoFile filein = fopen("addr.txt", "rt"); | ||
| 410 | if (filein) | ||
| 411 | { | ||
| 412 | try | ||
| 413 | { | ||
| 414 | char psz[1000]; | ||
| 415 | while (fgets(psz, sizeof(psz), filein)) | ||
| 416 | { | ||
| 417 | CAddress addr(psz, NODE_NETWORK); | ||
| 418 | if (addr.ip != 0) | ||
| 419 | AddAddress(*this, addr); | ||
| 420 | } | ||
| 421 | } | ||
| 422 | catch (...) { } | ||
| 423 | } | ||
| 424 | |||
| 425 | // Get cursor | ||
| 426 | Dbc* pcursor = GetCursor(); | ||
| 427 | if (!pcursor) | ||
| 428 | return false; | ||
| 429 | |||
| 430 | loop | ||
| 431 | { | ||
| 432 | // Read next record | ||
| 433 | CDataStream ssKey; | ||
| 434 | CDataStream ssValue; | ||
| 435 | int ret = ReadAtCursor(pcursor, ssKey, ssValue); | ||
| 436 | if (ret == DB_NOTFOUND) | ||
| 437 | break; | ||
| 438 | else if (ret != 0) | ||
| 439 | return false; | ||
| 440 | |||
| 441 | // Unserialize | ||
| 442 | string strType; | ||
| 443 | ssKey >> strType; | ||
| 444 | if (strType == "addr") | ||
| 445 | { | ||
| 446 | CAddress addr; | ||
| 447 | ssValue >> addr; | ||
| 448 | mapAddresses.insert(make_pair(addr.GetKey(), addr)); | ||
| 449 | } | ||
| 450 | } | ||
| 451 | |||
| 452 | //// debug print | ||
| 453 | printf("mapAddresses:\n"); | ||
| 454 | foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses) | ||
| 455 | item.second.print(); | ||
| 456 | printf("-----\n"); | ||
| 457 | } | ||
| 458 | |||
| 459 | return true; | ||
| 460 | } | ||
| 461 | |||
| 462 | bool LoadAddresses() | ||
| 463 | { | ||
| 464 | return CAddrDB("cr+").LoadAddresses(); | ||
| 465 | } | ||
| 466 | 397 | ||
| 467 | 398 | ||
| 468 | 399 | ||
| @@ -563,24 +494,28 @@ bool CWalletDB::LoadWallet(vector<unsigned char>& vchDefaultKeyRet) | |||
| 563 | { | 494 | { |
| 564 | string strKey; | 495 | string strKey; |
| 565 | ssKey >> strKey; | 496 | ssKey >> strKey; |
| 566 | if (strKey == "fGenerateBitcoins") ssValue >> fGenerateBitcoins; | ||
| 567 | if (strKey == "nTransactionFee") ssValue >> nTransactionFee; | 497 | if (strKey == "nTransactionFee") ssValue >> nTransactionFee; |
| 568 | if (strKey == "addrIncoming") ssValue >> addrIncoming; | 498 | if (strKey == "addrIncoming") ssValue >> addrIncoming; |
| 569 | if (strKey == "nMineMode") ssValue >> nMineMode; | 499 | // Mining-mode/pool settings (nMineMode, strParticipantPool, strPoolName, |
| 570 | if (strKey == "strParticipantPool") ssValue >> strParticipantPool; | 500 | // strPoolDashboardUrl, dPoolFeePercent, fGenerateBitcoins) are intentionally |
| 571 | if (strKey == "strPoolName") ssValue >> strPoolName; | 501 | // NOT restored here. They used to be, and LoadWallet() runs after CLI flags |
| 572 | if (strKey == "strPoolDashboardUrl") ssValue >> strPoolDashboardUrl; | 502 | // are parsed in main_gui.cpp, so a saved value would silently overwrite |
| 573 | if (strKey == "dPoolFeePercent") ssValue >> dPoolFeePercent; | 503 | // whatever was just requested on the command line or in a previous Options |
| 504 | // session -- no error, no log line. That's what caused pool name/address to | ||
| 505 | // show correctly in the UI but stay stale in the logs, and mode to change | ||
| 506 | // behavior across restarts. Mode/pool config is decided fresh every launch | ||
| 507 | // instead: CLI flags if given, otherwise the compiled-in default. Nothing to | ||
| 508 | // go stale, nothing to fight over load order. | ||
| 574 | } | 509 | } |
| 575 | } | 510 | } |
| 576 | } | 511 | } |
| 577 | 512 | ||
| 578 | printf("fGenerateBitcoins = %d\n", fGenerateBitcoins); | ||
| 579 | printf("nTransactionFee = %lld\n", nTransactionFee); | 513 | printf("nTransactionFee = %lld\n", nTransactionFee); |
| 580 | printf("addrIncoming = %s\n", addrIncoming.ToString().c_str()); | 514 | printf("addrIncoming = %s\n", addrIncoming.ToString().c_str()); |
| 581 | printf("nMineMode = %d, strParticipantPool = %s\n", nMineMode, strParticipantPool.c_str()); | 515 | printf("nMineMode = %d, strParticipantPool = %s, fGenerateBitcoins = %d (from CLI/default, not wallet.dat)\n", |
| 582 | printf("strPoolName = %s, dPoolFeePercent = %.2f\n", strPoolName.c_str(), dPoolFeePercent); | 516 | nMineMode, strParticipantPool.c_str(), fGenerateBitcoins); |
| 583 | printf("strPoolDashboardUrl = %s\n", strPoolDashboardUrl.c_str()); | 517 | printf("strPoolName = %s, dPoolFeePercent = %.2f, strPoolDashboardUrl = %s (from CLI/default, not wallet.dat)\n", |
| 518 | strPoolName.c_str(), dPoolFeePercent, strPoolDashboardUrl.c_str()); | ||
| 584 | 519 | ||
| 585 | return true; | 520 | return true; |
| 586 | } | 521 | } |
| @@ -316,19 +316,8 @@ private: | |||
| 316 | 316 | ||
| 317 | 317 | ||
| 318 | 318 | ||
| 319 | class CAddrDB : public CDB | 319 | // Legacy IP-based peer address database (CAddrDB / addr.dat) removed -- |
| 320 | { | 320 | // peer discovery is entirely Nostr/.btf-based now. |
| 321 | public: | ||
| 322 | CAddrDB(const char* pszMode="r+", bool fTxn=false) : CDB("addr.dat", pszMode, fTxn) { } | ||
| 323 | private: | ||
| 324 | CAddrDB(const CAddrDB&); | ||
| 325 | void operator=(const CAddrDB&); | ||
| 326 | public: | ||
| 327 | bool WriteAddress(const CAddress& addr); | ||
| 328 | bool LoadAddresses(); | ||
| 329 | }; | ||
| 330 | |||
| 331 | bool LoadAddresses(); | ||
| 332 | 321 | ||
| 333 | 322 | ||
| 334 | 323 | ||
diff --git a/src/gui.cpp b/src/gui.cpp index 2210296..a1a0698 100644 --- a/src/gui.cpp +++ b/src/gui.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Bitflash GUI — ImGui + GLFW + OpenGL3 | 1 | // Bitflash GUI -- ImGui + GLFW + OpenGL3 |
| 2 | // Same source on Linux and Windows. No platform ifdefs. | 2 | // Same source on Linux and Windows. No platform ifdefs. |
| 3 | 3 | ||
| 4 | #include "imgui/imgui.h" | 4 | #include "imgui/imgui.h" |
| @@ -25,6 +25,7 @@ extern std::string strParticipantPool; | |||
| 25 | extern CAddress addrLocalHost; | 25 | extern CAddress addrLocalHost; |
| 26 | 26 | ||
| 27 | void MainFrameRepaint(); | 27 | void MainFrameRepaint(); |
| 28 | int GetDiscoveredPeerCount(); | ||
| 28 | string DateTimeStr(int64 nTime); | 29 | string DateTimeStr(int64 nTime); |
| 29 | bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew); | 30 | bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew); |
| 30 | int64 GetBalance(); | 31 | int64 GetBalance(); |
| @@ -34,15 +35,20 @@ void ThreadBitcoinMiner(void*); | |||
| 34 | void ThreadRPCServer(void*); | 35 | void ThreadRPCServer(void*); |
| 35 | 36 | ||
| 36 | // --------------------------------------------------------------------------- | 37 | // --------------------------------------------------------------------------- |
| 37 | // State | 38 | // Layout constants |
| 39 | // --------------------------------------------------------------------------- | ||
| 40 | static const float STATUS_BAR_H = 22.0f; | ||
| 41 | |||
| 42 | // --------------------------------------------------------------------------- | ||
| 43 | // GUI state | ||
| 38 | // --------------------------------------------------------------------------- | 44 | // --------------------------------------------------------------------------- |
| 39 | static std::string g_myAddress; | 45 | static std::string g_myAddress; |
| 40 | static int64 g_balance = 0; | 46 | static int64 g_balance = 0; |
| 41 | static int64 g_lastWalletRefresh = 0; | 47 | static int64 g_lastWalletRefresh = 0; |
| 42 | static bool g_showSend = false; | 48 | static bool g_showSend = false; |
| 43 | static bool g_showOptions = false; | 49 | static bool g_showOptions = false; |
| 44 | static bool g_showAbout = false; | 50 | static bool g_showAbout = false; |
| 45 | static bool g_needRefresh = true; | 51 | static bool g_needRefresh = true; |
| 46 | 52 | ||
| 47 | static char g_sendAddr[128] = {}; | 53 | static char g_sendAddr[128] = {}; |
| 48 | static char g_sendAmount[32] = {}; | 54 | static char g_sendAmount[32] = {}; |
| @@ -73,36 +79,34 @@ static std::string FmtMoney(int64 n) | |||
| 73 | static std::string FmtAge(int64 createdAt) | 79 | static std::string FmtAge(int64 createdAt) |
| 74 | { | 80 | { |
| 75 | int64 age = GetTime() - createdAt; | 81 | int64 age = GetTime() - createdAt; |
| 76 | if (age < 0) | 82 | if (age < 0) age = 0; |
| 77 | age = 0; | 83 | if (age < 60) return strprintf("%llds", (long long)age); |
| 78 | if (age < 60) | 84 | if (age < 3600) return strprintf("%lldm", (long long)(age / 60)); |
| 79 | return strprintf("%llds", (long long)age); | 85 | return strprintf("%lldh", (long long)(age / 3600)); |
| 80 | if (age < 3600) | ||
| 81 | return strprintf("%lldm", (long long)(age / 60)); | ||
| 82 | return strprintf("%lldh", (long long)(age / 3600)); | ||
| 83 | } | 86 | } |
| 84 | 87 | ||
| 85 | static ImVec4 ParticipantStatusColor(const std::string& status) | 88 | static ImVec4 StatusColor(const std::string& s) |
| 86 | { | 89 | { |
| 87 | if (status.find("failed") != std::string::npos || | 90 | if (s.find("failed") != std::string::npos || |
| 88 | status.find("rejected") != std::string::npos || | 91 | s.find("rejected") != std::string::npos || |
| 89 | status.find("stopped") != std::string::npos) | 92 | s.find("stopped") != std::string::npos) |
| 90 | return ImVec4(1.0f, 0.38f, 0.38f, 1.0f); | 93 | return ImVec4(1.0f, 0.38f, 0.38f, 1.0f); // red |
| 91 | if (status.find("hashing") != std::string::npos || | 94 | if (s.find("hashing") != std::string::npos || |
| 92 | status.find("accepted") != std::string::npos || | 95 | s.find("accepted") != std::string::npos || |
| 93 | status.find("connected") != std::string::npos) | 96 | s.find("connected")!= std::string::npos) |
| 94 | return ImVec4(0.35f, 1.0f, 0.45f, 1.0f); | 97 | return ImVec4(0.35f, 1.0f, 0.45f, 1.0f); // green |
| 95 | if (status.find("asking") != std::string::npos || | 98 | if (s.find("asking") != std::string::npos || |
| 96 | status.find("authoriz") != std::string::npos || | 99 | s.find("authoriz") != std::string::npos || |
| 97 | status.find("subscrib") != std::string::npos) | 100 | s.find("subscrib") != std::string::npos) |
| 98 | return ImVec4(1.0f, 0.75f, 0.25f, 1.0f); | 101 | return ImVec4(1.0f, 0.75f, 0.25f, 1.0f); // amber |
| 99 | return ImVec4(0.55f, 0.80f, 1.0f, 1.0f); | 102 | return ImVec4(0.55f, 0.80f, 1.0f, 1.0f); // blue-grey |
| 100 | } | 103 | } |
| 101 | 104 | ||
| 102 | static std::string PoolLabel(const BtfPoolAnnouncement& ann) | 105 | static std::string PoolLabel(const BtfPoolAnnouncement& ann) |
| 103 | { | 106 | { |
| 104 | std::ostringstream o; | 107 | std::ostringstream o; |
| 105 | o << ann.poolName << " - " << std::fixed << std::setprecision(2) << ann.feePercent << "%"; | 108 | o << ann.poolName << " - " |
| 109 | << std::fixed << std::setprecision(2) << ann.feePercent << "%"; | ||
| 106 | if (ann.connectedMiners > 0) | 110 | if (ann.connectedMiners > 0) |
| 107 | o << " - " << ann.connectedMiners << " miners"; | 111 | o << " - " << ann.connectedMiners << " miners"; |
| 108 | return o.str(); | 112 | return o.str(); |
| @@ -118,19 +122,47 @@ static void RefreshWallet() | |||
| 118 | g_txRows.clear(); | 122 | g_txRows.clear(); |
| 119 | TRY_CRITICAL_BLOCK(cs_mapWallet) | 123 | TRY_CRITICAL_BLOCK(cs_mapWallet) |
| 120 | { | 124 | { |
| 121 | std::vector<std::pair<int64,uint256>> vs; | 125 | // Sort: unconfirmed first (depth 0), then by depth ascending (least |
| 122 | for (auto& kv : mapWallet) vs.push_back({kv.second.GetTxTime(), kv.first}); | 126 | // deep = most recent). We can't use nTimeReceived because a node |
| 123 | std::sort(vs.rbegin(), vs.rend()); | 127 | // resync re-stamps all txs with the same time. Depth is always correct. |
| 128 | std::vector<std::pair<int,uint256>> vs; | ||
| 129 | for (auto& kv : mapWallet) | ||
| 130 | vs.push_back({kv.second.GetDepthInMainChain(), kv.second.GetHash()}); | ||
| 131 | std::sort(vs.begin(), vs.end(), | ||
| 132 | [](const std::pair<int,uint256>& a, const std::pair<int,uint256>& b) { | ||
| 133 | return a.first < b.first; // 0 (unconfirmed) first, then shallowest | ||
| 134 | }); | ||
| 124 | for (auto& sv : vs) { | 135 | for (auto& sv : vs) { |
| 125 | auto mi = mapWallet.find(sv.second); | 136 | auto mi = mapWallet.find(sv.second); |
| 126 | if (mi == mapWallet.end()) continue; | 137 | if (mi == mapWallet.end()) continue; |
| 127 | CWalletTx& wtx = mi->second; | 138 | CWalletTx& wtx = mi->second; |
| 128 | int64 net = wtx.GetCredit() - wtx.GetDebit(); | 139 | int depth = wtx.GetDepthInMainChain(); |
| 129 | int depth = wtx.GetDepthInMainChain(); | 140 | int toMature = wtx.IsCoinBase() ? wtx.GetBlocksToMaturity() : 0; |
| 141 | // An orphaned coinbase has hashBlock set but depth=0 (block not in main chain). | ||
| 142 | // A genuinely unconfirmed tx has hashBlock==0. | ||
| 143 | bool isOrphaned = wtx.IsCoinBase() && wtx.hashBlock != 0 && depth == 0; | ||
| 144 | int64 net; | ||
| 130 | std::string desc; | 145 | std::string desc; |
| 131 | if (wtx.IsCoinBase()) desc = depth<1 ? "Generated (unconfirmed)" : "Generated"; | 146 | if (wtx.IsCoinBase()) { |
| 132 | else if (wtx.GetDebit() > 0) desc = "Sent"; | 147 | if (isOrphaned) { |
| 133 | else desc = "Received"; | 148 | net = 0; |
| 149 | desc = "Generated (orphaned -- block not in main chain)"; | ||
| 150 | } else if (toMature > 0) { | ||
| 151 | net = wtx.GetValueOut(); | ||
| 152 | char buf[64]; | ||
| 153 | snprintf(buf, sizeof(buf), "Generated (matures in %d blocks)", toMature); | ||
| 154 | desc = buf; | ||
| 155 | } else { | ||
| 156 | net = wtx.GetCredit() - wtx.GetDebit(); | ||
| 157 | desc = depth < 1 ? "Generated (unconfirmed)" : "Generated"; | ||
| 158 | } | ||
| 159 | } else if (wtx.GetDebit() > 0) { | ||
| 160 | net = wtx.GetCredit() - wtx.GetDebit(); | ||
| 161 | desc = "Sent"; | ||
| 162 | } else { | ||
| 163 | net = wtx.GetCredit() - wtx.GetDebit(); | ||
| 164 | desc = "Received"; | ||
| 165 | } | ||
| 134 | g_txRows.push_back({DateTimeStr(wtx.GetTxTime()), desc, net, depth}); | 166 | g_txRows.push_back({DateTimeStr(wtx.GetTxTime()), desc, net, depth}); |
| 135 | } | 167 | } |
| 136 | } | 168 | } |
| @@ -149,18 +181,103 @@ string DateTimeStr(int64 nTime) | |||
| 149 | } | 181 | } |
| 150 | 182 | ||
| 151 | // --------------------------------------------------------------------------- | 183 | // --------------------------------------------------------------------------- |
| 184 | // Status bar -- separate fullscreen-width overlay pinned to bottom edge. | ||
| 185 | // Drawn last so it always sits on top of everything else. | ||
| 186 | // --------------------------------------------------------------------------- | ||
| 187 | static void DrawStatusBar() | ||
| 188 | { | ||
| 189 | ImGuiIO& io = ImGui::GetIO(); | ||
| 190 | ImGui::SetNextWindowPos(ImVec2(0.0f, io.DisplaySize.y - STATUS_BAR_H)); | ||
| 191 | ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, STATUS_BAR_H)); | ||
| 192 | ImGui::SetNextWindowBgAlpha(1.0f); | ||
| 193 | ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(10.0f, 3.0f)); | ||
| 194 | ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); | ||
| 195 | ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); | ||
| 196 | ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.13f, 0.13f, 0.13f, 1.0f)); | ||
| 197 | ImGui::Begin("##statusbar", nullptr, | ||
| 198 | ImGuiWindowFlags_NoTitleBar | | ||
| 199 | ImGuiWindowFlags_NoResize | | ||
| 200 | ImGuiWindowFlags_NoMove | | ||
| 201 | ImGuiWindowFlags_NoScrollbar | | ||
| 202 | ImGuiWindowFlags_NoScrollWithMouse| | ||
| 203 | ImGuiWindowFlags_NoSavedSettings | | ||
| 204 | ImGuiWindowFlags_NoBringToFrontOnFocus); | ||
| 205 | ImGui::PopStyleVar(3); | ||
| 206 | ImGui::PopStyleColor(); | ||
| 207 | |||
| 208 | int connected = (int)vNodes.size(); | ||
| 209 | int discovered = GetDiscoveredPeerCount(); | ||
| 210 | |||
| 211 | if (nMineMode == MINE_PARTICIPANT) { | ||
| 212 | uint64 sent = 0, accepted = 0; | ||
| 213 | double hashRate = 0.0; | ||
| 214 | std::string st = GetParticipantMiningStatus(); | ||
| 215 | GetParticipantMiningStats(sent, accepted, hashRate); | ||
| 216 | if (sent > 0 || accepted > 0 || hashRate > 0.0) | ||
| 217 | ImGui::TextDisabled( | ||
| 218 | "Connected peers: %d Detected peers: %d Height: %d" | ||
| 219 | " Shares: %llu sent / %llu accepted %.2f H/s", | ||
| 220 | connected, discovered, nBestHeight, | ||
| 221 | (unsigned long long)sent, (unsigned long long)accepted, hashRate); | ||
| 222 | else if (!st.empty()) | ||
| 223 | ImGui::TextDisabled( | ||
| 224 | "Connected peers: %d Detected peers: %d Height: %d %s", | ||
| 225 | connected, discovered, nBestHeight, st.c_str()); | ||
| 226 | else | ||
| 227 | ImGui::TextDisabled( | ||
| 228 | "Connected peers: %d Detected peers: %d Height: %d", | ||
| 229 | connected, discovered, nBestHeight); | ||
| 230 | } else if (nMineMode == MINE_OPERATOR) { | ||
| 231 | int miners = 0, blocksFound = 0; | ||
| 232 | uint64 roundShares = 0; | ||
| 233 | double totalHashRate = 0.0; | ||
| 234 | GetPoolOperatorStats(miners, blocksFound, roundShares, totalHashRate); | ||
| 235 | ImGui::TextDisabled( | ||
| 236 | "Connected peers: %d Detected peers: %d Height: %d" | ||
| 237 | " Miners: %d Round shares: %llu Blocks found: %d %.2f H/s", | ||
| 238 | connected, discovered, nBestHeight, | ||
| 239 | miners, (unsigned long long)roundShares, blocksFound, totalHashRate); | ||
| 240 | } else { | ||
| 241 | ImGui::TextDisabled( | ||
| 242 | "Connected peers: %d Detected peers: %d Height: %d", | ||
| 243 | connected, discovered, nBestHeight); | ||
| 244 | } | ||
| 245 | |||
| 246 | ImGui::End(); | ||
| 247 | } | ||
| 248 | |||
| 249 | // --------------------------------------------------------------------------- | ||
| 152 | // Main window | 250 | // Main window |
| 251 | // | ||
| 252 | // Layout: | ||
| 253 | // [menu bar] -- ImGui built-in menu | ||
| 254 | // [header strip] -- address, balance, send button, mine status | ||
| 255 | // [separator] | ||
| 256 | // [telemetry strip] -- mode-specific live stats (never scrolls) | ||
| 257 | // [separator] | ||
| 258 | // [scrollable content child] -- transactions + mode panels | ||
| 259 | // | ||
| 260 | // The scrollable child ends at the top of the status bar so content never | ||
| 261 | // hides behind it. The child is explicitly sized to fill the remaining space. | ||
| 153 | // --------------------------------------------------------------------------- | 262 | // --------------------------------------------------------------------------- |
| 154 | static void DrawMainWindow() | 263 | static void DrawMainWindow() |
| 155 | { | 264 | { |
| 156 | ImGuiIO& io = ImGui::GetIO(); | 265 | ImGuiIO& io = ImGui::GetIO(); |
| 157 | ImGui::SetNextWindowPos(ImVec2(0,0)); | 266 | |
| 158 | ImGui::SetNextWindowSize(io.DisplaySize); | 267 | // Full display height minus the status bar at the bottom. |
| 159 | ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12,12)); | 268 | const float winH = io.DisplaySize.y - STATUS_BAR_H; |
| 269 | |||
| 270 | ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); | ||
| 271 | ImGui::SetNextWindowSize(ImVec2(io.DisplaySize.x, winH)); | ||
| 272 | ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(12.0f, 12.0f)); | ||
| 160 | ImGui::Begin("##main", nullptr, | 273 | ImGui::Begin("##main", nullptr, |
| 161 | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | | 274 | ImGuiWindowFlags_NoTitleBar | |
| 162 | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_MenuBar | | 275 | ImGuiWindowFlags_NoResize | |
| 163 | ImGuiWindowFlags_NoFocusOnAppearing); | 276 | ImGuiWindowFlags_NoMove | |
| 277 | ImGuiWindowFlags_NoScrollbar | | ||
| 278 | ImGuiWindowFlags_NoScrollWithMouse | | ||
| 279 | ImGuiWindowFlags_MenuBar | | ||
| 280 | ImGuiWindowFlags_NoBringToFrontOnFocus); | ||
| 164 | ImGui::SetWindowFontScale(0.92f); | 281 | ImGui::SetWindowFontScale(0.92f); |
| 165 | ImGui::PopStyleVar(); | 282 | ImGui::PopStyleVar(); |
| 166 | 283 | ||
| @@ -170,179 +287,209 @@ static void DrawMainWindow() | |||
| 170 | if (ImGui::MenuItem("Exit")) glfwSetWindowShouldClose(glfwGetCurrentContext(), true); | 287 | if (ImGui::MenuItem("Exit")) glfwSetWindowShouldClose(glfwGetCurrentContext(), true); |
| 171 | ImGui::EndMenu(); | 288 | ImGui::EndMenu(); |
| 172 | } | 289 | } |
| 173 | if (ImGui::MenuItem("Options")) g_showOptions = true; | 290 | if (ImGui::MenuItem("Options")) g_showOptions = true; |
| 174 | if (ImGui::MenuItem("About")) g_showAbout = true; | 291 | if (ImGui::MenuItem("About")) g_showAbout = true; |
| 175 | ImGui::EndMenuBar(); | 292 | ImGui::EndMenuBar(); |
| 176 | } | 293 | } |
| 177 | 294 | ||
| 178 | // ---- Address bar ---- | 295 | // ---- Header strip (never scrolls) ---- |
| 179 | ImGui::Spacing(); | 296 | ImGui::Spacing(); |
| 180 | ImGui::TextDisabled("Address:"); | 297 | ImGui::TextDisabled("Address:"); |
| 181 | ImGui::SameLine(); | 298 | ImGui::SameLine(); |
| 182 | ImGui::SetNextItemWidth(-80); | 299 | ImGui::SetNextItemWidth(-80.0f); |
| 183 | ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f,0.14f,0.14f,1)); | 300 | ImGui::PushStyleColor(ImGuiCol_FrameBg, ImVec4(0.14f, 0.14f, 0.14f, 1.0f)); |
| 184 | ImGui::InputText("##addr", (char*)g_myAddress.c_str(), g_myAddress.size()+1, | 301 | ImGui::InputText("##addr", (char*)g_myAddress.c_str(), g_myAddress.size()+1, |
| 185 | ImGuiInputTextFlags_ReadOnly); | 302 | ImGuiInputTextFlags_ReadOnly); |
| 186 | ImGui::PopStyleColor(); | 303 | ImGui::PopStyleColor(); |
| 187 | ImGui::SameLine(); | 304 | ImGui::SameLine(); |
| 188 | if (ImGui::Button("Copy##a")) ImGui::SetClipboardText(g_myAddress.c_str()); | 305 | if (ImGui::Button("Copy##a")) ImGui::SetClipboardText(g_myAddress.c_str()); |
| 189 | 306 | ||
| 190 | // ---- Balance on its own line ---- | ||
| 191 | ImGui::TextDisabled("Balance:"); | 307 | ImGui::TextDisabled("Balance:"); |
| 192 | ImGui::SameLine(); | 308 | ImGui::SameLine(); |
| 193 | ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.35f,1.0f,0.35f,1.0f)); | 309 | ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.35f, 1.0f, 0.35f, 1.0f)); |
| 194 | ImGui::Text("%s BTF", FmtMoney(g_balance).c_str()); | 310 | ImGui::Text("%s BTF", FmtMoney(g_balance).c_str()); |
| 195 | ImGui::PopStyleColor(); | 311 | ImGui::PopStyleColor(); |
| 196 | 312 | ||
| 197 | // ---- Toolbar ---- | ||
| 198 | ImGui::Spacing(); | 313 | ImGui::Spacing(); |
| 199 | ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.15f,0.40f,0.15f,1)); | 314 | ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0.15f, 0.40f, 0.15f, 1.0f)); |
| 200 | ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.20f,0.55f,0.20f,1)); | 315 | ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(0.20f, 0.55f, 0.20f, 1.0f)); |
| 201 | if (ImGui::Button(" Send Coins ")) g_showSend = true; | 316 | if (ImGui::Button(" Send Coins ")) g_showSend = true; |
| 202 | ImGui::PopStyleColor(2); | 317 | ImGui::PopStyleColor(2); |
| 203 | 318 | ||
| 204 | // Mining status indicator | 319 | ImGui::SameLine(0.0f, 20.0f); |
| 205 | ImGui::SameLine(0, 20); | ||
| 206 | if (fGenerateBitcoins) { | 320 | if (fGenerateBitcoins) { |
| 207 | ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f,0.6f,0.0f,1.0f)); | 321 | ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.6f, 0.0f, 1.0f)); |
| 208 | const char* modeLabel = nMineMode==MINE_OPERATOR ? "Mining (operator)" : | 322 | const char* modeLabel = |
| 209 | nMineMode==MINE_PARTICIPANT ? "Mining (pool)" : "Mining"; | 323 | nMineMode == MINE_OPERATOR ? "Mining (operator)" : |
| 210 | ImGui::Text("⬤ %s", modeLabel); | 324 | nMineMode == MINE_PARTICIPANT ? "Mining (pool)" : |
| 325 | nMineMode == MINE_RELAY ? "Relay" : "Mining"; | ||
| 326 | ImGui::Text("* %s", modeLabel); | ||
| 211 | ImGui::PopStyleColor(); | 327 | ImGui::PopStyleColor(); |
| 212 | if (nMineMode == MINE_PARTICIPANT) { | 328 | if (nMineMode == MINE_PARTICIPANT) { |
| 213 | std::string mineStatus = GetParticipantMiningStatus(); | 329 | std::string st = GetParticipantMiningStatus(); |
| 214 | if (!mineStatus.empty()) { | 330 | if (!st.empty()) { |
| 215 | ImGui::SameLine(0, 12); | 331 | ImGui::SameLine(0.0f, 12.0f); |
| 216 | ImGui::PushStyleColor(ImGuiCol_Text, ParticipantStatusColor(mineStatus)); | 332 | ImGui::PushStyleColor(ImGuiCol_Text, StatusColor(st)); |
| 217 | ImGui::Text("[%s]", mineStatus.c_str()); | 333 | ImGui::Text("[%s]", st.c_str()); |
| 218 | ImGui::PopStyleColor(); | 334 | ImGui::PopStyleColor(); |
| 219 | } | 335 | } |
| 220 | } | 336 | } |
| 221 | } else { | 337 | } else { |
| 222 | ImGui::TextDisabled("○ Not mining"); | 338 | ImGui::TextDisabled("Not mining"); |
| 223 | } | 339 | } |
| 224 | 340 | ||
| 225 | ImGui::Spacing(); | 341 | ImGui::Spacing(); |
| 226 | ImGui::Separator(); | 342 | ImGui::Separator(); |
| 227 | ImGui::Spacing(); | ||
| 228 | 343 | ||
| 229 | // ---- Live telemetry strip ---- | 344 | // ---- Telemetry strip (never scrolls) ---- |
| 230 | { | 345 | { |
| 231 | const char* modeName = nMineMode==MINE_OPERATOR ? "Operator" : | 346 | ImGui::Spacing(); |
| 232 | nMineMode==MINE_PARTICIPANT ? "Participant" : "Solo"; | 347 | const char* modeName = |
| 233 | int64 age = g_lastWalletRefresh > 0 ? (GetTime() - g_lastWalletRefresh) : -1; | 348 | nMineMode == MINE_OPERATOR ? "Operator" : |
| 234 | if (age < 0) age = 0; | 349 | nMineMode == MINE_PARTICIPANT ? "Participant" : |
| 350 | nMineMode == MINE_RELAY ? "Relay" : "Solo"; | ||
| 351 | int64 age = g_lastWalletRefresh > 0 ? GetTime() - g_lastWalletRefresh : 0; | ||
| 235 | 352 | ||
| 236 | ImGui::Text("Mode: %s", modeName); | 353 | ImGui::Text("Mode: %s", modeName); |
| 237 | ImGui::SameLine(0, 16); | 354 | ImGui::SameLine(0.0f, 16.0f); |
| 238 | ImGui::Text("Wallet refresh: %llds ago", (long long)age); | 355 | ImGui::TextDisabled("Wallet refreshed %llds ago", (long long)age); |
| 239 | 356 | ||
| 240 | if (nMineMode == MINE_PARTICIPANT) { | 357 | if (nMineMode == MINE_PARTICIPANT) { |
| 241 | uint64 sent = 0, accepted = 0; | 358 | uint64 sent = 0, accepted = 0; |
| 242 | double hashRate = 0.0; | 359 | double hashRate = 0.0; |
| 243 | std::string mineStatus = GetParticipantMiningStatus(); | 360 | std::string st = GetParticipantMiningStatus(); |
| 244 | GetParticipantMiningStats(sent, accepted, hashRate); | 361 | GetParticipantMiningStats(sent, accepted, hashRate); |
| 245 | if (sent > 0 || accepted > 0 || hashRate > 0.0) { | 362 | if (sent > 0 || accepted > 0 || hashRate > 0.0) { |
| 246 | double acceptPct = sent ? (100.0 * (double)accepted / (double)sent) : 0.0; | 363 | double pct = sent ? (100.0 * (double)accepted / (double)sent) : 0.0; |
| 247 | ImGui::TextDisabled("Your mining: sent %llu, accepted %llu (%.1f%%), %.2f H/s", | 364 | ImGui::TextDisabled( |
| 248 | (unsigned long long)sent, | 365 | "Sent %llu shares, accepted %llu (%.1f%%), %.2f H/s", |
| 249 | (unsigned long long)accepted, | 366 | (unsigned long long)sent, (unsigned long long)accepted, pct, hashRate); |
| 250 | acceptPct, | 367 | } else if (!st.empty()) { |
| 251 | hashRate); | 368 | ImGui::TextDisabled("Status: %s", st.c_str()); |
| 252 | } else if (!mineStatus.empty()) { | ||
| 253 | ImGui::TextDisabled("Your mining: %s", mineStatus.c_str()); | ||
| 254 | } else { | 369 | } else { |
| 255 | ImGui::TextDisabled("Your mining: asking pool for work"); | 370 | ImGui::TextDisabled("Waiting for pool work..."); |
| 256 | } | 371 | } |
| 257 | } else if (nMineMode == MINE_OPERATOR) { | 372 | } else if (nMineMode == MINE_OPERATOR) { |
| 258 | int miners = 0, blocksFound = 0; | 373 | int miners = 0, blocksFound = 0; |
| 259 | uint64 roundShares = 0; | 374 | uint64 roundShares = 0; |
| 260 | GetPoolOperatorStats(miners, blocksFound, roundShares); | 375 | double totalHashRate = 0.0; |
| 376 | GetPoolOperatorStats(miners, blocksFound, roundShares, totalHashRate); | ||
| 261 | if (miners > 0 || blocksFound > 0 || roundShares > 0) | 377 | if (miners > 0 || blocksFound > 0 || roundShares > 0) |
| 262 | ImGui::TextDisabled("Pool runtime: %d authorized miners, %llu round shares, %d blocks found", miners, (unsigned long long)roundShares, blocksFound); | 378 | ImGui::TextDisabled( |
| 379 | "Authorized miners: %d Round shares: %llu Blocks found: %d %.2f H/s", | ||
| 380 | miners, (unsigned long long)roundShares, blocksFound, totalHashRate); | ||
| 263 | else | 381 | else |
| 264 | ImGui::TextDisabled("Pool runtime: waiting for miners"); | 382 | ImGui::TextDisabled("Pool server running, waiting for miners"); |
| 383 | } else if (nMineMode == MINE_RELAY) { | ||
| 384 | ImGui::TextDisabled("Relay mode: syncing, not mining"); | ||
| 265 | } else { | 385 | } else { |
| 266 | ImGui::TextDisabled("Solo runtime: local wallet mining telemetry"); | 386 | ImGui::TextDisabled("Solo mining"); |
| 267 | } | 387 | } |
| 268 | ImGui::Spacing(); | 388 | ImGui::Spacing(); |
| 269 | ImGui::Separator(); | 389 | ImGui::Separator(); |
| 270 | ImGui::Spacing(); | 390 | ImGui::Spacing(); |
| 271 | } | 391 | } |
| 272 | 392 | ||
| 393 | // ---- Scrollable content child ---- | ||
| 394 | // Fills all remaining height in the window (cursor Y to bottom of window). | ||
| 395 | // Content that overflows scrolls; nothing leaks past the window edge. | ||
| 396 | // Size the scrollable child to fill exactly the remaining window height. | ||
| 397 | // GetContentRegionAvail() already accounts for padding/borders. | ||
| 398 | const float availH = ImGui::GetContentRegionAvail().y; | ||
| 399 | ImGui::BeginChild("##scroll", ImVec2(0.0f, availH), false, 0); | ||
| 400 | |||
| 273 | // ---- Transaction list ---- | 401 | // ---- Transaction list ---- |
| 274 | float listHeight = io.DisplaySize.y * 0.26f; | 402 | float txH = io.DisplaySize.y * 0.26f; |
| 275 | if (listHeight < 190.0f) listHeight = 190.0f; | 403 | if (txH < 180.0f) txH = 180.0f; |
| 276 | if (listHeight > 260.0f) listHeight = 260.0f; | 404 | if (txH > 260.0f) txH = 260.0f; |
| 405 | |||
| 277 | if (ImGui::BeginTable("txlist", 4, | 406 | if (ImGui::BeginTable("txlist", 4, |
| 278 | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | | 407 | ImGuiTableFlags_Borders | |
| 279 | ImGuiTableFlags_ScrollY | ImGuiTableFlags_SizingStretchProp, | 408 | ImGuiTableFlags_RowBg | |
| 280 | ImVec2(0, listHeight))) | 409 | ImGuiTableFlags_ScrollY | |
| 410 | ImGuiTableFlags_SizingStretchProp, | ||
| 411 | ImVec2(0.0f, txH))) | ||
| 281 | { | 412 | { |
| 282 | ImGui::TableSetupScrollFreeze(0, 1); | 413 | ImGui::TableSetupScrollFreeze(0, 1); |
| 283 | ImGui::TableSetupColumn("Status", ImGuiTableColumnFlags_WidthFixed, 110); | 414 | ImGui::TableSetupColumn("Status", ImGuiTableColumnFlags_WidthFixed, 110.0f); |
| 284 | ImGui::TableSetupColumn("Date", ImGuiTableColumnFlags_WidthFixed, 130); | 415 | ImGui::TableSetupColumn("Date", ImGuiTableColumnFlags_WidthFixed, 130.0f); |
| 285 | ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch); | 416 | ImGui::TableSetupColumn("Description", ImGuiTableColumnFlags_WidthStretch); |
| 286 | ImGui::TableSetupColumn("Amount", ImGuiTableColumnFlags_WidthFixed, 140); | 417 | ImGui::TableSetupColumn("Amount", ImGuiTableColumnFlags_WidthFixed, 140.0f); |
| 287 | ImGui::TableHeadersRow(); | 418 | ImGui::TableHeadersRow(); |
| 288 | 419 | ||
| 289 | for (auto& row : g_txRows) { | 420 | for (auto& row : g_txRows) { |
| 290 | ImGui::TableNextRow(); | 421 | ImGui::TableNextRow(); |
| 291 | ImGui::TableSetColumnIndex(0); | 422 | ImGui::TableSetColumnIndex(0); |
| 292 | if (row.depth < 1) | 423 | bool isImmatureCoinbase = (row.desc.find("matures in") != std::string::npos); |
| 293 | ImGui::TextColored(ImVec4(1,0.6f,0,1), "Unconfirmed"); | 424 | bool isOrphaned = (row.desc.find("orphaned") != std::string::npos); |
| 425 | if (isOrphaned) | ||
| 426 | ImGui::TextColored(ImVec4(1.0f, 0.3f, 0.3f, 1.0f), "Orphaned"); | ||
| 427 | else if (row.depth < 1) | ||
| 428 | ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f), "Unconfirmed"); | ||
| 429 | else if (isImmatureCoinbase) | ||
| 430 | ImGui::TextColored(ImVec4(1.0f, 0.75f, 0.25f, 1.0f), "Immature"); | ||
| 431 | else if (row.depth < 6) | ||
| 432 | ImGui::TextColored(ImVec4(1.0f, 0.85f, 0.3f, 1.0f), "%d confirm%s", | ||
| 433 | row.depth, row.depth == 1 ? "" : "s"); | ||
| 294 | else | 434 | else |
| 295 | ImGui::Text("%d blocks deep", row.depth); | 435 | ImGui::TextColored(ImVec4(0.5f, 0.9f, 0.5f, 1.0f), "Confirmed"); |
| 296 | ImGui::TableSetColumnIndex(1); | 436 | ImGui::TableSetColumnIndex(1); |
| 297 | ImGui::TextDisabled("%s", row.date.c_str()); | 437 | ImGui::TextDisabled("%s", row.date.c_str()); |
| 298 | ImGui::TableSetColumnIndex(2); | 438 | ImGui::TableSetColumnIndex(2); |
| 299 | ImGui::TextUnformatted(row.desc.c_str()); | 439 | ImGui::TextUnformatted(row.desc.c_str()); |
| 300 | ImGui::TableSetColumnIndex(3); | 440 | ImGui::TableSetColumnIndex(3); |
| 301 | if (row.amount >= 0) | 441 | if (row.amount >= 0) |
| 302 | ImGui::TextColored(ImVec4(0.35f,1,0.35f,1), "+%s BTF", FmtMoney(row.amount).c_str()); | 442 | ImGui::TextColored(ImVec4(0.35f, 1.0f, 0.35f, 1.0f), |
| 443 | "+%s BTF", FmtMoney(row.amount).c_str()); | ||
| 303 | else | 444 | else |
| 304 | ImGui::TextColored(ImVec4(1,0.4f,0.4f,1), "%s BTF", FmtMoney(row.amount).c_str()); | 445 | ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), |
| 446 | "%s BTF", FmtMoney(row.amount).c_str()); | ||
| 305 | } | 447 | } |
| 306 | ImGui::EndTable(); | 448 | ImGui::EndTable(); |
| 307 | } | 449 | } |
| 308 | 450 | ||
| 451 | // ---- Mode panels ---- | ||
| 309 | std::vector<BtfPoolAnnouncement> pools; | 452 | std::vector<BtfPoolAnnouncement> pools; |
| 310 | BtfGetPoolAnnouncements(pools); | 453 | BtfGetPoolAnnouncements(pools); |
| 311 | 454 | ||
| 312 | if (nMineMode == MINE_PARTICIPANT) { | 455 | if (nMineMode == MINE_PARTICIPANT) { |
| 313 | ImGui::Spacing(); | 456 | ImGui::Spacing(); |
| 314 | ImGui::SeparatorText("Participant Mining"); | 457 | ImGui::SeparatorText("Participant Mining"); |
| 315 | ImGui::Text("Selected pool:"); | 458 | |
| 459 | ImGui::TextDisabled("Selected pool:"); | ||
| 460 | ImGui::SameLine(); | ||
| 316 | if (strParticipantPool.empty()) | 461 | if (strParticipantPool.empty()) |
| 317 | ImGui::TextDisabled("No pool selected yet"); | 462 | ImGui::TextDisabled("none"); |
| 318 | else | 463 | else |
| 319 | ImGui::TextWrapped("%s", strParticipantPool.c_str()); | 464 | ImGui::TextWrapped("%s", strParticipantPool.c_str()); |
| 320 | 465 | ||
| 321 | const BtfPoolAnnouncement* selected = NULL; | 466 | const BtfPoolAnnouncement* sel = nullptr; |
| 322 | for (size_t i = 0; i < pools.size(); i++) | 467 | for (size_t i = 0; i < pools.size(); i++) |
| 323 | if (pools[i].btfAddress == strParticipantPool) { selected = &pools[i]; break; } | 468 | if (pools[i].btfAddress == strParticipantPool) { sel = &pools[i]; break; } |
| 324 | 469 | ||
| 325 | if (selected) { | 470 | if (sel) { |
| 326 | ImGui::Text("Pool name: %s", selected->poolName.c_str()); | 471 | ImGui::Text("Pool: %s Fee: %.2f%% Miners: %d Blocks: %d %.2f H/s", |
| 327 | ImGui::Text("Fee: %.2f%%", selected->feePercent); | 472 | sel->poolName.c_str(), sel->feePercent, |
| 328 | ImGui::Text("Live stats: %d miners, %d blocks", selected->connectedMiners, selected->blocksFound); | 473 | sel->connectedMiners, sel->blocksFound, sel->hashRate); |
| 329 | if (!selected->dashboardUrl.empty()) | 474 | if (!sel->dashboardUrl.empty()) |
| 330 | ImGui::TextWrapped("Dashboard: %s", selected->dashboardUrl.c_str()); | 475 | ImGui::TextDisabled("Dashboard: %s", sel->dashboardUrl.c_str()); |
| 331 | } else if (!strParticipantPool.empty()) { | 476 | } else if (!strParticipantPool.empty()) { |
| 332 | ImGui::TextDisabled("No fresh announcement found for this pool yet"); | 477 | ImGui::TextDisabled("No live announcement for this pool yet."); |
| 333 | } | 478 | } |
| 334 | 479 | ||
| 335 | if (!pools.empty()) { | 480 | if (!pools.empty()) { |
| 336 | ImGui::Spacing(); | 481 | ImGui::Spacing(); |
| 337 | ImGui::SeparatorText("Live Pools"); | 482 | ImGui::SeparatorText("Live Pools"); |
| 338 | if (ImGui::BeginTable("livepools", 5, | 483 | if (ImGui::BeginTable("livepools", 5, |
| 339 | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) | 484 | ImGuiTableFlags_Borders | |
| 485 | ImGuiTableFlags_RowBg | | ||
| 486 | ImGuiTableFlags_SizingStretchProp)) | ||
| 340 | { | 487 | { |
| 341 | ImGui::TableSetupColumn("Pool", ImGuiTableColumnFlags_WidthStretch); | 488 | ImGui::TableSetupColumn("Pool", ImGuiTableColumnFlags_WidthStretch); |
| 342 | ImGui::TableSetupColumn("Fee", ImGuiTableColumnFlags_WidthFixed, 70); | 489 | ImGui::TableSetupColumn("Fee", ImGuiTableColumnFlags_WidthFixed, 60.0f); |
| 343 | ImGui::TableSetupColumn("Stats", ImGuiTableColumnFlags_WidthFixed, 160); | 490 | ImGui::TableSetupColumn("Stats", ImGuiTableColumnFlags_WidthFixed, 150.0f); |
| 344 | ImGui::TableSetupColumn("Dashboard", ImGuiTableColumnFlags_WidthStretch); | 491 | ImGui::TableSetupColumn("Dashboard", ImGuiTableColumnFlags_WidthStretch); |
| 345 | ImGui::TableSetupColumn("Use", ImGuiTableColumnFlags_WidthFixed, 60); | 492 | ImGui::TableSetupColumn("Use", ImGuiTableColumnFlags_WidthFixed, 50.0f); |
| 346 | ImGui::TableHeadersRow(); | 493 | ImGui::TableHeadersRow(); |
| 347 | for (size_t i = 0; i < pools.size(); i++) { | 494 | for (size_t i = 0; i < pools.size(); i++) { |
| 348 | const BtfPoolAnnouncement& ann = pools[i]; | 495 | const BtfPoolAnnouncement& ann = pools[i]; |
| @@ -353,15 +500,19 @@ static void DrawMainWindow() | |||
| 353 | ImGui::TableSetColumnIndex(1); | 500 | ImGui::TableSetColumnIndex(1); |
| 354 | ImGui::Text("%.2f%%", ann.feePercent); | 501 | ImGui::Text("%.2f%%", ann.feePercent); |
| 355 | ImGui::TableSetColumnIndex(2); | 502 | ImGui::TableSetColumnIndex(2); |
| 356 | ImGui::Text("%d miners, %d blocks, %s old", ann.connectedMiners, ann.blocksFound, FmtAge(ann.createdAt).c_str()); | 503 | ImGui::Text("%d miners %d blocks %.2f H/s %s", |
| 504 | ann.connectedMiners, ann.blocksFound, ann.hashRate, | ||
| 505 | FmtAge(ann.createdAt).c_str()); | ||
| 357 | ImGui::TableSetColumnIndex(3); | 506 | ImGui::TableSetColumnIndex(3); |
| 358 | if (!ann.dashboardUrl.empty()) | 507 | if (!ann.dashboardUrl.empty()) |
| 359 | ImGui::TextWrapped("%s", ann.dashboardUrl.c_str()); | 508 | ImGui::TextWrapped("%s", ann.dashboardUrl.c_str()); |
| 360 | else | 509 | else |
| 361 | ImGui::TextDisabled("-"); | 510 | ImGui::TextDisabled("-"); |
| 362 | ImGui::TableSetColumnIndex(4); | 511 | ImGui::TableSetColumnIndex(4); |
| 363 | if (ImGui::SmallButton((std::string("Use##") + ann.btfAddress).c_str())) { | 512 | std::string btnId = "Use##" + ann.btfAddress; |
| 364 | strncpy(g_participantPool, ann.btfAddress.c_str(), sizeof(g_participantPool)-1); | 513 | if (ImGui::SmallButton(btnId.c_str())) { |
| 514 | strncpy(g_participantPool, ann.btfAddress.c_str(), | ||
| 515 | sizeof(g_participantPool)-1); | ||
| 365 | strParticipantPool = ann.btfAddress; | 516 | strParticipantPool = ann.btfAddress; |
| 366 | CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); | 517 | CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); |
| 367 | g_needRefresh = true; | 518 | g_needRefresh = true; |
| @@ -375,55 +526,60 @@ static void DrawMainWindow() | |||
| 375 | if (nMineMode == MINE_OPERATOR) { | 526 | if (nMineMode == MINE_OPERATOR) { |
| 376 | ImGui::Spacing(); | 527 | ImGui::Spacing(); |
| 377 | ImGui::SeparatorText("Operator Overview"); | 528 | ImGui::SeparatorText("Operator Overview"); |
| 378 | ImGui::Text("Pool .btf address:"); | 529 | |
| 379 | std::string opAddr = BtfLocalAddress(); | 530 | std::string opAddr = BtfLocalAddress(); |
| 531 | ImGui::TextDisabled("Pool .btf address:"); | ||
| 532 | ImGui::SameLine(); | ||
| 380 | if (opAddr.empty()) | 533 | if (opAddr.empty()) |
| 381 | ImGui::TextDisabled("Identity not ready yet"); | 534 | ImGui::TextDisabled("identity not ready"); |
| 382 | else | 535 | else |
| 383 | ImGui::TextWrapped("%s", opAddr.c_str()); | 536 | ImGui::TextWrapped("%s", opAddr.c_str()); |
| 384 | 537 | ||
| 538 | // Pending payouts | ||
| 385 | std::vector<PendingPayoutView> owed; | 539 | std::vector<PendingPayoutView> owed; |
| 386 | GetPendingPayouts(owed); | 540 | GetPendingPayouts(owed); |
| 387 | ImGui::Spacing(); | 541 | ImGui::Spacing(); |
| 388 | ImGui::SeparatorText("Pending Pool Payouts (you owe miners)"); | 542 | ImGui::SeparatorText("Pending Payouts (owed to miners)"); |
| 389 | if (owed.empty()) { | 543 | if (owed.empty()) { |
| 390 | ImGui::TextDisabled("No pending pool payouts"); | 544 | ImGui::TextDisabled("No pending payouts"); |
| 391 | } else if (ImGui::BeginTable("owedpayouts", 4, | 545 | } else if (ImGui::BeginTable("owedpayouts", 4, |
| 392 | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) | 546 | ImGuiTableFlags_Borders | |
| 547 | ImGuiTableFlags_RowBg | | ||
| 548 | ImGuiTableFlags_SizingStretchProp)) | ||
| 393 | { | 549 | { |
| 394 | ImGui::TableSetupColumn("Matures At", ImGuiTableColumnFlags_WidthFixed, 100); | 550 | ImGui::TableSetupColumn("Matures At", ImGuiTableColumnFlags_WidthFixed, 90.0f); |
| 395 | ImGui::TableSetupColumn("Blocks Left", ImGuiTableColumnFlags_WidthFixed, 90); | 551 | ImGui::TableSetupColumn("Blocks left", ImGuiTableColumnFlags_WidthFixed, 80.0f); |
| 396 | ImGui::TableSetupColumn("Recipients", ImGuiTableColumnFlags_WidthFixed, 90); | 552 | ImGui::TableSetupColumn("Recipients", ImGuiTableColumnFlags_WidthFixed, 80.0f); |
| 397 | ImGui::TableSetupColumn("Total", ImGuiTableColumnFlags_WidthStretch); | 553 | ImGui::TableSetupColumn("Total", ImGuiTableColumnFlags_WidthStretch); |
| 398 | ImGui::TableHeadersRow(); | 554 | ImGui::TableHeadersRow(); |
| 399 | for (const PendingPayoutView& row : owed) { | 555 | for (const PendingPayoutView& row : owed) { |
| 400 | int remaining = std::max(0, row.matureAtHeight - nBestHeight); | 556 | int left = std::max(0, row.matureAtHeight - nBestHeight); |
| 401 | ImGui::TableNextRow(); | 557 | ImGui::TableNextRow(); |
| 402 | ImGui::TableSetColumnIndex(0); | 558 | ImGui::TableSetColumnIndex(0); ImGui::Text("%d", row.matureAtHeight); |
| 403 | ImGui::Text("%d", row.matureAtHeight); | 559 | ImGui::TableSetColumnIndex(1); ImGui::Text("%d", left); |
| 404 | ImGui::TableSetColumnIndex(1); | 560 | ImGui::TableSetColumnIndex(2); ImGui::Text("%d", row.recipients); |
| 405 | ImGui::Text("%d", remaining); | 561 | ImGui::TableSetColumnIndex(3); ImGui::Text("%s BTF", FmtMoney(row.totalAmount).c_str()); |
| 406 | ImGui::TableSetColumnIndex(2); | ||
| 407 | ImGui::Text("%d", row.recipients); | ||
| 408 | ImGui::TableSetColumnIndex(3); | ||
| 409 | ImGui::Text("%s BTF", FmtMoney(row.totalAmount).c_str()); | ||
| 410 | } | 562 | } |
| 411 | ImGui::EndTable(); | 563 | ImGui::EndTable(); |
| 412 | } | 564 | } |
| 413 | 565 | ||
| 566 | // Workers | ||
| 414 | std::vector<PoolWorkerStatView> workers; | 567 | std::vector<PoolWorkerStatView> workers; |
| 415 | GetPoolWorkerStats(workers); | 568 | GetPoolWorkerStats(workers); |
| 416 | ImGui::Spacing(); | 569 | ImGui::Spacing(); |
| 417 | ImGui::SeparatorText("Current Round Workers"); | 570 | ImGui::SeparatorText("Current Round Workers"); |
| 418 | if (workers.empty()) { | 571 | if (workers.empty()) { |
| 419 | ImGui::TextDisabled("No active workers in this round"); | 572 | ImGui::TextDisabled("No active workers this round"); |
| 420 | } else if (ImGui::BeginTable("workers", 4, | 573 | } else if (ImGui::BeginTable("workers", 5, |
| 421 | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) | 574 | ImGuiTableFlags_Borders | |
| 575 | ImGuiTableFlags_RowBg | | ||
| 576 | ImGuiTableFlags_SizingStretchProp)) | ||
| 422 | { | 577 | { |
| 423 | ImGui::TableSetupColumn("Payout Addr", ImGuiTableColumnFlags_WidthStretch); | 578 | ImGui::TableSetupColumn("Payout Address", ImGuiTableColumnFlags_WidthStretch); |
| 424 | ImGui::TableSetupColumn("Worker", ImGuiTableColumnFlags_WidthStretch); | 579 | ImGui::TableSetupColumn("Worker", ImGuiTableColumnFlags_WidthStretch); |
| 425 | ImGui::TableSetupColumn("Round Shares", ImGuiTableColumnFlags_WidthFixed, 90); | 580 | ImGui::TableSetupColumn("Hashrate", ImGuiTableColumnFlags_WidthFixed, 90.0f); |
| 426 | ImGui::TableSetupColumn("Last Seen", ImGuiTableColumnFlags_WidthFixed, 100); | 581 | ImGui::TableSetupColumn("Round shares", ImGuiTableColumnFlags_WidthFixed, 90.0f); |
| 582 | ImGui::TableSetupColumn("Last seen", ImGuiTableColumnFlags_WidthFixed, 90.0f); | ||
| 427 | ImGui::TableHeadersRow(); | 583 | ImGui::TableHeadersRow(); |
| 428 | for (const PoolWorkerStatView& row : workers) { | 584 | for (const PoolWorkerStatView& row : workers) { |
| 429 | ImGui::TableNextRow(); | 585 | ImGui::TableNextRow(); |
| @@ -432,53 +588,19 @@ static void DrawMainWindow() | |||
| 432 | ImGui::TableSetColumnIndex(1); | 588 | ImGui::TableSetColumnIndex(1); |
| 433 | ImGui::TextDisabled("%s", row.worker.empty() ? "worker" : row.worker.c_str()); | 589 | ImGui::TextDisabled("%s", row.worker.empty() ? "worker" : row.worker.c_str()); |
| 434 | ImGui::TableSetColumnIndex(2); | 590 | ImGui::TableSetColumnIndex(2); |
| 435 | ImGui::Text("%llu", (unsigned long long)row.roundShares); | 591 | ImGui::Text("%.2f H/s", row.hashRate); |
| 436 | ImGui::TableSetColumnIndex(3); | 592 | ImGui::TableSetColumnIndex(3); |
| 437 | ImGui::TextDisabled("%s", FmtAge(row.lastSeen).c_str()); | 593 | ImGui::Text("%llu", (unsigned long long)row.roundShares); |
| 594 | ImGui::TableSetColumnIndex(4); | ||
| 595 | ImGui::TextDisabled("%s ago", FmtAge(row.lastSeen).c_str()); | ||
| 438 | } | 596 | } |
| 439 | ImGui::EndTable(); | 597 | ImGui::EndTable(); |
| 440 | } | 598 | } |
| 441 | } | 599 | } |
| 442 | 600 | ||
| 443 | // ---- Status bar ---- | 601 | ImGui::EndChild(); // ##scroll |
| 444 | { | ||
| 445 | ImGui::Spacing(); | ||
| 446 | ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,2)); | ||
| 447 | |||
| 448 | int peers = (int)vNodes.size(); | ||
| 449 | if (nMineMode == MINE_PARTICIPANT) { | ||
| 450 | uint64 sent = 0, accepted = 0; | ||
| 451 | double hashRate = 0.0; | ||
| 452 | std::string mineStatus = GetParticipantMiningStatus(); | ||
| 453 | GetParticipantMiningStats(sent, accepted, hashRate); | ||
| 454 | if (sent > 0 || accepted > 0 || hashRate > 0.0) | ||
| 455 | ImGui::TextDisabled("Peers %d height %d shares sent %llu accepted %llu hash rate %.2f H/s", | ||
| 456 | peers, | ||
| 457 | nBestHeight, | ||
| 458 | (unsigned long long)sent, | ||
| 459 | (unsigned long long)accepted, | ||
| 460 | hashRate); | ||
| 461 | else if (!mineStatus.empty()) | ||
| 462 | ImGui::TextDisabled("Peers %d height %d %s", peers, nBestHeight, mineStatus.c_str()); | ||
| 463 | else | ||
| 464 | ImGui::TextDisabled("Peers %d height %d asking pool for work", peers, nBestHeight); | ||
| 465 | } else if (nMineMode == MINE_OPERATOR) { | ||
| 466 | int miners = 0, blocksFound = 0; | ||
| 467 | uint64 roundShares = 0; | ||
| 468 | GetPoolOperatorStats(miners, blocksFound, roundShares); | ||
| 469 | if (miners > 0 || blocksFound > 0 || roundShares > 0) | ||
| 470 | ImGui::TextDisabled("Peers %d height %d authorized miners %d round shares %llu blocks found %d", | ||
| 471 | peers, nBestHeight, miners, (unsigned long long)roundShares, blocksFound); | ||
| 472 | else | ||
| 473 | ImGui::TextDisabled("Peers %d height %d waiting for miners", peers, nBestHeight); | ||
| 474 | } else { | ||
| 475 | ImGui::TextDisabled("Peers %d height %d", peers, nBestHeight); | ||
| 476 | } | ||
| 477 | ImGui::PopStyleVar(); | ||
| 478 | } | ||
| 479 | |||
| 480 | ImGui::SetWindowFontScale(1.0f); | 602 | ImGui::SetWindowFontScale(1.0f); |
| 481 | ImGui::End(); | 603 | ImGui::End(); // ##main |
| 482 | } | 604 | } |
| 483 | 605 | ||
| 484 | // --------------------------------------------------------------------------- | 606 | // --------------------------------------------------------------------------- |
| @@ -487,42 +609,53 @@ static void DrawMainWindow() | |||
| 487 | static void DrawSendDialog() | 609 | static void DrawSendDialog() |
| 488 | { | 610 | { |
| 489 | if (!g_showSend) return; | 611 | if (!g_showSend) return; |
| 490 | ImGui::SetNextWindowSize(ImVec2(500, 180), ImGuiCond_Always); | 612 | ImGui::SetNextWindowSize(ImVec2(500.0f, 180.0f), ImGuiCond_Always); |
| 491 | ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); | 613 | ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), |
| 614 | ImGuiCond_Always, ImVec2(0.5f, 0.5f)); | ||
| 492 | if (ImGui::Begin("Send Coins", &g_showSend, | 615 | if (ImGui::Begin("Send Coins", &g_showSend, |
| 493 | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) | 616 | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) |
| 494 | { | 617 | { |
| 495 | ImGui::Text("Recipient address:"); | 618 | ImGui::Text("Recipient address:"); |
| 496 | ImGui::SetNextItemWidth(-1); | 619 | ImGui::SetNextItemWidth(-1.0f); |
| 497 | ImGui::InputText("##sa", g_sendAddr, sizeof(g_sendAddr)); | 620 | ImGui::InputText("##sa", g_sendAddr, sizeof(g_sendAddr)); |
| 498 | 621 | ||
| 499 | ImGui::Text("Amount (BTF):"); | 622 | ImGui::Text("Amount (BTF):"); |
| 500 | ImGui::SetNextItemWidth(180); | 623 | ImGui::SetNextItemWidth(180.0f); |
| 501 | ImGui::InputText("##sm", g_sendAmount, sizeof(g_sendAmount)); | 624 | ImGui::InputText("##sm", g_sendAmount, sizeof(g_sendAmount)); |
| 502 | 625 | ||
| 503 | if (!g_sendStatus.empty()) { | 626 | if (!g_sendStatus.empty()) { |
| 504 | ImGui::Spacing(); | 627 | ImGui::Spacing(); |
| 505 | ImGui::TextColored(ImVec4(1,.4f,.4f,1), "%s", g_sendStatus.c_str()); | 628 | ImGui::TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), |
| 629 | "%s", g_sendStatus.c_str()); | ||
| 506 | } | 630 | } |
| 507 | 631 | ||
| 508 | ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); | 632 | ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); |
| 509 | if (ImGui::Button("Send", ImVec2(90,0))) { | 633 | if (ImGui::Button("Send", ImVec2(90.0f, 0.0f))) { |
| 510 | uint160 h; int64 nv = 0; | 634 | uint160 h; int64 nv = 0; |
| 511 | if (!AddressToHash160(g_sendAddr, h)) g_sendStatus = "Invalid address."; | 635 | if (!AddressToHash160(g_sendAddr, h)) |
| 512 | else if (!ParseMoney(g_sendAmount,nv)||nv<=0) g_sendStatus = "Invalid amount."; | 636 | g_sendStatus = "Invalid address."; |
| 637 | else if (!ParseMoney(g_sendAmount, nv) || nv <= 0) | ||
| 638 | g_sendStatus = "Invalid amount."; | ||
| 513 | else { | 639 | else { |
| 514 | CScript s; s << OP_DUP << OP_HASH160 << h << OP_EQUALVERIFY << OP_CHECKSIG; | 640 | CScript sc; |
| 641 | sc << OP_DUP << OP_HASH160 << h << OP_EQUALVERIFY << OP_CHECKSIG; | ||
| 515 | CWalletTx wtx; | 642 | CWalletTx wtx; |
| 516 | if (SendMoney(s, nv, wtx)) { | 643 | if (SendMoney(sc, nv, wtx)) { |
| 517 | g_showSend=false; g_sendStatus=""; | 644 | g_showSend = false; |
| 518 | memset(g_sendAddr,0,sizeof(g_sendAddr)); | 645 | g_sendStatus = ""; |
| 519 | memset(g_sendAmount,0,sizeof(g_sendAmount)); | 646 | memset(g_sendAddr, 0, sizeof(g_sendAddr)); |
| 647 | memset(g_sendAmount, 0, sizeof(g_sendAmount)); | ||
| 520 | g_needRefresh = true; | 648 | g_needRefresh = true; |
| 521 | } else g_sendStatus = "Transaction failed."; | 649 | } else { |
| 650 | g_sendStatus = "Transaction failed."; | ||
| 651 | } | ||
| 522 | } | 652 | } |
| 523 | } | 653 | } |
| 524 | ImGui::SameLine(); | 654 | ImGui::SameLine(); |
| 525 | if (ImGui::Button("Cancel", ImVec2(90,0))) { g_showSend=false; g_sendStatus=""; } | 655 | if (ImGui::Button("Cancel", ImVec2(90.0f, 0.0f))) { |
| 656 | g_showSend = false; | ||
| 657 | g_sendStatus = ""; | ||
| 658 | } | ||
| 526 | } | 659 | } |
| 527 | ImGui::End(); | 660 | ImGui::End(); |
| 528 | } | 661 | } |
| @@ -534,7 +667,6 @@ static void DrawOptionsDialog() | |||
| 534 | { | 667 | { |
| 535 | if (!g_showOptions) return; | 668 | if (!g_showOptions) return; |
| 536 | 669 | ||
| 537 | // Always sync from current globals when dialog opens | ||
| 538 | static bool wasOpen = false; | 670 | static bool wasOpen = false; |
| 539 | if (!wasOpen) { | 671 | if (!wasOpen) { |
| 540 | g_mineRadio = nMineMode; | 672 | g_mineRadio = nMineMode; |
| @@ -544,42 +676,46 @@ static void DrawOptionsDialog() | |||
| 544 | strncpy(g_poolDash, strPoolDashboardUrl.c_str(), sizeof(g_poolDash)-1); | 676 | strncpy(g_poolDash, strPoolDashboardUrl.c_str(), sizeof(g_poolDash)-1); |
| 545 | } | 677 | } |
| 546 | wasOpen = true; | 678 | wasOpen = true; |
| 547 | ImGui::SetNextWindowSize(ImVec2(500, 310), ImGuiCond_Always); | 679 | |
| 548 | ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); | 680 | ImGui::SetNextWindowSize(ImVec2(500.0f, 335.0f), ImGuiCond_Always); |
| 681 | ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), | ||
| 682 | ImGuiCond_Always, ImVec2(0.5f, 0.5f)); | ||
| 549 | if (ImGui::Begin("Options", &g_showOptions, | 683 | if (ImGui::Begin("Options", &g_showOptions, |
| 550 | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) | 684 | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) |
| 551 | { | 685 | { |
| 552 | // Transaction fee | 686 | // Transaction fee |
| 553 | ImGui::SeparatorText("Transaction Fee"); | 687 | ImGui::SeparatorText("Transaction Fee"); |
| 554 | static char feeStr[32] = {}; | 688 | static char feeStr[32] = {}; |
| 555 | if (feeStr[0]=='\0') snprintf(feeStr,sizeof(feeStr),"%s",FmtMoney(nTransactionFee).c_str()); | 689 | if (feeStr[0] == '\0') |
| 556 | ImGui::SetNextItemWidth(180); | 690 | snprintf(feeStr, sizeof(feeStr), "%s", FmtMoney(nTransactionFee).c_str()); |
| 691 | ImGui::SetNextItemWidth(180.0f); | ||
| 557 | ImGui::InputText("BTF per transaction##fee", feeStr, sizeof(feeStr)); | 692 | ImGui::InputText("BTF per transaction##fee", feeStr, sizeof(feeStr)); |
| 558 | 693 | ||
| 559 | // Mining | 694 | // Mining mode |
| 560 | ImGui::SeparatorText("Mining Mode"); | 695 | ImGui::SeparatorText("Mining Mode"); |
| 561 | ImGui::RadioButton("Solo — rewards go to your wallet", &g_mineRadio, MINE_SOLO); | 696 | ImGui::RadioButton("Relay -- just run the node, don't mine", &g_mineRadio, MINE_RELAY); |
| 562 | ImGui::RadioButton("Operator — run a pool for other miners", &g_mineRadio, MINE_OPERATOR); | 697 | ImGui::RadioButton("Solo -- rewards go to your wallet", &g_mineRadio, MINE_SOLO); |
| 563 | ImGui::RadioButton("Participant — mine to someone's pool", &g_mineRadio, MINE_PARTICIPANT); | 698 | ImGui::RadioButton("Operator -- run a pool for other miners", &g_mineRadio, MINE_OPERATOR); |
| 699 | ImGui::RadioButton("Participant -- mine to someone's pool", &g_mineRadio, MINE_PARTICIPANT); | ||
| 564 | 700 | ||
| 565 | if (g_mineRadio == MINE_OPERATOR) { | 701 | if (g_mineRadio == MINE_OPERATOR) { |
| 566 | ImGui::Spacing(); | 702 | ImGui::Spacing(); |
| 567 | ImGui::SeparatorText("Pool Announcement"); | 703 | ImGui::SeparatorText("Pool Announcement"); |
| 568 | ImGui::Text("Pool name:"); | 704 | ImGui::Text("Pool name:"); |
| 569 | ImGui::SetNextItemWidth(-1); | 705 | ImGui::SetNextItemWidth(-1.0f); |
| 570 | ImGui::InputText("##poolname", g_poolName, sizeof(g_poolName)); | 706 | ImGui::InputText("##poolname", g_poolName, sizeof(g_poolName)); |
| 571 | ImGui::Text("Fee %%:"); | 707 | ImGui::Text("Fee %%:"); |
| 572 | ImGui::SetNextItemWidth(120); | 708 | ImGui::SetNextItemWidth(120.0f); |
| 573 | ImGui::InputText("##poolfee", g_poolFee, sizeof(g_poolFee)); | 709 | ImGui::InputText("##poolfee", g_poolFee, sizeof(g_poolFee)); |
| 574 | ImGui::Text("Dashboard URL:"); | 710 | ImGui::Text("Dashboard URL:"); |
| 575 | ImGui::SetNextItemWidth(-1); | 711 | ImGui::SetNextItemWidth(-1.0f); |
| 576 | ImGui::InputText("##pooldash", g_poolDash, sizeof(g_poolDash)); | 712 | ImGui::InputText("##pooldash", g_poolDash, sizeof(g_poolDash)); |
| 577 | } | 713 | } |
| 578 | 714 | ||
| 579 | if (g_mineRadio == MINE_PARTICIPANT) { | 715 | if (g_mineRadio == MINE_PARTICIPANT) { |
| 580 | ImGui::Spacing(); | 716 | ImGui::Spacing(); |
| 581 | ImGui::SeparatorText("Pool Selection"); | 717 | ImGui::SeparatorText("Pool Selection"); |
| 582 | ImGui::TextDisabled("Pick from live discovered pools. Manual entry is disabled here."); | 718 | ImGui::TextDisabled("Pick from live discovered pools."); |
| 583 | 719 | ||
| 584 | std::vector<BtfPoolAnnouncement> pools; | 720 | std::vector<BtfPoolAnnouncement> pools; |
| 585 | BtfGetPoolAnnouncements(pools); | 721 | BtfGetPoolAnnouncements(pools); |
| @@ -591,46 +727,49 @@ static void DrawOptionsDialog() | |||
| 591 | break; | 727 | break; |
| 592 | } | 728 | } |
| 593 | } | 729 | } |
| 594 | if (ImGui::BeginCombo("Discovered pools", current.c_str())) { | 730 | if (ImGui::BeginCombo("Discovered pools##combo", current.c_str())) { |
| 595 | for (size_t i = 0; i < pools.size(); i++) { | 731 | for (size_t i = 0; i < pools.size(); i++) { |
| 596 | const BtfPoolAnnouncement& ann = pools[i]; | 732 | const BtfPoolAnnouncement& ann = pools[i]; |
| 597 | std::string label = PoolLabel(ann); | 733 | bool selected = (ann.btfAddress == g_participantPool); |
| 598 | bool selected = ann.btfAddress == g_participantPool; | 734 | if (ImGui::Selectable(PoolLabel(ann).c_str(), selected)) |
| 599 | if (ImGui::Selectable(label.c_str(), selected)) { | 735 | strncpy(g_participantPool, ann.btfAddress.c_str(), |
| 600 | strncpy(g_participantPool, ann.btfAddress.c_str(), sizeof(g_participantPool)-1); | 736 | sizeof(g_participantPool)-1); |
| 601 | } | ||
| 602 | } | 737 | } |
| 603 | ImGui::EndCombo(); | 738 | ImGui::EndCombo(); |
| 604 | } | 739 | } |
| 605 | } else { | 740 | } else { |
| 606 | ImGui::TextDisabled("No live pools discovered yet"); | 741 | ImGui::TextDisabled("No live pools discovered yet."); |
| 607 | } | 742 | } |
| 608 | } | 743 | } |
| 609 | 744 | ||
| 610 | ImGui::Spacing(); | ||
| 611 | const char* genLabel = fGenerateBitcoins ? "Stop Mining" : "Start Mining"; | ||
| 612 | if (ImGui::Button(genLabel, ImVec2(130,0))) { | ||
| 613 | fGenerateBitcoins = fGenerateBitcoins ? 0 : 1; | ||
| 614 | if (fGenerateBitcoins) _beginthread(ThreadBitcoinMiner, 0, NULL); | ||
| 615 | CWalletDB().WriteSetting("fGenerateBitcoins", fGenerateBitcoins); | ||
| 616 | } | ||
| 617 | |||
| 618 | ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); | 745 | ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); |
| 619 | if (ImGui::Button("OK", ImVec2(90,0))) { | 746 | if (ImGui::Button("OK", ImVec2(90.0f, 0.0f))) { |
| 620 | int64 fee=0; | 747 | int64 fee = 0; |
| 621 | if (ParseMoney(feeStr,fee)) { nTransactionFee=fee; CWalletDB().WriteSetting("nTransactionFee",nTransactionFee); } | 748 | if (ParseMoney(feeStr, fee)) { |
| 622 | 749 | nTransactionFee = fee; | |
| 623 | bool changed = (g_mineRadio != nMineMode); | 750 | CWalletDB().WriteSetting("nTransactionFee", nTransactionFee); |
| 624 | nMineMode = g_mineRadio; | 751 | } |
| 625 | strParticipantPool = g_participantPool; | 752 | |
| 626 | strPoolName = g_poolName[0] ? g_poolName : "Bitflash Pool"; | 753 | bool poolChanged = |
| 627 | strPoolDashboardUrl = g_poolDash; | 754 | nMineMode != g_mineRadio || |
| 628 | dPoolFeePercent = atof(g_poolFee); | 755 | strPoolName != (g_poolName[0] ? g_poolName : "Bitflash Pool") || |
| 629 | CWalletDB().WriteSetting("nMineMode", nMineMode); | 756 | strPoolDashboardUrl != g_poolDash || |
| 630 | CWalletDB().WriteSetting("strParticipantPool", strParticipantPool); | 757 | dPoolFeePercent != atof(g_poolFee); |
| 631 | CWalletDB().WriteSetting("strPoolName", strPoolName); | 758 | |
| 632 | CWalletDB().WriteSetting("strPoolDashboardUrl", strPoolDashboardUrl); | 759 | nMineMode = g_mineRadio; |
| 633 | CWalletDB().WriteSetting("dPoolFeePercent", dPoolFeePercent); | 760 | strParticipantPool = g_participantPool; |
| 761 | strPoolName = g_poolName[0] ? g_poolName : "Bitflash Pool"; | ||
| 762 | strPoolDashboardUrl = g_poolDash; | ||
| 763 | dPoolFeePercent = atof(g_poolFee); | ||
| 764 | |||
| 765 | if (nMineMode == MINE_OPERATOR && poolChanged) gAnnounceNow = true; | ||
| 766 | |||
| 767 | if (nMineMode == MINE_RELAY) { | ||
| 768 | fGenerateBitcoins = 0; | ||
| 769 | } else { | ||
| 770 | fGenerateBitcoins = 1; | ||
| 771 | if (!vfThreadRunning[3]) _beginthread(ThreadBitcoinMiner, 0, NULL); | ||
| 772 | } | ||
| 634 | 773 | ||
| 635 | if (nMineMode == MINE_OPERATOR) { | 774 | if (nMineMode == MINE_OPERATOR) { |
| 636 | if (!gPoolServerRunning) { | 775 | if (!gPoolServerRunning) { |
| @@ -645,7 +784,7 @@ static void DrawOptionsDialog() | |||
| 645 | g_showOptions = false; | 784 | g_showOptions = false; |
| 646 | } | 785 | } |
| 647 | ImGui::SameLine(); | 786 | ImGui::SameLine(); |
| 648 | if (ImGui::Button("Cancel", ImVec2(90,0))) g_showOptions = false; | 787 | if (ImGui::Button("Cancel", ImVec2(90.0f, 0.0f))) g_showOptions = false; |
| 649 | } | 788 | } |
| 650 | if (!g_showOptions) wasOpen = false; | 789 | if (!g_showOptions) wasOpen = false; |
| 651 | ImGui::End(); | 790 | ImGui::End(); |
| @@ -657,18 +796,21 @@ static void DrawOptionsDialog() | |||
| 657 | static void DrawAboutDialog() | 796 | static void DrawAboutDialog() |
| 658 | { | 797 | { |
| 659 | if (!g_showAbout) return; | 798 | if (!g_showAbout) return; |
| 660 | ImGui::SetNextWindowSize(ImVec2(380, 170), ImGuiCond_Always); | 799 | ImGui::SetNextWindowSize(ImVec2(380.0f, 170.0f), ImGuiCond_Always); |
| 661 | ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(.5f,.5f)); | 800 | ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), |
| 801 | ImGuiCond_Always, ImVec2(0.5f, 0.5f)); | ||
| 662 | if (ImGui::Begin("About Bitflash", &g_showAbout, | 802 | if (ImGui::Begin("About Bitflash", &g_showAbout, |
| 663 | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) | 803 | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse)) |
| 664 | { | 804 | { |
| 665 | ImGui::TextColored(ImVec4(1,.6f,0,1), "Bitflash BTF v1.1.0"); | 805 | ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f), "Bitflash BTF v1.1.0"); |
| 666 | ImGui::Spacing(); | 806 | ImGui::Spacing(); |
| 667 | ImGui::TextWrapped("CPU-only cryptocurrency. RandomX proof of work. Anonymous .btf addressing over Nostr. No premine."); | 807 | ImGui::TextWrapped( |
| 808 | "CPU-only cryptocurrency. RandomX proof of work. " | ||
| 809 | "Anonymous .btf addressing over Nostr. No premine."); | ||
| 668 | ImGui::Spacing(); | 810 | ImGui::Spacing(); |
| 669 | ImGui::TextDisabled("Based on Bitcoin 0.1.0 (Satoshi Nakamoto, 2009)"); | 811 | ImGui::TextDisabled("Based on Bitcoin 0.1.0 (Satoshi Nakamoto, 2009)"); |
| 670 | ImGui::Spacing(); | 812 | ImGui::Spacing(); |
| 671 | if (ImGui::Button("OK", ImVec2(90,0))) g_showAbout = false; | 813 | if (ImGui::Button("OK", ImVec2(90.0f, 0.0f))) g_showAbout = false; |
| 672 | } | 814 | } |
| 673 | ImGui::End(); | 815 | ImGui::End(); |
| 674 | } | 816 | } |
| @@ -705,34 +847,33 @@ int RunGUI(int argc, char* argv[]) | |||
| 705 | ImGuiIO& io = ImGui::GetIO(); | 847 | ImGuiIO& io = ImGui::GetIO(); |
| 706 | io.IniFilename = nullptr; | 848 | io.IniFilename = nullptr; |
| 707 | 849 | ||
| 708 | // Load Roboto at 16px — clean, readable on all platforms | ||
| 709 | io.Fonts->AddFontFromMemoryCompressedTTF( | 850 | io.Fonts->AddFontFromMemoryCompressedTTF( |
| 710 | RobotoMedium_compressed_data, RobotoMedium_compressed_size, 16.0f); | 851 | RobotoMedium_compressed_data, RobotoMedium_compressed_size, 14.0f); |
| 711 | 852 | ||
| 712 | ImGui::StyleColorsDark(); | 853 | ImGui::StyleColorsDark(); |
| 713 | ImGuiStyle& s = ImGui::GetStyle(); | 854 | ImGuiStyle& st = ImGui::GetStyle(); |
| 714 | s.WindowRounding = s.FrameRounding = s.PopupRounding = 4.0f; | 855 | st.WindowRounding = st.FrameRounding = st.PopupRounding = 4.0f; |
| 715 | s.ItemSpacing = ImVec2(10, 7); | 856 | st.ItemSpacing = ImVec2(10.0f, 7.0f); |
| 716 | s.FramePadding = ImVec2(8, 5); | 857 | st.FramePadding = ImVec2(8.0f, 5.0f); |
| 717 | s.WindowPadding = ImVec2(12, 12); | 858 | st.WindowPadding = ImVec2(12.0f, 12.0f); |
| 718 | // Orange accent | 859 | // Orange accent |
| 719 | s.Colors[ImGuiCol_TitleBgActive] = ImVec4(.80f,.45f,.00f,1); | 860 | st.Colors[ImGuiCol_TitleBgActive] = ImVec4(.80f, .45f, .00f, 1.0f); |
| 720 | s.Colors[ImGuiCol_CheckMark] = ImVec4(1.0f,.60f,.00f,1); | 861 | st.Colors[ImGuiCol_CheckMark] = ImVec4(1.0f, .60f, .00f, 1.0f); |
| 721 | s.Colors[ImGuiCol_SliderGrab] = ImVec4(.80f,.45f,.00f,1); | 862 | st.Colors[ImGuiCol_SliderGrab] = ImVec4(.80f, .45f, .00f, 1.0f); |
| 722 | s.Colors[ImGuiCol_Button] = ImVec4(.25f,.25f,.25f,1); | 863 | st.Colors[ImGuiCol_Button] = ImVec4(.25f, .25f, .25f, 1.0f); |
| 723 | s.Colors[ImGuiCol_ButtonHovered] = ImVec4(.80f,.45f,.00f,1); | 864 | st.Colors[ImGuiCol_ButtonHovered] = ImVec4(.80f, .45f, .00f, 1.0f); |
| 724 | s.Colors[ImGuiCol_ButtonActive] = ImVec4(.60f,.30f,.00f,1); | 865 | st.Colors[ImGuiCol_ButtonActive] = ImVec4(.60f, .30f, .00f, 1.0f); |
| 725 | s.Colors[ImGuiCol_Header] = ImVec4(.80f,.45f,.00f,.40f); | 866 | st.Colors[ImGuiCol_Header] = ImVec4(.80f, .45f, .00f, .40f); |
| 726 | s.Colors[ImGuiCol_HeaderHovered] = ImVec4(.80f,.45f,.20f,.80f); | 867 | st.Colors[ImGuiCol_HeaderHovered] = ImVec4(.80f, .45f, .20f, .80f); |
| 727 | s.Colors[ImGuiCol_Tab] = ImVec4(.20f,.20f,.20f,1); | 868 | st.Colors[ImGuiCol_Tab] = ImVec4(.20f, .20f, .20f, 1.0f); |
| 728 | s.Colors[ImGuiCol_TabHovered] = ImVec4(.80f,.45f,.00f,1); | 869 | st.Colors[ImGuiCol_TabHovered] = ImVec4(.80f, .45f, .00f, 1.0f); |
| 729 | s.Colors[ImGuiCol_TabActive] = ImVec4(.80f,.45f,.00f,1); | 870 | st.Colors[ImGuiCol_TabActive] = ImVec4(.80f, .45f, .00f, 1.0f); |
| 730 | s.Colors[ImGuiCol_SeparatorHovered]=ImVec4(.80f,.45f,.00f,1); | 871 | st.Colors[ImGuiCol_SeparatorHovered]= ImVec4(.80f, .45f, .00f, 1.0f); |
| 731 | s.Colors[ImGuiCol_FrameBg] = ImVec4(.14f,.14f,.14f,1); | 872 | st.Colors[ImGuiCol_FrameBg] = ImVec4(.14f, .14f, .14f, 1.0f); |
| 732 | s.Colors[ImGuiCol_FrameBgHovered] = ImVec4(.20f,.20f,.20f,1); | 873 | st.Colors[ImGuiCol_FrameBgHovered] = ImVec4(.20f, .20f, .20f, 1.0f); |
| 733 | s.Colors[ImGuiCol_TableHeaderBg] = ImVec4(.18f,.18f,.18f,1); | 874 | st.Colors[ImGuiCol_TableHeaderBg] = ImVec4(.18f, .18f, .18f, 1.0f); |
| 734 | s.Colors[ImGuiCol_TableRowBg] = ImVec4(.11f,.11f,.11f,1); | 875 | st.Colors[ImGuiCol_TableRowBg] = ImVec4(.11f, .11f, .11f, 1.0f); |
| 735 | s.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(.14f,.14f,.14f,1); | 876 | st.Colors[ImGuiCol_TableRowBgAlt] = ImVec4(.14f, .14f, .14f, 1.0f); |
| 736 | 877 | ||
| 737 | ImGui_ImplGlfw_InitForOpenGL(window, true); | 878 | ImGui_ImplGlfw_InitForOpenGL(window, true); |
| 738 | ImGui_ImplOpenGL3_Init("#version 330"); | 879 | ImGui_ImplOpenGL3_Init("#version 330"); |
| @@ -744,22 +885,28 @@ int RunGUI(int argc, char* argv[]) | |||
| 744 | while (!glfwWindowShouldClose(window) && !fShutdown) | 885 | while (!glfwWindowShouldClose(window) && !fShutdown) |
| 745 | { | 886 | { |
| 746 | glfwPollEvents(); | 887 | glfwPollEvents(); |
| 747 | if (g_needRefresh || (frame % 120 == 0)) { RefreshWallet(); g_needRefresh = false; } | 888 | if (g_needRefresh || (frame % 120 == 0)) { |
| 889 | RefreshWallet(); | ||
| 890 | g_needRefresh = false; | ||
| 891 | } | ||
| 748 | frame++; | 892 | frame++; |
| 749 | 893 | ||
| 750 | ImGui_ImplOpenGL3_NewFrame(); | 894 | ImGui_ImplOpenGL3_NewFrame(); |
| 751 | ImGui_ImplGlfw_NewFrame(); | 895 | ImGui_ImplGlfw_NewFrame(); |
| 752 | ImGui::NewFrame(); | 896 | ImGui::NewFrame(); |
| 753 | 897 | ||
| 898 | // Draw order matters: status bar last so it is always on top. | ||
| 754 | DrawMainWindow(); | 899 | DrawMainWindow(); |
| 755 | DrawSendDialog(); | 900 | DrawSendDialog(); |
| 756 | DrawOptionsDialog(); | 901 | DrawOptionsDialog(); |
| 757 | DrawAboutDialog(); | 902 | DrawAboutDialog(); |
| 903 | DrawStatusBar(); | ||
| 758 | 904 | ||
| 759 | ImGui::Render(); | 905 | ImGui::Render(); |
| 760 | int w, h; glfwGetFramebufferSize(window, &w, &h); | 906 | int w, h; |
| 907 | glfwGetFramebufferSize(window, &w, &h); | ||
| 761 | glViewport(0, 0, w, h); | 908 | glViewport(0, 0, w, h); |
| 762 | glClearColor(.08f,.08f,.08f,1); | 909 | glClearColor(.08f, .08f, .08f, 1.0f); |
| 763 | glClear(GL_COLOR_BUFFER_BIT); | 910 | glClear(GL_COLOR_BUFFER_BIT); |
| 764 | ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); | 911 | ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); |
| 765 | glfwSwapBuffers(window); | 912 | glfwSwapBuffers(window); |
diff --git a/src/headers.h b/src/headers.h index bb252c7..367e9b0 100644 --- a/src/headers.h +++ b/src/headers.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Bitflash — main include file. | 1 | // Bitflash -- main include file. |
| 2 | // Includes core node headers. GUI is handled separately in gui.cpp. | 2 | // Includes core node headers. GUI is handled separately in gui.cpp. |
| 3 | #pragma once | 3 | #pragma once |
| 4 | #include "headers_core.h" | 4 | #include "headers_core.h" |
diff --git a/src/headers_core.h b/src/headers_core.h index 089b67f..6c0c602 100644 --- a/src/headers_core.h +++ b/src/headers_core.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Core node headers — no GUI framework dependency. | 1 | // Core node headers -- no GUI framework dependency. |
| 2 | // Included by gui.cpp and all non-GUI source files. | 2 | // Included by gui.cpp and all non-GUI source files. |
| 3 | 3 | ||
| 4 | #ifdef _MSC_VER | 4 | #ifdef _MSC_VER |
| @@ -63,12 +63,11 @@ inline typename std::common_type<T1,T2>::type max(const T1& a, const T2& b) | |||
| 63 | #include "script.h" | 63 | #include "script.h" |
| 64 | #include "db.h" | 64 | #include "db.h" |
| 65 | #include "net.h" | 65 | #include "net.h" |
| 66 | #include "irc.h" | ||
| 67 | #include "nostr.h" | 66 | #include "nostr.h" |
| 68 | #include "randomx_pow.h" | 67 | #include "randomx_pow.h" |
| 69 | #include "main.h" | 68 | #include "main.h" |
| 70 | #include "market.h" | 69 | #include "market.h" |
| 71 | 70 | ||
| 72 | // GUI callback — implemented in gui.cpp (or as no-op in headless builds) | 71 | // GUI callback -- implemented in gui.cpp (or as no-op in headless builds) |
| 73 | void MainFrameRepaint(); | 72 | void MainFrameRepaint(); |
| 74 | string DateTimeStr(int64 nTime); | 73 | string DateTimeStr(int64 nTime); |
diff --git a/src/irc.cpp b/src/irc.cpp deleted file mode 100644 index ff82c66..0000000 --- a/src/irc.cpp +++ /dev/null | |||
| @@ -1,271 +0,0 @@ | |||
| 1 | // Copyright (c) 2009 Satoshi Nakamoto | ||
| 2 | // Distributed under the MIT/X11 software license, see the accompanying | ||
| 3 | // file license.txt or http://www.opensource.org/licenses/mit-license.php. | ||
| 4 | |||
| 5 | #include "headers.h" | ||
| 6 | |||
| 7 | |||
| 8 | |||
| 9 | |||
| 10 | #pragma pack(1) | ||
| 11 | struct ircaddr | ||
| 12 | { | ||
| 13 | int ip; | ||
| 14 | short port; | ||
| 15 | }; | ||
| 16 | |||
| 17 | string EncodeAddress(const CAddress& addr) | ||
| 18 | { | ||
| 19 | struct ircaddr tmp; | ||
| 20 | tmp.ip = addr.ip; | ||
| 21 | tmp.port = addr.port; | ||
| 22 | |||
| 23 | vector<unsigned char> vch(UBEGIN(tmp), UEND(tmp)); | ||
| 24 | return string("u") + EncodeBase58Check(vch); | ||
| 25 | } | ||
| 26 | |||
| 27 | bool DecodeAddress(string str, CAddress& addr) | ||
| 28 | { | ||
| 29 | vector<unsigned char> vch; | ||
| 30 | if (!DecodeBase58Check(str.substr(1), vch)) | ||
| 31 | return false; | ||
| 32 | |||
| 33 | struct ircaddr tmp; | ||
| 34 | if (vch.size() != sizeof(tmp)) | ||
| 35 | return false; | ||
| 36 | memcpy(&tmp, &vch[0], sizeof(tmp)); | ||
| 37 | |||
| 38 | addr = CAddress(tmp.ip, tmp.port); | ||
| 39 | return true; | ||
| 40 | } | ||
| 41 | |||
| 42 | |||
| 43 | |||
| 44 | |||
| 45 | |||
| 46 | |||
| 47 | static bool Send(SOCKET hSocket, const char* pszSend) | ||
| 48 | { | ||
| 49 | if (strstr(pszSend, "PONG") != pszSend) | ||
| 50 | printf("SENDING: %s\n", pszSend); | ||
| 51 | const char* psz = pszSend; | ||
| 52 | const char* pszEnd = psz + strlen(psz); | ||
| 53 | while (psz < pszEnd) | ||
| 54 | { | ||
| 55 | int ret = send(hSocket, psz, pszEnd - psz, 0); | ||
| 56 | if (ret < 0) | ||
| 57 | return false; | ||
| 58 | psz += ret; | ||
| 59 | } | ||
| 60 | return true; | ||
| 61 | } | ||
| 62 | |||
| 63 | bool RecvLine(SOCKET hSocket, string& strLine) | ||
| 64 | { | ||
| 65 | strLine = ""; | ||
| 66 | loop | ||
| 67 | { | ||
| 68 | char c; | ||
| 69 | int nBytes = recv(hSocket, &c, 1, 0); | ||
| 70 | if (nBytes > 0) | ||
| 71 | { | ||
| 72 | if (c == '\n') | ||
| 73 | continue; | ||
| 74 | if (c == '\r') | ||
| 75 | return true; | ||
| 76 | strLine += c; | ||
| 77 | } | ||
| 78 | else if (nBytes <= 0) | ||
| 79 | { | ||
| 80 | if (!strLine.empty()) | ||
| 81 | return true; | ||
| 82 | // socket closed | ||
| 83 | printf("IRC socket closed\n"); | ||
| 84 | return false; | ||
| 85 | } | ||
| 86 | else | ||
| 87 | { | ||
| 88 | // socket error | ||
| 89 | int nErr = WSAGetLastError(); | ||
| 90 | if (nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) | ||
| 91 | { | ||
| 92 | printf("IRC recv failed: %d\n", nErr); | ||
| 93 | return false; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | bool RecvLineIRC(SOCKET hSocket, string& strLine) | ||
| 100 | { | ||
| 101 | loop | ||
| 102 | { | ||
| 103 | bool fRet = RecvLine(hSocket, strLine); | ||
| 104 | if (fRet) | ||
| 105 | { | ||
| 106 | if (fShutdown) | ||
| 107 | return false; | ||
| 108 | vector<string> vWords; | ||
| 109 | ParseString(strLine, ' ', vWords); | ||
| 110 | if (vWords[0] == "PING") | ||
| 111 | { | ||
| 112 | strLine[1] = 'O'; | ||
| 113 | strLine += '\r'; | ||
| 114 | Send(hSocket, strLine.c_str()); | ||
| 115 | continue; | ||
| 116 | } | ||
| 117 | } | ||
| 118 | return fRet; | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | bool RecvUntil(SOCKET hSocket, const char* psz1, const char* psz2=NULL, const char* psz3=NULL) | ||
| 123 | { | ||
| 124 | loop | ||
| 125 | { | ||
| 126 | string strLine; | ||
| 127 | if (!RecvLineIRC(hSocket, strLine)) | ||
| 128 | return false; | ||
| 129 | printf("IRC %s\n", strLine.c_str()); | ||
| 130 | if (psz1 && strLine.find(psz1) != -1) | ||
| 131 | return true; | ||
| 132 | if (psz2 && strLine.find(psz2) != -1) | ||
| 133 | return true; | ||
| 134 | if (psz3 && strLine.find(psz3) != -1) | ||
| 135 | return true; | ||
| 136 | } | ||
| 137 | } | ||
| 138 | |||
| 139 | |||
| 140 | |||
| 141 | |||
| 142 | bool fRestartIRCSeed = false; | ||
| 143 | |||
| 144 | void ThreadIRCSeed(void* parg) | ||
| 145 | { | ||
| 146 | // IRC peer discovery disabled: the 2009 IRC network no longer exists (and | ||
| 147 | // what answers today crashes the parser). Replaced by Nostr relay | ||
| 148 | // discovery. | ||
| 149 | printf("ThreadIRCSeed: IRC peer discovery disabled (using Nostr)\n"); | ||
| 150 | return; | ||
| 151 | |||
| 152 | loop | ||
| 153 | { | ||
| 154 | struct hostent* phostent = gethostbyname("chat.freenode.net"); | ||
| 155 | CAddress addrConnect(*(u_long*)phostent->h_addr_list[0], htons(6667)); | ||
| 156 | |||
| 157 | SOCKET hSocket; | ||
| 158 | if (!ConnectSocket(addrConnect, hSocket)) | ||
| 159 | { | ||
| 160 | printf("IRC connect failed\n"); | ||
| 161 | return; | ||
| 162 | } | ||
| 163 | |||
| 164 | if (!RecvUntil(hSocket, "Found your hostname", "using your IP address instead", "Couldn't look up your hostname")) | ||
| 165 | { | ||
| 166 | closesocket(hSocket); | ||
| 167 | return; | ||
| 168 | } | ||
| 169 | |||
| 170 | string strMyName = EncodeAddress(addrLocalHost); | ||
| 171 | |||
| 172 | if (!addrLocalHost.IsRoutable()) | ||
| 173 | strMyName = strprintf("x%u", GetRand(1000000000)); | ||
| 174 | |||
| 175 | Send(hSocket, strprintf("NICK %s\r", strMyName.c_str()).c_str()); | ||
| 176 | Send(hSocket, strprintf("USER %s 8 * : %s\r", strMyName.c_str(), strMyName.c_str()).c_str()); | ||
| 177 | |||
| 178 | if (!RecvUntil(hSocket, " 004 ")) | ||
| 179 | { | ||
| 180 | closesocket(hSocket); | ||
| 181 | return; | ||
| 182 | } | ||
| 183 | Sleep(500); | ||
| 184 | |||
| 185 | Send(hSocket, "JOIN #bitcoin\r"); | ||
| 186 | Send(hSocket, "WHO #bitcoin\r"); | ||
| 187 | |||
| 188 | while (!fRestartIRCSeed) | ||
| 189 | { | ||
| 190 | string strLine; | ||
| 191 | if (fShutdown || !RecvLineIRC(hSocket, strLine)) | ||
| 192 | { | ||
| 193 | closesocket(hSocket); | ||
| 194 | return; | ||
| 195 | } | ||
| 196 | if (strLine.empty() || strLine[0] != ':') | ||
| 197 | continue; | ||
| 198 | printf("IRC %s\n", strLine.c_str()); | ||
| 199 | |||
| 200 | vector<string> vWords; | ||
| 201 | ParseString(strLine, ' ', vWords); | ||
| 202 | if (vWords.size() < 2) | ||
| 203 | continue; | ||
| 204 | |||
| 205 | char pszName[10000]; | ||
| 206 | pszName[0] = '\0'; | ||
| 207 | |||
| 208 | if (vWords[1] == "352" && vWords.size() >= 8) | ||
| 209 | { | ||
| 210 | // index 7 is limited to 16 characters | ||
| 211 | // could get full length name at index 10, but would be different from join messages | ||
| 212 | strcpy(pszName, vWords[7].c_str()); | ||
| 213 | printf("GOT WHO: [%s] ", pszName); | ||
| 214 | } | ||
| 215 | |||
| 216 | if (vWords[1] == "JOIN") | ||
| 217 | { | ||
| 218 | // :username!username@50000007.F000000B.90000002.IP JOIN :#channelname | ||
| 219 | strcpy(pszName, vWords[0].c_str() + 1); | ||
| 220 | if (strchr(pszName, '!')) | ||
| 221 | *strchr(pszName, '!') = '\0'; | ||
| 222 | printf("GOT JOIN: [%s] ", pszName); | ||
| 223 | } | ||
| 224 | |||
| 225 | if (pszName[0] == 'u') | ||
| 226 | { | ||
| 227 | CAddress addr; | ||
| 228 | if (DecodeAddress(pszName, addr)) | ||
| 229 | { | ||
| 230 | CAddrDB addrdb; | ||
| 231 | if (AddAddress(addrdb, addr)) | ||
| 232 | printf("new "); | ||
| 233 | addr.print(); | ||
| 234 | } | ||
| 235 | else | ||
| 236 | { | ||
| 237 | printf("decode failed\n"); | ||
| 238 | } | ||
| 239 | } | ||
| 240 | } | ||
| 241 | |||
| 242 | fRestartIRCSeed = false; | ||
| 243 | closesocket(hSocket); | ||
| 244 | } | ||
| 245 | } | ||
| 246 | |||
| 247 | |||
| 248 | |||
| 249 | |||
| 250 | |||
| 251 | |||
| 252 | |||
| 253 | |||
| 254 | |||
| 255 | |||
| 256 | #ifdef TEST | ||
| 257 | int main(int argc, char *argv[]) | ||
| 258 | { | ||
| 259 | WSADATA wsadata; | ||
| 260 | if (WSAStartup(MAKEWORD(2,2), &wsadata) != NO_ERROR) | ||
| 261 | { | ||
| 262 | printf("Error at WSAStartup()\n"); | ||
| 263 | return false; | ||
| 264 | } | ||
| 265 | |||
| 266 | ThreadIRCSeed(NULL); | ||
| 267 | |||
| 268 | WSACleanup(); | ||
| 269 | return 0; | ||
| 270 | } | ||
| 271 | #endif | ||
diff --git a/src/irc.h b/src/irc.h deleted file mode 100644 index 1ae4ffc..0000000 --- a/src/irc.h +++ /dev/null | |||
| @@ -1,7 +0,0 @@ | |||
| 1 | // Copyright (c) 2009 Satoshi Nakamoto | ||
| 2 | // Distributed under the MIT/X11 software license, see the accompanying | ||
| 3 | // file license.txt or http://www.opensource.org/licenses/mit-license.php. | ||
| 4 | |||
| 5 | extern bool RecvLine(SOCKET hSocket, string& strLine); | ||
| 6 | extern void ThreadIRCSeed(void* parg); | ||
| 7 | extern bool fRestartIRCSeed; | ||
diff --git a/src/main.cpp b/src/main.cpp index f3de4d3..aff7bab 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include "sha.h" | 13 | #include "sha.h" |
| 14 | #include <atomic> | 14 | #include <atomic> |
| 15 | #include <mutex> | 15 | #include <mutex> |
| 16 | #include <thread> | ||
| 16 | #include "btfaddr.h" | 17 | #include "btfaddr.h" |
| 17 | #include "btftunnel.h" | 18 | #include "btftunnel.h" |
| 18 | #ifndef _WIN32 | 19 | #ifndef _WIN32 |
| @@ -73,7 +74,7 @@ bool fSoloMineTest = false; // /solomine: mine without requiring a peer (local t | |||
| 73 | int fGenerateBitcoins; | 74 | int fGenerateBitcoins; |
| 74 | int64 nTransactionFee = 0; | 75 | int64 nTransactionFee = 0; |
| 75 | CAddress addrIncoming; | 76 | CAddress addrIncoming; |
| 76 | int nMineMode = MINE_SOLO; | 77 | int nMineMode = MINE_RELAY; |
| 77 | string strParticipantPool; // participant mode: pool .btf address | 78 | string strParticipantPool; // participant mode: pool .btf address |
| 78 | string strPoolName = "Bitflash Pool"; | 79 | string strPoolName = "Bitflash Pool"; |
| 79 | string strPoolDashboardUrl; | 80 | string strPoolDashboardUrl; |
| @@ -88,11 +89,10 @@ static std::string gParticipantStatus; | |||
| 88 | 89 | ||
| 89 | void SetParticipantMiningStatus(const std::string& status) | 90 | void SetParticipantMiningStatus(const std::string& status) |
| 90 | { | 91 | { |
| 92 | // Updates the GUI status string only. Logging is done at each call site | ||
| 93 | // with full context; duplicating it here just adds noise to the log. | ||
| 91 | std::lock_guard<std::mutex> lk(gParticipantStatusMutex); | 94 | std::lock_guard<std::mutex> lk(gParticipantStatusMutex); |
| 92 | if (gParticipantStatus == status) | ||
| 93 | return; | ||
| 94 | gParticipantStatus = status; | 95 | gParticipantStatus = status; |
| 95 | printf("PoolParticipantMiner: status -> %s\n", status.c_str()); | ||
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | std::string GetParticipantMiningStatus() | 98 | std::string GetParticipantMiningStatus() |
| @@ -159,7 +159,7 @@ bool AddToWallet(const CWalletTx& wtxIn) | |||
| 159 | wtx.nTimeReceived = GetAdjustedTime(); | 159 | wtx.nTimeReceived = GetAdjustedTime(); |
| 160 | 160 | ||
| 161 | //// debug print | 161 | //// debug print |
| 162 | printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update"); | 162 | if (LogAcceptsCategory("net")) printf("AddToWallet %s %s\n", wtxIn.GetHash().ToString().substr(0,6).c_str(), fInsertedNew ? "new" : "update"); |
| 163 | 163 | ||
| 164 | if (!fInsertedNew) | 164 | if (!fInsertedNew) |
| 165 | { | 165 | { |
| @@ -372,7 +372,7 @@ int CMerkleTx::SetMerkleBranch(const CBlock* pblock) | |||
| 372 | { | 372 | { |
| 373 | vMerkleBranch.clear(); | 373 | vMerkleBranch.clear(); |
| 374 | nIndex = -1; | 374 | nIndex = -1; |
| 375 | printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); | 375 | if (LogAcceptsCategory("net")) printf("ERROR: SetMerkleBranch() : couldn't find tx in block\n"); |
| 376 | return 0; | 376 | return 0; |
| 377 | } | 377 | } |
| 378 | 378 | ||
| @@ -433,7 +433,7 @@ void CWalletTx::AddSupportingTransactions(CTxDB& txdb) | |||
| 433 | } | 433 | } |
| 434 | else | 434 | else |
| 435 | { | 435 | { |
| 436 | printf("ERROR: AddSupportingTransactions() : unsupported transaction\n"); | 436 | if (LogAcceptsCategory("net")) printf("ERROR: AddSupportingTransactions() : unsupported transaction\n"); |
| 437 | continue; | 437 | continue; |
| 438 | } | 438 | } |
| 439 | 439 | ||
| @@ -519,7 +519,7 @@ bool CTransaction::AcceptTransaction(CTxDB& txdb, bool fCheckInputs, bool* pfMis | |||
| 519 | { | 519 | { |
| 520 | if (ptxOld) | 520 | if (ptxOld) |
| 521 | { | 521 | { |
| 522 | printf("mapTransaction.erase(%s) replacing with new version\n", ptxOld->GetHash().ToString().c_str()); | 522 | if (LogAcceptsCategory("net")) printf("mapTransaction.erase(%s) replacing with new version\n", ptxOld->GetHash().ToString().c_str()); |
| 523 | mapTransactions.erase(ptxOld->GetHash()); | 523 | mapTransactions.erase(ptxOld->GetHash()); |
| 524 | } | 524 | } |
| 525 | AddToMemoryPool(); | 525 | AddToMemoryPool(); |
| @@ -530,7 +530,7 @@ bool CTransaction::AcceptTransaction(CTxDB& txdb, bool fCheckInputs, bool* pfMis | |||
| 530 | if (ptxOld) | 530 | if (ptxOld) |
| 531 | EraseFromWallet(ptxOld->GetHash()); | 531 | EraseFromWallet(ptxOld->GetHash()); |
| 532 | 532 | ||
| 533 | printf("AcceptTransaction(): accepted %s\n", hash.ToString().substr(0,6).c_str()); | 533 | if (LogAcceptsCategory("net")) printf("AcceptTransaction(): accepted %s\n", hash.ToString().substr(0,6).c_str()); |
| 534 | return true; | 534 | return true; |
| 535 | } | 535 | } |
| 536 | 536 | ||
| @@ -669,7 +669,7 @@ void CWalletTx::RelayWalletTransaction(CTxDB& txdb) | |||
| 669 | uint256 hash = GetHash(); | 669 | uint256 hash = GetHash(); |
| 670 | if (!txdb.ContainsTx(hash)) | 670 | if (!txdb.ContainsTx(hash)) |
| 671 | { | 671 | { |
| 672 | printf("Relaying wtx %s\n", hash.ToString().substr(0,6).c_str()); | 672 | if (LogAcceptsCategory("net")) printf("Relaying wtx %s\n", hash.ToString().substr(0,6).c_str()); |
| 673 | RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this); | 673 | RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this); |
| 674 | } | 674 | } |
| 675 | } | 675 | } |
| @@ -683,7 +683,7 @@ void RelayWalletTransactions() | |||
| 683 | nLastTime = GetTime(); | 683 | nLastTime = GetTime(); |
| 684 | 684 | ||
| 685 | // Rebroadcast any of our txes that aren't in a block yet | 685 | // Rebroadcast any of our txes that aren't in a block yet |
| 686 | printf("RelayWalletTransactions()\n"); | 686 | if (LogAcceptsCategory("net")) printf("RelayWalletTransactions()\n"); |
| 687 | CTxDB txdb("r"); | 687 | CTxDB txdb("r"); |
| 688 | CRITICAL_BLOCK(cs_mapWallet) | 688 | CRITICAL_BLOCK(cs_mapWallet) |
| 689 | { | 689 | { |
| @@ -764,7 +764,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast) | |||
| 764 | 764 | ||
| 765 | // Limit adjustment step | 765 | // Limit adjustment step |
| 766 | unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime; | 766 | unsigned int nActualTimespan = pindexLast->nTime - pindexFirst->nTime; |
| 767 | printf(" nActualTimespan = %d before bounds\n", nActualTimespan); | 767 | if (LogAcceptsCategory("net")) printf(" nActualTimespan = %d before bounds\n", nActualTimespan); |
| 768 | if (nActualTimespan < nTargetTimespan/4) | 768 | if (nActualTimespan < nTargetTimespan/4) |
| 769 | nActualTimespan = nTargetTimespan/4; | 769 | nActualTimespan = nTargetTimespan/4; |
| 770 | if (nActualTimespan > nTargetTimespan*4) | 770 | if (nActualTimespan > nTargetTimespan*4) |
| @@ -780,10 +780,7 @@ unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast) | |||
| 780 | bnNew = bnProofOfWorkLimit; | 780 | bnNew = bnProofOfWorkLimit; |
| 781 | 781 | ||
| 782 | /// debug print | 782 | /// debug print |
| 783 | printf("\n\n\nGetNextWorkRequired RETARGET *****\n"); | 783 | if (LogAcceptsCategory("net")) { printf("\n\n\nGetNextWorkRequired RETARGET *****\n"); printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan); printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str()); printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str()); } |
| 784 | printf("nTargetTimespan = %d nActualTimespan = %d\n", nTargetTimespan, nActualTimespan); | ||
| 785 | printf("Before: %08x %s\n", pindexLast->nBits, CBigNum().SetCompact(pindexLast->nBits).getuint256().ToString().c_str()); | ||
| 786 | printf("After: %08x %s\n", bnNew.GetCompact(), bnNew.getuint256().ToString().c_str()); | ||
| 787 | 784 | ||
| 788 | return bnNew.GetCompact(); | 785 | return bnNew.GetCompact(); |
| 789 | } | 786 | } |
| @@ -1037,7 +1034,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex) | |||
| 1037 | 1034 | ||
| 1038 | bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) | 1035 | bool Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) |
| 1039 | { | 1036 | { |
| 1040 | printf("*** REORGANIZE ***\n"); | 1037 | LogPrint("net", "*** REORGANIZE ***\n"); |
| 1041 | 1038 | ||
| 1042 | // Find the fork | 1039 | // Find the fork |
| 1043 | CBlockIndex* pfork = pindexBest; | 1040 | CBlockIndex* pfork = pindexBest; |
| @@ -1712,7 +1709,7 @@ bool ProcessMessages(CNode* pfrom) | |||
| 1712 | CDataStream& vRecv = pfrom->vRecv; | 1709 | CDataStream& vRecv = pfrom->vRecv; |
| 1713 | if (vRecv.empty()) | 1710 | if (vRecv.empty()) |
| 1714 | return true; | 1711 | return true; |
| 1715 | printf("ProcessMessages(%d bytes)\n", vRecv.size()); | 1712 | LogPrint("net", "ProcessMessages(%d bytes)\n", vRecv.size()); |
| 1716 | 1713 | ||
| 1717 | // | 1714 | // |
| 1718 | // Message format | 1715 | // Message format |
| @@ -1730,13 +1727,13 @@ bool ProcessMessages(CNode* pfrom) | |||
| 1730 | { | 1727 | { |
| 1731 | if (vRecv.size() > sizeof(CMessageHeader)) | 1728 | if (vRecv.size() > sizeof(CMessageHeader)) |
| 1732 | { | 1729 | { |
| 1733 | printf("\n\nPROCESSMESSAGE MESSAGESTART NOT FOUND\n\n"); | 1730 | if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE MESSAGESTART NOT FOUND\n\n"); |
| 1734 | vRecv.erase(vRecv.begin(), vRecv.end() - sizeof(CMessageHeader)); | 1731 | vRecv.erase(vRecv.begin(), vRecv.end() - sizeof(CMessageHeader)); |
| 1735 | } | 1732 | } |
| 1736 | break; | 1733 | break; |
| 1737 | } | 1734 | } |
| 1738 | if (pstart - vRecv.begin() > 0) | 1735 | if (pstart - vRecv.begin() > 0) |
| 1739 | printf("\n\nPROCESSMESSAGE SKIPPED %d BYTES\n\n", pstart - vRecv.begin()); | 1736 | if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE SKIPPED %d BYTES\n\n", pstart - vRecv.begin()); |
| 1740 | vRecv.erase(vRecv.begin(), pstart); | 1737 | vRecv.erase(vRecv.begin(), pstart); |
| 1741 | 1738 | ||
| 1742 | // Read header | 1739 | // Read header |
| @@ -1744,7 +1741,7 @@ bool ProcessMessages(CNode* pfrom) | |||
| 1744 | vRecv >> hdr; | 1741 | vRecv >> hdr; |
| 1745 | if (!hdr.IsValid()) | 1742 | if (!hdr.IsValid()) |
| 1746 | { | 1743 | { |
| 1747 | printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str()); | 1744 | if (LogAcceptsCategory("net")) printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str()); |
| 1748 | continue; | 1745 | continue; |
| 1749 | } | 1746 | } |
| 1750 | string strCommand = hdr.GetCommand(); | 1747 | string strCommand = hdr.GetCommand(); |
| @@ -1755,7 +1752,7 @@ bool ProcessMessages(CNode* pfrom) | |||
| 1755 | { | 1752 | { |
| 1756 | // Rewind and wait for rest of message | 1753 | // Rewind and wait for rest of message |
| 1757 | ///// need a mechanism to give up waiting for overlong message size error | 1754 | ///// need a mechanism to give up waiting for overlong message size error |
| 1758 | printf("MESSAGE-BREAK 2\n"); | 1755 | if (LogAcceptsCategory("net")) printf("MESSAGE-BREAK 2\n"); |
| 1759 | vRecv.insert(vRecv.begin(), BEGIN(hdr), END(hdr)); | 1756 | vRecv.insert(vRecv.begin(), BEGIN(hdr), END(hdr)); |
| 1760 | Sleep(100); | 1757 | Sleep(100); |
| 1761 | break; | 1758 | break; |
| @@ -1776,7 +1773,7 @@ bool ProcessMessages(CNode* pfrom) | |||
| 1776 | } | 1773 | } |
| 1777 | CATCH_PRINT_EXCEPTION("ProcessMessage()") | 1774 | CATCH_PRINT_EXCEPTION("ProcessMessage()") |
| 1778 | if (!fRet) | 1775 | if (!fRet) |
| 1779 | printf("ProcessMessage(%s, %d bytes) from %s to %s FAILED\n", strCommand.c_str(), nMessageSize, pfrom->addr.ToString().c_str(), addrLocalHost.ToString().c_str()); | 1776 | if (LogAcceptsCategory("net")) printf("ProcessMessage(%s, %d bytes) from %s to %s FAILED\n", strCommand.c_str(), nMessageSize, pfrom->addr.ToString().c_str(), addrLocalHost.ToString().c_str()); |
| 1780 | } | 1777 | } |
| 1781 | 1778 | ||
| 1782 | vRecv.Compact(); | 1779 | vRecv.Compact(); |
| @@ -1789,13 +1786,10 @@ bool ProcessMessages(CNode* pfrom) | |||
| 1789 | bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | 1786 | bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) |
| 1790 | { | 1787 | { |
| 1791 | static map<unsigned int, vector<unsigned char> > mapReuseKey; | 1788 | static map<unsigned int, vector<unsigned char> > mapReuseKey; |
| 1792 | printf("received: %-12s (%d bytes) ", strCommand.c_str(), vRecv.size()); | 1789 | if (LogAcceptsCategory("net")) { printf("received: %-12s (%d bytes) ", strCommand.c_str(), vRecv.size()); for (int i = 0; i < min(vRecv.size(), (unsigned int)25); i++) printf("%02x ", vRecv[i] & 0xff); printf("\n"); } |
| 1793 | for (int i = 0; i < min(vRecv.size(), (unsigned int)25); i++) | ||
| 1794 | printf("%02x ", vRecv[i] & 0xff); | ||
| 1795 | printf("\n"); | ||
| 1796 | if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) | 1790 | if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) |
| 1797 | { | 1791 | { |
| 1798 | printf("dropmessages DROPPING RECV MESSAGE\n"); | 1792 | if (LogAcceptsCategory("net")) printf("dropmessages DROPPING RECV MESSAGE\n"); |
| 1799 | return true; | 1793 | return true; |
| 1800 | } | 1794 | } |
| 1801 | 1795 | ||
| @@ -1833,7 +1827,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 1833 | pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0)); | 1827 | pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0)); |
| 1834 | } | 1828 | } |
| 1835 | 1829 | ||
| 1836 | printf("version addrMe = %s\n", addrMe.ToString().c_str()); | 1830 | if (LogAcceptsCategory("net")) printf("version addrMe = %s\n", addrMe.ToString().c_str()); |
| 1837 | } | 1831 | } |
| 1838 | 1832 | ||
| 1839 | 1833 | ||
| @@ -1844,30 +1838,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 1844 | } | 1838 | } |
| 1845 | 1839 | ||
| 1846 | 1840 | ||
| 1847 | else if (strCommand == "addr") | ||
| 1848 | { | ||
| 1849 | vector<CAddress> vAddr; | ||
| 1850 | vRecv >> vAddr; | ||
| 1851 | |||
| 1852 | // Store the new addresses | ||
| 1853 | CAddrDB addrdb; | ||
| 1854 | foreach(const CAddress& addr, vAddr) | ||
| 1855 | { | ||
| 1856 | if (fShutdown) | ||
| 1857 | return true; | ||
| 1858 | if (AddAddress(addrdb, addr)) | ||
| 1859 | { | ||
| 1860 | // Put on lists to send to other nodes | ||
| 1861 | pfrom->setAddrKnown.insert(addr); | ||
| 1862 | CRITICAL_BLOCK(cs_vNodes) | ||
| 1863 | foreach(CNode* pnode, vNodes) | ||
| 1864 | if (!pnode->setAddrKnown.count(addr)) | ||
| 1865 | pnode->vAddrToSend.push_back(addr); | ||
| 1866 | } | ||
| 1867 | } | ||
| 1868 | } | ||
| 1869 | |||
| 1870 | |||
| 1871 | else if (strCommand == "inv") | 1841 | else if (strCommand == "inv") |
| 1872 | { | 1842 | { |
| 1873 | vector<CInv> vInv; | 1843 | vector<CInv> vInv; |
| @@ -1881,7 +1851,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 1881 | pfrom->AddInventoryKnown(inv); | 1851 | pfrom->AddInventoryKnown(inv); |
| 1882 | 1852 | ||
| 1883 | bool fAlreadyHave = AlreadyHave(txdb, inv); | 1853 | bool fAlreadyHave = AlreadyHave(txdb, inv); |
| 1884 | printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new"); | 1854 | if (LogAcceptsCategory("net")) printf(" got inventory: %s %s\n", inv.ToString().c_str(), fAlreadyHave ? "have" : "new"); |
| 1885 | 1855 | ||
| 1886 | if (!fAlreadyHave) | 1856 | if (!fAlreadyHave) |
| 1887 | pfrom->AskFor(inv); | 1857 | pfrom->AskFor(inv); |
| @@ -1900,7 +1870,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 1900 | { | 1870 | { |
| 1901 | if (fShutdown) | 1871 | if (fShutdown) |
| 1902 | return true; | 1872 | return true; |
| 1903 | printf("received getdata for: %s\n", inv.ToString().c_str()); | 1873 | if (LogAcceptsCategory("net")) printf("received getdata for: %s\n", inv.ToString().c_str()); |
| 1904 | 1874 | ||
| 1905 | if (inv.type == MSG_BLOCK) | 1875 | if (inv.type == MSG_BLOCK) |
| 1906 | { | 1876 | { |
| @@ -1940,12 +1910,12 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 1940 | // Send the rest of the chain | 1910 | // Send the rest of the chain |
| 1941 | if (pindex) | 1911 | if (pindex) |
| 1942 | pindex = pindex->pnext; | 1912 | pindex = pindex->pnext; |
| 1943 | printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,14).c_str()); | 1913 | if (LogAcceptsCategory("net")) printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,14).c_str()); |
| 1944 | for (; pindex; pindex = pindex->pnext) | 1914 | for (; pindex; pindex = pindex->pnext) |
| 1945 | { | 1915 | { |
| 1946 | if (pindex->GetBlockHash() == hashStop) | 1916 | if (pindex->GetBlockHash() == hashStop) |
| 1947 | { | 1917 | { |
| 1948 | printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,14).c_str()); | 1918 | if (LogAcceptsCategory("net")) printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,14).c_str()); |
| 1949 | break; | 1919 | break; |
| 1950 | } | 1920 | } |
| 1951 | 1921 | ||
| @@ -1997,7 +1967,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 1997 | 1967 | ||
| 1998 | if (tx.AcceptTransaction(true)) | 1968 | if (tx.AcceptTransaction(true)) |
| 1999 | { | 1969 | { |
| 2000 | printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); | 1970 | if (LogAcceptsCategory("net")) printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); |
| 2001 | AddToWalletIfMine(tx, NULL); | 1971 | AddToWalletIfMine(tx, NULL); |
| 2002 | RelayMessage(inv, vMsg); | 1972 | RelayMessage(inv, vMsg); |
| 2003 | mapAlreadyAskedFor.erase(inv); | 1973 | mapAlreadyAskedFor.erase(inv); |
| @@ -2011,7 +1981,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 2011 | } | 1981 | } |
| 2012 | else if (fMissingInputs) | 1982 | else if (fMissingInputs) |
| 2013 | { | 1983 | { |
| 2014 | printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); | 1984 | if (LogAcceptsCategory("net")) printf("storing orphan tx %s\n", inv.hash.ToString().substr(0,6).c_str()); |
| 2015 | AddOrphanTx(vMsg); | 1985 | AddOrphanTx(vMsg); |
| 2016 | } | 1986 | } |
| 2017 | } | 1987 | } |
| @@ -2041,7 +2011,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 2041 | vRecv >> *pblock; | 2011 | vRecv >> *pblock; |
| 2042 | 2012 | ||
| 2043 | //// debug print | 2013 | //// debug print |
| 2044 | printf("received block:\n"); pblock->print(); | 2014 | if (LogAcceptsCategory("net")) { printf("received block:\n"); pblock->print(); } |
| 2045 | 2015 | ||
| 2046 | CInv inv(MSG_BLOCK, pblock->GetHash()); | 2016 | CInv inv(MSG_BLOCK, pblock->GetHash()); |
| 2047 | pfrom->AddInventoryKnown(inv); | 2017 | pfrom->AddInventoryKnown(inv); |
| @@ -2051,25 +2021,6 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 2051 | } | 2021 | } |
| 2052 | 2022 | ||
| 2053 | 2023 | ||
| 2054 | else if (strCommand == "getaddr") | ||
| 2055 | { | ||
| 2056 | pfrom->vAddrToSend.clear(); | ||
| 2057 | //// need to expand the time range if not enough found | ||
| 2058 | int64 nSince = GetAdjustedTime() - 60 * 60; // in the last hour | ||
| 2059 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 2060 | { | ||
| 2061 | foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses) | ||
| 2062 | { | ||
| 2063 | if (fShutdown) | ||
| 2064 | return true; | ||
| 2065 | const CAddress& addr = item.second; | ||
| 2066 | if (addr.nTime > nSince) | ||
| 2067 | pfrom->vAddrToSend.push_back(addr); | ||
| 2068 | } | ||
| 2069 | } | ||
| 2070 | } | ||
| 2071 | |||
| 2072 | |||
| 2073 | else if (strCommand == "checkorder") | 2024 | else if (strCommand == "checkorder") |
| 2074 | { | 2025 | { |
| 2075 | uint256 hashReply; | 2026 | uint256 hashReply; |
| @@ -2134,12 +2085,12 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) | |||
| 2134 | else | 2085 | else |
| 2135 | { | 2086 | { |
| 2136 | // Ignore unknown commands for extensibility | 2087 | // Ignore unknown commands for extensibility |
| 2137 | printf("ProcessMessage(%s) : Ignored unknown message\n", strCommand.c_str()); | 2088 | if (LogAcceptsCategory("net")) printf("ProcessMessage(%s) : Ignored unknown message\n", strCommand.c_str()); |
| 2138 | } | 2089 | } |
| 2139 | 2090 | ||
| 2140 | 2091 | ||
| 2141 | if (!vRecv.empty()) | 2092 | if (!vRecv.empty()) |
| 2142 | printf("ProcessMessage(%s) : %d extra bytes\n", strCommand.c_str(), vRecv.size()); | 2093 | if (LogAcceptsCategory("net")) printf("ProcessMessage(%s) : %d extra bytes\n", strCommand.c_str(), vRecv.size()); |
| 2143 | 2094 | ||
| 2144 | return true; | 2095 | return true; |
| 2145 | } | 2096 | } |
| @@ -2163,19 +2114,6 @@ bool SendMessages(CNode* pto) | |||
| 2163 | 2114 | ||
| 2164 | 2115 | ||
| 2165 | // | 2116 | // |
| 2166 | // Message: addr | ||
| 2167 | // | ||
| 2168 | vector<CAddress> vAddrToSend; | ||
| 2169 | vAddrToSend.reserve(pto->vAddrToSend.size()); | ||
| 2170 | foreach(const CAddress& addr, pto->vAddrToSend) | ||
| 2171 | if (!pto->setAddrKnown.count(addr)) | ||
| 2172 | vAddrToSend.push_back(addr); | ||
| 2173 | pto->vAddrToSend.clear(); | ||
| 2174 | if (!vAddrToSend.empty()) | ||
| 2175 | pto->PushMessage("addr", vAddrToSend); | ||
| 2176 | |||
| 2177 | |||
| 2178 | // | ||
| 2179 | // Message: inventory | 2117 | // Message: inventory |
| 2180 | // | 2118 | // |
| 2181 | vector<CInv> vInventoryToSend; | 2119 | vector<CInv> vInventoryToSend; |
| @@ -2204,7 +2142,7 @@ bool SendMessages(CNode* pto) | |||
| 2204 | while (!pto->mapAskFor.empty() && (*pto->mapAskFor.begin()).first <= nNow) | 2142 | while (!pto->mapAskFor.empty() && (*pto->mapAskFor.begin()).first <= nNow) |
| 2205 | { | 2143 | { |
| 2206 | const CInv& inv = (*pto->mapAskFor.begin()).second; | 2144 | const CInv& inv = (*pto->mapAskFor.begin()).second; |
| 2207 | printf("sending getdata: %s\n", inv.ToString().c_str()); | 2145 | if (LogAcceptsCategory("net")) printf("sending getdata: %s\n", inv.ToString().c_str()); |
| 2208 | if (!AlreadyHave(txdb, inv)) | 2146 | if (!AlreadyHave(txdb, inv)) |
| 2209 | vAskFor.push_back(inv); | 2147 | vAskFor.push_back(inv); |
| 2210 | pto->mapAskFor.erase(pto->mapAskFor.begin()); | 2148 | pto->mapAskFor.erase(pto->mapAskFor.begin()); |
| @@ -2280,13 +2218,21 @@ void BlockSHA256(const void* pin, unsigned int nBlocks, void* pout) | |||
| 2280 | 2218 | ||
| 2281 | 2219 | ||
| 2282 | // --------------------------------------------------------------------------- | 2220 | // --------------------------------------------------------------------------- |
| 2283 | // Participant pool miner — connects to an external Stratum server, receives | 2221 | // Participant pool miner -- connects to an external Stratum server, receives |
| 2284 | // RandomX jobs, hashes with the local CPU, and submits shares. | 2222 | // RandomX jobs, hashes with the local CPU, and submits shares. |
| 2285 | // Called from BitcoinMiner() when nMineMode == MINE_PARTICIPANT. | 2223 | // Called from BitcoinMiner() when nMineMode == MINE_PARTICIPANT. |
| 2286 | // --------------------------------------------------------------------------- | 2224 | // --------------------------------------------------------------------------- |
| 2287 | 2225 | ||
| 2288 | using json = nlohmann::json; | 2226 | using json = nlohmann::json; |
| 2289 | 2227 | ||
| 2228 | |||
| 2229 | // --------------------------------------------------------------------------- | ||
| 2230 | // Participant miner -- connects to a pool over a .btf tunnel, runs Stratum, | ||
| 2231 | // hashes with RandomX, submits shares. Called from BitcoinMiner(). | ||
| 2232 | // --------------------------------------------------------------------------- | ||
| 2233 | |||
| 2234 | using json = nlohmann::json; | ||
| 2235 | |||
| 2290 | static std::string ToHexStr(const void* p, size_t n) | 2236 | static std::string ToHexStr(const void* p, size_t n) |
| 2291 | { | 2237 | { |
| 2292 | const unsigned char* b = (const unsigned char*)p; | 2238 | const unsigned char* b = (const unsigned char*)p; |
| @@ -2300,10 +2246,10 @@ static std::vector<unsigned char> FromHexStr(const std::string& s) | |||
| 2300 | { | 2246 | { |
| 2301 | std::vector<unsigned char> v; | 2247 | std::vector<unsigned char> v; |
| 2302 | for (size_t i = 0; i+1 < s.size(); i += 2) { | 2248 | for (size_t i = 0; i+1 < s.size(); i += 2) { |
| 2303 | auto h=[](char c)->int{ | 2249 | auto h = [](char c)->int{ |
| 2304 | if(c>='0'&&c<='9')return c-'0'; | 2250 | if(c>='0'&&c<='9') return c-'0'; |
| 2305 | if(c>='a'&&c<='f')return c-'a'+10; | 2251 | if(c>='a'&&c<='f') return c-'a'+10; |
| 2306 | if(c>='A'&&c<='F')return c-'A'+10; | 2252 | if(c>='A'&&c<='F') return c-'A'+10; |
| 2307 | return 0; | 2253 | return 0; |
| 2308 | }; | 2254 | }; |
| 2309 | v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); | 2255 | v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); |
| @@ -2313,14 +2259,13 @@ static std::vector<unsigned char> FromHexStr(const std::string& s) | |||
| 2313 | 2259 | ||
| 2314 | static void UpdateParticipantHashRate(uint64 hashesSinceSample, int64 sampleStart) | 2260 | static void UpdateParticipantHashRate(uint64 hashesSinceSample, int64 sampleStart) |
| 2315 | { | 2261 | { |
| 2316 | int64 now = GetTime(); | 2262 | int64 elapsed = GetTime() - sampleStart; |
| 2317 | int64 elapsed = now - sampleStart; | 2263 | if (elapsed <= 0) elapsed = 1; |
| 2318 | if (elapsed <= 0) | 2264 | gParticipantHashRateX1000.store( |
| 2319 | elapsed = 1; | 2265 | (uint64)((double)hashesSinceSample / (double)elapsed * 1000.0)); |
| 2320 | double rate = (double)hashesSinceSample / (double)elapsed; | ||
| 2321 | gParticipantHashRateX1000.store((uint64)(rate * 1000.0)); | ||
| 2322 | } | 2266 | } |
| 2323 | 2267 | ||
| 2268 | // Blocking send of a JSON line to the pool. | ||
| 2324 | static bool StratumSendLine(SOCKET s, const json& j) | 2269 | static bool StratumSendLine(SOCKET s, const json& j) |
| 2325 | { | 2270 | { |
| 2326 | std::string line = j.dump() + "\n"; | 2271 | std::string line = j.dump() + "\n"; |
| @@ -2333,38 +2278,59 @@ static bool StratumSendLine(SOCKET s, const json& j) | |||
| 2333 | return true; | 2278 | return true; |
| 2334 | } | 2279 | } |
| 2335 | 2280 | ||
| 2336 | static bool StratumRecvLine(SOCKET s, std::string& buf, std::string& line) | 2281 | // Non-blocking recv into carry buffer. Returns true + fills line when a |
| 2282 | // complete newline-terminated message is ready. Returns false in two cases: | ||
| 2283 | // disconnected=true -- socket closed by peer; caller must stop | ||
| 2284 | // disconnected=false -- no complete line yet; caller should select() and retry | ||
| 2285 | static bool StratumRecvLine(SOCKET s, std::string& buf, | ||
| 2286 | std::string& line, bool& disconnected) | ||
| 2337 | { | 2287 | { |
| 2338 | while (true) { | 2288 | disconnected = false; |
| 2339 | size_t pos = buf.find('\n'); | 2289 | char tmp[4096]; |
| 2340 | if (pos != std::string::npos) { | 2290 | #ifdef _WIN32 |
| 2341 | line = buf.substr(0, pos); | 2291 | u_long avail = 0; |
| 2342 | if (!line.empty() && line.back()=='\r') line.pop_back(); | 2292 | ioctlsocket(s, FIONREAD, &avail); |
| 2343 | buf = buf.substr(pos+1); | 2293 | if (avail > 0) { |
| 2344 | return true; | 2294 | int r = recv(s, tmp, (int)std::min((u_long)(sizeof(tmp)-1), avail), 0); |
| 2345 | } | 2295 | if (r > 0) { tmp[r] = 0; buf += tmp; } |
| 2346 | char tmp[4096]; | 2296 | else if (r == 0) { disconnected = true; return false; } |
| 2347 | int r = recv(s, tmp, sizeof(tmp)-1, 0); | 2297 | } |
| 2348 | if (r <= 0) return false; | 2298 | #else |
| 2349 | tmp[r] = 0; | 2299 | { |
| 2350 | buf += tmp; | 2300 | int r = recv(s, tmp, sizeof(tmp)-1, MSG_DONTWAIT); |
| 2301 | if (r > 0) { tmp[r] = 0; buf += tmp; } | ||
| 2302 | else if (r == 0) { disconnected = true; return false; } | ||
| 2303 | // r < 0: EAGAIN -- no data right now | ||
| 2351 | } | 2304 | } |
| 2305 | #endif | ||
| 2306 | size_t pos = buf.find('\n'); | ||
| 2307 | if (pos == std::string::npos) return false; | ||
| 2308 | line = buf.substr(0, pos); | ||
| 2309 | if (!line.empty() && line.back() == '\r') line.pop_back(); | ||
| 2310 | buf = buf.substr(pos + 1); | ||
| 2311 | return true; | ||
| 2352 | } | 2312 | } |
| 2353 | 2313 | ||
| 2314 | // How long to wait for a mining.notify after authorize before giving up | ||
| 2315 | static const int64 STUCK_NO_JOB_TIMEOUT_SECS = 120; | ||
| 2316 | |||
| 2354 | static bool PoolParticipantMiner() | 2317 | static bool PoolParticipantMiner() |
| 2355 | { | 2318 | { |
| 2356 | printf("PoolParticipantMiner: connecting to %s\n", strParticipantPool.c_str()); | 2319 | // ------------------------------------------------------------------ |
| 2357 | SetParticipantMiningStatus("resolving pool address"); | 2320 | // Step 1: resolve .btf address -> meeting node |
| 2358 | 2321 | // ------------------------------------------------------------------ | |
| 2359 | if (strParticipantPool.empty()) { | 2322 | if (strParticipantPool.empty()) { |
| 2360 | printf("PoolParticipantMiner: no pool selected\n"); | 2323 | LogPrint("worker", "[worker] no pool selected\n"); |
| 2361 | SetParticipantMiningStatus("no pool selected"); | 2324 | SetParticipantMiningStatus("no pool selected"); |
| 2362 | return false; | 2325 | return false; |
| 2363 | } | 2326 | } |
| 2364 | 2327 | ||
| 2328 | LogPrint("worker", "[worker] connecting to pool %s\n", strParticipantPool.c_str()); | ||
| 2329 | SetParticipantMiningStatus("resolving pool address"); | ||
| 2330 | |||
| 2365 | unsigned char target_pubkey[32]; | 2331 | unsigned char target_pubkey[32]; |
| 2366 | if (!btf::ParseAddress(strParticipantPool, target_pubkey)) { | 2332 | if (!btf::ParseAddress(strParticipantPool, target_pubkey)) { |
| 2367 | printf("PoolParticipantMiner: invalid .btf address %s\n", strParticipantPool.c_str()); | 2333 | LogPrint("worker", "[worker] invalid .btf address: %s\n", strParticipantPool.c_str()); |
| 2368 | SetParticipantMiningStatus("invalid pool address"); | 2334 | SetParticipantMiningStatus("invalid pool address"); |
| 2369 | return false; | 2335 | return false; |
| 2370 | } | 2336 | } |
| @@ -2372,35 +2338,48 @@ static bool PoolParticipantMiner() | |||
| 2372 | std::string meetingHostPort; | 2338 | std::string meetingHostPort; |
| 2373 | unsigned char service_enc_pub[32]; | 2339 | unsigned char service_enc_pub[32]; |
| 2374 | if (!BtfResolve(strParticipantPool, meetingHostPort, service_enc_pub)) { | 2340 | if (!BtfResolve(strParticipantPool, meetingHostPort, service_enc_pub)) { |
| 2375 | printf("PoolParticipantMiner: failed to resolve %s\n", strParticipantPool.c_str()); | 2341 | LogPrint("worker", "[worker] failed to resolve pool %s" |
| 2342 | " (no Nostr descriptor found -- pool may be offline or relays down)\n", | ||
| 2343 | strParticipantPool.c_str()); | ||
| 2376 | SetParticipantMiningStatus("failed to resolve pool"); | 2344 | SetParticipantMiningStatus("failed to resolve pool"); |
| 2377 | return false; | 2345 | return false; |
| 2378 | } | 2346 | } |
| 2347 | LogPrint("worker", "[worker] pool resolved to meeting node %s\n", meetingHostPort.c_str()); | ||
| 2379 | 2348 | ||
| 2380 | size_t colon = meetingHostPort.rfind(':'); | 2349 | size_t colon = meetingHostPort.rfind(':'); |
| 2381 | if (colon == std::string::npos) { | 2350 | if (colon == std::string::npos) { |
| 2382 | printf("PoolParticipantMiner: bad meeting node %s\n", meetingHostPort.c_str()); | 2351 | LogPrint("worker", "[worker] bad meeting node format '%s'\n", meetingHostPort.c_str()); |
| 2383 | SetParticipantMiningStatus("bad pool endpoint"); | 2352 | SetParticipantMiningStatus("bad pool endpoint"); |
| 2384 | return false; | 2353 | return false; |
| 2385 | } | 2354 | } |
| 2386 | std::string host = meetingHostPort.substr(0, colon); | 2355 | std::string host = meetingHostPort.substr(0, colon); |
| 2387 | int port = atoi(meetingHostPort.substr(colon + 1).c_str()); | 2356 | int port = atoi(meetingHostPort.substr(colon + 1).c_str()); |
| 2388 | if (port <= 0 || port > 65535) { | 2357 | if (port <= 0 || port > 65535) { |
| 2389 | printf("PoolParticipantMiner: bad meeting port %d\n", port); | 2358 | LogPrint("worker", "[worker] bad meeting port %d in '%s'\n", |
| 2359 | port, meetingHostPort.c_str()); | ||
| 2390 | SetParticipantMiningStatus("bad pool port"); | 2360 | SetParticipantMiningStatus("bad pool port"); |
| 2391 | return false; | 2361 | return false; |
| 2392 | } | 2362 | } |
| 2393 | 2363 | ||
| 2394 | btf_socket_t s = btf::BtfClientTunnel(host.c_str(), (unsigned short)port, target_pubkey, service_enc_pub); | 2364 | // ------------------------------------------------------------------ |
| 2365 | // Step 2: open encrypted tunnel to pool | ||
| 2366 | // ------------------------------------------------------------------ | ||
| 2367 | SetParticipantMiningStatus("opening tunnel"); | ||
| 2368 | btf_socket_t s = btf::BtfClientTunnel(host.c_str(), (unsigned short)port, | ||
| 2369 | target_pubkey, service_enc_pub); | ||
| 2395 | if (s == INVALID_SOCKET) { | 2370 | if (s == INVALID_SOCKET) { |
| 2396 | printf("PoolParticipantMiner: tunnel connect failed via %s\n", meetingHostPort.c_str()); | 2371 | LogPrint("worker", "[worker] tunnel connect FAILED via %s" |
| 2372 | " (relay unreachable or pool not listening)\n", | ||
| 2373 | meetingHostPort.c_str()); | ||
| 2397 | SetParticipantMiningStatus("tunnel connect failed"); | 2374 | SetParticipantMiningStatus("tunnel connect failed"); |
| 2398 | return false; | 2375 | return false; |
| 2399 | } | 2376 | } |
| 2400 | printf("PoolParticipantMiner: connected via %s\n", meetingHostPort.c_str()); | 2377 | LogPrint("worker", "[worker] tunnel open via %s\n", meetingHostPort.c_str()); |
| 2401 | SetParticipantMiningStatus("tunnel connected"); | 2378 | SetParticipantMiningStatus("tunnel open"); |
| 2402 | 2379 | ||
| 2403 | // Use our wallet address as mining username so payouts go to our wallet | 2380 | // ------------------------------------------------------------------ |
| 2381 | // Step 3: determine our payout address (mining username) | ||
| 2382 | // ------------------------------------------------------------------ | ||
| 2404 | std::string username; | 2383 | std::string username; |
| 2405 | { | 2384 | { |
| 2406 | std::vector<unsigned char> vchPubKey; | 2385 | std::vector<unsigned char> vchPubKey; |
| @@ -2408,102 +2387,260 @@ static bool PoolParticipantMiner() | |||
| 2408 | username = PubKeyToAddress(vchPubKey); | 2387 | username = PubKeyToAddress(vchPubKey); |
| 2409 | } | 2388 | } |
| 2410 | if (username.empty()) username = BtfLocalAddress(); | 2389 | if (username.empty()) username = BtfLocalAddress(); |
| 2411 | if (username.empty()) username = "unknown"; | 2390 | if (username.empty()) { |
| 2412 | 2391 | LogPrint("worker", "[worker] WARNING: could not determine wallet address" | |
| 2392 | " -- shares will not pay out\n"); | ||
| 2393 | username = "unknown"; | ||
| 2394 | } | ||
| 2395 | LogPrint("worker", "[worker] payout address: %s\n", username.c_str()); | ||
| 2396 | |||
| 2397 | // ------------------------------------------------------------------ | ||
| 2398 | // Step 4: build the fast (~2 GB dataset) RandomX mode if not already | ||
| 2399 | // built, then start our VM. Without this, RandomXCreateMinerVM() falls | ||
| 2400 | // back to "light" mode (cache only) forever, which is dramatically | ||
| 2401 | // slower per hash than fast mode -- it recomputes dataset items on the | ||
| 2402 | // fly for every single hash instead of a direct memory lookup. That | ||
| 2403 | // alone can turn a "few seconds per share" pool into "many minutes per | ||
| 2404 | // share" regardless of how easy the share target is. | ||
| 2405 | // | ||
| 2406 | // This MUST happen before we send mining.subscribe/authorize, not | ||
| 2407 | // after: it's a synchronous, single-threaded-per-call build that can | ||
| 2408 | // take anywhere from several seconds to a couple of minutes depending | ||
| 2409 | // on core count. If it runs after the handshake messages are sent, | ||
| 2410 | // the pool's replies (subscribe ack, authorize ack, set_difficulty, | ||
| 2411 | // and the first job) all land in the OS socket buffer while we're | ||
| 2412 | // not reading -- nothing is lost, but we sit there looking (and | ||
| 2413 | // logging) like we're "stuck waiting for pool response" for the | ||
| 2414 | // entire build duration, when really we're just not listening yet. | ||
| 2415 | // Building the dataset first means that by the time we say | ||
| 2416 | // "subscribing", we're genuinely ready to read the reply the instant | ||
| 2417 | // it arrives. | ||
| 2418 | // ------------------------------------------------------------------ | ||
| 2419 | if (!RandomXFastReady()) { | ||
| 2420 | SetParticipantMiningStatus("building RandomX dataset (~2GB, one-time)"); | ||
| 2421 | unsigned int nThreads = std::thread::hardware_concurrency(); | ||
| 2422 | RandomXInitDataset(nThreads > 0 ? (int)nThreads : 1); | ||
| 2423 | } | ||
| 2424 | void* rxvm = RandomXCreateMinerVM(); | ||
| 2425 | if (!rxvm) { | ||
| 2426 | LogPrint("worker", "[worker] failed to create RandomX VM\n"); | ||
| 2427 | SetParticipantMiningStatus("RandomX init failed"); | ||
| 2428 | closesocket(s); return false; | ||
| 2429 | } | ||
| 2430 | LogPrint("worker", "[worker] RandomX VM ready (%s)\n", | ||
| 2431 | RandomXFastReady() ? "fast 2GB" : "light 256MB"); | ||
| 2432 | |||
| 2433 | // ------------------------------------------------------------------ | ||
| 2434 | // Step 5: Stratum subscribe + authorize. The socket is read from | ||
| 2435 | // immediately after this, in the main loop below, so nothing sits | ||
| 2436 | // unread behind a blocking dataset build anymore. | ||
| 2437 | // ------------------------------------------------------------------ | ||
| 2413 | std::string buf; | 2438 | std::string buf; |
| 2414 | int msgId = 1; | 2439 | int msgId = 1; |
| 2415 | std::set<int> pendingSubmitIds; | 2440 | std::set<int> pendingSubmitIds; |
| 2416 | 2441 | ||
| 2417 | // Subscribe | ||
| 2418 | SetParticipantMiningStatus("subscribing"); | 2442 | SetParticipantMiningStatus("subscribing"); |
| 2419 | if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.subscribe"},{"params",json::array()}})) | 2443 | LogPrint("worker", "[worker->pool] sending mining.subscribe\n"); |
| 2420 | { SetParticipantMiningStatus("subscribe failed"); closesocket(s); return false; } | 2444 | if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.subscribe"}, |
| 2445 | {"params",json::array()}})) { | ||
| 2446 | LogPrint("worker", "[worker] subscribe send FAILED -- pool dropped connection\n"); | ||
| 2447 | SetParticipantMiningStatus("subscribe send failed"); | ||
| 2448 | RandomXDestroyMinerVM(rxvm); | ||
| 2449 | closesocket(s); return false; | ||
| 2450 | } | ||
| 2421 | 2451 | ||
| 2422 | // Authorize | ||
| 2423 | SetParticipantMiningStatus("authorizing"); | 2452 | SetParticipantMiningStatus("authorizing"); |
| 2453 | LogPrint("worker", "[worker->pool] sending mining.authorize as %s\n", username.c_str()); | ||
| 2424 | if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.authorize"}, | 2454 | if (!StratumSendLine(s, json{{"id",msgId++},{"method","mining.authorize"}, |
| 2425 | {"params",json::array({username,"x"})}})) | 2455 | {"params",json::array({username,"x"})}})) { |
| 2426 | { SetParticipantMiningStatus("authorize failed"); closesocket(s); return false; } | 2456 | LogPrint("worker", "[worker] authorize send FAILED -- pool dropped connection\n"); |
| 2457 | SetParticipantMiningStatus("authorize send failed"); | ||
| 2458 | RandomXDestroyMinerVM(rxvm); | ||
| 2459 | closesocket(s); return false; | ||
| 2460 | } | ||
| 2427 | 2461 | ||
| 2428 | // Job state | 2462 | // ------------------------------------------------------------------ |
| 2463 | // Step 6: main loop -- receive messages, hash, submit shares | ||
| 2464 | // ------------------------------------------------------------------ | ||
| 2429 | std::string jobId; | 2465 | std::string jobId; |
| 2430 | unsigned char header[80]; | 2466 | unsigned char header[80] = {}; |
| 2431 | uint256 target; | 2467 | uint256 target; |
| 2432 | bool haveJob = false; | 2468 | double currentDifficulty = 1.0; // updated by mining.set_difficulty from pool |
| 2469 | bool haveJob = false; | ||
| 2433 | bool gotSubscribeAck = false; | 2470 | bool gotSubscribeAck = false; |
| 2434 | bool gotAuthorizeAck = false; | 2471 | bool gotAuthorizeAck = false; |
| 2435 | int64 authWaitStart = 0; | 2472 | int64 authWaitStart = 0; |
| 2436 | unsigned int nNonce = 1; | 2473 | int64 lastStuckLog = 0; |
| 2437 | uint64 hashesSinceSample = 0; | 2474 | unsigned int nNonce = 1; |
| 2438 | int64 sampleStart = GetTime(); | 2475 | uint64 hashesSinceSample = 0; |
| 2476 | uint64 sessionSharesSent = 0; // this connection only | ||
| 2477 | uint64 sessionSharesAccepted = 0; | ||
| 2478 | int64 sampleStart = GetTime(); | ||
| 2439 | 2479 | ||
| 2440 | void* rxvm = RandomXCreateMinerVM(); | 2480 | SetParticipantMiningStatus("waiting for pool response"); |
| 2441 | if (!rxvm) { SetParticipantMiningStatus("failed to start RandomX miner"); closesocket(s); return false; } | ||
| 2442 | printf("PoolParticipantMiner: RandomX VM ready (%s)\n", | ||
| 2443 | RandomXFastReady() ? "fast 2GB" : "light 256MB"); | ||
| 2444 | SetParticipantMiningStatus("authorized; asking pool for work"); | ||
| 2445 | 2481 | ||
| 2446 | while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) | 2482 | while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) |
| 2447 | { | 2483 | { |
| 2448 | // Non-blocking receive check | 2484 | // -- Receive: check buffer first, then select -- |
| 2449 | { | 2485 | { |
| 2450 | fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); | 2486 | bool haveBuffered = buf.find('\n') != std::string::npos; |
| 2451 | struct timeval tv={0,50000}; // 50ms | 2487 | bool readable = false; |
| 2452 | if (select((int)s+1, &fds, NULL, NULL, &tv) > 0) { | 2488 | if (!haveBuffered) { |
| 2489 | fd_set fds; FD_ZERO(&fds); FD_SET(s, &fds); | ||
| 2490 | struct timeval tv = {0, 50000}; // 50ms | ||
| 2491 | readable = select((int)s+1, &fds, NULL, NULL, &tv) > 0; | ||
| 2492 | } | ||
| 2493 | |||
| 2494 | if (haveBuffered || readable) { | ||
| 2453 | std::string line; | 2495 | std::string line; |
| 2454 | if (!StratumRecvLine(s, buf, line)) break; | 2496 | bool disc = false; |
| 2455 | try { | 2497 | while (StratumRecvLine(s, buf, line, disc)) { |
| 2456 | json msg = json::parse(line); | 2498 | json msg; |
| 2457 | if (msg.contains("id") && msg["id"].is_number_integer() && msg.contains("result")) { | 2499 | try { msg = json::parse(line); } catch (...) { |
| 2458 | int id = msg["id"].get<int>(); | 2500 | LogPrint("worker", "[pool->worker] JSON parse error: %.80s\n", |
| 2459 | if (id == 1 && msg["result"].is_boolean() && msg["result"].get<bool>()) { | 2501 | line.c_str()); |
| 2460 | gotSubscribeAck = true; | 2502 | continue; |
| 2461 | SetParticipantMiningStatus("subscribed; authorizing"); | 2503 | } |
| 2462 | } else if (id == 2 && msg["result"].is_boolean()) { | 2504 | |
| 2463 | gotAuthorizeAck = msg["result"].get<bool>(); | 2505 | // -- Response to our subscribe (id=1) -- |
| 2464 | authWaitStart = GetTime(); | 2506 | if (msg.contains("id") && msg["id"].is_number_integer() |
| 2465 | SetParticipantMiningStatus(gotAuthorizeAck ? "authorized; asking pool for work" : "authorization rejected"); | 2507 | && msg["id"].get<int>() == 1 |
| 2508 | && msg.contains("result") && !msg["result"].is_null()) { | ||
| 2509 | gotSubscribeAck = true; | ||
| 2510 | LogPrint("worker", "[pool->worker] subscribe ack received\n"); | ||
| 2511 | SetParticipantMiningStatus("subscribed; waiting for authorize ack"); | ||
| 2512 | } | ||
| 2513 | |||
| 2514 | // -- Response to our authorize (id=2) -- | ||
| 2515 | else if (msg.contains("id") && msg["id"].is_number_integer() | ||
| 2516 | && msg["id"].get<int>() == 2 | ||
| 2517 | && msg.contains("result")) { | ||
| 2518 | bool ok = msg["result"].is_boolean() && msg["result"].get<bool>(); | ||
| 2519 | authWaitStart = GetTime(); | ||
| 2520 | if (ok) { | ||
| 2521 | gotAuthorizeAck = true; | ||
| 2522 | LogPrint("worker", "[pool->worker] authorize OK -- waiting for job\n"); | ||
| 2523 | SetParticipantMiningStatus("authorized; waiting for job"); | ||
| 2524 | } else { | ||
| 2525 | std::string reason = msg.value("error", json("unspecified")).is_string() | ||
| 2526 | ? msg["error"].get<std::string>() : "unspecified"; | ||
| 2527 | LogPrint("worker", "[pool->worker] authorize REJECTED: %s\n", | ||
| 2528 | reason.c_str()); | ||
| 2529 | SetParticipantMiningStatus("authorization rejected"); | ||
| 2530 | // Don't break -- pool might still send a job (some pools | ||
| 2531 | // reject bad addresses but still send work) | ||
| 2466 | } | 2532 | } |
| 2467 | if (pendingSubmitIds.erase(id) > 0) { | 2533 | } |
| 2468 | if (msg["result"].is_boolean() && msg["result"].get<bool>()) { | 2534 | |
| 2535 | // -- Share submission response -- | ||
| 2536 | else if (msg.contains("id") && msg["id"].is_number_integer()) { | ||
| 2537 | int rid = msg["id"].get<int>(); | ||
| 2538 | if (pendingSubmitIds.erase(rid) > 0) { | ||
| 2539 | bool accepted = msg.contains("result") | ||
| 2540 | && msg["result"].is_boolean() | ||
| 2541 | && msg["result"].get<bool>(); | ||
| 2542 | if (accepted) { | ||
| 2469 | gParticipantSharesAccepted.fetch_add(1); | 2543 | gParticipantSharesAccepted.fetch_add(1); |
| 2544 | sessionSharesAccepted++; | ||
| 2545 | LogPrint("worker", "[pool->worker] share id=%d ACCEPTED\n", rid); | ||
| 2470 | SetParticipantMiningStatus("share accepted"); | 2546 | SetParticipantMiningStatus("share accepted"); |
| 2471 | } else { | 2547 | } else { |
| 2472 | SetParticipantMiningStatus("share rejected"); | 2548 | std::string reason = (msg.contains("error") |
| 2549 | && msg["error"].is_string()) | ||
| 2550 | ? msg["error"].get<std::string>() : "unspecified"; | ||
| 2551 | LogPrint("worker", "[pool->worker] share id=%d REJECTED: %s\n", | ||
| 2552 | rid, reason.c_str()); | ||
| 2553 | SetParticipantMiningStatus("share rejected: " + reason); | ||
| 2473 | } | 2554 | } |
| 2474 | } | 2555 | } |
| 2475 | } | 2556 | } |
| 2476 | std::string method = msg.value("method",""); | 2557 | |
| 2477 | if (method == "mining.notify") { | 2558 | // -- Server notification -- |
| 2478 | auto& p = msg["params"]; | 2559 | else { |
| 2479 | jobId = p[0].get<std::string>(); | 2560 | std::string method = msg.value("method", ""); |
| 2480 | // p[1] = full 80-byte header hex | 2561 | |
| 2481 | auto hdrBytes = FromHexStr(p[1].get<std::string>()); | 2562 | if (method == "mining.notify") { |
| 2482 | if (hdrBytes.size() >= 80) | 2563 | auto& p = msg["params"]; |
| 2483 | memcpy(header, hdrBytes.data(), 80); | 2564 | if (!p.is_array() || p.size() < 4) { |
| 2484 | // p[3] = share target hex (little-endian uint256) | 2565 | LogPrint("worker", "[pool->worker] malformed mining.notify" |
| 2485 | auto tgtBytes = FromHexStr(p[3].get<std::string>()); | 2566 | " (params size=%zu)\n", p.is_array() ? p.size() : 0); |
| 2486 | if (tgtBytes.size() >= 32) | 2567 | } else { |
| 2487 | memcpy(&target, tgtBytes.data(), 32); | 2568 | std::string newJobId = p[0].get<std::string>(); |
| 2488 | haveJob = true; | 2569 | auto hdrBytes = FromHexStr(p[1].get<std::string>()); |
| 2489 | nNonce = 1; | 2570 | auto tgtBytes = FromHexStr(p[3].get<std::string>()); |
| 2490 | SetParticipantMiningStatus("job received; hashing"); | 2571 | |
| 2491 | printf("PoolParticipantMiner: new job %s\n", jobId.c_str()); | 2572 | if (hdrBytes.size() < 80) { |
| 2492 | } else if (method == "mining.set_difficulty") { | 2573 | LogPrint("worker", "[pool->worker] mining.notify:" |
| 2493 | // acknowledged, we use the target from notify | 2574 | " header too short (%zu bytes)\n", |
| 2575 | hdrBytes.size()); | ||
| 2576 | } else if (tgtBytes.size() < 32) { | ||
| 2577 | LogPrint("worker", "[pool->worker] mining.notify:" | ||
| 2578 | " target too short (%zu bytes)\n", | ||
| 2579 | tgtBytes.size()); | ||
| 2580 | } else { | ||
| 2581 | jobId = newJobId; | ||
| 2582 | memcpy(header, hdrBytes.data(), 80); | ||
| 2583 | memcpy(&target, tgtBytes.data(), 32); | ||
| 2584 | haveJob = true; | ||
| 2585 | nNonce = 1; | ||
| 2586 | LogPrint("worker", "[pool->worker] new job %s received\n", | ||
| 2587 | jobId.c_str()); | ||
| 2588 | SetParticipantMiningStatus("hashing job " + jobId); | ||
| 2589 | } | ||
| 2590 | } | ||
| 2591 | } else if (method == "mining.set_difficulty") { | ||
| 2592 | // Pool adjusts our share difficulty via vardiff. | ||
| 2593 | // Apply it immediately so we start hashing at the new target. | ||
| 2594 | if (msg.contains("params") && msg["params"].is_array() | ||
| 2595 | && msg["params"].size() > 0 | ||
| 2596 | && msg["params"][0].is_number()) { | ||
| 2597 | double newDiff = msg["params"][0].get<double>(); | ||
| 2598 | if (newDiff > 0.0) { | ||
| 2599 | bool changed = (newDiff != currentDifficulty); | ||
| 2600 | currentDifficulty = newDiff; | ||
| 2601 | LogPrint("worker", "[pool->worker] set_difficulty %.6f%s\n", | ||
| 2602 | newDiff, changed ? " (updated)" : " (initial)"); | ||
| 2603 | } | ||
| 2604 | } else { | ||
| 2605 | LogPrint("worker", "[pool->worker] set_difficulty" | ||
| 2606 | " received (no valid params)\n"); | ||
| 2607 | } | ||
| 2608 | } else if (!method.empty()) { | ||
| 2609 | LogPrint("worker", "[pool->worker] unknown server method: %s\n", | ||
| 2610 | method.c_str()); | ||
| 2611 | } | ||
| 2494 | } | 2612 | } |
| 2495 | } catch(...) {} | 2613 | } |
| 2614 | |||
| 2615 | if (disc) { | ||
| 2616 | LogPrint("worker", "[worker] pool closed the connection" | ||
| 2617 | " (gotSubscribeAck=%d gotAuthorizeAck=%d haveJob=%d)\n", | ||
| 2618 | gotSubscribeAck, gotAuthorizeAck, haveJob); | ||
| 2619 | break; | ||
| 2620 | } | ||
| 2496 | } | 2621 | } |
| 2497 | } | 2622 | } |
| 2498 | 2623 | ||
| 2499 | if (gotAuthorizeAck && !haveJob && authWaitStart > 0 && GetTime() - authWaitStart > 10) { | 2624 | // -- Stuck watchdog: authorized but no job arriving -- |
| 2500 | SetParticipantMiningStatus("authorized; waiting for pool notify"); | 2625 | if (gotAuthorizeAck && !haveJob && authWaitStart > 0) { |
| 2501 | authWaitStart = 0; | 2626 | int64 waited = GetTime() - authWaitStart; |
| 2627 | if (waited > 10 && GetTime() - lastStuckLog >= 15) { | ||
| 2628 | LogPrint("worker", "[worker] authorized but no job after %llds" | ||
| 2629 | " -- pool tunnel is live, waiting on mining.notify\n", | ||
| 2630 | (long long)waited); | ||
| 2631 | lastStuckLog = GetTime(); | ||
| 2632 | } | ||
| 2633 | if (waited > STUCK_NO_JOB_TIMEOUT_SECS) { | ||
| 2634 | LogPrint("worker", "[worker] no job received after %llds -- disconnecting" | ||
| 2635 | " and reconnecting\n", (long long)STUCK_NO_JOB_TIMEOUT_SECS); | ||
| 2636 | SetParticipantMiningStatus("timeout waiting for job; reconnecting"); | ||
| 2637 | break; | ||
| 2638 | } | ||
| 2502 | } | 2639 | } |
| 2503 | 2640 | ||
| 2504 | if (!haveJob) { Sleep(100); continue; } | 2641 | if (!haveJob) { Sleep(100); continue; } |
| 2505 | 2642 | ||
| 2506 | // Hash one nonce | 2643 | // -- Hash one nonce -- |
| 2507 | memcpy(header+76, &nNonce, 4); | 2644 | memcpy(header+76, &nNonce, 4); |
| 2508 | uint256 hash = RandomXHashWithVM(rxvm, header, 80); | 2645 | uint256 hash = RandomXHashWithVM(rxvm, header, 80); |
| 2509 | hashesSinceSample++; | 2646 | hashesSinceSample++; |
| @@ -2512,38 +2649,59 @@ static bool PoolParticipantMiner() | |||
| 2512 | UpdateParticipantHashRate(hashesSinceSample, sampleStart); | 2649 | UpdateParticipantHashRate(hashesSinceSample, sampleStart); |
| 2513 | 2650 | ||
| 2514 | if (hash <= target) { | 2651 | if (hash <= target) { |
| 2515 | printf("PoolParticipantMiner: share found! nonce=%u\n", nNonce); | 2652 | LogPrint("worker", "[worker] share found! nonce=%u job=%s difficulty=%.4f\n", |
| 2653 | nNonce, jobId.c_str(), currentDifficulty); | ||
| 2516 | SetParticipantMiningStatus("share found; submitting"); | 2654 | SetParticipantMiningStatus("share found; submitting"); |
| 2517 | int submitId = msgId++; | 2655 | int submitId = msgId++; |
| 2518 | pendingSubmitIds.insert(submitId); | 2656 | pendingSubmitIds.insert(submitId); |
| 2519 | gParticipantSharesSent.fetch_add(1); | 2657 | gParticipantSharesSent.fetch_add(1); |
| 2658 | sessionSharesSent++; | ||
| 2520 | json submit = {{"id",submitId},{"method","mining.submit"}, | 2659 | json submit = {{"id",submitId},{"method","mining.submit"}, |
| 2521 | {"params",json::array({username, jobId, | 2660 | {"params",json::array({username, jobId, ToHexStr(&nNonce,4)})}}; |
| 2522 | ToHexStr(&nNonce,4)})}}; | 2661 | if (!StratumSendLine(s, submit)) { |
| 2523 | if (!StratumSendLine(s, submit)) break; | 2662 | LogPrint("worker", "[worker] share submit send FAILED" |
| 2663 | " -- pool connection lost\n"); | ||
| 2664 | break; | ||
| 2665 | } | ||
| 2524 | } | 2666 | } |
| 2525 | 2667 | ||
| 2526 | nNonce++; | 2668 | nNonce++; |
| 2527 | if (nNonce == 0) { haveJob = false; } // exhausted, wait for new job | 2669 | if (nNonce == 0) { |
| 2670 | LogPrint("worker", "[worker] nonce space exhausted for job %s" | ||
| 2671 | " -- waiting for new job\n", jobId.c_str()); | ||
| 2672 | haveJob = false; | ||
| 2673 | } | ||
| 2528 | } | 2674 | } |
| 2529 | 2675 | ||
| 2676 | // ------------------------------------------------------------------ | ||
| 2677 | // Cleanup | ||
| 2678 | // ------------------------------------------------------------------ | ||
| 2530 | RandomXDestroyMinerVM(rxvm); | 2679 | RandomXDestroyMinerVM(rxvm); |
| 2531 | closesocket(s); | 2680 | closesocket(s); |
| 2532 | UpdateParticipantHashRate(hashesSinceSample, sampleStart); | 2681 | UpdateParticipantHashRate(hashesSinceSample, sampleStart); |
| 2533 | SetParticipantMiningStatus("participant miner stopped"); | 2682 | SetParticipantMiningStatus("disconnected"); |
| 2534 | printf("PoolParticipantMiner: disconnected\n"); | 2683 | LogPrint("worker", "[worker] disconnected from pool" |
| 2684 | " (hashes this session: %llu, shares sent: %llu, accepted: %llu)\n", | ||
| 2685 | (unsigned long long)hashesSinceSample, | ||
| 2686 | (unsigned long long)sessionSharesSent, | ||
| 2687 | (unsigned long long)sessionSharesAccepted); | ||
| 2535 | return true; | 2688 | return true; |
| 2536 | } | 2689 | } |
| 2537 | 2690 | ||
| 2538 | bool BitcoinMiner() | 2691 | bool BitcoinMiner() |
| 2539 | { | 2692 | { |
| 2693 | // Relay mode: never mines, just relays/syncs. (Shouldn't normally get here | ||
| 2694 | // since the GUI hides Start Mining for Relay, but guard it regardless.) | ||
| 2695 | if (nMineMode == MINE_RELAY) | ||
| 2696 | return true; | ||
| 2697 | |||
| 2540 | // Participant mode: connect to external pool instead of mining solo/operator | 2698 | // Participant mode: connect to external pool instead of mining solo/operator |
| 2541 | if (nMineMode == MINE_PARTICIPANT) | 2699 | if (nMineMode == MINE_PARTICIPANT) |
| 2542 | { | 2700 | { |
| 2543 | while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { | 2701 | while (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { |
| 2544 | PoolParticipantMiner(); | 2702 | PoolParticipantMiner(); |
| 2545 | if (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { | 2703 | if (fGenerateBitcoins && nMineMode == MINE_PARTICIPANT && !fShutdown) { |
| 2546 | printf("PoolParticipantMiner: reconnecting in 10s\n"); | 2704 | LogPrint("worker", "PoolParticipantMiner: reconnecting in 10s\n"); |
| 2547 | for (int i = 0; i < 10 && !fShutdown; i++) Sleep(1000); | 2705 | for (int i = 0; i < 10 && !fShutdown; i++) Sleep(1000); |
| 2548 | } | 2706 | } |
| 2549 | } | 2707 | } |
| @@ -2554,9 +2712,16 @@ bool BitcoinMiner() | |||
| 2554 | if (nMineMode == MINE_OPERATOR) | 2712 | if (nMineMode == MINE_OPERATOR) |
| 2555 | return true; | 2713 | return true; |
| 2556 | 2714 | ||
| 2557 | printf("BitcoinMiner started\n"); | 2715 | LogPrint("net", "BitcoinMiner started\n"); |
| 2558 | SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); | 2716 | SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); |
| 2559 | 2717 | ||
| 2718 | // Build the fast (~2 GB dataset) RandomX mode once, up front, so we're | ||
| 2719 | // not stuck mining in the much slower light/cache-only mode forever. | ||
| 2720 | if (!RandomXFastReady()) { | ||
| 2721 | unsigned int nThreads = std::thread::hardware_concurrency(); | ||
| 2722 | RandomXInitDataset(nThreads > 0 ? (int)nThreads : 1); | ||
| 2723 | } | ||
| 2724 | |||
| 2560 | CKey key; | 2725 | CKey key; |
| 2561 | key.MakeNewKey(); | 2726 | key.MakeNewKey(); |
| 2562 | CBigNum bnExtraNonce = 0; | 2727 | CBigNum bnExtraNonce = 0; |
| @@ -2639,7 +2804,7 @@ bool BitcoinMiner() | |||
| 2639 | } | 2804 | } |
| 2640 | pblock->nBits = nBits; | 2805 | pblock->nBits = nBits; |
| 2641 | pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees); | 2806 | pblock->vtx[0].vout[0].nValue = pblock->GetBlockValue(nFees); |
| 2642 | printf("\n\nRunning BitcoinMiner with %d transactions in block\n", pblock->vtx.size()); | 2807 | if (LogAcceptsCategory("net")) printf("\n\nRunning BitcoinMiner with %d transactions in block\n", pblock->vtx.size()); |
| 2643 | 2808 | ||
| 2644 | 2809 | ||
| 2645 | // | 2810 | // |
| @@ -2658,11 +2823,11 @@ bool BitcoinMiner() | |||
| 2658 | void* rxvm = RandomXCreateMinerVM(); | 2823 | void* rxvm = RandomXCreateMinerVM(); |
| 2659 | if (!rxvm) | 2824 | if (!rxvm) |
| 2660 | { | 2825 | { |
| 2661 | printf("BitcoinMiner: failed to create RandomX VM\n"); | 2826 | LogPrint("net", "BitcoinMiner: failed to create RandomX VM\n"); |
| 2662 | Sleep(1000); | 2827 | Sleep(1000); |
| 2663 | continue; | 2828 | continue; |
| 2664 | } | 2829 | } |
| 2665 | printf("BitcoinMiner: mining with RandomX (%s)\n", | 2830 | LogPrint("net", "BitcoinMiner: mining with RandomX (%s)\n", |
| 2666 | RandomXFastReady() ? "fast 2GB" : "light 256MB"); | 2831 | RandomXFastReady() ? "fast 2GB" : "light 256MB"); |
| 2667 | 2832 | ||
| 2668 | unsigned int nStart = GetTime(); | 2833 | unsigned int nStart = GetTime(); |
| @@ -2675,9 +2840,9 @@ bool BitcoinMiner() | |||
| 2675 | if (hash <= hashTarget) | 2840 | if (hash <= hashTarget) |
| 2676 | { | 2841 | { |
| 2677 | //// debug print | 2842 | //// debug print |
| 2678 | printf("BitcoinMiner:\n"); | 2843 | if (LogAcceptsCategory("net")) printf("BitcoinMiner:\n"); |
| 2679 | printf("RandomX proof-of-work found \n powhash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str()); | 2844 | if (LogAcceptsCategory("net")) printf("RandomX proof-of-work found \n powhash: %s \ntarget: %s\n", hash.GetHex().c_str(), hashTarget.GetHex().c_str()); |
| 2680 | pblock->print(); | 2845 | if (LogAcceptsCategory("net")) pblock->print(); |
| 2681 | 2846 | ||
| 2682 | SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); | 2847 | SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); |
| 2683 | CRITICAL_BLOCK(cs_main) | 2848 | CRITICAL_BLOCK(cs_main) |
| @@ -2692,7 +2857,7 @@ bool BitcoinMiner() | |||
| 2692 | 2857 | ||
| 2693 | // Process this block the same as if we had received it from another node | 2858 | // Process this block the same as if we had received it from another node |
| 2694 | if (!ProcessBlock(NULL, pblock.release())) | 2859 | if (!ProcessBlock(NULL, pblock.release())) |
| 2695 | printf("ERROR in BitcoinMiner, ProcessBlock, block not accepted\n"); | 2860 | LogPrint("net", "ERROR in BitcoinMiner, ProcessBlock, block not accepted\n"); |
| 2696 | } | 2861 | } |
| 2697 | SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); | 2862 | SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); |
| 2698 | 2863 | ||
| @@ -2860,11 +3025,11 @@ bool SelectCoins(int64 nTargetValue, set<CWalletTx*>& setCoinsRet) | |||
| 2860 | setCoinsRet.insert(vValue[i].second); | 3025 | setCoinsRet.insert(vValue[i].second); |
| 2861 | 3026 | ||
| 2862 | //// debug print | 3027 | //// debug print |
| 2863 | printf("SelectCoins() best subset: "); | 3028 | if (LogAcceptsCategory("net")) printf("SelectCoins() best subset: "); |
| 2864 | for (int i = 0; i < vValue.size(); i++) | 3029 | for (int i = 0; i < vValue.size(); i++) |
| 2865 | if (vfBest[i]) | 3030 | if (vfBest[i]) |
| 2866 | printf("%s ", FormatMoney(vValue[i].first).c_str()); | 3031 | if (LogAcceptsCategory("net")) printf("%s ", FormatMoney(vValue[i].first).c_str()); |
| 2867 | printf("total %s\n", FormatMoney(nBest).c_str()); | 3032 | if (LogAcceptsCategory("net")) printf("total %s\n", FormatMoney(nBest).c_str()); |
| 2868 | } | 3033 | } |
| 2869 | 3034 | ||
| 2870 | return true; | 3035 | return true; |
| @@ -2953,6 +3118,34 @@ bool CreateTransaction(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew, in | |||
| 2953 | return true; | 3118 | return true; |
| 2954 | } | 3119 | } |
| 2955 | 3120 | ||
| 3121 | // Undo what CommitTransactionSpent did: unmark the inputs it marked spent | ||
| 3122 | // and erase the half-committed wallet entry. Used when a transaction is | ||
| 3123 | // accepted into the wallet but then rejected by the mempool/chain, so we | ||
| 3124 | // don't end up with a wallet that thinks money is spent that never left. | ||
| 3125 | void RollbackTransactionSpent(const CWalletTx& wtxNew) | ||
| 3126 | { | ||
| 3127 | CRITICAL_BLOCK(cs_main) | ||
| 3128 | CRITICAL_BLOCK(cs_mapWallet) | ||
| 3129 | { | ||
| 3130 | set<CWalletTx*> setCoins; | ||
| 3131 | foreach(const CTxIn& txin, wtxNew.vin) | ||
| 3132 | { | ||
| 3133 | map<uint256, CWalletTx>::iterator mi = mapWallet.find(txin.prevout.hash); | ||
| 3134 | if (mi != mapWallet.end()) | ||
| 3135 | setCoins.insert(&mi->second); | ||
| 3136 | } | ||
| 3137 | foreach(CWalletTx* pcoin, setCoins) | ||
| 3138 | { | ||
| 3139 | pcoin->fSpent = false; | ||
| 3140 | pcoin->WriteToDisk(); | ||
| 3141 | vWalletUpdated.push_back(make_pair(pcoin->GetHash(), false)); | ||
| 3142 | } | ||
| 3143 | |||
| 3144 | EraseFromWallet(wtxNew.GetHash()); | ||
| 3145 | } | ||
| 3146 | MainFrameRepaint(); | ||
| 3147 | } | ||
| 3148 | |||
| 2956 | // Call after CreateTransaction unless you want to abort | 3149 | // Call after CreateTransaction unless you want to abort |
| 2957 | bool CommitTransactionSpent(const CWalletTx& wtxNew) | 3150 | bool CommitTransactionSpent(const CWalletTx& wtxNew) |
| 2958 | { | 3151 | { |
| @@ -3003,13 +3196,17 @@ bool SendMoney(CScript scriptPubKey, int64 nValue, CWalletTx& wtxNew) | |||
| 3003 | return error("SendMoney() : Error finalizing transaction"); | 3196 | return error("SendMoney() : Error finalizing transaction"); |
| 3004 | } | 3197 | } |
| 3005 | 3198 | ||
| 3006 | printf("SendMoney: %s\n", wtxNew.GetHash().ToString().substr(0,6).c_str()); | 3199 | if (LogAcceptsCategory("net")) printf("SendMoney: %s\n", wtxNew.GetHash().ToString().substr(0,6).c_str()); |
| 3007 | 3200 | ||
| 3008 | // Broadcast | 3201 | // Broadcast |
| 3009 | if (!wtxNew.AcceptTransaction()) | 3202 | if (!wtxNew.AcceptTransaction()) |
| 3010 | { | 3203 | { |
| 3011 | // This must not fail. The transaction has already been signed and recorded. | 3204 | // The transaction was already signed and committed to the wallet |
| 3012 | throw runtime_error("SendMoney() : wtxNew.AcceptTransaction() failed\n"); | 3205 | // above, but the chain/mempool just rejected it (e.g. a raced |
| 3206 | // input already spent by another transaction). Unwind the | ||
| 3207 | // wallet state we just wrote instead of crashing the app. | ||
| 3208 | RollbackTransactionSpent(wtxNew); | ||
| 3209 | return error("SendMoney() : wtxNew.AcceptTransaction() failed"); | ||
| 3013 | } | 3210 | } |
| 3014 | wtxNew.RelayWalletTransaction(); | 3211 | wtxNew.RelayWalletTransaction(); |
| 3015 | } | 3212 | } |
| @@ -48,13 +48,17 @@ extern CBlockIndex* pindexBest; | |||
| 48 | extern unsigned int nTransactionsUpdated; | 48 | extern unsigned int nTransactionsUpdated; |
| 49 | extern string strSetDataDir; | 49 | extern string strSetDataDir; |
| 50 | extern int nDropMessagesTest; | 50 | extern int nDropMessagesTest; |
| 51 | // Mining mode — persisted in wallet.dat | 51 | // Mining mode -- persisted in wallet.dat |
| 52 | // MINE_SOLO (0): mine to own wallet, no pool server | 52 | // Mining mode -- decided fresh every launch (CLI flags, else default). Never |
| 53 | // MINE_OPERATOR (1): run pool server, mine to own wallet, distribute to miners | 53 | // restored from wallet.dat; see LoadWallet() in db.cpp. |
| 54 | // MINE_PARTICIPANT (2): connect to external pool, submit shares, receive payouts | 54 | // MINE_RELAY (0): default. Node runs/syncs, never mines, no pool server. |
| 55 | #define MINE_SOLO 0 | 55 | // MINE_SOLO (1): mine to own wallet, no pool server |
| 56 | #define MINE_OPERATOR 1 | 56 | // MINE_OPERATOR (2): run pool server, mine to own wallet, distribute to miners |
| 57 | #define MINE_PARTICIPANT 2 | 57 | // MINE_PARTICIPANT (3): connect to external pool, submit shares, receive payouts |
| 58 | #define MINE_RELAY 0 | ||
| 59 | #define MINE_SOLO 1 | ||
| 60 | #define MINE_OPERATOR 2 | ||
| 61 | #define MINE_PARTICIPANT 3 | ||
| 58 | extern int nMineMode; | 62 | extern int nMineMode; |
| 59 | extern string strParticipantPool; // participant: pool .btf address | 63 | extern string strParticipantPool; // participant: pool .btf address |
| 60 | extern string strPoolName; // operator: announced pool name | 64 | extern string strPoolName; // operator: announced pool name |
| @@ -78,6 +82,7 @@ struct PoolWorkerStatView | |||
| 78 | uint64 totalShares; | 82 | uint64 totalShares; |
| 79 | uint64 roundShares; | 83 | uint64 roundShares; |
| 80 | int64 lastSeen; | 84 | int64 lastSeen; |
| 85 | double hashRate; // estimated H/s, derived from share difficulty + submit rate | ||
| 81 | }; | 86 | }; |
| 82 | 87 | ||
| 83 | // Settings | 88 | // Settings |
| @@ -102,11 +107,11 @@ void RelayWalletTransactions(); | |||
| 102 | bool LoadBlockIndex(bool fAllowNew=true); | 107 | bool LoadBlockIndex(bool fAllowNew=true); |
| 103 | void PrintBlockTree(); | 108 | void PrintBlockTree(); |
| 104 | bool BitcoinMiner(); | 109 | bool BitcoinMiner(); |
| 105 | void ThreadRPCServer(void* parg); // rpc.cpp — .btf pool server | 110 | void ThreadRPCServer(void* parg); // rpc.cpp -- .btf pool server |
| 106 | void GetParticipantMiningStats(uint64& sharesSent, uint64& sharesAccepted, double& hashRate); | 111 | void GetParticipantMiningStats(uint64& sharesSent, uint64& sharesAccepted, double& hashRate); |
| 107 | void SetParticipantMiningStatus(const std::string& status); | 112 | void SetParticipantMiningStatus(const std::string& status); |
| 108 | std::string GetParticipantMiningStatus(); | 113 | std::string GetParticipantMiningStatus(); |
| 109 | void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares); | 114 | void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares, double& totalHashRate); |
| 110 | void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out); | 115 | void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out); |
| 111 | void GetPendingPayouts(std::vector<PendingPayoutView>& out); | 116 | void GetPendingPayouts(std::vector<PendingPayoutView>& out); |
| 112 | bool ProcessMessages(CNode* pfrom); | 117 | bool ProcessMessages(CNode* pfrom); |
diff --git a/src/main_gui.cpp b/src/main_gui.cpp index b7377da..842b0d5 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | // Bitflash entry point — starts node threads then runs GUI (or headless). | 1 | // Bitflash entry point -- starts node threads then runs GUI (or headless). |
| 2 | 2 | ||
| 3 | #include "headers_core.h" | 3 | #include "headers_core.h" |
| 4 | #ifndef _WIN32 | 4 | #ifndef _WIN32 |
| @@ -126,8 +126,6 @@ int main(int argc, char* argv[]) | |||
| 126 | 126 | ||
| 127 | ParseStartupArguments(argc, argv); | 127 | ParseStartupArguments(argc, argv); |
| 128 | 128 | ||
| 129 | printf("Loading addresses...\n"); | ||
| 130 | if (!LoadAddresses()) printf("Warning: error loading addr.dat\n"); | ||
| 131 | printf("Loading block index...\n"); | 129 | printf("Loading block index...\n"); |
| 132 | string strErrors; | 130 | string strErrors; |
| 133 | if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; } | 131 | if (!LoadBlockIndex()) { fprintf(stderr,"LoadBlockIndex failed\n"); return 1; } |
diff --git a/src/makefile.linux b/src/makefile.linux deleted file mode 100644 index 9e63f7d..0000000 --- a/src/makefile.linux +++ /dev/null | |||
| @@ -1,55 +0,0 @@ | |||
| 1 | # Bitflash Linux build — GUI wallet + pool server + daemon mode. | ||
| 2 | # Requires: bash build-linux.sh (installs deps, builds secp256k1 + RandomX) | ||
| 3 | # Result: src/bitflash | ||
| 4 | # | ||
| 5 | # ./bitflash — GUI wallet | ||
| 6 | # ./bitflash /nogui /gen — headless daemon (same binary, no window) | ||
| 7 | |||
| 8 | CXX ?= g++ | ||
| 9 | |||
| 10 | SECP_INC ?= /usr/local/include | ||
| 11 | SECP_LIB ?= /usr/local/lib | ||
| 12 | RANDOMX_DIR ?= $(HOME)/RandomX | ||
| 13 | |||
| 14 | WX_CFLAGS := $(shell wx-config --cxxflags) | ||
| 15 | WX_LIBS := $(shell wx-config --libs) | ||
| 16 | |||
| 17 | CXXFLAGS = -std=gnu++14 -O2 -w -fpermissive -pthread \ | ||
| 18 | -DSECP256K1_STATIC \ | ||
| 19 | -I$(SECP_INC) -I$(RANDOMX_DIR)/src \ | ||
| 20 | -I/usr/include/nlohmann \ | ||
| 21 | $(WX_CFLAGS) | ||
| 22 | |||
| 23 | LIBS = -L$(SECP_LIB) -lsecp256k1 \ | ||
| 24 | -L$(RANDOMX_DIR)/build -lrandomx \ | ||
| 25 | -lsodium -lssl -lcrypto -ldb_cxx -lpthread \ | ||
| 26 | -lboost_system \ | ||
| 27 | $(WX_LIBS) | ||
| 28 | |||
| 29 | HEADERS = headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h \ | ||
| 30 | db.h base58.h net.h irc.h nostr.h randomx_pow.h btfaddr.h btfchan.h \ | ||
| 31 | btfrv.h btftunnel.h market.h compat.h uibase.h ui.h | ||
| 32 | |||
| 33 | OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o obj/market.o \ | ||
| 34 | obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ | ||
| 35 | obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o \ | ||
| 36 | obj/rpc.o obj/uibase.o obj/ui.o | ||
| 37 | |||
| 38 | all: bitflash | ||
| 39 | |||
| 40 | obj/%.o: %.cpp $(HEADERS) | ||
| 41 | @mkdir -p obj | ||
| 42 | $(CXX) -c $(CXXFLAGS) -o $@ $< | ||
| 43 | |||
| 44 | obj/sha.o: sha.cpp sha.h | ||
| 45 | @mkdir -p obj | ||
| 46 | $(CXX) -c $(CXXFLAGS) -O3 -o $@ $< | ||
| 47 | |||
| 48 | bitflash: $(OBJS) | ||
| 49 | $(CXX) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS) | ||
| 50 | @echo "Built: bitflash" | ||
| 51 | @echo " GUI: ./bitflash" | ||
| 52 | @echo " Daemon: ./bitflash /nogui /gen" | ||
| 53 | |||
| 54 | clean: | ||
| 55 | rm -rf obj bitflash | ||
diff --git a/src/makefile.mingw b/src/makefile.mingw index d381653..7d35d92 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw | |||
| @@ -28,13 +28,13 @@ IMGUI_OBJS = obj/imgui.o obj/imgui_draw.o obj/imgui_tables.o \ | |||
| 28 | obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o | 28 | obj/imgui_widgets.o obj/imgui_impl_glfw.o obj/imgui_impl_opengl3.o |
| 29 | 29 | ||
| 30 | NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ | 30 | NODE_OBJS = obj/util.o obj/script.o obj/db.o obj/net.o obj/main.o \ |
| 31 | obj/market.o obj/sha.o obj/irc.o obj/nostr.o obj/randomx_pow.o \ | 31 | obj/market.o obj/sha.o obj/nostr.o obj/randomx_pow.o \ |
| 32 | obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o | 32 | obj/btfaddr.o obj/btfchan.o obj/btfrv.o obj/btftunnel.o obj/rpc.o |
| 33 | 33 | ||
| 34 | GUI_OBJS = obj/gui.o obj/main_gui.o obj/bitflash_res.o | 34 | GUI_OBJS = obj/gui.o obj/main_gui.o obj/bitflash_res.o |
| 35 | 35 | ||
| 36 | HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ | 36 | HEADERS = headers_core.h headers.h util.h main.h serialize.h uint256.h \ |
| 37 | key.h bignum.h script.h db.h base58.h net.h irc.h nostr.h \ | 37 | key.h bignum.h script.h db.h base58.h net.h nostr.h \ |
| 38 | randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h | 38 | randomx_pow.h btfaddr.h btfchan.h btfrv.h btftunnel.h market.h |
| 39 | 39 | ||
| 40 | all: bitflash.exe | 40 | all: bitflash.exe |
diff --git a/src/makefile.vc b/src/makefile.vc deleted file mode 100644 index 60dca78..0000000 --- a/src/makefile.vc +++ /dev/null | |||
| @@ -1,77 +0,0 @@ | |||
| 1 | # Copyright (c) 2009 Satoshi Nakamoto | ||
| 2 | # Distributed under the MIT/X11 software license, see the accompanying | ||
| 3 | # file license.txt or http://www.opensource.org/licenses/mit-license.php. | ||
| 4 | |||
| 5 | |||
| 6 | !IF "$(BUILD)" != "debug" && "$(BUILD)" != "release" | ||
| 7 | BUILD=debug | ||
| 8 | !ENDIF | ||
| 9 | !IF "$(BUILD)" == "debug" | ||
| 10 | D=d | ||
| 11 | DEBUGFLAGS=/Zi /Od /D__WXDEBUG__ | ||
| 12 | !ENDIF | ||
| 13 | |||
| 14 | |||
| 15 | |||
| 16 | INCLUDEPATHS=/I"/boost" /I"/DB/build_windows" /I"/OpenSSL/include" /I"/wxWidgets/lib/vc_lib/mswd" /I"/wxWidgets/include" | ||
| 17 | LIBPATHS=/LIBPATH:"/DB/build_windows/$(BUILD)" /LIBPATH:"/OpenSSL/out" /LIBPATH:"/wxWidgets/lib/vc_lib" | ||
| 18 | LIBS= \ | ||
| 19 | libdb47s$(D).lib \ | ||
| 20 | libeay32.lib \ | ||
| 21 | wxmsw28$(D)_richtext.lib wxmsw28$(D)_html.lib wxmsw28$(D)_core.lib wxbase28$(D).lib wxtiff$(D).lib wxjpeg$(D).lib wxpng$(D).lib wxzlib$(D).lib wxregex$(D).lib wxexpat$(D).lib \ | ||
| 22 | kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib ws2_32.lib | ||
| 23 | WXDEFS=/DWIN32 /D__WXMSW__ /D_WINDOWS /DNOPCH | ||
| 24 | CFLAGS=/c /nologo /Ob0 /MD$(D) /EHsc /GR /Zm300 /YX /Fpobj/headers.pch $(DEBUGFLAGS) $(WXDEFS) $(INCLUDEPATHS) | ||
| 25 | HEADERS=headers.h util.h main.h serialize.h uint256.h key.h bignum.h script.h db.h base58.h | ||
| 26 | |||
| 27 | |||
| 28 | |||
| 29 | all: bitcoin.exe | ||
| 30 | |||
| 31 | |||
| 32 | obj\util.obj: util.cpp $(HEADERS) | ||
| 33 | cl $(CFLAGS) /Fo$@ %s | ||
| 34 | |||
| 35 | obj\script.obj: script.cpp $(HEADERS) | ||
| 36 | cl $(CFLAGS) /Fo$@ %s | ||
| 37 | |||
| 38 | obj\db.obj: db.cpp $(HEADERS) market.h | ||
| 39 | cl $(CFLAGS) /Fo$@ %s | ||
| 40 | |||
| 41 | obj\net.obj: net.cpp $(HEADERS) net.h | ||
| 42 | cl $(CFLAGS) /Fo$@ %s | ||
| 43 | |||
| 44 | obj\main.obj: main.cpp $(HEADERS) net.h market.h | ||
| 45 | cl $(CFLAGS) /Fo$@ %s | ||
| 46 | |||
| 47 | obj\market.obj: market.cpp $(HEADERS) market.h | ||
| 48 | cl $(CFLAGS) /Fo$@ %s | ||
| 49 | |||
| 50 | obj\ui.obj: ui.cpp $(HEADERS) net.h uibase.h ui.h market.h | ||
| 51 | cl $(CFLAGS) /Fo$@ %s | ||
| 52 | |||
| 53 | obj\uibase.obj: uibase.cpp uibase.h | ||
| 54 | cl $(CFLAGS) /Fo$@ %s | ||
| 55 | |||
| 56 | obj\sha.obj: sha.cpp sha.h | ||
| 57 | cl $(CFLAGS) /O2 /Fo$@ %s | ||
| 58 | |||
| 59 | obj\irc.obj: irc.cpp $(HEADERS) | ||
| 60 | cl $(CFLAGS) /Fo$@ %s | ||
| 61 | |||
| 62 | obj\ui.res: ui.rc rc/bitcoin.ico rc/check.ico rc/send16.bmp rc/send16mask.bmp rc/send16masknoshadow.bmp rc/send20.bmp rc/send20mask.bmp rc/addressbook16.bmp rc/addressbook16mask.bmp rc/addressbook20.bmp rc/addressbook20mask.bmp | ||
| 63 | rc $(INCLUDEPATHS) $(WXDEFS) /Fo$@ %s | ||
| 64 | |||
| 65 | |||
| 66 | |||
| 67 | OBJS=obj\util.obj obj\script.obj obj\db.obj obj\net.obj obj\main.obj obj\market.obj \ | ||
| 68 | obj\ui.obj obj\uibase.obj obj\sha.obj obj\irc.obj obj\ui.res | ||
| 69 | |||
| 70 | bitcoin.exe: $(OBJS) | ||
| 71 | -kill /f bitcoin.exe & sleep 1 | ||
| 72 | link /nologo /DEBUG /SUBSYSTEM:WINDOWS /OUT:$@ $(LIBPATHS) $** $(LIBS) | ||
| 73 | |||
| 74 | clean: | ||
| 75 | -del /Q obj\* | ||
| 76 | -del *.ilk | ||
| 77 | -del *.pdb | ||
diff --git a/src/net.cpp b/src/net.cpp index bdfb9c3..ab07f94 100644 --- a/src/net.cpp +++ b/src/net.cpp | |||
| @@ -12,7 +12,6 @@ | |||
| 12 | 12 | ||
| 13 | void ThreadMessageHandler2(void* parg); | 13 | void ThreadMessageHandler2(void* parg); |
| 14 | void ThreadSocketHandler2(void* parg); | 14 | void ThreadSocketHandler2(void* parg); |
| 15 | void ThreadOpenConnections2(void* parg); | ||
| 16 | 15 | ||
| 17 | 16 | ||
| 18 | 17 | ||
| @@ -32,8 +31,6 @@ bool fShutdown = false; | |||
| 32 | array<bool, 10> vfThreadRunning; | 31 | array<bool, 10> vfThreadRunning; |
| 33 | vector<CNode*> vNodes; | 32 | vector<CNode*> vNodes; |
| 34 | CCriticalSection cs_vNodes; | 33 | CCriticalSection cs_vNodes; |
| 35 | map<vector<unsigned char>, CAddress> mapAddresses; | ||
| 36 | CCriticalSection cs_mapAddresses; | ||
| 37 | map<CInv, CDataStream> mapRelay; | 34 | map<CInv, CDataStream> mapRelay; |
| 38 | deque<pair<int64, CInv> > vRelayExpiration; | 35 | deque<pair<int64, CInv> > vRelayExpiration; |
| 39 | CCriticalSection cs_mapRelay; | 36 | CCriticalSection cs_mapRelay; |
| @@ -41,61 +38,6 @@ map<CInv, int64> mapAlreadyAskedFor; | |||
| 41 | string strBtfConnect; // .btf peer to keep connected to (from /connectbtf) | 38 | string strBtfConnect; // .btf peer to keep connected to (from /connectbtf) |
| 42 | 39 | ||
| 43 | 40 | ||
| 44 | |||
| 45 | CAddress addrProxy; | ||
| 46 | |||
| 47 | bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet) | ||
| 48 | { | ||
| 49 | hSocketRet = INVALID_SOCKET; | ||
| 50 | |||
| 51 | SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0); | ||
| 52 | if (hSocket == INVALID_SOCKET) | ||
| 53 | return false; | ||
| 54 | |||
| 55 | bool fRoutable = !(addrConnect.GetByte(3) == 10 || (addrConnect.GetByte(3) == 192 && addrConnect.GetByte(2) == 168)); | ||
| 56 | bool fProxy = (addrProxy.ip && fRoutable); | ||
| 57 | struct sockaddr_in sockaddr = (fProxy ? addrProxy.GetSockAddr() : addrConnect.GetSockAddr()); | ||
| 58 | |||
| 59 | if (connect(hSocket, (struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) | ||
| 60 | { | ||
| 61 | closesocket(hSocket); | ||
| 62 | return false; | ||
| 63 | } | ||
| 64 | |||
| 65 | if (fProxy) | ||
| 66 | { | ||
| 67 | printf("Proxy connecting to %s\n", addrConnect.ToString().c_str()); | ||
| 68 | char pszSocks4IP[] = "\4\1\0\0\0\0\0\0user"; | ||
| 69 | memcpy(pszSocks4IP + 2, &addrConnect.port, 2); | ||
| 70 | memcpy(pszSocks4IP + 4, &addrConnect.ip, 4); | ||
| 71 | char* pszSocks4 = pszSocks4IP; | ||
| 72 | int nSize = sizeof(pszSocks4IP); | ||
| 73 | |||
| 74 | int ret = send(hSocket, pszSocks4, nSize, 0); | ||
| 75 | if (ret != nSize) | ||
| 76 | { | ||
| 77 | closesocket(hSocket); | ||
| 78 | return error("Error sending to proxy\n"); | ||
| 79 | } | ||
| 80 | char pchRet[8]; | ||
| 81 | if (recv(hSocket, pchRet, 8, 0) != 8) | ||
| 82 | { | ||
| 83 | closesocket(hSocket); | ||
| 84 | return error("Error reading proxy response\n"); | ||
| 85 | } | ||
| 86 | if (pchRet[1] != 0x5a) | ||
| 87 | { | ||
| 88 | closesocket(hSocket); | ||
| 89 | return error("Proxy returned error %d\n", pchRet[1]); | ||
| 90 | } | ||
| 91 | printf("Proxy connection established %s\n", addrConnect.ToString().c_str()); | ||
| 92 | } | ||
| 93 | |||
| 94 | hSocketRet = hSocket; | ||
| 95 | return true; | ||
| 96 | } | ||
| 97 | |||
| 98 | |||
| 99 | bool GetMyExternalIP(unsigned int& ipRet) | 41 | bool GetMyExternalIP(unsigned int& ipRet) |
| 100 | { | 42 | { |
| 101 | // Try several plain-text IP echo services in order. | 43 | // Try several plain-text IP echo services in order. |
| @@ -178,38 +120,6 @@ bool GetMyExternalIP(unsigned int& ipRet) | |||
| 178 | 120 | ||
| 179 | 121 | ||
| 180 | 122 | ||
| 181 | bool AddAddress(CAddrDB& addrdb, const CAddress& addr) | ||
| 182 | { | ||
| 183 | if (!addr.IsRoutable()) | ||
| 184 | return false; | ||
| 185 | if (addr.ip == addrLocalHost.ip) | ||
| 186 | return false; | ||
| 187 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 188 | { | ||
| 189 | map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey()); | ||
| 190 | if (it == mapAddresses.end()) | ||
| 191 | { | ||
| 192 | // New address | ||
| 193 | mapAddresses.insert(make_pair(addr.GetKey(), addr)); | ||
| 194 | addrdb.WriteAddress(addr); | ||
| 195 | return true; | ||
| 196 | } | ||
| 197 | else | ||
| 198 | { | ||
| 199 | CAddress& addrFound = (*it).second; | ||
| 200 | if ((addrFound.nServices | addr.nServices) != addrFound.nServices) | ||
| 201 | { | ||
| 202 | // Services have been added | ||
| 203 | addrFound.nServices |= addr.nServices; | ||
| 204 | addrdb.WriteAddress(addrFound); | ||
| 205 | return true; | ||
| 206 | } | ||
| 207 | } | ||
| 208 | } | ||
| 209 | return false; | ||
| 210 | } | ||
| 211 | |||
| 212 | |||
| 213 | 123 | ||
| 214 | 124 | ||
| 215 | 125 | ||
| @@ -330,64 +240,6 @@ CNode* FindNode(unsigned int ip) | |||
| 330 | return NULL; | 240 | return NULL; |
| 331 | } | 241 | } |
| 332 | 242 | ||
| 333 | CNode* FindNode(CAddress addr) | ||
| 334 | { | ||
| 335 | CRITICAL_BLOCK(cs_vNodes) | ||
| 336 | { | ||
| 337 | foreach(CNode* pnode, vNodes) | ||
| 338 | if (pnode->addr == addr) | ||
| 339 | return (pnode); | ||
| 340 | } | ||
| 341 | return NULL; | ||
| 342 | } | ||
| 343 | |||
| 344 | CNode* ConnectNode(CAddress addrConnect, int64 nTimeout) | ||
| 345 | { | ||
| 346 | if (addrConnect.ip == addrLocalHost.ip) | ||
| 347 | return NULL; | ||
| 348 | |||
| 349 | // Look for an existing connection | ||
| 350 | CNode* pnode = FindNode(addrConnect.ip); | ||
| 351 | if (pnode) | ||
| 352 | { | ||
| 353 | if (nTimeout != 0) | ||
| 354 | pnode->AddRef(nTimeout); | ||
| 355 | else | ||
| 356 | pnode->AddRef(); | ||
| 357 | return pnode; | ||
| 358 | } | ||
| 359 | |||
| 360 | if (fDebug) | ||
| 361 | printf("trying %s\n", addrConnect.ToString().c_str()); | ||
| 362 | |||
| 363 | // Connect | ||
| 364 | SOCKET hSocket; | ||
| 365 | if (ConnectSocket(addrConnect, hSocket)) | ||
| 366 | { | ||
| 367 | if (fDebug) | ||
| 368 | printf("connected %s\n", addrConnect.ToString().c_str()); | ||
| 369 | |||
| 370 | // Add node | ||
| 371 | CNode* pnode = new CNode(hSocket, addrConnect, false); | ||
| 372 | if (nTimeout != 0) | ||
| 373 | pnode->AddRef(nTimeout); | ||
| 374 | else | ||
| 375 | pnode->AddRef(); | ||
| 376 | CRITICAL_BLOCK(cs_vNodes) | ||
| 377 | vNodes.push_back(pnode); | ||
| 378 | |||
| 379 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 380 | mapAddresses[addrConnect.GetKey()].nLastFailed = 0; | ||
| 381 | return pnode; | ||
| 382 | } | ||
| 383 | else | ||
| 384 | { | ||
| 385 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 386 | mapAddresses[addrConnect.GetKey()].nLastFailed = GetTime(); | ||
| 387 | return NULL; | ||
| 388 | } | ||
| 389 | } | ||
| 390 | |||
| 391 | // Synthetic marker address for a tunneled `.btf` peer. The real endpoint is | 243 | // Synthetic marker address for a tunneled `.btf` peer. The real endpoint is |
| 392 | // unknown by design (the tunnel hides it), so tag the CNode with a non-routable | 244 | // unknown by design (the tunnel hides it), so tag the CNode with a non-routable |
| 393 | // 10.x.x.x address (fails IsRoutable, so it is never gossiped as a real peer) | 245 | // 10.x.x.x address (fails IsRoutable, so it is never gossiped as a real peer) |
| @@ -401,20 +253,15 @@ static CAddress BtfMarkerAddr(const unsigned char b5[5]) | |||
| 401 | return CAddress(ip, port, nLocalServices); | 253 | return CAddress(ip, port, nLocalServices); |
| 402 | } | 254 | } |
| 403 | 255 | ||
| 404 | // Connect to a peer by its `.btf` address: resolve the self-certified | 256 | // Shared tail: given a peer's pubkey and already-resolved rendezvous |
| 405 | // descriptor over Nostr, then tunnel through its meeting node with the | 257 | // coordinates, open the tunnel and register the CNode. Used by both |
| 406 | // end-to-end channel. Neither side ever learns the other's IP. | 258 | // ConnectNodeBtf (which resolves the descriptor itself) and |
| 407 | CNode* ConnectNodeBtf(const string& strBtfAddr) | 259 | // ConnectNodeBtfResolved (which takes an already-resolved descriptor, so it |
| 260 | // makes no Nostr relay calls at all -- see nostr.cpp's BtfResolveMany for why | ||
| 261 | // that matters when dialing many candidates in parallel). | ||
| 262 | static CNode* ConnectNodeBtfTail(const string& strBtfAddr, const unsigned char pk[32], | ||
| 263 | const string& strMeeting, const unsigned char enc_pub[32]) | ||
| 408 | { | 264 | { |
| 409 | unsigned char pk[32]; | ||
| 410 | if (!btf::ParseAddress(strBtfAddr, pk)) | ||
| 411 | { | ||
| 412 | printf("ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str()); | ||
| 413 | return NULL; | ||
| 414 | } | ||
| 415 | if (BtfLocalAddress() == strBtfAddr) | ||
| 416 | return NULL; // ourselves | ||
| 417 | |||
| 418 | CAddress addr = BtfMarkerAddr(pk); | 265 | CAddress addr = BtfMarkerAddr(pk); |
| 419 | CNode* pnode = FindNode(addr.ip); | 266 | CNode* pnode = FindNode(addr.ip); |
| 420 | if (pnode) | 267 | if (pnode) |
| @@ -423,17 +270,6 @@ CNode* ConnectNodeBtf(const string& strBtfAddr) | |||
| 423 | return pnode; | 270 | return pnode; |
| 424 | } | 271 | } |
| 425 | 272 | ||
| 426 | if (fDebug) | ||
| 427 | printf("trying %s\n", strBtfAddr.c_str()); | ||
| 428 | |||
| 429 | string strMeeting; | ||
| 430 | unsigned char enc_pub[32]; | ||
| 431 | if (!BtfResolve(strBtfAddr, strMeeting, enc_pub)) | ||
| 432 | { | ||
| 433 | if (fDebug) | ||
| 434 | printf("ConnectNodeBtf: could not resolve a descriptor for %s\n", strBtfAddr.c_str()); | ||
| 435 | return NULL; | ||
| 436 | } | ||
| 437 | size_t colon = strMeeting.rfind(':'); | 273 | size_t colon = strMeeting.rfind(':'); |
| 438 | if (colon == string::npos) | 274 | if (colon == string::npos) |
| 439 | return NULL; | 275 | return NULL; |
| @@ -446,12 +282,12 @@ CNode* ConnectNodeBtf(const string& strBtfAddr) | |||
| 446 | if (hSocket == INVALID_SOCKET) | 282 | if (hSocket == INVALID_SOCKET) |
| 447 | { | 283 | { |
| 448 | if (fDebug) | 284 | if (fDebug) |
| 449 | printf("ConnectNodeBtf: tunnel to %s via %s failed\n", strBtfAddr.c_str(), strMeeting.c_str()); | 285 | LogPrint("net", "ConnectNodeBtf: tunnel to %s via %s failed\n", strBtfAddr.c_str(), strMeeting.c_str()); |
| 450 | return NULL; | 286 | return NULL; |
| 451 | } | 287 | } |
| 452 | 288 | ||
| 453 | if (fDebug) | 289 | if (fDebug) |
| 454 | printf("connected %s via rendezvous %s\n", strBtfAddr.c_str(), strMeeting.c_str()); | 290 | LogPrint("net", "connected %s via rendezvous %s\n", strBtfAddr.c_str(), strMeeting.c_str()); |
| 455 | 291 | ||
| 456 | // Add node | 292 | // Add node |
| 457 | pnode = new CNode(hSocket, addr, false); | 293 | pnode = new CNode(hSocket, addr, false); |
| @@ -461,6 +297,53 @@ CNode* ConnectNodeBtf(const string& strBtfAddr) | |||
| 461 | return pnode; | 297 | return pnode; |
| 462 | } | 298 | } |
| 463 | 299 | ||
| 300 | // Connect to a peer by its `.btf` address: resolve the self-certified | ||
| 301 | // descriptor over Nostr, then tunnel through its meeting node with the | ||
| 302 | // end-to-end channel. Neither side ever learns the other's IP. | ||
| 303 | CNode* ConnectNodeBtf(const string& strBtfAddr) | ||
| 304 | { | ||
| 305 | unsigned char pk[32]; | ||
| 306 | if (!btf::ParseAddress(strBtfAddr, pk)) | ||
| 307 | { | ||
| 308 | LogPrint("net", "ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str()); | ||
| 309 | return NULL; | ||
| 310 | } | ||
| 311 | if (BtfLocalAddress() == strBtfAddr) | ||
| 312 | return NULL; // ourselves | ||
| 313 | |||
| 314 | if (fDebug) | ||
| 315 | LogPrint("net", "trying %s\n", strBtfAddr.c_str()); | ||
| 316 | |||
| 317 | string strMeeting; | ||
| 318 | unsigned char enc_pub[32]; | ||
| 319 | if (!BtfResolve(strBtfAddr, strMeeting, enc_pub)) | ||
| 320 | { | ||
| 321 | if (fDebug) | ||
| 322 | LogPrint("net", "ConnectNodeBtf: could not resolve a descriptor for %s\n", strBtfAddr.c_str()); | ||
| 323 | return NULL; | ||
| 324 | } | ||
| 325 | return ConnectNodeBtfTail(strBtfAddr, pk, strMeeting, enc_pub); | ||
| 326 | } | ||
| 327 | |||
| 328 | // Same as ConnectNodeBtf, but skips the Nostr resolve step because the caller | ||
| 329 | // already resolved the descriptor (e.g. via BtfResolveMany, batching many | ||
| 330 | // addresses into one relay round-trip instead of one relay round-trip per | ||
| 331 | // address). Makes zero relay connections -- only talks to the peer's | ||
| 332 | // rendezvous meeting node. | ||
| 333 | CNode* ConnectNodeBtfResolved(const string& strBtfAddr, const string& strMeeting, | ||
| 334 | const unsigned char enc_pub[32]) | ||
| 335 | { | ||
| 336 | unsigned char pk[32]; | ||
| 337 | if (!btf::ParseAddress(strBtfAddr, pk)) | ||
| 338 | { | ||
| 339 | LogPrint("net", "ConnectNodeBtf: invalid address %s\n", strBtfAddr.c_str()); | ||
| 340 | return NULL; | ||
| 341 | } | ||
| 342 | if (BtfLocalAddress() == strBtfAddr) | ||
| 343 | return NULL; // ourselves | ||
| 344 | return ConnectNodeBtfTail(strBtfAddr, pk, strMeeting, enc_pub); | ||
| 345 | } | ||
| 346 | |||
| 464 | // Anonymous inbound listener (this node's `.btf` hidden service). Registers at | 347 | // Anonymous inbound listener (this node's `.btf` hidden service). Registers at |
| 465 | // the meeting relay and blocks until a client dials our address; each pairing | 348 | // the meeting relay and blocks until a client dials our address; each pairing |
| 466 | // becomes a normal inbound CNode riding the end-to-end channel, then we | 349 | // becomes a normal inbound CNode riding the end-to-end channel, then we |
| @@ -535,7 +418,7 @@ void ThreadBtfAccept(void* parg) | |||
| 535 | RAND_bytes(rnd, sizeof(rnd)); | 418 | RAND_bytes(rnd, sizeof(rnd)); |
| 536 | CAddress addr = BtfMarkerAddr(rnd); | 419 | CAddress addr = BtfMarkerAddr(rnd); |
| 537 | 420 | ||
| 538 | printf("accepted .btf connection via rendezvous %s\n", strMeeting.c_str()); | 421 | LogPrint("net", "accepted .btf connection via rendezvous %s\n", strMeeting.c_str()); |
| 539 | CNode* pnode = new CNode(hSocket, addr, true); | 422 | CNode* pnode = new CNode(hSocket, addr, true); |
| 540 | pnode->AddRef(); | 423 | pnode->AddRef(); |
| 541 | CRITICAL_BLOCK(cs_vNodes) | 424 | CRITICAL_BLOCK(cs_vNodes) |
| @@ -574,7 +457,7 @@ void ThreadBtfConnect(void* parg) | |||
| 574 | 457 | ||
| 575 | void CNode::Disconnect() | 458 | void CNode::Disconnect() |
| 576 | { | 459 | { |
| 577 | printf("disconnecting node %s\n", addr.ToString().c_str()); | 460 | LogPrint("net", "disconnecting node %s\n", addr.ToString().c_str()); |
| 578 | 461 | ||
| 579 | closesocket(hSocket); | 462 | closesocket(hSocket); |
| 580 | 463 | ||
| @@ -653,7 +536,7 @@ void ThreadSocketHandler2(void* parg) | |||
| 653 | 536 | ||
| 654 | if (pnodeExtra->GetRefCount() <= (pnodeExtra->fNetworkNode ? 1 : 0)) | 537 | if (pnodeExtra->GetRefCount() <= (pnodeExtra->fNetworkNode ? 1 : 0)) |
| 655 | { | 538 | { |
| 656 | printf("(%d nodes) disconnecting duplicate: %s\n", vNodes.size(), pnodeExtra->addr.ToString().c_str()); | 539 | LogPrint("net", "(%d nodes) disconnecting duplicate: %s\n", vNodes.size(), pnodeExtra->addr.ToString().c_str()); |
| 657 | if (pnodeExtra->fNetworkNode && !pnode->fNetworkNode) | 540 | if (pnodeExtra->fNetworkNode && !pnode->fNetworkNode) |
| 658 | { | 541 | { |
| 659 | pnode->AddRef(); | 542 | pnode->AddRef(); |
| @@ -745,7 +628,7 @@ void ThreadSocketHandler2(void* parg) | |||
| 745 | if (nSelect == SOCKET_ERROR) | 628 | if (nSelect == SOCKET_ERROR) |
| 746 | { | 629 | { |
| 747 | int nErr = WSAGetLastError(); | 630 | int nErr = WSAGetLastError(); |
| 748 | printf("select failed: %d\n", nErr); | 631 | LogPrint("net", "select failed: %d\n", nErr); |
| 749 | for (int i = 0; i <= hSocketMax; i++) | 632 | for (int i = 0; i <= hSocketMax; i++) |
| 750 | { | 633 | { |
| 751 | FD_SET(i, &fdsetRecv); | 634 | FD_SET(i, &fdsetRecv); |
| @@ -784,7 +667,7 @@ void ThreadSocketHandler2(void* parg) | |||
| 784 | } | 667 | } |
| 785 | else | 668 | else |
| 786 | { | 669 | { |
| 787 | printf("accepted connection from %s\n", addr.ToString().c_str()); | 670 | LogPrint("net", "accepted connection from %s\n", addr.ToString().c_str()); |
| 788 | CNode* pnode = new CNode(hSocket, addr, true); | 671 | CNode* pnode = new CNode(hSocket, addr, true); |
| 789 | pnode->AddRef(); | 672 | pnode->AddRef(); |
| 790 | CRITICAL_BLOCK(cs_vNodes) | 673 | CRITICAL_BLOCK(cs_vNodes) |
| @@ -823,7 +706,7 @@ void ThreadSocketHandler2(void* parg) | |||
| 823 | { | 706 | { |
| 824 | // socket closed gracefully | 707 | // socket closed gracefully |
| 825 | if (!pnode->fDisconnect) | 708 | if (!pnode->fDisconnect) |
| 826 | printf("recv: socket closed\n"); | 709 | LogPrint("net", "recv: socket closed\n"); |
| 827 | pnode->fDisconnect = true; | 710 | pnode->fDisconnect = true; |
| 828 | } | 711 | } |
| 829 | else if (nBytes < 0) | 712 | else if (nBytes < 0) |
| @@ -833,7 +716,7 @@ void ThreadSocketHandler2(void* parg) | |||
| 833 | if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) | 716 | if (nErr != WSAEWOULDBLOCK && nErr != WSAEMSGSIZE && nErr != WSAEINTR && nErr != WSAEINPROGRESS) |
| 834 | { | 717 | { |
| 835 | if (!pnode->fDisconnect) | 718 | if (!pnode->fDisconnect) |
| 836 | printf("recv failed: %d\n", nErr); | 719 | LogPrint("net", "recv failed: %d\n", nErr); |
| 837 | pnode->fDisconnect = true; | 720 | pnode->fDisconnect = true; |
| 838 | } | 721 | } |
| 839 | } | 722 | } |
| @@ -862,7 +745,7 @@ void ThreadSocketHandler2(void* parg) | |||
| 862 | } | 745 | } |
| 863 | else | 746 | else |
| 864 | { | 747 | { |
| 865 | printf("send error %d\n", nBytes); | 748 | LogPrint("net", "send error %d\n", nBytes); |
| 866 | if (pnode->ReadyToDisconnect()) | 749 | if (pnode->ReadyToDisconnect()) |
| 867 | pnode->vSend.clear(); | 750 | pnode->vSend.clear(); |
| 868 | } | 751 | } |
| @@ -885,141 +768,6 @@ void ThreadSocketHandler2(void* parg) | |||
| 885 | 768 | ||
| 886 | 769 | ||
| 887 | 770 | ||
| 888 | void ThreadOpenConnections(void* parg) | ||
| 889 | { | ||
| 890 | IMPLEMENT_RANDOMIZE_STACK(ThreadOpenConnections(parg)); | ||
| 891 | |||
| 892 | loop | ||
| 893 | { | ||
| 894 | vfThreadRunning[1] = true; | ||
| 895 | CheckForShutdown(1); | ||
| 896 | try | ||
| 897 | { | ||
| 898 | ThreadOpenConnections2(parg); | ||
| 899 | } | ||
| 900 | CATCH_PRINT_EXCEPTION("ThreadOpenConnections()") | ||
| 901 | vfThreadRunning[1] = false; | ||
| 902 | Sleep(5000); | ||
| 903 | } | ||
| 904 | } | ||
| 905 | |||
| 906 | void ThreadOpenConnections2(void* parg) | ||
| 907 | { | ||
| 908 | printf("ThreadOpenConnections started\n"); | ||
| 909 | |||
| 910 | // Initiate network connections | ||
| 911 | const int nMaxConnections = 15; | ||
| 912 | loop | ||
| 913 | { | ||
| 914 | // Wait | ||
| 915 | vfThreadRunning[1] = false; | ||
| 916 | Sleep(500); | ||
| 917 | while (vNodes.size() >= nMaxConnections || vNodes.size() >= mapAddresses.size()) | ||
| 918 | { | ||
| 919 | CheckForShutdown(1); | ||
| 920 | Sleep(2000); | ||
| 921 | } | ||
| 922 | vfThreadRunning[1] = true; | ||
| 923 | CheckForShutdown(1); | ||
| 924 | |||
| 925 | |||
| 926 | // Make a list of unique class C's | ||
| 927 | unsigned char pchIPCMask[4] = { 0xff, 0xff, 0xff, 0x00 }; | ||
| 928 | unsigned int nIPCMask = *(unsigned int*)pchIPCMask; | ||
| 929 | vector<unsigned int> vIPC; | ||
| 930 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 931 | { | ||
| 932 | vIPC.reserve(mapAddresses.size()); | ||
| 933 | unsigned int nPrev = 0; | ||
| 934 | foreach(const PAIRTYPE(vector<unsigned char>, CAddress)& item, mapAddresses) | ||
| 935 | { | ||
| 936 | const CAddress& addr = item.second; | ||
| 937 | if (!addr.IsIPv4()) | ||
| 938 | continue; | ||
| 939 | |||
| 940 | // Taking advantage of mapAddresses being in sorted order, | ||
| 941 | // with IPs of the same class C grouped together. | ||
| 942 | unsigned int ipC = addr.ip & nIPCMask; | ||
| 943 | if (ipC != nPrev) | ||
| 944 | vIPC.push_back(nPrev = ipC); | ||
| 945 | } | ||
| 946 | } | ||
| 947 | |||
| 948 | // | ||
| 949 | // The IP selection process is designed to limit vulnerability to address flooding. | ||
| 950 | // Any class C (a.b.c.?) has an equal chance of being chosen, then an IP is | ||
| 951 | // chosen within the class C. An attacker may be able to allocate many IPs, but | ||
| 952 | // they would normally be concentrated in blocks of class C's. They can hog the | ||
| 953 | // attention within their class C, but not the whole IP address space overall. | ||
| 954 | // A lone node in a class C will get as much attention as someone holding all 255 | ||
| 955 | // IPs in another class C. | ||
| 956 | // | ||
| 957 | bool fSuccess = false; | ||
| 958 | int nLimit = vIPC.size(); | ||
| 959 | while (!fSuccess && nLimit-- > 0) | ||
| 960 | { | ||
| 961 | // Choose a random class C | ||
| 962 | unsigned int ipC = vIPC[GetRand(vIPC.size())]; | ||
| 963 | |||
| 964 | // Organize all addresses in the class C by IP | ||
| 965 | map<unsigned int, vector<CAddress> > mapIP; | ||
| 966 | CRITICAL_BLOCK(cs_mapAddresses) | ||
| 967 | { | ||
| 968 | unsigned int nDelay = ((30 * 60) << vNodes.size()); | ||
| 969 | if (nDelay > 8 * 60 * 60) | ||
| 970 | nDelay = 8 * 60 * 60; | ||
| 971 | for (map<vector<unsigned char>, CAddress>::iterator mi = mapAddresses.lower_bound(CAddress(ipC, 0).GetKey()); | ||
| 972 | mi != mapAddresses.upper_bound(CAddress(ipC | ~nIPCMask, 0xffff).GetKey()); | ||
| 973 | ++mi) | ||
| 974 | { | ||
| 975 | const CAddress& addr = (*mi).second; | ||
| 976 | unsigned int nRandomizer = (addr.nLastFailed * addr.ip * 7777U) % 20000; | ||
| 977 | if (GetTime() - addr.nLastFailed > nDelay * nRandomizer / 10000) | ||
| 978 | mapIP[addr.ip].push_back(addr); | ||
| 979 | } | ||
| 980 | } | ||
| 981 | if (mapIP.empty()) | ||
| 982 | break; | ||
| 983 | |||
| 984 | // Choose a random IP in the class C | ||
| 985 | map<unsigned int, vector<CAddress> >::iterator mi = mapIP.begin(); | ||
| 986 | advance(mi, GetRand(mapIP.size())); | ||
| 987 | |||
| 988 | // Once we've chosen an IP, we'll try every given port before moving on | ||
| 989 | foreach(const CAddress& addrConnect, (*mi).second) | ||
| 990 | { | ||
| 991 | if (addrConnect.ip == addrLocalHost.ip || !addrConnect.IsIPv4() || FindNode(addrConnect.ip)) | ||
| 992 | continue; | ||
| 993 | |||
| 994 | CNode* pnode = ConnectNode(addrConnect); | ||
| 995 | if (!pnode) | ||
| 996 | continue; | ||
| 997 | pnode->fNetworkNode = true; | ||
| 998 | |||
| 999 | if (addrLocalHost.IsRoutable()) | ||
| 1000 | { | ||
| 1001 | // Advertise our address | ||
| 1002 | vector<CAddress> vAddrToSend; | ||
| 1003 | vAddrToSend.push_back(addrLocalHost); | ||
| 1004 | pnode->PushMessage("addr", vAddrToSend); | ||
| 1005 | } | ||
| 1006 | |||
| 1007 | // Get as many addresses as we can | ||
| 1008 | pnode->PushMessage("getaddr"); | ||
| 1009 | |||
| 1010 | ////// should the one on the receiving end do this too? | ||
| 1011 | // Subscribe our local subscription list | ||
| 1012 | const unsigned int nHops = 0; | ||
| 1013 | for (unsigned int nChannel = 0; nChannel < pnodeLocalHost->vfSubscribe.size(); nChannel++) | ||
| 1014 | if (pnodeLocalHost->vfSubscribe[nChannel]) | ||
| 1015 | pnode->PushMessage("subscribe", nChannel, nHops); | ||
| 1016 | |||
| 1017 | fSuccess = true; | ||
| 1018 | break; | ||
| 1019 | } | ||
| 1020 | } | ||
| 1021 | } | ||
| 1022 | } | ||
| 1023 | 771 | ||
| 1024 | 772 | ||
| 1025 | 773 | ||
| @@ -1187,7 +935,7 @@ bool StartNode(string& strError) | |||
| 1187 | return false; | 935 | return false; |
| 1188 | } | 936 | } |
| 1189 | 937 | ||
| 1190 | // Get our external IP in a background thread — up to 4 HTTP requests with | 938 | // Get our external IP in a background thread -- up to 4 HTTP requests with |
| 1191 | // 5s timeouts each could otherwise delay startup by 20s on first run. | 939 | // 5s timeouts each could otherwise delay startup by 20s on first run. |
| 1192 | // addrIncoming from a previous session is used immediately as a fallback. | 940 | // addrIncoming from a previous session is used immediately as a fallback. |
| 1193 | if (addrIncoming.ip) | 941 | if (addrIncoming.ip) |
| @@ -1228,13 +976,6 @@ bool StartNode(string& strError) | |||
| 1228 | return false; | 976 | return false; |
| 1229 | } | 977 | } |
| 1230 | 978 | ||
| 1231 | if (_beginthread(ThreadOpenConnections, 0, NULL) == -1) | ||
| 1232 | { | ||
| 1233 | strError = "Error: _beginthread(ThreadOpenConnections) failed"; | ||
| 1234 | printf("%s\n", strError.c_str()); | ||
| 1235 | return false; | ||
| 1236 | } | ||
| 1237 | |||
| 1238 | if (_beginthread(ThreadMessageHandler, 0, NULL) == -1) | 979 | if (_beginthread(ThreadMessageHandler, 0, NULL) == -1) |
| 1239 | { | 980 | { |
| 1240 | strError = "Error: _beginthread(ThreadMessageHandler) failed"; | 981 | strError = "Error: _beginthread(ThreadMessageHandler) failed"; |
| @@ -22,12 +22,10 @@ enum | |||
| 22 | 22 | ||
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet); | ||
| 26 | bool GetMyExternalIP(unsigned int& ipRet); | 25 | bool GetMyExternalIP(unsigned int& ipRet); |
| 27 | bool AddAddress(CAddrDB& addrdb, const CAddress& addr); | ||
| 28 | CNode* FindNode(unsigned int ip); | ||
| 29 | CNode* ConnectNode(CAddress addrConnect, int64 nTimeout=0); | ||
| 30 | CNode* ConnectNodeBtf(const string& strBtfAddr); | 26 | CNode* ConnectNodeBtf(const string& strBtfAddr); |
| 27 | CNode* ConnectNodeBtfResolved(const string& strBtfAddr, const string& strMeeting, | ||
| 28 | const unsigned char enc_pub[32]); | ||
| 31 | void ThreadBtfAccept(void* parg); | 29 | void ThreadBtfAccept(void* parg); |
| 32 | void ThreadBtfConnect(void* parg); | 30 | void ThreadBtfConnect(void* parg); |
| 33 | extern string strBtfConnect; | 31 | extern string strBtfConnect; |
| @@ -120,7 +118,7 @@ public: | |||
| 120 | // Message size | 118 | // Message size |
| 121 | if (nMessageSize > 0x10000000) | 119 | if (nMessageSize > 0x10000000) |
| 122 | { | 120 | { |
| 123 | printf("CMessageHeader::IsValid() : nMessageSize too large %u\n", nMessageSize); | 121 | if (LogAcceptsCategory("net")) printf("CMessageHeader::IsValid() : nMessageSize too large %u\n", nMessageSize); |
| 124 | return false; | 122 | return false; |
| 125 | } | 123 | } |
| 126 | 124 | ||
| @@ -294,7 +292,7 @@ public: | |||
| 294 | 292 | ||
| 295 | void print() const | 293 | void print() const |
| 296 | { | 294 | { |
| 297 | printf("CAddress(%s)\n", ToString().c_str()); | 295 | if (LogAcceptsCategory("net")) printf("CAddress(%s)\n", ToString().c_str()); |
| 298 | } | 296 | } |
| 299 | }; | 297 | }; |
| 300 | 298 | ||
| @@ -387,7 +385,7 @@ public: | |||
| 387 | 385 | ||
| 388 | void print() const | 386 | void print() const |
| 389 | { | 387 | { |
| 390 | printf("CInv(%s)\n", ToString().c_str()); | 388 | if (LogAcceptsCategory("net")) printf("CInv(%s)\n", ToString().c_str()); |
| 391 | } | 389 | } |
| 392 | }; | 390 | }; |
| 393 | 391 | ||
| @@ -426,13 +424,10 @@ extern bool fShutdown; | |||
| 426 | extern array<bool, 10> vfThreadRunning; | 424 | extern array<bool, 10> vfThreadRunning; |
| 427 | extern vector<CNode*> vNodes; | 425 | extern vector<CNode*> vNodes; |
| 428 | extern CCriticalSection cs_vNodes; | 426 | extern CCriticalSection cs_vNodes; |
| 429 | extern map<vector<unsigned char>, CAddress> mapAddresses; | ||
| 430 | extern CCriticalSection cs_mapAddresses; | ||
| 431 | extern map<CInv, CDataStream> mapRelay; | 427 | extern map<CInv, CDataStream> mapRelay; |
| 432 | extern deque<pair<int64, CInv> > vRelayExpiration; | 428 | extern deque<pair<int64, CInv> > vRelayExpiration; |
| 433 | extern CCriticalSection cs_mapRelay; | 429 | extern CCriticalSection cs_mapRelay; |
| 434 | extern map<CInv, int64> mapAlreadyAskedFor; | 430 | extern map<CInv, int64> mapAlreadyAskedFor; |
| 435 | extern CAddress addrProxy; | ||
| 436 | 431 | ||
| 437 | 432 | ||
| 438 | 433 | ||
| @@ -462,10 +457,6 @@ public: | |||
| 462 | map<uint256, CRequestTracker> mapRequests; | 457 | map<uint256, CRequestTracker> mapRequests; |
| 463 | CCriticalSection cs_mapRequests; | 458 | CCriticalSection cs_mapRequests; |
| 464 | 459 | ||
| 465 | // flood | ||
| 466 | vector<CAddress> vAddrToSend; | ||
| 467 | set<CAddress> setAddrKnown; | ||
| 468 | |||
| 469 | // inventory based relay | 460 | // inventory based relay |
| 470 | set<CInv> setInventoryKnown; | 461 | set<CInv> setInventoryKnown; |
| 471 | set<CInv> setInventoryKnown2; | 462 | set<CInv> setInventoryKnown2; |
| @@ -555,7 +546,7 @@ public: | |||
| 555 | // We're using mapAskFor as a priority queue, | 546 | // We're using mapAskFor as a priority queue, |
| 556 | // the key is the earliest time the request can be sent | 547 | // the key is the earliest time the request can be sent |
| 557 | int64& nRequestTime = mapAlreadyAskedFor[inv]; | 548 | int64& nRequestTime = mapAlreadyAskedFor[inv]; |
| 558 | printf("askfor %s %lld\n", inv.ToString().c_str(), nRequestTime); | 549 | if (LogAcceptsCategory("net")) printf("askfor %s %lld\n", inv.ToString().c_str(), nRequestTime); |
| 559 | 550 | ||
| 560 | // Make sure not to reuse time indexes to keep things in the same order | 551 | // Make sure not to reuse time indexes to keep things in the same order |
| 561 | int64 nNow = (GetTime() - 1) * 1000000; | 552 | int64 nNow = (GetTime() - 1) * 1000000; |
| @@ -576,7 +567,7 @@ public: | |||
| 576 | AbortMessage(); | 567 | AbortMessage(); |
| 577 | nPushPos = vSend.size(); | 568 | nPushPos = vSend.size(); |
| 578 | vSend << CMessageHeader(pszCommand, 0); | 569 | vSend << CMessageHeader(pszCommand, 0); |
| 579 | printf("sending: %-12s ", pszCommand); | 570 | if (LogAcceptsCategory("net")) printf("sending: %-12s ", pszCommand); |
| 580 | } | 571 | } |
| 581 | 572 | ||
| 582 | void AbortMessage() | 573 | void AbortMessage() |
| @@ -586,7 +577,7 @@ public: | |||
| 586 | vSend.resize(nPushPos); | 577 | vSend.resize(nPushPos); |
| 587 | nPushPos = -1; | 578 | nPushPos = -1; |
| 588 | LeaveCriticalSection(&cs_vSend); | 579 | LeaveCriticalSection(&cs_vSend); |
| 589 | printf("(aborted)\n"); | 580 | if (LogAcceptsCategory("net")) printf("(aborted)\n"); |
| 590 | } | 581 | } |
| 591 | 582 | ||
| 592 | void EndMessage() | 583 | void EndMessage() |
| @@ -594,7 +585,7 @@ public: | |||
| 594 | extern int nDropMessagesTest; | 585 | extern int nDropMessagesTest; |
| 595 | if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) | 586 | if (nDropMessagesTest > 0 && GetRand(nDropMessagesTest) == 0) |
| 596 | { | 587 | { |
| 597 | printf("dropmessages DROPPING SEND MESSAGE\n"); | 588 | if (LogAcceptsCategory("net")) printf("dropmessages DROPPING SEND MESSAGE\n"); |
| 598 | AbortMessage(); | 589 | AbortMessage(); |
| 599 | return; | 590 | return; |
| 600 | } | 591 | } |
| @@ -606,10 +597,10 @@ public: | |||
| 606 | unsigned int nSize = vSend.size() - nPushPos - sizeof(CMessageHeader); | 597 | unsigned int nSize = vSend.size() - nPushPos - sizeof(CMessageHeader); |
| 607 | memcpy((char*)&vSend[nPushPos] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize)); | 598 | memcpy((char*)&vSend[nPushPos] + offsetof(CMessageHeader, nMessageSize), &nSize, sizeof(nSize)); |
| 608 | 599 | ||
| 609 | printf("(%d bytes) ", nSize); | 600 | if (LogAcceptsCategory("net")) printf("(%d bytes) ", nSize); |
| 610 | //for (int i = nPushPos+sizeof(CMessageHeader); i < min(vSend.size(), nPushPos+sizeof(CMessageHeader)+20U); i++) | 601 | //for (int i = nPushPos+sizeof(CMessageHeader); i < min(vSend.size(), nPushPos+sizeof(CMessageHeader)+20U); i++) |
| 611 | // printf("%02x ", vSend[i] & 0xff); | 602 | // printf("%02x ", vSend[i] & 0xff); |
| 612 | printf("\n"); | 603 | if (LogAcceptsCategory("net")) printf("\n"); |
| 613 | 604 | ||
| 614 | nPushPos = -1; | 605 | nPushPos = -1; |
| 615 | LeaveCriticalSection(&cs_vSend); | 606 | LeaveCriticalSection(&cs_vSend); |
diff --git a/src/nostr.cpp b/src/nostr.cpp index c2ccc4c..009edd1 100644 --- a/src/nostr.cpp +++ b/src/nostr.cpp | |||
| @@ -45,7 +45,12 @@ static const int64 BTF_POOL_MAX_AGE = 3 * 60; // seconds | |||
| 45 | 45 | ||
| 46 | // Anonymous auto-discovery: how many peers to keep connected via .btf rendezvous | 46 | // Anonymous auto-discovery: how many peers to keep connected via .btf rendezvous |
| 47 | // before we stop dialing more, and how many new dials to attempt per cycle. | 47 | // before we stop dialing more, and how many new dials to attempt per cycle. |
| 48 | static const unsigned int BTF_TARGET_CONN = 8; | 48 | // Target outbound peer count. With ~100 known .btf peers on the network, |
| 49 | // an Erdos-Renyi random graph stays connected with overwhelming probability | ||
| 50 | // once average degree exceeds ln(N) (~4.6 here); 24 is ~5x past that | ||
| 51 | // threshold, so this is plenty *provided* selection isn't fully correlated | ||
| 52 | // across nodes -- see the diversity slice in ConnectDiscoveredBtfPeers. | ||
| 53 | static const unsigned int BTF_TARGET_CONN = 24; | ||
| 49 | static const int BTF_DIALS_PER_PASS = 12; // try more peers per Nostr cycle | 54 | static const int BTF_DIALS_PER_PASS = 12; // try more peers per Nostr cycle |
| 50 | 55 | ||
| 51 | // Nostr descriptor freshness cutoff: skip peers whose descriptor hasn't been | 56 | // Nostr descriptor freshness cutoff: skip peers whose descriptor hasn't been |
| @@ -58,11 +63,27 @@ static map<string, int64> g_btfPeers; | |||
| 58 | static CCriticalSection cs_btfPeers; | 63 | static CCriticalSection cs_btfPeers; |
| 59 | 64 | ||
| 60 | // Public discovery relays. Tunable. | 65 | // Public discovery relays. Tunable. |
| 66 | // | ||
| 67 | // Picked for: free/public (no NIP-42 auth or payment wall), track record of | ||
| 68 | // high uptime, and *infrastructure* diversity, not just different hostnames. | ||
| 69 | // relay.damus.io, relay.snort.social and relay.primal.net are all fronted by | ||
| 70 | // Cloudflare -- different operators, same upstream, so a Cloudflare-side | ||
| 71 | // incident (or a Cloudflare IP range getting rate-limited/blocked on some | ||
| 72 | // network) can take out several of them at once even though they look like | ||
| 73 | // independent relays. Kept only one Cloudflare-fronted relay (damus.io, the | ||
| 74 | // most established) and filled the rest with relays on different hosts | ||
| 75 | // (Hetzner, various independents) so no single upstream provider is a | ||
| 76 | // single point of failure for peer discovery. 7 relays lands inside the | ||
| 77 | // commonly recommended 5-10 range for redundancy without keeping an | ||
| 78 | // excessive number of persistent sockets open per node. | ||
| 61 | const char* pszNostrRelays[] = { | 79 | const char* pszNostrRelays[] = { |
| 62 | "wss://relay.damus.io", | 80 | "wss://relay.damus.io", |
| 63 | "wss://nos.lol", | 81 | "wss://nos.lol", |
| 64 | "wss://relay.nostr.band", | 82 | "wss://relay.nostr.band", |
| 65 | "wss://relay.snort.social", | 83 | "wss://nostr21.com", |
| 84 | "wss://offchain.pub", | ||
| 85 | "wss://nostr.mom", | ||
| 86 | "wss://relay.primal.net", | ||
| 66 | }; | 87 | }; |
| 67 | const int nNostrRelays = ARRAYLEN(pszNostrRelays); | 88 | const int nNostrRelays = ARRAYLEN(pszNostrRelays); |
| 68 | 89 | ||
| @@ -317,6 +338,13 @@ std::string BtfLocalAddress() | |||
| 317 | return g_nostrKey.BtfAddress(); | 338 | return g_nostrKey.BtfAddress(); |
| 318 | } | 339 | } |
| 319 | 340 | ||
| 341 | int GetDiscoveredPeerCount() | ||
| 342 | { | ||
| 343 | int n = 0; | ||
| 344 | CRITICAL_BLOCK(cs_btfPeers) { n = (int)g_btfPeers.size(); } | ||
| 345 | return n; | ||
| 346 | } | ||
| 347 | |||
| 320 | void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out) | 348 | void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out) |
| 321 | { | 349 | { |
| 322 | out.clear(); | 350 | out.clear(); |
| @@ -425,38 +453,55 @@ public: | |||
| 425 | size_t colon = host.find(':'); | 453 | size_t colon = host.find(':'); |
| 426 | if (colon != string::npos) { port = atoi(host.substr(colon + 1).c_str()); host = host.substr(0, colon); } | 454 | if (colon != string::npos) { port = atoi(host.substr(colon + 1).c_str()); host = host.substr(0, colon); } |
| 427 | 455 | ||
| 428 | // Resolve and connect (TCP) | 456 | // Resolve and connect (TCP). AF_UNSPEC so we get both A and AAAA |
| 429 | struct addrinfo hints, *res = NULL; | 457 | // records back and try them in the order the resolver prefers, |
| 458 | // rather than hard-failing whenever the IPv4 path to a relay is | ||
| 459 | // filtered/rate-limited (increasingly common for CDN-fronted | ||
| 460 | // relays) while a working IPv6 route exists right there in the | ||
| 461 | // same getaddrinfo() result. | ||
| 462 | struct addrinfo hints, *res = NULL, *rp = NULL; | ||
| 430 | memset(&hints, 0, sizeof(hints)); | 463 | memset(&hints, 0, sizeof(hints)); |
| 431 | hints.ai_family = AF_INET; | 464 | hints.ai_family = AF_UNSPEC; |
| 432 | hints.ai_socktype = SOCK_STREAM; | 465 | hints.ai_socktype = SOCK_STREAM; |
| 433 | char portstr[16]; sprintf(portstr, "%d", port); | 466 | char portstr[16]; sprintf(portstr, "%d", port); |
| 434 | if (getaddrinfo(host.c_str(), portstr, &hints, &res) != 0 || !res) | 467 | if (getaddrinfo(host.c_str(), portstr, &hints, &res) != 0 || !res) |
| 435 | return error("Nostr: getaddrinfo %s failed", host.c_str()); | 468 | return error("Nostr: getaddrinfo %s failed", host.c_str()); |
| 436 | hSocket = socket(res->ai_family, res->ai_socktype, res->ai_protocol); | ||
| 437 | if (hSocket == INVALID_SOCKET) { freeaddrinfo(res); return false; } | ||
| 438 | 469 | ||
| 439 | // Socket receive/send timeout: Windows takes a DWORD of milliseconds; | 470 | bool fConnected = false; |
| 440 | // POSIX takes a struct timeval. | 471 | for (rp = res; rp != NULL; rp = rp->ai_next) |
| 472 | { | ||
| 473 | hSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); | ||
| 474 | if (hSocket == INVALID_SOCKET) | ||
| 475 | continue; | ||
| 476 | |||
| 477 | // Socket receive/send timeout: Windows takes a DWORD of | ||
| 478 | // milliseconds; POSIX takes a struct timeval. | ||
| 441 | #ifdef _WIN32 | 479 | #ifdef _WIN32 |
| 442 | DWORD tv = timeoutSec * 1000; | 480 | DWORD tv = timeoutSec * 1000; |
| 443 | setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); | 481 | setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); |
| 444 | setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); | 482 | setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); |
| 445 | #else | 483 | #else |
| 446 | struct timeval tv; | 484 | struct timeval tv; |
| 447 | tv.tv_sec = timeoutSec; | 485 | tv.tv_sec = timeoutSec; |
| 448 | tv.tv_usec = 0; | 486 | tv.tv_usec = 0; |
| 449 | setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); | 487 | setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); |
| 450 | setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); | 488 | setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); |
| 451 | #endif | 489 | #endif |
| 452 | 490 | ||
| 453 | if (connect(hSocket, res->ai_addr, (int)res->ai_addrlen) != 0) | 491 | if (connect(hSocket, rp->ai_addr, (int)rp->ai_addrlen) == 0) |
| 454 | { | 492 | { |
| 455 | freeaddrinfo(res); | 493 | fConnected = true; |
| 456 | return error("Nostr: connect %s:%d failed", host.c_str(), port); | 494 | break; |
| 495 | } | ||
| 496 | |||
| 497 | closesocket(hSocket); | ||
| 498 | hSocket = INVALID_SOCKET; | ||
| 457 | } | 499 | } |
| 458 | freeaddrinfo(res); | 500 | freeaddrinfo(res); |
| 459 | 501 | ||
| 502 | if (!fConnected) | ||
| 503 | return error("Nostr: connect %s:%d failed", host.c_str(), port); | ||
| 504 | |||
| 460 | // TLS | 505 | // TLS |
| 461 | if (fTls) | 506 | if (fTls) |
| 462 | { | 507 | { |
| @@ -598,6 +643,88 @@ private: | |||
| 598 | }; | 643 | }; |
| 599 | 644 | ||
| 600 | 645 | ||
| 646 | // Persistent relay connections. Public relays (relay.damus.io in particular) | ||
| 647 | // rate-limit new connections per source IP fairly aggressively. Before this, | ||
| 648 | // every single operation -- self-test, per-pass seeding, batch descriptor | ||
| 649 | // resolve, pool announce, pool query -- opened its own fresh CWebSocket, | ||
| 650 | // meaning a single node could fire a dozen-plus brand-new TCP+TLS+WS | ||
| 651 | // handshakes at the same 4 relays within any given minute (ThreadNostrSeed's | ||
| 652 | // own loop plus the separate ThreadBtfPoolAnnouncer thread, each reconnecting | ||
| 653 | // from scratch every cycle). That's exactly what was showing up as constant | ||
| 654 | // "handshake refused by relay.damus.io" and "connect ... failed" -- not | ||
| 655 | // necessarily dead relays, just this node getting rate-limited by its own | ||
| 656 | // reconnect churn. | ||
| 657 | // | ||
| 658 | // Now every relay-touching call reuses one long-lived socket per relay via | ||
| 659 | // this pool, reconnecting only when a socket actually drops. That cuts fresh | ||
| 660 | // connections from several per minute down to essentially one per relay for | ||
| 661 | // the life of the process. | ||
| 662 | struct RelayConn | ||
| 663 | { | ||
| 664 | CWebSocket ws; | ||
| 665 | CCriticalSection cs; // serializes use of this relay's socket | ||
| 666 | bool fConnected; | ||
| 667 | RelayConn() : fConnected(false) {} | ||
| 668 | }; | ||
| 669 | static map<string, RelayConn*> g_relayPool; | ||
| 670 | static CCriticalSection cs_relayPool; | ||
| 671 | |||
| 672 | static RelayConn* GetRelayConn(const string& relay) | ||
| 673 | { | ||
| 674 | CRITICAL_BLOCK(cs_relayPool) | ||
| 675 | { | ||
| 676 | map<string, RelayConn*>::iterator it = g_relayPool.find(relay); | ||
| 677 | if (it != g_relayPool.end()) | ||
| 678 | return it->second; | ||
| 679 | RelayConn* rc = new RelayConn(); | ||
| 680 | g_relayPool[relay] = rc; | ||
| 681 | return rc; | ||
| 682 | } | ||
| 683 | return NULL; // unreachable | ||
| 684 | } | ||
| 685 | |||
| 686 | // RAII lease on a relay's pooled connection: connects (if not already | ||
| 687 | // connected) on construction, and on destruction either keeps the socket | ||
| 688 | // alive for the next caller (if the exchange succeeded) or closes it so the | ||
| 689 | // next caller reconnects instead of reusing a socket that may be wedged. | ||
| 690 | // Caller must set fOk = true once its exchange with the relay completed | ||
| 691 | // cleanly. | ||
| 692 | class CRelayLease | ||
| 693 | { | ||
| 694 | public: | ||
| 695 | RelayConn* rc; | ||
| 696 | bool fOk; | ||
| 697 | bool fJustConnected; // true if this lease had to (re)connect, false if reusing a live socket | ||
| 698 | |||
| 699 | CRelayLease(const string& relay, int timeoutSec) : rc(NULL), fOk(false), fJustConnected(false) | ||
| 700 | { | ||
| 701 | rc = GetRelayConn(relay); | ||
| 702 | rc->cs.Enter(); | ||
| 703 | if (!rc->fConnected) | ||
| 704 | { | ||
| 705 | rc->ws.Close(); | ||
| 706 | rc->fConnected = rc->ws.Connect(relay, timeoutSec); | ||
| 707 | fJustConnected = rc->fConnected; | ||
| 708 | } | ||
| 709 | } | ||
| 710 | ~CRelayLease() | ||
| 711 | { | ||
| 712 | if (!fOk) | ||
| 713 | { | ||
| 714 | rc->ws.Close(); | ||
| 715 | rc->fConnected = false; | ||
| 716 | } | ||
| 717 | rc->cs.Leave(); | ||
| 718 | } | ||
| 719 | bool Connected() const { return rc->fConnected; } | ||
| 720 | CWebSocket& Ws() { return rc->ws; } | ||
| 721 | |||
| 722 | private: | ||
| 723 | CRelayLease(const CRelayLease&); | ||
| 724 | CRelayLease& operator=(const CRelayLease&); | ||
| 725 | }; | ||
| 726 | |||
| 727 | |||
| 601 | // Publish this node's self-certifying `.btf` descriptor: "reach me (this key) | 728 | // Publish this node's self-certifying `.btf` descriptor: "reach me (this key) |
| 602 | // via <meeting_node>, encrypting to my x25519 key <enc>". Signed by the node | 729 | // via <meeting_node>, encrypting to my x25519 key <enc>". Signed by the node |
| 603 | // key so only the address's owner can publish it (no hijacking). | 730 | // key so only the address's owner can publish it (no hijacking). |
| @@ -673,11 +800,11 @@ bool BtfPublishPoolAnnouncement(const BtfPoolAnnouncement& ann) | |||
| 673 | { | 800 | { |
| 674 | try | 801 | try |
| 675 | { | 802 | { |
| 676 | CWebSocket ws; | 803 | CRelayLease lease(pszNostrRelays[i], 10); |
| 677 | if (!ws.Connect(pszNostrRelays[i], 10)) | 804 | if (!lease.Connected()) |
| 678 | continue; | 805 | continue; |
| 679 | if (PublishPoolAnnouncementOnRelay(ws, g_nostrKey, ann)) | 806 | if (PublishPoolAnnouncementOnRelay(lease.Ws(), g_nostrKey, ann)) |
| 680 | fPublished = true; | 807 | fPublished = lease.fOk = true; |
| 681 | } | 808 | } |
| 682 | CATCH_PRINT_EXCEPTION("BtfPublishPoolAnnouncement") | 809 | CATCH_PRINT_EXCEPTION("BtfPublishPoolAnnouncement") |
| 683 | } | 810 | } |
| @@ -699,9 +826,10 @@ bool BtfQueryPoolAnnouncement(const std::string& poolBtfAddr, BtfPoolAnnouncemen | |||
| 699 | { | 826 | { |
| 700 | try | 827 | try |
| 701 | { | 828 | { |
| 702 | CWebSocket ws; | 829 | CRelayLease lease(pszNostrRelays[i], 10); |
| 703 | if (!ws.Connect(pszNostrRelays[i], 10)) | 830 | if (!lease.Connected()) |
| 704 | continue; | 831 | continue; |
| 832 | CWebSocket& ws = lease.Ws(); | ||
| 705 | 833 | ||
| 706 | json filter = json::object(); | 834 | json filter = json::object(); |
| 707 | filter["authors"] = json::array({ HexEncode(pk, 32) }); | 835 | filter["authors"] = json::array({ HexEncode(pk, 32) }); |
| @@ -756,6 +884,7 @@ bool BtfQueryPoolAnnouncement(const std::string& poolBtfAddr, BtfPoolAnnouncemen | |||
| 756 | else if (type == "EOSE") | 884 | else if (type == "EOSE") |
| 757 | break; | 885 | break; |
| 758 | } | 886 | } |
| 887 | lease.fOk = true; | ||
| 759 | } | 888 | } |
| 760 | CATCH_PRINT_EXCEPTION("BtfQueryPoolAnnouncement") | 889 | CATCH_PRINT_EXCEPTION("BtfQueryPoolAnnouncement") |
| 761 | } | 890 | } |
| @@ -855,12 +984,16 @@ bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort, | |||
| 855 | { | 984 | { |
| 856 | try | 985 | try |
| 857 | { | 986 | { |
| 858 | CWebSocket ws; | 987 | CRelayLease lease(pszNostrRelays[i], 10); |
| 859 | if (!ws.Connect(pszNostrRelays[i], 10)) | 988 | if (!lease.Connected()) |
| 860 | continue; | 989 | continue; |
| 861 | btf::Descriptor d; | 990 | btf::Descriptor d; |
| 862 | if (!ResolveDescriptor(ws, g_nostrKey.ctx, btfAddr, d)) | 991 | if (!ResolveDescriptor(lease.Ws(), g_nostrKey.ctx, btfAddr, d)) |
| 992 | { | ||
| 993 | lease.fOk = true; // exchange completed, just no match | ||
| 863 | continue; | 994 | continue; |
| 995 | } | ||
| 996 | lease.fOk = true; | ||
| 864 | if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending") | 997 | if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending") |
| 865 | continue; // descriptor predates the owner's relay config | 998 | continue; // descriptor predates the owner's relay config |
| 866 | if (!HexDecode(d.enc, enc_pub, 32)) | 999 | if (!HexDecode(d.enc, enc_pub, 32)) |
| @@ -873,14 +1006,115 @@ bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort, | |||
| 873 | return false; | 1006 | return false; |
| 874 | } | 1007 | } |
| 875 | 1008 | ||
| 1009 | // Resolve MANY .btf addresses in one pass. A single relay connection carries | ||
| 1010 | // a REQ with every still-unresolved address's pubkey in "authors", instead of | ||
| 1011 | // opening one relay connection per address. This matters because callers like | ||
| 1012 | // ConnectDiscoveredBtfPeers dial many candidates in parallel; without | ||
| 1013 | // batching, each of those dial threads independently walks the same handful | ||
| 1014 | // of public relays on its own, so a pass of N candidates can fire up to | ||
| 1015 | // N * nNostrRelays near-simultaneous connections at the same few relays -- | ||
| 1016 | // enough to get rate-limited or have handshakes refused, which then looks | ||
| 1017 | // like "dead peers" even though the descriptors are perfectly resolvable. | ||
| 1018 | bool BtfResolveMany(const std::vector<std::string>& btfAddrs, | ||
| 1019 | std::map<std::string, BtfResolvedPeer>& out) | ||
| 1020 | { | ||
| 1021 | if (!EnsureNostrKey() || btfAddrs.empty()) | ||
| 1022 | return false; | ||
| 1023 | |||
| 1024 | map<string, string> hexToAddr; // pubkey hex -> .btf addr, for matching events back | ||
| 1025 | set<string> pending; | ||
| 1026 | for (const string& a : btfAddrs) | ||
| 1027 | { | ||
| 1028 | unsigned char pk[32]; | ||
| 1029 | if (!btf::ParseAddress(a, pk)) | ||
| 1030 | continue; | ||
| 1031 | hexToAddr[HexEncode(pk, 32)] = a; | ||
| 1032 | pending.insert(a); | ||
| 1033 | } | ||
| 1034 | if (pending.empty()) | ||
| 1035 | return false; | ||
| 1036 | |||
| 1037 | for (int i = 0; i < nNostrRelays && !fShutdown && !pending.empty(); i++) | ||
| 1038 | { | ||
| 1039 | try | ||
| 1040 | { | ||
| 1041 | CRelayLease lease(pszNostrRelays[i], 10); | ||
| 1042 | if (!lease.Connected()) | ||
| 1043 | continue; | ||
| 1044 | CWebSocket& ws = lease.Ws(); | ||
| 1045 | |||
| 1046 | json authors = json::array(); | ||
| 1047 | for (auto& kv : hexToAddr) | ||
| 1048 | if (pending.count(kv.second)) | ||
| 1049 | authors.push_back(kv.first); | ||
| 1050 | if (authors.empty()) | ||
| 1051 | { | ||
| 1052 | lease.fOk = true; | ||
| 1053 | break; | ||
| 1054 | } | ||
| 1055 | |||
| 1056 | json filter = json::object(); | ||
| 1057 | filter["authors"] = authors; | ||
| 1058 | filter["kinds"] = json::array({ BTF_DESC_KIND }); | ||
| 1059 | filter["limit"] = (int)authors.size(); | ||
| 1060 | json req = json::array({ "REQ", "btf-resolve-many", filter }); | ||
| 1061 | if (!ws.SendText(req.dump())) | ||
| 1062 | continue; | ||
| 1063 | |||
| 1064 | for (;;) | ||
| 1065 | { | ||
| 1066 | string msg; | ||
| 1067 | if (!ws.RecvText(msg)) | ||
| 1068 | break; | ||
| 1069 | json j; | ||
| 1070 | try { j = json::parse(msg); } catch (...) { continue; } | ||
| 1071 | if (!j.is_array() || j.empty()) continue; | ||
| 1072 | string t = j[0].get<string>(); | ||
| 1073 | if (t == "EVENT" && j.size() >= 3) | ||
| 1074 | { | ||
| 1075 | const json& ev = j[2]; | ||
| 1076 | if (!ev.contains("pubkey") || !ev.contains("content")) | ||
| 1077 | continue; | ||
| 1078 | string hexpk = ev["pubkey"].get<string>(); | ||
| 1079 | auto ai = hexToAddr.find(hexpk); | ||
| 1080 | if (ai == hexToAddr.end() || !pending.count(ai->second)) | ||
| 1081 | continue; // not one we're waiting on (or already resolved) | ||
| 1082 | |||
| 1083 | unsigned char pk[32]; | ||
| 1084 | if (!HexDecode(hexpk, pk, 32)) | ||
| 1085 | continue; | ||
| 1086 | btf::Descriptor d; | ||
| 1087 | if (!btf::VerifyDescriptor(g_nostrKey.ctx, ev["content"].get<string>(), pk, d)) | ||
| 1088 | continue; | ||
| 1089 | if (d.meeting_node.empty() || d.meeting_node == "rendezvous-pending") | ||
| 1090 | continue; | ||
| 1091 | BtfResolvedPeer rp; | ||
| 1092 | if (!HexDecode(d.enc, rp.enc_pub, 32)) | ||
| 1093 | continue; | ||
| 1094 | rp.meetingHostPort = d.meeting_node; | ||
| 1095 | out[ai->second] = rp; | ||
| 1096 | pending.erase(ai->second); | ||
| 1097 | } | ||
| 1098 | else if (t == "EOSE") | ||
| 1099 | break; | ||
| 1100 | } | ||
| 1101 | lease.fOk = true; | ||
| 1102 | } | ||
| 1103 | CATCH_PRINT_EXCEPTION("BtfResolveMany") | ||
| 1104 | } | ||
| 1105 | return !out.empty(); | ||
| 1106 | } | ||
| 1107 | |||
| 876 | 1108 | ||
| 877 | // Connect to a relay: publish our .btf descriptor and collect relay data. | 1109 | // Connect to a relay: publish our .btf descriptor and collect relay data. |
| 878 | static bool SeedFromRelay(CNostrKey& key, const string& relay) | 1110 | static bool SeedFromRelay(CNostrKey& key, const string& relay) |
| 879 | { | 1111 | { |
| 880 | CWebSocket ws; | 1112 | CRelayLease lease(relay, 10); |
| 881 | if (!ws.Connect(relay, 10)) | 1113 | if (!lease.Connected()) |
| 882 | return false; | 1114 | return false; |
| 883 | printf("Nostr: connected to %s\n", relay.c_str()); | 1115 | CWebSocket& ws = lease.Ws(); |
| 1116 | if (lease.fJustConnected) | ||
| 1117 | LogPrint("nostr", "Nostr: connected to %s\n", relay.c_str()); | ||
| 884 | 1118 | ||
| 885 | // Publish our self-certifying .btf descriptor (rendezvous discovery) | 1119 | // Publish our self-certifying .btf descriptor (rendezvous discovery) |
| 886 | PublishDescriptor(ws, key); | 1120 | PublishDescriptor(ws, key); |
| @@ -930,7 +1164,7 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay) | |||
| 930 | else if (createdAt > it->second) it->second = createdAt; // refresh | 1164 | else if (createdAt > it->second) it->second = createdAt; // refresh |
| 931 | } | 1165 | } |
| 932 | if (fNew && fDebug) | 1166 | if (fNew && fDebug) |
| 933 | printf("Nostr: discovered .btf peer %s\n", peerAddr.c_str()); | 1167 | LogPrint("nostr", "Nostr: discovered .btf peer %s\n", peerAddr.c_str()); |
| 934 | if (++nPeers > 500) break; | 1168 | if (++nPeers > 500) break; |
| 935 | } | 1169 | } |
| 936 | else if (type == "EOSE") | 1170 | else if (type == "EOSE") |
| @@ -974,7 +1208,7 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay) | |||
| 974 | if (g_discoveredRelays.size() < BTF_MAX_DISCOVERED_RELAYS) | 1208 | if (g_discoveredRelays.size() < BTF_MAX_DISCOVERED_RELAYS) |
| 975 | fNew = g_discoveredRelays.insert(r).second; | 1209 | fNew = g_discoveredRelays.insert(r).second; |
| 976 | if (fNew && fDebug) | 1210 | if (fNew && fDebug) |
| 977 | printf("Nostr: discovered relay %s\n", r.c_str()); | 1211 | LogPrint("nostr", "Nostr: discovered relay %s\n", r.c_str()); |
| 978 | } | 1212 | } |
| 979 | else if (type == "EOSE") | 1213 | else if (type == "EOSE") |
| 980 | break; | 1214 | break; |
| @@ -1009,12 +1243,15 @@ static bool SeedFromRelay(CNostrKey& key, const string& relay) | |||
| 1009 | } | 1243 | } |
| 1010 | } | 1244 | } |
| 1011 | } | 1245 | } |
| 1246 | lease.fOk = true; | ||
| 1012 | return true; | 1247 | return true; |
| 1013 | } | 1248 | } |
| 1014 | 1249 | ||
| 1250 | volatile bool gAnnounceNow = false; | ||
| 1251 | |||
| 1015 | void ThreadBtfPoolAnnouncer(void*) | 1252 | void ThreadBtfPoolAnnouncer(void*) |
| 1016 | { | 1253 | { |
| 1017 | printf("ThreadBtfPoolAnnouncer started\n"); | 1254 | LogPrint("pool", "ThreadBtfPoolAnnouncer started\n"); |
| 1018 | while (!fShutdown) | 1255 | while (!fShutdown) |
| 1019 | { | 1256 | { |
| 1020 | if (nMineMode == MINE_OPERATOR && gPoolRunning) | 1257 | if (nMineMode == MINE_OPERATOR && gPoolRunning) |
| @@ -1025,15 +1262,17 @@ void ThreadBtfPoolAnnouncer(void*) | |||
| 1025 | ann.dashboardUrl = strPoolDashboardUrl; | 1262 | ann.dashboardUrl = strPoolDashboardUrl; |
| 1026 | ann.feePercent = dPoolFeePercent; | 1263 | ann.feePercent = dPoolFeePercent; |
| 1027 | uint64 roundShares = 0; | 1264 | uint64 roundShares = 0; |
| 1028 | GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares); | 1265 | double totalHashRate = 0.0; |
| 1029 | ann.hashRate = 0.0; | 1266 | GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares, totalHashRate); |
| 1267 | ann.hashRate = totalHashRate; | ||
| 1030 | ann.createdAt = GetTime(); | 1268 | ann.createdAt = GetTime(); |
| 1031 | if (!ann.btfAddress.empty() && !ann.poolName.empty()) | 1269 | if (!ann.btfAddress.empty() && !ann.poolName.empty()) |
| 1032 | BtfPublishPoolAnnouncement(ann); | 1270 | BtfPublishPoolAnnouncement(ann); |
| 1033 | } | 1271 | } |
| 1034 | 1272 | ||
| 1035 | for (int i = 0; i < 60 && !fShutdown; i++) | 1273 | for (int i = 0; i < 60 && !fShutdown && !gAnnounceNow; i++) |
| 1036 | Sleep(1000); | 1274 | Sleep(1000); |
| 1275 | gAnnounceNow = false; | ||
| 1037 | } | 1276 | } |
| 1038 | } | 1277 | } |
| 1039 | 1278 | ||
| @@ -1042,10 +1281,29 @@ void ThreadBtfPoolAnnouncer(void*) | |||
| 1042 | // dead/stale descriptors (e.g. abandoned test identities that linger on the | 1281 | // dead/stale descriptors (e.g. abandoned test identities that linger on the |
| 1043 | // relays) from consuming the whole per-pass dial budget and starving the live | 1282 | // relays) from consuming the whole per-pass dial budget and starving the live |
| 1044 | // peers. Backoff grows on repeated failures, capped. | 1283 | // peers. Backoff grows on repeated failures, capped. |
| 1284 | // | ||
| 1285 | // g_btfPeerFails also doubles as the priority signal for dial ordering: a peer | ||
| 1286 | // we've connected to before (present in g_btfPeerEverConnected) is known-good | ||
| 1287 | // and goes first; a peer we've never tried goes next; a peer with a growing | ||
| 1288 | // fail count is known-bad and goes last, worst offenders furthest back. This | ||
| 1289 | // replaces the old behavior where the whole candidate list was shuffled right | ||
| 1290 | // after being sorted by freshness, which made the freshness sort a no-op and | ||
| 1291 | // gave dead peers equal footing with everyone else. | ||
| 1045 | static map<string, int64> g_btfPeerBackoff; // addr -> next-try time | 1292 | static map<string, int64> g_btfPeerBackoff; // addr -> next-try time |
| 1046 | static map<string, int> g_btfPeerFails; // addr -> consecutive failures | 1293 | static map<string, int> g_btfPeerFails; // addr -> consecutive failures |
| 1294 | static set<string> g_btfPeerEverConnected; // addr -> has succeeded at least once | ||
| 1047 | static CCriticalSection cs_btfPeerState; | 1295 | static CCriticalSection cs_btfPeerState; |
| 1048 | 1296 | ||
| 1297 | // Backoff cap for repeatedly-dead peers. The old 15-minute cap meant a | ||
| 1298 | // descriptor that has failed many times in a row cycles back into the dial | ||
| 1299 | // pool just as often as a peer we've never tried, wasting dial budget on | ||
| 1300 | // known-dead addresses every pass. Once a peer has failed enough times to | ||
| 1301 | // be "chronic", stretch the cap much further so it consumes budget far less | ||
| 1302 | // often while still getting retried eventually in case it comes back online. | ||
| 1303 | static const int64 BTF_BACKOFF_CAP_SECS = 15 * 60; // 15 min: initial ramp cap | ||
| 1304 | static const int64 BTF_BACKOFF_CAP_SECS_DEAD = 6 * 60 * 60; // 6 hr: cap for chronic failures | ||
| 1305 | static const int BTF_CHRONIC_FAIL_THRESHOLD = 6; // fails before "chronic" cap kicks in | ||
| 1306 | |||
| 1049 | // Dial the .btf peers discovered on the relays, up to a target connection count. | 1307 | // Dial the .btf peers discovered on the relays, up to a target connection count. |
| 1050 | // Connections are attempted in parallel so a single slow/dead relay doesn't | 1308 | // Connections are attempted in parallel so a single slow/dead relay doesn't |
| 1051 | // stall the entire pass. Each candidate gets its own thread; all threads start | 1309 | // stall the entire pass. Each candidate gets its own thread; all threads start |
| @@ -1060,23 +1318,18 @@ static void ConnectDiscoveredBtfPeers() | |||
| 1060 | for (auto& kv : g_btfPeers) | 1318 | for (auto& kv : g_btfPeers) |
| 1061 | peersWithAge.push_back({kv.second, kv.first}); | 1319 | peersWithAge.push_back({kv.second, kv.first}); |
| 1062 | } | 1320 | } |
| 1063 | // Sort newest descriptor first — recently-active nodes are much more | ||
| 1064 | // likely to be online right now. Stale ones stay in the list as fallback. | ||
| 1065 | sort(peersWithAge.begin(), peersWithAge.end(), | ||
| 1066 | [](const pair<int64,string>& a, const pair<int64,string>& b){ return a.first > b.first; }); | ||
| 1067 | |||
| 1068 | int64 cutoff = GetTime() - BTF_PEER_MAX_AGE; | 1321 | int64 cutoff = GetTime() - BTF_PEER_MAX_AGE; |
| 1069 | int nFresh = 0; | 1322 | int nFresh = 0; |
| 1070 | vector<string> peers; | 1323 | vector<pair<int64,string>> fresh; // (createdAt, addr), newest first |
| 1071 | for (auto& p : peersWithAge) | 1324 | for (auto& p : peersWithAge) |
| 1072 | { | 1325 | { |
| 1073 | if (p.first < cutoff) | 1326 | if (p.first < cutoff) |
| 1074 | continue; | 1327 | continue; |
| 1075 | peers.push_back(p.second); | 1328 | fresh.push_back(p); |
| 1076 | nFresh++; | 1329 | nFresh++; |
| 1077 | } | 1330 | } |
| 1078 | if (!peers.empty()) | 1331 | if (!fresh.empty()) |
| 1079 | printf("Nostr: %d fresh peers, %d stale (of %d total)\n", nFresh, nTotal-nFresh, nTotal); | 1332 | LogPrint("nostr", "Nostr: %d fresh peers, %d stale (of %d total)\n", nFresh, nTotal-nFresh, nTotal); |
| 1080 | 1333 | ||
| 1081 | // Drop stale peers so we stop retrying dead descriptors until they refresh. | 1334 | // Drop stale peers so we stop retrying dead descriptors until they refresh. |
| 1082 | { | 1335 | { |
| @@ -1092,42 +1345,164 @@ static void ConnectDiscoveredBtfPeers() | |||
| 1092 | } | 1345 | } |
| 1093 | } | 1346 | } |
| 1094 | 1347 | ||
| 1095 | // Shuffle so we don't always retry the same dead peers at the front. | 1348 | // Sort newest descriptor first -- recently-active nodes are much more |
| 1096 | for (size_t i = peers.size(); i > 1; i--) | 1349 | // likely to be online right now. |
| 1097 | swap(peers[i - 1], peers[(size_t)GetRand(i)]); | 1350 | sort(fresh.begin(), fresh.end(), |
| 1351 | [](const pair<int64,string>& a, const pair<int64,string>& b){ return a.first > b.first; }); | ||
| 1352 | |||
| 1353 | // Reorder into tiers: known-good (succeeded before) first, untried next, | ||
| 1354 | // known-bad (has a fail count) last -- worst offenders furthest back. | ||
| 1355 | // Freshness order is preserved *within* each tier, so recency still | ||
| 1356 | // matters, but a peer we know is dead no longer gets equal footing with | ||
| 1357 | // a peer we've never tried or one that's worked before. | ||
| 1358 | vector<string> tierGood, tierUntried, tierBad; | ||
| 1359 | CRITICAL_BLOCK(cs_btfPeerState) | ||
| 1360 | { | ||
| 1361 | for (auto& p : fresh) | ||
| 1362 | { | ||
| 1363 | const string& addr = p.second; | ||
| 1364 | if (g_btfPeerEverConnected.count(addr)) | ||
| 1365 | tierGood.push_back(addr); | ||
| 1366 | else if (g_btfPeerFails.find(addr) == g_btfPeerFails.end()) | ||
| 1367 | tierUntried.push_back(addr); | ||
| 1368 | else | ||
| 1369 | tierBad.push_back(addr); | ||
| 1370 | } | ||
| 1371 | // Within known-bad, put fewer-fails peers ahead of chronic offenders. | ||
| 1372 | sort(tierBad.begin(), tierBad.end(), | ||
| 1373 | [](const string& a, const string& b){ return g_btfPeerFails[a] < g_btfPeerFails[b]; }); | ||
| 1374 | } | ||
| 1375 | |||
| 1376 | vector<string> peers; | ||
| 1377 | peers.reserve(fresh.size()); | ||
| 1378 | peers.insert(peers.end(), tierGood.begin(), tierGood.end()); | ||
| 1379 | peers.insert(peers.end(), tierUntried.begin(), tierUntried.end()); | ||
| 1380 | peers.insert(peers.end(), tierBad.begin(), tierBad.end()); | ||
| 1098 | 1381 | ||
| 1099 | // Pick candidates for this pass (skip those in backoff, cap at budget). | 1382 | // Pick candidates for this pass (skip those in backoff, cap at budget). |
| 1383 | // | ||
| 1384 | // The tiered order above is deliberately biased toward peers we know | ||
| 1385 | // are good -- that's the right default, since dialing untested/bad | ||
| 1386 | // peers wastes attempts. But if every node on the network applies the | ||
| 1387 | // same bias, everyone converges on the same small set of "known good" | ||
| 1388 | // peers as neighbors: that correlates peer sets across the network, | ||
| 1389 | // which is exactly what standard random-graph connectivity results | ||
| 1390 | // assume you avoid. If that shared hub set has a bad day (e.g. one | ||
| 1391 | // relay outage), many nodes lose the same edges at once instead of | ||
| 1392 | // losing independent, uncorrelated edges. | ||
| 1393 | // | ||
| 1394 | // So: fill most of the pass from the reliable/tiered order, but reserve | ||
| 1395 | // a slice for peers picked at random from the *entire* fresh pool | ||
| 1396 | // (not just the front of the sorted list). Same pattern Bitcoin's own | ||
| 1397 | // peer manager and Kademlia-style DHTs use -- sticky reliable peers | ||
| 1398 | // plus a random sample, not one or the other. | ||
| 1100 | int64 now = GetTime(); | 1399 | int64 now = GetTime(); |
| 1400 | int nBudget = (int)BTF_DIALS_PER_PASS; | ||
| 1401 | { | ||
| 1402 | int nRoom = (int)BTF_TARGET_CONN - (int)vNodes.size(); | ||
| 1403 | if (nRoom < nBudget) nBudget = nRoom; | ||
| 1404 | } | ||
| 1405 | if (nBudget < 0) nBudget = 0; | ||
| 1406 | int nRandomSlots = (nBudget > 0) ? max(1, nBudget * 3 / 10) : 0; | ||
| 1407 | int nSortedSlots = nBudget - nRandomSlots; | ||
| 1408 | |||
| 1101 | vector<string> candidates; | 1409 | vector<string> candidates; |
| 1410 | set<string> setChosen; | ||
| 1102 | CRITICAL_BLOCK(cs_btfPeerState) | 1411 | CRITICAL_BLOCK(cs_btfPeerState) |
| 1103 | { | 1412 | { |
| 1413 | // Reliability slice: walk the tiered (good -> untried -> bad) order. | ||
| 1104 | for (const string& addr : peers) | 1414 | for (const string& addr : peers) |
| 1105 | { | 1415 | { |
| 1106 | if ((int)vNodes.size() >= (int)BTF_TARGET_CONN) break; | 1416 | if ((int)vNodes.size() >= (int)BTF_TARGET_CONN) break; |
| 1107 | if ((int)candidates.size() >= BTF_DIALS_PER_PASS) break; | 1417 | if ((int)candidates.size() >= nSortedSlots) break; |
| 1108 | map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr); | 1418 | map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr); |
| 1109 | if (bi != g_btfPeerBackoff.end() && now < bi->second) | 1419 | if (bi != g_btfPeerBackoff.end() && now < bi->second) |
| 1110 | continue; | 1420 | continue; |
| 1111 | candidates.push_back(addr); | 1421 | candidates.push_back(addr); |
| 1422 | setChosen.insert(addr); | ||
| 1423 | } | ||
| 1424 | |||
| 1425 | // Diversity slice: random sample from the full fresh pool, so the | ||
| 1426 | // dial isn't limited to whatever the tiered sort put up front. | ||
| 1427 | vector<string> pool; | ||
| 1428 | for (auto& p : fresh) | ||
| 1429 | { | ||
| 1430 | const string& addr = p.second; | ||
| 1431 | if (setChosen.count(addr)) | ||
| 1432 | continue; | ||
| 1433 | map<string, int64>::iterator bi = g_btfPeerBackoff.find(addr); | ||
| 1434 | if (bi != g_btfPeerBackoff.end() && now < bi->second) | ||
| 1435 | continue; | ||
| 1436 | pool.push_back(addr); | ||
| 1437 | } | ||
| 1438 | int nWant = min(nRandomSlots, (int)pool.size()); | ||
| 1439 | for (int i = 0; i < nWant; i++) | ||
| 1440 | { | ||
| 1441 | if ((int)vNodes.size() + (int)candidates.size() >= (int)BTF_TARGET_CONN) break; | ||
| 1442 | if ((int)candidates.size() >= nBudget) break; | ||
| 1443 | size_t j = i + (size_t)GetRand((uint64)(pool.size() - i)); | ||
| 1444 | std::swap(pool[i], pool[j]); | ||
| 1445 | candidates.push_back(pool[i]); | ||
| 1446 | setChosen.insert(pool[i]); | ||
| 1112 | } | 1447 | } |
| 1113 | } | 1448 | } |
| 1114 | 1449 | ||
| 1115 | if (candidates.empty()) return; | 1450 | if (candidates.empty()) return; |
| 1116 | 1451 | ||
| 1117 | // Launch one thread per candidate — all connect attempts run in parallel. | 1452 | // Resolve every candidate's descriptor in one batched pass (a handful of |
| 1453 | // relay round-trips total, one REQ per relay covering all candidates) | ||
| 1454 | // instead of each dial thread independently walking the relay list on | ||
| 1455 | // its own. That per-thread approach meant a 12-candidate pass could fire | ||
| 1456 | // up to 12 * nNostrRelays near-simultaneous connections at the same | ||
| 1457 | // handful of public relays -- enough to trip rate limits or get | ||
| 1458 | // handshakes refused, which then looks exactly like "dead peers" even | ||
| 1459 | // though the descriptors were perfectly resolvable. | ||
| 1460 | map<string, BtfResolvedPeer> resolved; | ||
| 1461 | BtfResolveMany(candidates, resolved); | ||
| 1462 | |||
| 1463 | // Candidates whose descriptor didn't resolve this pass are recorded as a | ||
| 1464 | // failure right away (no point spawning a tunnel thread with nothing to | ||
| 1465 | // dial), same bookkeeping as a failed connect attempt. | ||
| 1466 | vector<string> toDial; | ||
| 1467 | CRITICAL_BLOCK(cs_btfPeerState) | ||
| 1468 | { | ||
| 1469 | for (const string& addr : candidates) | ||
| 1470 | { | ||
| 1471 | if (resolved.count(addr)) | ||
| 1472 | { | ||
| 1473 | toDial.push_back(addr); | ||
| 1474 | continue; | ||
| 1475 | } | ||
| 1476 | int n = ++g_btfPeerFails[addr]; | ||
| 1477 | int64 cap = (n >= BTF_CHRONIC_FAIL_THRESHOLD) ? BTF_BACKOFF_CAP_SECS_DEAD | ||
| 1478 | : BTF_BACKOFF_CAP_SECS; | ||
| 1479 | int64 secs = 30; | ||
| 1480 | for (int k = 1; k < n && secs < cap; k++) secs *= 2; | ||
| 1481 | if (secs > cap) secs = cap; | ||
| 1482 | g_btfPeerBackoff[addr] = GetTime() + secs; | ||
| 1483 | } | ||
| 1484 | } | ||
| 1485 | if (toDial.empty()) return; | ||
| 1486 | |||
| 1487 | // Launch one thread per resolved candidate -- all connect attempts run in | ||
| 1488 | // parallel, but purely against each peer's own rendezvous meeting node, | ||
| 1489 | // not the shared Nostr relays, so there's no thundering-herd effect here. | ||
| 1118 | // Each thread writes its result back via shared state guarded by cs_btfPeerState. | 1490 | // Each thread writes its result back via shared state guarded by cs_btfPeerState. |
| 1119 | struct DialCtx { string addr; }; | 1491 | struct DialCtx { string addr; BtfResolvedPeer rp; }; |
| 1120 | vector<DialCtx*> ctxs; | 1492 | vector<DialCtx*> ctxs; |
| 1121 | for (const string& addr : candidates) | 1493 | for (const string& addr : toDial) |
| 1122 | { | 1494 | { |
| 1123 | DialCtx* ctx = new DialCtx{addr}; | 1495 | DialCtx* ctx = new DialCtx{addr, resolved[addr]}; |
| 1124 | ctxs.push_back(ctx); | 1496 | ctxs.push_back(ctx); |
| 1125 | _beginthread([](void* arg) { | 1497 | _beginthread([](void* arg) { |
| 1126 | DialCtx* ctx = (DialCtx*)arg; | 1498 | DialCtx* ctx = (DialCtx*)arg; |
| 1127 | string addr = ctx->addr; | 1499 | string addr = ctx->addr; |
| 1500 | string meeting = ctx->rp.meetingHostPort; | ||
| 1501 | unsigned char enc_pub[32]; | ||
| 1502 | memcpy(enc_pub, ctx->rp.enc_pub, 32); | ||
| 1128 | delete ctx; | 1503 | delete ctx; |
| 1129 | 1504 | ||
| 1130 | CNode* pnode = ConnectNodeBtf(addr); | 1505 | CNode* pnode = ConnectNodeBtfResolved(addr, meeting, enc_pub); |
| 1131 | CRITICAL_BLOCK(cs_btfPeerState) | 1506 | CRITICAL_BLOCK(cs_btfPeerState) |
| 1132 | { | 1507 | { |
| 1133 | if (pnode) | 1508 | if (pnode) |
| @@ -1138,13 +1513,16 @@ static void ConnectDiscoveredBtfPeers() | |||
| 1138 | pnode->Release(); | 1513 | pnode->Release(); |
| 1139 | g_btfPeerBackoff.erase(addr); | 1514 | g_btfPeerBackoff.erase(addr); |
| 1140 | g_btfPeerFails.erase(addr); | 1515 | g_btfPeerFails.erase(addr); |
| 1516 | g_btfPeerEverConnected.insert(addr); | ||
| 1141 | } | 1517 | } |
| 1142 | else | 1518 | else |
| 1143 | { | 1519 | { |
| 1144 | int n = ++g_btfPeerFails[addr]; | 1520 | int n = ++g_btfPeerFails[addr]; |
| 1521 | int64 cap = (n >= BTF_CHRONIC_FAIL_THRESHOLD) ? BTF_BACKOFF_CAP_SECS_DEAD | ||
| 1522 | : BTF_BACKOFF_CAP_SECS; | ||
| 1145 | int64 secs = 30; | 1523 | int64 secs = 30; |
| 1146 | for (int k = 1; k < n && secs < 15*60; k++) secs *= 2; | 1524 | for (int k = 1; k < n && secs < cap; k++) secs *= 2; |
| 1147 | if (secs > 15*60) secs = 15*60; | 1525 | if (secs > cap) secs = cap; |
| 1148 | g_btfPeerBackoff[addr] = GetTime() + secs; | 1526 | g_btfPeerBackoff[addr] = GetTime() + secs; |
| 1149 | } | 1527 | } |
| 1150 | } | 1528 | } |
| @@ -1160,16 +1538,16 @@ static void ConnectDiscoveredBtfPeers() | |||
| 1160 | 1538 | ||
| 1161 | void ThreadNostrSeed(void* parg) | 1539 | void ThreadNostrSeed(void* parg) |
| 1162 | { | 1540 | { |
| 1163 | printf("ThreadNostrSeed started\n"); | 1541 | LogPrint("nostr", "ThreadNostrSeed started\n"); |
| 1164 | 1542 | ||
| 1165 | if (!EnsureNostrKey()) | 1543 | if (!EnsureNostrKey()) |
| 1166 | { | 1544 | { |
| 1167 | printf("Nostr: failed to initialize secp256k1 key\n"); | 1545 | LogPrint("nostr", "Nostr: failed to initialize secp256k1 key\n"); |
| 1168 | return; | 1546 | return; |
| 1169 | } | 1547 | } |
| 1170 | CNostrKey& key = g_nostrKey; | 1548 | CNostrKey& key = g_nostrKey; |
| 1171 | printf("Nostr: node pubkey = %s\n", key.PubKeyHex().c_str()); | 1549 | LogPrint("nostr", "Nostr: node pubkey = %s\n", key.PubKeyHex().c_str()); |
| 1172 | printf("Nostr: node .btf address = %s\n", key.BtfAddress().c_str()); | 1550 | LogPrint("nostr", "Nostr: node .btf address = %s\n", key.BtfAddress().c_str()); |
| 1173 | 1551 | ||
| 1174 | // One-time self-test of the rendezvous: publish our descriptor to a relay, | 1552 | // One-time self-test of the rendezvous: publish our descriptor to a relay, |
| 1175 | // then resolve our OWN .btf address back and verify it self-certifies. Proves | 1553 | // then resolve our OWN .btf address back and verify it self-certifies. Proves |
| @@ -1178,17 +1556,20 @@ void ThreadNostrSeed(void* parg) | |||
| 1178 | { | 1556 | { |
| 1179 | try | 1557 | try |
| 1180 | { | 1558 | { |
| 1181 | CWebSocket ws; | 1559 | CRelayLease lease(pszNostrRelays[i], 10); |
| 1182 | if (!ws.Connect(pszNostrRelays[i], 10)) continue; | 1560 | if (!lease.Connected()) continue; |
| 1561 | CWebSocket& ws = lease.Ws(); | ||
| 1183 | PublishDescriptor(ws, key); | 1562 | PublishDescriptor(ws, key); |
| 1184 | Sleep(700); // let the relay store the replaceable event | 1563 | Sleep(700); // let the relay store the replaceable event |
| 1185 | btf::Descriptor d; | 1564 | btf::Descriptor d; |
| 1186 | if (ResolveDescriptor(ws, key.ctx, key.BtfAddress(), d)) | 1565 | if (ResolveDescriptor(ws, key.ctx, key.BtfAddress(), d)) |
| 1187 | { | 1566 | { |
| 1188 | printf("Nostr: .btf self-resolve OK via %s (meeting_node=%s, enc=%s...)\n", | 1567 | LogPrint("nostr", "Nostr: .btf self-resolve OK via %s (meeting_node=%s, enc=%s...)\n", |
| 1189 | pszNostrRelays[i], d.meeting_node.c_str(), d.enc.substr(0, 16).c_str()); | 1568 | pszNostrRelays[i], d.meeting_node.c_str(), d.enc.substr(0, 16).c_str()); |
| 1569 | lease.fOk = true; | ||
| 1190 | break; | 1570 | break; |
| 1191 | } | 1571 | } |
| 1572 | lease.fOk = true; | ||
| 1192 | } | 1573 | } |
| 1193 | CATCH_PRINT_EXCEPTION("btf self-test") | 1574 | CATCH_PRINT_EXCEPTION("btf self-test") |
| 1194 | } | 1575 | } |
| @@ -1223,8 +1604,9 @@ void ThreadNostrSeed(void* parg) | |||
| 1223 | ann.dashboardUrl = strPoolDashboardUrl; | 1604 | ann.dashboardUrl = strPoolDashboardUrl; |
| 1224 | ann.feePercent = dPoolFeePercent; | 1605 | ann.feePercent = dPoolFeePercent; |
| 1225 | uint64 roundShares = 0; | 1606 | uint64 roundShares = 0; |
| 1226 | GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares); | 1607 | double totalHashRate = 0.0; |
| 1227 | ann.hashRate = 0.0; | 1608 | GetPoolOperatorStats(ann.connectedMiners, ann.blocksFound, roundShares, totalHashRate); |
| 1609 | ann.hashRate = totalHashRate; | ||
| 1228 | ann.createdAt = GetTime(); | 1610 | ann.createdAt = GetTime(); |
| 1229 | if (!ann.btfAddress.empty() && !ann.poolName.empty()) | 1611 | if (!ann.btfAddress.empty() && !ann.poolName.empty()) |
| 1230 | BtfPublishPoolAnnouncement(ann); | 1612 | BtfPublishPoolAnnouncement(ann); |
diff --git a/src/nostr.h b/src/nostr.h index 63fc095..37b3b05 100644 --- a/src/nostr.h +++ b/src/nostr.h | |||
| @@ -12,11 +12,17 @@ | |||
| 12 | 12 | ||
| 13 | #include <string> | 13 | #include <string> |
| 14 | #include <vector> | 14 | #include <vector> |
| 15 | #include <map> | ||
| 15 | 16 | ||
| 16 | // Thread entry point (signature compatible with _beginthread) | 17 | // Thread entry point (signature compatible with _beginthread) |
| 17 | void ThreadNostrSeed(void* parg); | 18 | void ThreadNostrSeed(void* parg); |
| 18 | void ThreadBtfPoolAnnouncer(void* parg); | 19 | void ThreadBtfPoolAnnouncer(void* parg); |
| 19 | 20 | ||
| 21 | // Set to true to make ThreadBtfPoolAnnouncer publish immediately instead of | ||
| 22 | // waiting for its ~60s sleep loop (e.g. right after the operator changes pool | ||
| 23 | // name/fee/dashboard URL in Options). The announcer clears it after publishing. | ||
| 24 | extern volatile bool gAnnounceNow; | ||
| 25 | |||
| 20 | // Public relays used for discovery. Tunable. | 26 | // Public relays used for discovery. Tunable. |
| 21 | extern const char* pszNostrRelays[]; | 27 | extern const char* pszNostrRelays[]; |
| 22 | extern const int nNostrRelays; | 28 | extern const int nNostrRelays; |
| @@ -56,6 +62,9 @@ struct BtfPoolAnnouncement | |||
| 56 | } | 62 | } |
| 57 | }; | 63 | }; |
| 58 | 64 | ||
| 65 | // Number of .btf peers discovered from Nostr relays (includes not-yet-connected). | ||
| 66 | int GetDiscoveredPeerCount(); | ||
| 67 | |||
| 59 | // Current live pool announcements discovered from Nostr relays. | 68 | // Current live pool announcements discovered from Nostr relays. |
| 60 | void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out); | 69 | void BtfGetPoolAnnouncements(std::vector<BtfPoolAnnouncement>& out); |
| 61 | 70 | ||
| @@ -78,4 +87,21 @@ std::string BtfLocalAddress(); | |||
| 78 | bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort, | 87 | bool BtfResolve(const std::string& btfAddr, std::string& meetingHostPort, |
| 79 | unsigned char enc_pub[32]); | 88 | unsigned char enc_pub[32]); |
| 80 | 89 | ||
| 90 | // Result of resolving one .btf address via BtfResolveMany. | ||
| 91 | struct BtfResolvedPeer | ||
| 92 | { | ||
| 93 | std::string meetingHostPort; | ||
| 94 | unsigned char enc_pub[32]; | ||
| 95 | }; | ||
| 96 | |||
| 97 | // Resolve many .btf addresses at once. Batches all still-unresolved addresses | ||
| 98 | // into a single Nostr REQ per relay (multiple "authors"), instead of opening | ||
| 99 | // one relay connection per address like BtfResolve does. Use this whenever | ||
| 100 | // resolving more than a handful of addresses in the same pass -- e.g. before | ||
| 101 | // dialing several discovered peers in parallel -- to avoid hammering the | ||
| 102 | // same few public relays with a burst of simultaneous connections. Returns | ||
| 103 | // true if at least one address resolved; check `out` for which ones. | ||
| 104 | bool BtfResolveMany(const std::vector<std::string>& btfAddrs, | ||
| 105 | std::map<std::string, BtfResolvedPeer>& out); | ||
| 106 | |||
| 81 | #endif | 107 | #endif |
diff --git a/src/rc/addressbook16.bmp b/src/rc/addressbook16.bmp deleted file mode 100644 index c557691..0000000 --- a/src/rc/addressbook16.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/addressbook16mask.bmp b/src/rc/addressbook16mask.bmp deleted file mode 100644 index d3a478d..0000000 --- a/src/rc/addressbook16mask.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/addressbook20.bmp b/src/rc/addressbook20.bmp deleted file mode 100644 index 2b33b22..0000000 --- a/src/rc/addressbook20.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/addressbook20mask.bmp b/src/rc/addressbook20mask.bmp deleted file mode 100644 index 56ce612..0000000 --- a/src/rc/addressbook20mask.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/bitcoin_bc_original.ico b/src/rc/bitcoin_bc_original.ico deleted file mode 100644 index 88cc240..0000000 --- a/src/rc/bitcoin_bc_original.ico +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/check.ico b/src/rc/check.ico deleted file mode 100644 index 0c4e6e8..0000000 --- a/src/rc/check.ico +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/send16.bmp b/src/rc/send16.bmp deleted file mode 100644 index 676b5c4..0000000 --- a/src/rc/send16.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/send16mask.bmp b/src/rc/send16mask.bmp deleted file mode 100644 index 06c747f..0000000 --- a/src/rc/send16mask.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/send16masknoshadow.bmp b/src/rc/send16masknoshadow.bmp deleted file mode 100644 index faf24e0..0000000 --- a/src/rc/send16masknoshadow.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/send20.bmp b/src/rc/send20.bmp deleted file mode 100644 index 2b90422..0000000 --- a/src/rc/send20.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rc/send20mask.bmp b/src/rc/send20mask.bmp deleted file mode 100644 index f124d0d..0000000 --- a/src/rc/send20mask.bmp +++ /dev/null | |||
| Binary files differ | |||
diff --git a/src/rpc.cpp b/src/rpc.cpp index 99d182e..1b529e8 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp | |||
| @@ -1,14 +1,19 @@ | |||
| 1 | // Copyright (c) 2009 Satoshi Nakamoto / Copyright (c) 2026 Bitflash developers | 1 | // Copyright (c) 2009 Satoshi Nakamoto / Copyright (c) 2026 Bitflash developers |
| 2 | // Distributed under the MIT/X11 software license. | 2 | // Distributed under the MIT/X11 software license. |
| 3 | // | 3 | // |
| 4 | // Bitflash pool server — .btf-only pool listener. | 4 | // Bitflash pool server -- .btf Stratum pool, operator side. |
| 5 | // Miners connect through rendezvous tunnels; no raw IP:port endpoints remain. | ||
| 6 | // Pending payouts are held until maturity and shown in the GUI. | ||
| 7 | // | 5 | // |
| 8 | // Compiles on both Windows (mingw) and Linux unchanged. | 6 | // Architecture: |
| 9 | // Launched from ui.cpp (GUI) and headless.cpp (node) via ThreadRPCServer(). | 7 | // PoolEventLoop -- single thread, owns all miner fds, all job/share/payout |
| 8 | // state. No locks needed on any of that data. | ||
| 9 | // AcceptOneFn -- one thread per relay. Blocks on RvServiceRegister + | ||
| 10 | // BtfServiceWrap, pushes finished socket to gReadyQueue. | ||
| 11 | // AcceptLoopFn -- spawns AcceptOneFn threads, re-polls relay list every | ||
| 12 | // 60s so dynamically discovered relays get picked up. | ||
| 13 | // | ||
| 14 | // GUI-visible state is snapshotted under gStatsMutex every 2s. | ||
| 15 | // Accept queue handoff uses gReadyMutex (held for microseconds). | ||
| 10 | 16 | ||
| 11 | // nlohmann must be included before headers.h because util.h redefines snprintf | ||
| 12 | #pragma push_macro("snprintf") | 17 | #pragma push_macro("snprintf") |
| 13 | #undef snprintf | 18 | #undef snprintf |
| 14 | #include <nlohmann/json.hpp> | 19 | #include <nlohmann/json.hpp> |
| @@ -20,8 +25,6 @@ | |||
| 20 | #endif | 25 | #endif |
| 21 | #include "btftunnel.h" | 26 | #include "btftunnel.h" |
| 22 | 27 | ||
| 23 | // POSIX socket headers — already provided by compat.h on Windows, | ||
| 24 | // and by the OS directly on Linux. | ||
| 25 | #ifndef _WIN32 | 28 | #ifndef _WIN32 |
| 26 | #include <sys/socket.h> | 29 | #include <sys/socket.h> |
| 27 | #include <sys/select.h> | 30 | #include <sys/select.h> |
| @@ -33,14 +36,15 @@ | |||
| 33 | #include <atomic> | 36 | #include <atomic> |
| 34 | #include <mutex> | 37 | #include <mutex> |
| 35 | #include <map> | 38 | #include <map> |
| 39 | #include <set> | ||
| 36 | #include <deque> | 40 | #include <deque> |
| 41 | #include <vector> | ||
| 42 | #include <algorithm> | ||
| 37 | #include <sstream> | 43 | #include <sstream> |
| 38 | #include <iomanip> | 44 | #include <iomanip> |
| 39 | #include <ctime> | ||
| 40 | 45 | ||
| 41 | using json = nlohmann::json; | 46 | using json = nlohmann::json; |
| 42 | 47 | ||
| 43 | // Cross-platform socket close / send flags | ||
| 44 | #ifdef _WIN32 | 48 | #ifdef _WIN32 |
| 45 | #define sock_close(s) closesocket(s) | 49 | #define sock_close(s) closesocket(s) |
| 46 | #define SEND_FLAGS 0 | 50 | #define SEND_FLAGS 0 |
| @@ -49,660 +53,1260 @@ using json = nlohmann::json; | |||
| 49 | #define SEND_FLAGS MSG_NOSIGNAL | 53 | #define SEND_FLAGS MSG_NOSIGNAL |
| 50 | #endif | 54 | #endif |
| 51 | 55 | ||
| 52 | // Cross-platform thread launch: wraps _beginthread (compat.h maps it to | ||
| 53 | // pthread_create+detach on Linux, native _beginthread on Windows). | ||
| 54 | // fn must be void(*)(void*). | ||
| 55 | static void LaunchThread(void (*fn)(void*), void* arg) | ||
| 56 | { | ||
| 57 | _beginthread(fn, 0, arg); | ||
| 58 | } | ||
| 59 | |||
| 60 | // --------------------------------------------------------------------------- | ||
| 61 | // Config — set by headless.cpp / ui.cpp before threads launch | ||
| 62 | // --------------------------------------------------------------------------- | ||
| 63 | std::string gRpcUser; | ||
| 64 | std::string gRpcPassword; | ||
| 65 | |||
| 66 | // Pool server running flag — set false to stop server cleanly (all loops check it) | ||
| 67 | volatile bool gPoolRunning = false; | 56 | volatile bool gPoolRunning = false; |
| 68 | 57 | ||
| 69 | // --------------------------------------------------------------------------- | 58 | // --------------------------------------------------------------------------- |
| 70 | // Stubs for symbols absent from Bitflash 0.1.0 | ||
| 71 | // --------------------------------------------------------------------------- | ||
| 72 | double dHashesPerSec = 0.0; | ||
| 73 | int64 nHPSTimerStart = 0; | ||
| 74 | |||
| 75 | static bool IsInitialBlockDownload() | ||
| 76 | { | ||
| 77 | return (pindexBest == NULL || nBestHeight < 1); | ||
| 78 | } | ||
| 79 | |||
| 80 | // --------------------------------------------------------------------------- | ||
| 81 | // Hex helpers | 59 | // Hex helpers |
| 82 | // --------------------------------------------------------------------------- | 60 | // --------------------------------------------------------------------------- |
| 83 | static std::string ToHex(const void* p, size_t n) | 61 | static std::string ToHex(const void* p, size_t n) |
| 84 | { | 62 | { |
| 85 | const unsigned char* b = (const unsigned char*)p; | 63 | const unsigned char* b = (const unsigned char*)p; |
| 86 | std::string s; s.reserve(n*2); | 64 | std::string s; s.reserve(n * 2); |
| 87 | static const char* H = "0123456789abcdef"; | 65 | static const char* H = "0123456789abcdef"; |
| 88 | for (size_t i = 0; i < n; i++) { s += H[b[i]>>4]; s += H[b[i]&0xf]; } | 66 | for (size_t i = 0; i < n; i++) { s += H[b[i] >> 4]; s += H[b[i] & 0xf]; } |
| 89 | return s; | 67 | return s; |
| 90 | } | 68 | } |
| 69 | |||
| 91 | static std::vector<unsigned char> FromHex(const std::string& s) | 70 | static std::vector<unsigned char> FromHex(const std::string& s) |
| 92 | { | 71 | { |
| 93 | std::vector<unsigned char> v; | 72 | std::vector<unsigned char> v; |
| 94 | for (size_t i = 0; i+1 < s.size(); i += 2) { | 73 | for (size_t i = 0; i + 1 < s.size(); i += 2) { |
| 95 | auto h=[](char c)->int{ | 74 | auto h = [](char c) -> int { |
| 96 | if(c>='0'&&c<='9') return c-'0'; | 75 | if (c >= '0' && c <= '9') return c - '0'; |
| 97 | if(c>='a'&&c<='f') return c-'a'+10; | 76 | if (c >= 'a' && c <= 'f') return c - 'a' + 10; |
| 98 | if(c>='A'&&c<='F') return c-'A'+10; | 77 | if (c >= 'A' && c <= 'F') return c - 'A' + 10; |
| 99 | return 0; | 78 | return 0; |
| 100 | }; | 79 | }; |
| 101 | v.push_back((unsigned char)((h(s[i])<<4)|h(s[i+1]))); | 80 | v.push_back((unsigned char)((h(s[i]) << 4) | h(s[i + 1]))); |
| 102 | } | 81 | } |
| 103 | return v; | 82 | return v; |
| 104 | } | 83 | } |
| 105 | 84 | ||
| 106 | // --------------------------------------------------------------------------- | 85 | // --------------------------------------------------------------------------- |
| 107 | // PPLNS share tracking | 86 | // Job -- written and read exclusively by the event loop thread |
| 108 | // --------------------------------------------------------------------------- | ||
| 109 | struct Share { | ||
| 110 | std::string minerAddress; | ||
| 111 | int64 timestamp; | ||
| 112 | uint64 difficulty; | ||
| 113 | }; | ||
| 114 | |||
| 115 | struct MinerStats { | ||
| 116 | std::string address; | ||
| 117 | std::string worker; | ||
| 118 | uint64 totalShares = 0; | ||
| 119 | uint64 roundShares = 0; | ||
| 120 | int64 lastSeen = 0; | ||
| 121 | }; | ||
| 122 | static std::mutex gMinerStatsMutex; | ||
| 123 | static std::map<std::string, MinerStats> gMinerStats; | ||
| 124 | |||
| 125 | struct FoundBlock { | ||
| 126 | int height; | ||
| 127 | int64 timestamp; | ||
| 128 | std::string minerAddress; | ||
| 129 | uint256 hash; | ||
| 130 | }; | ||
| 131 | static std::mutex gBlocksMutex; | ||
| 132 | static std::deque<FoundBlock> gFoundBlocks; | ||
| 133 | |||
| 134 | struct Miner; | ||
| 135 | static std::mutex gMinersMutex; | ||
| 136 | static std::vector<Miner*> gMiners; | ||
| 137 | |||
| 138 | static std::string MinerKey(const std::string& address, const std::string& worker) | ||
| 139 | { | ||
| 140 | return address + "\n" + worker; | ||
| 141 | } | ||
| 142 | |||
| 143 | void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out) | ||
| 144 | { | ||
| 145 | out.clear(); | ||
| 146 | int64 now = GetTime(); | ||
| 147 | std::lock_guard<std::mutex> lk(gMinerStatsMutex); | ||
| 148 | for (std::map<std::string, MinerStats>::const_iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) | ||
| 149 | { | ||
| 150 | const MinerStats& ms = it->second; | ||
| 151 | if (ms.lastSeen <= 0) | ||
| 152 | continue; | ||
| 153 | if (now - ms.lastSeen > 15 * 60) | ||
| 154 | continue; | ||
| 155 | PoolWorkerStatView view; | ||
| 156 | view.address = ms.address; | ||
| 157 | view.worker = ms.worker; | ||
| 158 | view.totalShares = ms.totalShares; | ||
| 159 | view.roundShares = ms.roundShares; | ||
| 160 | view.lastSeen = ms.lastSeen; | ||
| 161 | out.push_back(view); | ||
| 162 | } | ||
| 163 | std::sort(out.begin(), out.end(), [](const PoolWorkerStatView& a, const PoolWorkerStatView& b) { | ||
| 164 | if (a.roundShares != b.roundShares) return a.roundShares > b.roundShares; | ||
| 165 | if (a.totalShares != b.totalShares) return a.totalShares > b.totalShares; | ||
| 166 | return a.lastSeen > b.lastSeen; | ||
| 167 | }); | ||
| 168 | } | ||
| 169 | |||
| 170 | // --------------------------------------------------------------------------- | ||
| 171 | // Current mining job | ||
| 172 | // --------------------------------------------------------------------------- | 87 | // --------------------------------------------------------------------------- |
| 173 | struct StratumJob { | 88 | struct StratumJob { |
| 174 | std::string jobId; | 89 | std::string jobId; |
| 175 | CBlock block; | 90 | CBlock block; |
| 176 | uint256 target; | 91 | uint256 target; // full block target; share targets are per-miner via vardiff |
| 177 | uint256 shareTarget; | ||
| 178 | int height; | 92 | int height; |
| 179 | }; | 93 | }; |
| 94 | static StratumJob gCurrentJob; | ||
| 95 | static bool gHaveJob = false; | ||
| 96 | |||
| 97 | // Compute a share target from a Stratum difficulty value. | ||
| 98 | // Stratum difficulty 1 must correspond to THIS chain's easiest allowed target | ||
| 99 | // (bnProofOfWorkLimit = ~uint256(0) >> 12, compact 0x1f0fffff), not Bitcoin's | ||
| 100 | // SHA256 diff-1 target (0x1d00ffff). Those differ by about 2^20 (~1e6x): | ||
| 101 | // Bitcoin's diff-1 needs ~2^32 hashes/share on average, while this chain's PoW | ||
| 102 | // floor needs only ~2^12. Using the Bitcoin constant made every miner's | ||
| 103 | // "difficulty 1" about a million times harder than the chain's own floor, so a | ||
| 104 | // worker could hash for minutes without ever finding a share -- and vardiff | ||
| 105 | // never gets the samples it needs to correct course, because no share ever | ||
| 106 | // comes in for it to measure. Base off the actual chain limit instead so | ||
| 107 | // difficulty 1 is genuinely easy and vardiff has real data to retarget from. | ||
| 108 | // Higher difficulty = smaller (harder) target. | ||
| 109 | static uint256 ShareTargetFromDifficulty(double difficulty) | ||
| 110 | { | ||
| 111 | if (difficulty <= 0.0) difficulty = 1.0; | ||
| 112 | static const uint256 diff1 = CBigNum(bnProofOfWorkLimit).getuint256(); | ||
| 113 | // shareTarget = diff1 / difficulty | ||
| 114 | CBigNum bn; bn.setuint256(diff1); | ||
| 115 | // Multiply by 2^16 to keep precision, divide, shift back | ||
| 116 | bn <<= 16; | ||
| 117 | bn /= (uint64)(difficulty * 65536.0); | ||
| 118 | uint256 t = bn.getuint256(); | ||
| 119 | // Cap at all-ones (maximum, easiest possible) | ||
| 120 | if (t < diff1 && difficulty < 1.0) t = ~uint256(0); | ||
| 121 | return t; | ||
| 122 | } | ||
| 180 | 123 | ||
| 181 | static std::mutex gJobMutex; | 124 | // Expected number of hashes to find one share at a given Stratum difficulty, |
| 182 | static StratumJob gCurrentJob; | 125 | // on this chain's scale (difficulty 1 == bnProofOfWorkLimit, which needs on |
| 183 | static bool gHaveJob = false; | 126 | // average 2^12 = 4096 hashes). Used to turn "shares per second" into H/s. |
| 184 | static std::atomic<uint32_t> gJobSeq{0}; | 127 | static const double SHARE_HASHES_AT_DIFF_1 = 4096.0; |
| 185 | 128 | static double ExpectedHashesForDifficulty(double difficulty) | |
| 186 | static uint256 MakeShareTarget(const uint256& blockTarget) | ||
| 187 | { | 129 | { |
| 188 | uint256 shareTarget = blockTarget; | 130 | if (difficulty <= 0.0) difficulty = 1.0; |
| 189 | shareTarget <<= 8; | 131 | return difficulty * SHARE_HASHES_AT_DIFF_1; |
| 190 | if (shareTarget < blockTarget) | ||
| 191 | shareTarget = ~uint256(0); | ||
| 192 | return shareTarget; | ||
| 193 | } | 132 | } |
| 194 | 133 | ||
| 134 | // Rebuild the current job from the best chain tip. | ||
| 135 | // Must be called from the event loop thread (or startup, before the loop). | ||
| 136 | // Returns true on success. Logs the specific failure reason on false. | ||
| 195 | static bool RebuildJob() | 137 | static bool RebuildJob() |
| 196 | { | 138 | { |
| 197 | if (!pindexBest) return false; | 139 | CRITICAL_BLOCK(cs_main) |
| 140 | { | ||
| 141 | if (!pindexBest) { | ||
| 142 | LogPrint("pool", "RebuildJob: no chain tip (pindexBest is null)\n"); | ||
| 143 | return false; | ||
| 144 | } | ||
| 198 | 145 | ||
| 199 | CBlockIndex* pindexPrev = pindexBest; | 146 | CBlockIndex* pindexPrev = pindexBest; |
| 200 | unsigned int nBits = GetNextWorkRequired(pindexPrev); | 147 | unsigned int nBits = GetNextWorkRequired(pindexPrev); |
| 201 | 148 | ||
| 202 | CKey key; | 149 | CKey key; key.MakeNewKey(); |
| 203 | key.MakeNewKey(); | 150 | static std::atomic<uint32_t> sExtra{0}; |
| 204 | static std::atomic<uint32_t> sExtra{0}; | 151 | uint32_t extraNonce = ++sExtra; |
| 205 | uint32_t extraNonce = ++sExtra; | ||
| 206 | 152 | ||
| 207 | CTransaction txNew; | 153 | CTransaction txNew; |
| 208 | txNew.vin.resize(1); | 154 | txNew.vin.resize(1); |
| 209 | txNew.vin[0].prevout.SetNull(); | 155 | txNew.vin[0].prevout.SetNull(); |
| 210 | txNew.vin[0].scriptSig << nBits << (CBigNum)extraNonce; | 156 | txNew.vin[0].scriptSig << nBits << (CBigNum)extraNonce; |
| 211 | txNew.vout.resize(1); | 157 | txNew.vout.resize(1); |
| 212 | // Always pay coinbase to a fresh wallet key. DoPayouts() distributes | 158 | txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG; |
| 213 | // shares to miners via SendMoney() after the block is accepted. | ||
| 214 | txNew.vout[0].scriptPubKey << key.GetPubKey() << OP_CHECKSIG; | ||
| 215 | 159 | ||
| 216 | CBlock block; | 160 | CBlock block; |
| 217 | block.vtx.push_back(txNew); | 161 | block.vtx.push_back(txNew); |
| 218 | 162 | ||
| 219 | { | ||
| 220 | CTxDB txdb("r"); | ||
| 221 | CRITICAL_BLOCK(cs_mapTransactions) | ||
| 222 | { | 163 | { |
| 223 | map<uint256,CTxIndex> pool; | 164 | CTxDB txdb("r"); |
| 224 | unsigned int sz = 0; | 165 | CRITICAL_BLOCK(cs_mapTransactions) |
| 225 | for (auto& kv : mapTransactions) { | 166 | { |
| 226 | CTransaction& tx = kv.second; | 167 | map<uint256, CTxIndex> pool; |
| 227 | if (tx.IsCoinBase() || !tx.IsFinal()) continue; | 168 | unsigned int sz = 0; |
| 228 | int64 nFees = 0; | 169 | for (auto& kv : mapTransactions) { |
| 229 | int64 nMinFee = tx.GetMinFee(block.vtx.size() < 100); | 170 | CTransaction& tx = kv.second; |
| 230 | map<uint256,CTxIndex> tmp(pool); | 171 | if (tx.IsCoinBase() || !tx.IsFinal()) continue; |
| 231 | if (!tx.ConnectInputs(txdb, tmp, CDiskTxPos(1,1,1), 0, nFees, false, true, nMinFee)) continue; | 172 | int64 nFees = 0; |
| 232 | pool = tmp; | 173 | map<uint256, CTxIndex> tmp(pool); |
| 233 | block.vtx.push_back(tx); | 174 | if (!tx.ConnectInputs(txdb, tmp, CDiskTxPos(1,1,1), 0, nFees, |
| 234 | sz += ::GetSerializeSize(tx, SER_NETWORK); | 175 | false, true, tx.GetMinFee(block.vtx.size() < 100))) |
| 235 | if (sz > MAX_SIZE/2) break; | 176 | continue; |
| 177 | pool = tmp; | ||
| 178 | block.vtx.push_back(tx); | ||
| 179 | sz += ::GetSerializeSize(tx, SER_NETWORK); | ||
| 180 | if (sz > MAX_SIZE / 2) break; | ||
| 181 | } | ||
| 236 | } | 182 | } |
| 237 | } | 183 | } |
| 184 | |||
| 185 | block.vtx[0].vout[0].nValue = block.GetBlockValue(0); | ||
| 186 | block.hashPrevBlock = pindexPrev->GetBlockHash(); | ||
| 187 | block.hashMerkleRoot = block.BuildMerkleTree(); | ||
| 188 | block.nTime = max((unsigned int)(pindexPrev->GetMedianTimePast() + 1), | ||
| 189 | (unsigned int)GetAdjustedTime()); | ||
| 190 | block.nBits = nBits; | ||
| 191 | block.nNonce = 1; | ||
| 192 | AddKey(key); | ||
| 193 | |||
| 194 | StratumJob job; | ||
| 195 | job.jobId = ToHex(&extraNonce, 4); | ||
| 196 | job.block = block; | ||
| 197 | job.target = CBigNum().SetCompact(nBits).getuint256(); | ||
| 198 | job.height = nBestHeight + 1; | ||
| 199 | |||
| 200 | gCurrentJob = job; | ||
| 201 | gHaveJob = true; | ||
| 202 | return true; | ||
| 238 | } | 203 | } |
| 239 | block.vtx[0].vout[0].nValue = block.GetBlockValue(0); | 204 | return false; |
| 240 | block.hashPrevBlock = pindexPrev->GetBlockHash(); | ||
| 241 | block.hashMerkleRoot = block.BuildMerkleTree(); | ||
| 242 | block.nTime = max((unsigned int)(pindexPrev->GetMedianTimePast()+1), | ||
| 243 | (unsigned int)GetAdjustedTime()); | ||
| 244 | block.nBits = nBits; | ||
| 245 | block.nNonce = 1; | ||
| 246 | |||
| 247 | AddKey(key); | ||
| 248 | |||
| 249 | StratumJob job; | ||
| 250 | job.jobId = ToHex(&extraNonce, 4); | ||
| 251 | job.block = block; | ||
| 252 | job.target = CBigNum().SetCompact(nBits).getuint256(); | ||
| 253 | job.shareTarget = MakeShareTarget(job.target); | ||
| 254 | job.height = nBestHeight + 1; | ||
| 255 | |||
| 256 | std::lock_guard<std::mutex> lk(gJobMutex); | ||
| 257 | gCurrentJob = job; | ||
| 258 | gHaveJob = true; | ||
| 259 | ++gJobSeq; | ||
| 260 | return true; | ||
| 261 | } | 205 | } |
| 262 | 206 | ||
| 263 | // --------------------------------------------------------------------------- | 207 | // --------------------------------------------------------------------------- |
| 264 | // PPLNS payout | 208 | // Payouts -- event loop thread only |
| 265 | // --------------------------------------------------------------------------- | ||
| 266 | // --------------------------------------------------------------------------- | ||
| 267 | // Deferred payouts — coinbase outputs require COINBASE_MATURITY (100) blocks | ||
| 268 | // before they can be spent. We store the share snapshot when a block is found | ||
| 269 | // and execute the actual SendMoney() calls once the coinbase matures. | ||
| 270 | // --------------------------------------------------------------------------- | 209 | // --------------------------------------------------------------------------- |
| 271 | struct PendingPayout { | 210 | struct PendingPayout { |
| 272 | int matureAtHeight; // pay out when nBestHeight >= this | 211 | int matureAtHeight; |
| 273 | std::map<std::string, int64> amounts; // addr -> BTF amount | 212 | std::map<std::string, int64> amounts; // address -> satoshis |
| 274 | }; | 213 | }; |
| 214 | static std::vector<PendingPayout> gPendingPayouts; | ||
| 275 | 215 | ||
| 276 | static std::mutex gPayoutMutex; | 216 | static std::string PayoutFilePath() |
| 277 | static std::vector<PendingPayout> gPendingPayouts; | 217 | { |
| 218 | return GetAppDir() + "/pending_payouts.json"; | ||
| 219 | } | ||
| 278 | 220 | ||
| 279 | void GetPendingPayouts(std::vector<PendingPayoutView>& out) | 221 | static void SavePendingPayouts() |
| 280 | { | 222 | { |
| 281 | out.clear(); | 223 | nlohmann::json arr = nlohmann::json::array(); |
| 282 | std::lock_guard<std::mutex> lk(gPayoutMutex); | 224 | for (const auto& pp : gPendingPayouts) { |
| 283 | for (const PendingPayout& p : gPendingPayouts) | 225 | nlohmann::json obj; |
| 284 | { | 226 | obj["matureAtHeight"] = pp.matureAtHeight; |
| 285 | PendingPayoutView view; | 227 | nlohmann::json amounts = nlohmann::json::object(); |
| 286 | view.matureAtHeight = p.matureAtHeight; | 228 | for (const auto& kv : pp.amounts) |
| 287 | view.recipients = (int)p.amounts.size(); | 229 | amounts[kv.first] = kv.second; |
| 288 | view.totalAmount = 0; | 230 | obj["amounts"] = amounts; |
| 289 | for (const std::map<std::string, int64>::value_type& kv : p.amounts) | 231 | arr.push_back(obj); |
| 290 | view.totalAmount += kv.second; | 232 | } |
| 291 | out.push_back(view); | 233 | std::string path = PayoutFilePath(); |
| 234 | FILE* f = fopen(path.c_str(), "w"); | ||
| 235 | if (f) { | ||
| 236 | std::string s = arr.dump(2); | ||
| 237 | fwrite(s.c_str(), 1, s.size(), f); | ||
| 238 | fclose(f); | ||
| 239 | } else { | ||
| 240 | LogPrint("payout", "[payout] WARNING: could not write %s\n", path.c_str()); | ||
| 292 | } | 241 | } |
| 293 | } | 242 | } |
| 294 | 243 | ||
| 295 | // Called when a block is found: snapshot shares, schedule payout for maturity. | 244 | static void LoadPendingPayouts() |
| 296 | static void QueuePayouts(int blockHeight) | ||
| 297 | { | 245 | { |
| 298 | if (nMineMode != MINE_OPERATOR) return; | 246 | std::string path = PayoutFilePath(); |
| 299 | 247 | FILE* f = fopen(path.c_str(), "r"); | |
| 300 | std::map<std::string, uint64> shareCount; | 248 | if (!f) return; // no file yet -- first run, nothing to load |
| 301 | uint64 total = 0; | 249 | fseek(f, 0, SEEK_END); |
| 302 | { | 250 | long sz = ftell(f); |
| 303 | std::lock_guard<std::mutex> lk(gMinerStatsMutex); | 251 | fseek(f, 0, SEEK_SET); |
| 304 | for (std::map<std::string, MinerStats>::iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) | 252 | std::string s(sz, '\0'); |
| 305 | { | 253 | fread(&s[0], 1, sz, f); |
| 306 | MinerStats& ms = it->second; | 254 | fclose(f); |
| 307 | if (ms.roundShares == 0) | 255 | try { |
| 308 | continue; | 256 | nlohmann::json arr = nlohmann::json::parse(s); |
| 309 | if (ms.address.empty()) | 257 | for (const auto& obj : arr) { |
| 310 | continue; | 258 | PendingPayout pp; |
| 311 | shareCount[ms.address] += ms.roundShares; | 259 | pp.matureAtHeight = obj["matureAtHeight"].get<int>(); |
| 312 | total += ms.roundShares; | 260 | for (auto it = obj["amounts"].begin(); it != obj["amounts"].end(); ++it) |
| 313 | ms.roundShares = 0; | 261 | pp.amounts[it.key()] = it.value().get<int64>(); |
| 262 | gPendingPayouts.push_back(pp); | ||
| 314 | } | 263 | } |
| 264 | LogPrint("payout", "[payout] loaded %zu pending payout(s) from disk\n", | ||
| 265 | gPendingPayouts.size()); | ||
| 266 | } catch (const std::exception& e) { | ||
| 267 | LogPrint("payout", "[payout] WARNING: failed to parse %s: %s\n", | ||
| 268 | path.c_str(), e.what()); | ||
| 269 | } | ||
| 270 | } | ||
| 271 | |||
| 272 | // Payouts ready to execute are moved here under gPayoutExecMutex. | ||
| 273 | // A dedicated thread drains this list so SendMoney (which takes cs_main) | ||
| 274 | // never runs on the event loop thread and can't stall miner I/O. | ||
| 275 | static std::vector<PendingPayout> gPayoutExecQueue; | ||
| 276 | static std::mutex gPayoutExecMutex; | ||
| 277 | static std::atomic<bool> gPayoutThreadRunning{false}; | ||
| 278 | |||
| 279 | static void QueuePayouts(int blockHeight, | ||
| 280 | const std::map<std::string, uint64>& shareCount, | ||
| 281 | uint64 total) | ||
| 282 | { | ||
| 283 | if (total == 0) { | ||
| 284 | LogPrint("payout", "[payout] block %d: zero shares recorded -- nothing to pay out\n", | ||
| 285 | blockHeight); | ||
| 286 | return; | ||
| 315 | } | 287 | } |
| 316 | if (total == 0) return; | ||
| 317 | 288 | ||
| 318 | int64 blockReward = CBlock().GetBlockValue(0); | 289 | double feeFrac = dPoolFeePercent / 100.0; |
| 290 | if (feeFrac < 0.0) feeFrac = 0.0; | ||
| 291 | if (feeFrac > 1.0) feeFrac = 1.0; | ||
| 292 | |||
| 293 | // Compute the block subsidy at the height that was just found. | ||
| 294 | // We do not include tx fees in miner payout -- those stay in the operator | ||
| 295 | // wallet as part of the coinbase, which is the operator's cut on top of feeFrac. | ||
| 296 | int64 nSubsidy = 50 * COIN; | ||
| 297 | nSubsidy >>= (blockHeight / 210000); // halving schedule | ||
| 298 | int64 minerReward = (int64)((double)nSubsidy * (1.0 - feeFrac)); | ||
| 299 | |||
| 319 | PendingPayout pp; | 300 | PendingPayout pp; |
| 320 | pp.matureAtHeight = blockHeight + COINBASE_MATURITY; | 301 | pp.matureAtHeight = blockHeight + COINBASE_MATURITY; |
| 302 | |||
| 303 | int skipped = 0; | ||
| 304 | int64 burned = 0; // amount owed to miners with bad/empty addresses | ||
| 321 | for (auto& kv : shareCount) { | 305 | for (auto& kv : shareCount) { |
| 322 | int64 amount = (int64)(((double)kv.second / (double)total) * (double)blockReward); | 306 | int64 amount = (int64)(((double)kv.second / (double)total) * (double)minerReward); |
| 323 | if (amount >= CENT) | 307 | if (amount < CENT) { |
| 324 | pp.amounts[kv.first] = amount; | 308 | skipped++; |
| 309 | continue; | ||
| 310 | } | ||
| 311 | uint160 addrCheck; | ||
| 312 | if (kv.first.empty() || !AddressToHash160(kv.first, addrCheck)) { | ||
| 313 | // Address was invalid at authorize time (warned then). Their share | ||
| 314 | // of the reward cannot be paid -- log the amount so it's visible. | ||
| 315 | burned += amount; | ||
| 316 | LogPrint("payout", "[payout] WARNING: %s owed to miner with invalid" | ||
| 317 | " address '%s' -- cannot pay out, amount forfeited\n", | ||
| 318 | FormatMoney(amount).c_str(), kv.first.c_str()); | ||
| 319 | continue; | ||
| 320 | } | ||
| 321 | pp.amounts[kv.first] = amount; | ||
| 325 | } | 322 | } |
| 326 | 323 | ||
| 327 | { std::lock_guard<std::mutex> lk(gPayoutMutex); gPendingPayouts.push_back(pp); } | 324 | gPendingPayouts.push_back(pp); |
| 328 | 325 | SavePendingPayouts(); | |
| 329 | printf("Pool: block %d payout queued for height %d (%zu miners)\n", | 326 | |
| 330 | blockHeight, pp.matureAtHeight, pp.amounts.size()); | 327 | int64 operatorCut = nSubsidy - minerReward; |
| 328 | LogPrint("payout", | ||
| 329 | "[payout] block %d: subsidy %s BTF, miners get %s" | ||
| 330 | " (fee %.2f%% = %s to operator)," | ||
| 331 | " %zu recipients, matures height %d," | ||
| 332 | " %d below dust%s\n", | ||
| 333 | blockHeight, | ||
| 334 | FormatMoney(nSubsidy).c_str(), | ||
| 335 | FormatMoney(minerReward).c_str(), | ||
| 336 | dPoolFeePercent, | ||
| 337 | FormatMoney(operatorCut).c_str(), | ||
| 338 | pp.amounts.size(), pp.matureAtHeight, skipped, | ||
| 339 | burned > 0 ? (", " + FormatMoney(burned) + " forfeited (bad address)").c_str() | ||
| 340 | : ""); | ||
| 331 | } | 341 | } |
| 332 | 342 | ||
| 333 | // Called from JobWatcher every new block: execute any matured payouts. | 343 | // Called from event loop: move matured entries to the exec queue (fast). |
| 344 | // Save BEFORE moving to exec queue: if we crash between the save and SendMoney, | ||
| 345 | // LoadPendingPayouts re-queues them from the exec-queue section of the file. | ||
| 334 | static void FlushMaturePayouts() | 346 | static void FlushMaturePayouts() |
| 335 | { | 347 | { |
| 336 | if (nMineMode != MINE_OPERATOR) return; | 348 | std::vector<PendingPayout> ready; |
| 337 | |||
| 338 | std::lock_guard<std::mutex> lk(gPayoutMutex); | ||
| 339 | for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) { | 349 | for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) { |
| 340 | if (nBestHeight < it->matureAtHeight) { ++it; continue; } | 350 | if (nBestHeight < it->matureAtHeight) { ++it; continue; } |
| 341 | 351 | LogPrint("payout", "[payout] block height %d matured -- queuing %zu payments\n", | |
| 342 | printf("Pool: executing payout for block matured at height %d\n", it->matureAtHeight); | 352 | it->matureAtHeight, it->amounts.size()); |
| 343 | for (auto& kv : it->amounts) { | 353 | ready.push_back(*it); // copy first; erase after save |
| 344 | uint160 hash160; | 354 | ++it; |
| 345 | if (!AddressToHash160(kv.first, hash160)) continue; | 355 | } |
| 346 | CScript scriptPubKey; | 356 | if (!ready.empty()) { |
| 347 | scriptPubKey << OP_DUP << OP_HASH160 << hash160 << OP_EQUALVERIFY << OP_CHECKSIG; | 357 | // Erase from pending then save before handing off to exec thread, |
| 348 | CWalletTx wtx; | 358 | // so the file never contains an entry that is already being sent. |
| 349 | wtx.mapValue["comment"] = strprintf("Pool payout height %d", it->matureAtHeight); | 359 | for (auto it = gPendingPayouts.begin(); it != gPendingPayouts.end(); ) { |
| 350 | if (SendMoney(scriptPubKey, kv.second, wtx)) | 360 | if (nBestHeight >= it->matureAtHeight) |
| 351 | printf("Pool: paid %s to %s\n", FormatMoney(kv.second).c_str(), kv.first.c_str()); | 361 | it = gPendingPayouts.erase(it); |
| 352 | else | 362 | else |
| 353 | printf("Pool: payout FAILED for %s (will not retry)\n", kv.first.c_str()); | 363 | ++it; |
| 364 | } | ||
| 365 | SavePendingPayouts(); | ||
| 366 | std::lock_guard<std::mutex> lk(gPayoutExecMutex); | ||
| 367 | for (auto& pp : ready) | ||
| 368 | gPayoutExecQueue.push_back(std::move(pp)); | ||
| 369 | } | ||
| 370 | } | ||
| 371 | |||
| 372 | // Payout execution thread: drains gPayoutExecQueue, calls SendMoney. | ||
| 373 | // Runs independently of the event loop so slow wallet operations | ||
| 374 | // (SendMoney takes cs_main) never stall miner I/O. | ||
| 375 | static void PayoutThreadFn(void*) | ||
| 376 | { | ||
| 377 | gPayoutThreadRunning = true; | ||
| 378 | LogPrint("payout", "[payout] payout thread started\n"); | ||
| 379 | |||
| 380 | while (!fShutdown && gPoolRunning) { | ||
| 381 | std::vector<PendingPayout> batch; | ||
| 382 | { | ||
| 383 | std::lock_guard<std::mutex> lk(gPayoutExecMutex); | ||
| 384 | batch.swap(gPayoutExecQueue); | ||
| 385 | } | ||
| 386 | |||
| 387 | for (auto& pp : batch) { | ||
| 388 | LogPrint("payout", "[payout] executing payments for block matured at %d" | ||
| 389 | " (%zu miners)\n", pp.matureAtHeight, pp.amounts.size()); | ||
| 390 | for (auto& kv : pp.amounts) { | ||
| 391 | uint160 h160; | ||
| 392 | if (!AddressToHash160(kv.first, h160)) { | ||
| 393 | // Should not happen -- bad addresses are filtered in QueuePayouts | ||
| 394 | LogPrint("payout", "[payout] SKIPPED bad address '%s'\n", | ||
| 395 | kv.first.c_str()); | ||
| 396 | continue; | ||
| 397 | } | ||
| 398 | CScript sc; | ||
| 399 | sc << OP_DUP << OP_HASH160 << h160 << OP_EQUALVERIFY << OP_CHECKSIG; | ||
| 400 | CWalletTx wtx; | ||
| 401 | wtx.mapValue["comment"] = strprintf("Pool payout height %d", | ||
| 402 | pp.matureAtHeight); | ||
| 403 | if (SendMoney(sc, kv.second, wtx)) | ||
| 404 | LogPrint("payout", "[payout] paid %s to %s\n", | ||
| 405 | FormatMoney(kv.second).c_str(), kv.first.c_str()); | ||
| 406 | else | ||
| 407 | LogPrint("payout", "[payout] FAILED to pay %s to %s" | ||
| 408 | " (insufficient funds or wallet locked?)\n", | ||
| 409 | FormatMoney(kv.second).c_str(), kv.first.c_str()); | ||
| 410 | } | ||
| 354 | } | 411 | } |
| 355 | it = gPendingPayouts.erase(it); | 412 | |
| 413 | Sleep(500); // check for new work every 500ms | ||
| 356 | } | 414 | } |
| 415 | |||
| 416 | gPayoutThreadRunning = false; | ||
| 417 | LogPrint("payout", "[payout] payout thread stopped\n"); | ||
| 357 | } | 418 | } |
| 358 | 419 | ||
| 359 | // --------------------------------------------------------------------------- | 420 | // --------------------------------------------------------------------------- |
| 360 | // Stratum protocol | 421 | // GUI stats snapshot -- event loop writes, GUI threads read |
| 361 | // --------------------------------------------------------------------------- | 422 | // --------------------------------------------------------------------------- |
| 362 | static json MakeNotifyParams(const StratumJob& job, bool clean) | 423 | struct StatsSnapshot { |
| 424 | int authorizedMiners = 0; | ||
| 425 | int blocksFound = 0; | ||
| 426 | uint64 roundShares = 0; | ||
| 427 | double totalHashRate = 0.0; | ||
| 428 | }; | ||
| 429 | static StatsSnapshot gStats; | ||
| 430 | static std::vector<PoolWorkerStatView> gWorkerStats; | ||
| 431 | static std::vector<PendingPayoutView> gPayoutViews; | ||
| 432 | static std::mutex gStatsMutex; | ||
| 433 | |||
| 434 | void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares, double& totalHashRate) | ||
| 363 | { | 435 | { |
| 364 | CBlock& b = const_cast<CBlock&>(job.block); | 436 | std::lock_guard<std::mutex> lk(gStatsMutex); |
| 365 | unsigned char hdr[80]; | 437 | authorizedMiners = gStats.authorizedMiners; |
| 366 | memcpy(hdr, &b.nVersion, 4); | 438 | blocksFound = gStats.blocksFound; |
| 367 | memcpy(hdr+4, &b.hashPrevBlock, 32); | 439 | roundShares = gStats.roundShares; |
| 368 | memcpy(hdr+36, &b.hashMerkleRoot, 32); | 440 | totalHashRate = gStats.totalHashRate; |
| 369 | memcpy(hdr+68, &b.nTime, 4); | 441 | } |
| 370 | memcpy(hdr+72, &b.nBits, 4); | 442 | |
| 371 | memcpy(hdr+76, &b.nNonce, 4); | 443 | void GetPoolWorkerStats(std::vector<PoolWorkerStatView>& out) |
| 372 | unsigned char shareTgt[32]; memcpy(shareTgt, &job.shareTarget, 32); | 444 | { |
| 373 | return json::array({job.jobId, ToHex(hdr,80), b.hashPrevBlock.GetHex(), ToHex(shareTgt,32), clean}); | 445 | std::lock_guard<std::mutex> lk(gStatsMutex); |
| 446 | out = gWorkerStats; | ||
| 447 | } | ||
| 448 | |||
| 449 | void GetPendingPayouts(std::vector<PendingPayoutView>& out) | ||
| 450 | { | ||
| 451 | std::lock_guard<std::mutex> lk(gStatsMutex); | ||
| 452 | out = gPayoutViews; | ||
| 374 | } | 453 | } |
| 375 | 454 | ||
| 455 | // --------------------------------------------------------------------------- | ||
| 456 | // Miner state -- event loop thread only | ||
| 457 | // --------------------------------------------------------------------------- | ||
| 458 | static std::atomic<uint32_t> gNextExtranonce2{1}; | ||
| 459 | |||
| 460 | // Vardiff target: aim for one share every VARDIFF_TARGET_SECS seconds per miner. | ||
| 461 | // After VARDIFF_SHARES_PER_CHECK shares, recalculate and adjust if rate is off | ||
| 462 | // by more than 50%. Shares are the stable unit; difficulty floats to match. | ||
| 463 | static const int64 VARDIFF_TARGET_SECS = 15; // one share every 15s | ||
| 464 | static const uint64 VARDIFF_SHARES_PER_CHECK = 5; // re-evaluate every 5 shares | ||
| 465 | static const double VARDIFF_RETARGET_RATIO = 1.5; // adjust if >50% off target | ||
| 466 | static const double VARDIFF_MIN = 0.001; | ||
| 467 | static const double VARDIFF_MAX = 1e12; | ||
| 468 | // If a miner has gone this long since its vardiff window opened with ZERO | ||
| 469 | // shares, the normal vardiff retarget (which only fires after | ||
| 470 | // VARDIFF_SHARES_PER_CHECK shares) can never trigger -- it has no samples to | ||
| 471 | // act on. This is the residual gap the ShareTargetFromDifficulty fix above | ||
| 472 | // doesn't cover: even with a correctly-easy diff-1 target, a miner stuck in | ||
| 473 | // RandomX light mode (or otherwise much slower than expected) can go | ||
| 474 | // indefinitely without a single share, and difficulty would never drop to | ||
| 475 | // meet it. Force a difficulty cut on a timeout instead of waiting for shares | ||
| 476 | // that will never come. | ||
| 477 | static const int64 VARDIFF_STALL_SECS = 45; // 3x share target -- reacts faster without false-triggering on normal variance | ||
| 478 | static const double VARDIFF_STALL_CUT = 4.0; // divide difficulty by this much | ||
| 479 | |||
| 376 | struct Miner { | 480 | struct Miner { |
| 377 | SOCKET fd; | 481 | btf_socket_t fd; |
| 378 | bool authorised; | 482 | bool authorised = false; |
| 379 | std::string address; | 483 | std::string address; |
| 380 | std::string worker; | 484 | std::string worker; |
| 381 | std::string readBuf; | 485 | std::string readBuf; |
| 382 | int64 connectTime; | 486 | int64 connectTime; |
| 383 | uint64 sessionShares; | 487 | uint64 sessionShares = 0; |
| 384 | Miner(SOCKET f) : fd(f), authorised(false), connectTime(GetTime()), sessionShares(0) {} | 488 | uint64 roundShares = 0; |
| 489 | uint64 totalShares = 0; | ||
| 490 | int64 lastSeen = 0; | ||
| 491 | uint32_t extranonce2; | ||
| 492 | |||
| 493 | // Vardiff state | ||
| 494 | double difficulty = 1.0; // current share difficulty sent to this miner | ||
| 495 | uint256 shareTarget; // derived from difficulty; what we check against | ||
| 496 | int64 vardiffWindowStart = 0; // when the current vardiff window opened | ||
| 497 | uint64 vardiffShares = 0; // shares found in current window | ||
| 498 | |||
| 499 | // Hashrate estimate -- EWMA of (expected hashes per share at current | ||
| 500 | // difficulty) / (seconds since the previous share). We had all the data | ||
| 501 | // to compute this (difficulty + share timing) but never actually did, | ||
| 502 | // so pool/GUI hashrate always showed as zero/missing. | ||
| 503 | int64 lastShareTime = 0; // GetTime() of the previous accepted share | ||
| 504 | double hashRate = 0.0; // smoothed H/s estimate | ||
| 505 | |||
| 506 | explicit Miner(btf_socket_t f) | ||
| 507 | : fd(f), connectTime(GetTime()), | ||
| 508 | extranonce2(gNextExtranonce2.fetch_add(1)) {} | ||
| 385 | }; | 509 | }; |
| 386 | 510 | ||
| 387 | void GetPoolOperatorStats(int& authorizedMiners, int& blocksFound, uint64& roundShares) | 511 | static std::vector<Miner*> gMiners; |
| 512 | |||
| 513 | struct FoundBlock { int height; int64 ts; std::string addr; }; | ||
| 514 | static std::deque<FoundBlock> gFoundBlocks; | ||
| 515 | |||
| 516 | // --------------------------------------------------------------------------- | ||
| 517 | // Accept queue -- accept threads push; event loop pops at top of each tick | ||
| 518 | // --------------------------------------------------------------------------- | ||
| 519 | static std::vector<btf_socket_t> gReadyQueue; | ||
| 520 | static std::mutex gReadyMutex; | ||
| 521 | |||
| 522 | static void PushReady(btf_socket_t s) | ||
| 388 | { | 523 | { |
| 389 | authorizedMiners = 0; | 524 | std::lock_guard<std::mutex> lk(gReadyMutex); |
| 390 | blocksFound = 0; | 525 | gReadyQueue.push_back(s); |
| 391 | roundShares = 0; | 526 | } |
| 392 | { | 527 | |
| 393 | std::lock_guard<std::mutex> lk(gMinersMutex); | 528 | // --------------------------------------------------------------------------- |
| 394 | for (Miner* m : gMiners) | 529 | // I/O helpers -- event loop thread only |
| 395 | if (m->authorised) | 530 | // --------------------------------------------------------------------------- |
| 396 | authorizedMiners++; | 531 | |
| 532 | // Blocking send of a complete JSON line. Called only from the event loop so | ||
| 533 | // no other thread is writing to the same fd concurrently. | ||
| 534 | static bool SendLine(btf_socket_t fd, const json& j) | ||
| 535 | { | ||
| 536 | std::string s = j.dump() + "\n"; | ||
| 537 | int off = 0, total = (int)s.size(); | ||
| 538 | while (off < total) { | ||
| 539 | int r = send(fd, s.c_str() + off, total - off, SEND_FLAGS); | ||
| 540 | if (r <= 0) return false; | ||
| 541 | off += r; | ||
| 397 | } | 542 | } |
| 398 | { | 543 | return true; |
| 399 | std::lock_guard<std::mutex> lk(gBlocksMutex); | 544 | } |
| 400 | blocksFound = (int)gFoundBlocks.size(); | 545 | |
| 546 | // Non-blocking recv: pull whatever bytes are available now into buf, then | ||
| 547 | // return one complete line if one is ready. Three outcomes: | ||
| 548 | // true -- line is filled; buf may still contain more lines | ||
| 549 | // false, errno EAGAIN/EWOULDBLOCK (or FIONREAD==0) -- no data right now | ||
| 550 | // false, r==0 -- clean disconnect; caller must treat fd as dead | ||
| 551 | // Caller distinguishes disconnect from "not yet" by checking whether | ||
| 552 | // line.empty() after a false return (line is "" on both paths, so we | ||
| 553 | // use a separate out-param for the disconnect signal). | ||
| 554 | static bool RecvLine(btf_socket_t fd, std::string& buf, | ||
| 555 | std::string& line, bool& disconnected) | ||
| 556 | { | ||
| 557 | disconnected = false; | ||
| 558 | char tmp[4096]; | ||
| 559 | |||
| 560 | #ifdef _WIN32 | ||
| 561 | u_long avail = 0; | ||
| 562 | ioctlsocket(fd, FIONREAD, &avail); | ||
| 563 | if (avail > 0) { | ||
| 564 | int r = recv(fd, tmp, (int)std::min((u_long)(sizeof(tmp)-1), avail), 0); | ||
| 565 | if (r > 0) { tmp[r] = 0; buf += tmp; } | ||
| 566 | else if (r == 0){ disconnected = true; return false; } | ||
| 567 | // r < 0: WSAEWOULDBLOCK -- fall through with what we have | ||
| 401 | } | 568 | } |
| 569 | #else | ||
| 402 | { | 570 | { |
| 403 | std::lock_guard<std::mutex> lk(gMinerStatsMutex); | 571 | int r = recv(fd, tmp, sizeof(tmp) - 1, MSG_DONTWAIT); |
| 404 | for (std::map<std::string, MinerStats>::const_iterator it = gMinerStats.begin(); it != gMinerStats.end(); ++it) | 572 | if (r > 0) { tmp[r] = 0; buf += tmp; } |
| 405 | roundShares += it->second.roundShares; | 573 | else if (r == 0) { disconnected = true; return false; } |
| 574 | // r < 0: EAGAIN/EWOULDBLOCK -- fall through with what we have | ||
| 406 | } | 575 | } |
| 576 | #endif | ||
| 577 | |||
| 578 | size_t pos = buf.find('\n'); | ||
| 579 | if (pos == std::string::npos) return false; // no complete line yet | ||
| 580 | |||
| 581 | line = buf.substr(0, pos); | ||
| 582 | if (!line.empty() && line.back() == '\r') line.pop_back(); | ||
| 583 | buf = buf.substr(pos + 1); | ||
| 584 | return true; | ||
| 407 | } | 585 | } |
| 408 | 586 | ||
| 409 | static bool SendLine(Miner* m, const json& j) | 587 | // --------------------------------------------------------------------------- |
| 588 | // Job helpers | ||
| 589 | // --------------------------------------------------------------------------- | ||
| 590 | static CBlock BuildMinerBlock(const StratumJob& job, uint32_t extranonce2) | ||
| 410 | { | 591 | { |
| 411 | std::string s = j.dump() + "\n"; | 592 | CBlock blk = job.block; |
| 412 | int off = 0; | 593 | blk.vtx[0].vin[0].scriptSig << (CBigNum)extranonce2; |
| 413 | while (off < (int)s.size()) { | 594 | blk.hashMerkleRoot = blk.BuildMerkleTree(); |
| 414 | int n = send(m->fd, s.c_str() + off, (int)s.size() - off, SEND_FLAGS); | 595 | return blk; |
| 415 | if (n <= 0) | 596 | } |
| 416 | return false; | 597 | |
| 417 | off += n; | 598 | // shareTarget is per-miner (set by vardiff) and passed explicitly so the |
| 418 | } | 599 | // value in p[3] of mining.notify always matches what HandleLine checks on submit. |
| 419 | return true; | 600 | // This is the single source of truth for share difficulty. |
| 601 | static json MakeNotifyParams(const StratumJob& job, const CBlock& b, | ||
| 602 | const uint256& shareTarget, bool clean) | ||
| 603 | { | ||
| 604 | unsigned char hdr[80]; | ||
| 605 | memcpy(hdr, &b.nVersion, 4); | ||
| 606 | memcpy(hdr+4, &b.hashPrevBlock, 32); | ||
| 607 | memcpy(hdr+36, &b.hashMerkleRoot, 32); | ||
| 608 | memcpy(hdr+68, &b.nTime, 4); | ||
| 609 | memcpy(hdr+72, &b.nBits, 4); | ||
| 610 | memcpy(hdr+76, &b.nNonce, 4); | ||
| 611 | unsigned char tgt[32]; memcpy(tgt, &shareTarget, 32); | ||
| 612 | return json::array({job.jobId, ToHex(hdr, 80), | ||
| 613 | b.hashPrevBlock.GetHex(), ToHex(tgt, 32), clean}); | ||
| 614 | } | ||
| 615 | |||
| 616 | static void SendJob(Miner* m, bool clean) | ||
| 617 | { | ||
| 618 | if (!gHaveJob) return; | ||
| 619 | CBlock mb = BuildMinerBlock(gCurrentJob, m->extranonce2); | ||
| 620 | // Use this miner's own shareTarget (set by vardiff) in the notify params. | ||
| 621 | // The participant miner reads p[3] as its share target, and HandleLine | ||
| 622 | // checks m->shareTarget on submit -- both sides now use the same value. | ||
| 623 | json n = {{"id",nullptr},{"method","mining.notify"}, | ||
| 624 | {"params", MakeNotifyParams(gCurrentJob, mb, m->shareTarget, clean)}}; | ||
| 625 | if (!SendLine(m->fd, n)) | ||
| 626 | LogPrint("worker", "[pool->worker] job send FAILED for %s -- miner will be dropped\n", | ||
| 627 | m->address.empty() ? "(not yet authorized)" : m->address.c_str()); | ||
| 420 | } | 628 | } |
| 421 | 629 | ||
| 422 | static void BroadcastJob(bool clean) | 630 | static void BroadcastJob(bool clean) |
| 423 | { | 631 | { |
| 424 | StratumJob job; | 632 | if (!gHaveJob) return; |
| 425 | { std::lock_guard<std::mutex> lk(gJobMutex); if(!gHaveJob) return; job=gCurrentJob; } | 633 | int sent = 0; |
| 426 | json n = {{"id",nullptr},{"method","mining.notify"},{"params",MakeNotifyParams(job,clean)}}; | 634 | for (Miner* m : gMiners) { |
| 427 | std::lock_guard<std::mutex> lk(gMinersMutex); | 635 | if (!m->authorised) continue; |
| 428 | for (Miner* m : gMiners) | 636 | SendJob(m, clean); |
| 429 | if (m->authorised && !SendLine(m, n)) | 637 | sent++; |
| 430 | printf("Stratum: failed to broadcast job to %s\n", m->address.c_str()); | 638 | } |
| 639 | LogPrint("pool", "[pool] job %s broadcast to %d miner(s)\n", | ||
| 640 | gCurrentJob.jobId.c_str(), sent); | ||
| 431 | } | 641 | } |
| 432 | 642 | ||
| 433 | static void HandleLine(Miner* m, const std::string& line) | 643 | // --------------------------------------------------------------------------- |
| 644 | // Stratum message handler -- called for each complete line from a miner | ||
| 645 | // Returns false if the miner should be disconnected immediately. | ||
| 646 | // --------------------------------------------------------------------------- | ||
| 647 | static bool HandleLine(Miner* m, const std::string& rawLine, | ||
| 648 | std::map<std::string, uint64>& roundShareCount, | ||
| 649 | uint64& roundShareTotal, | ||
| 650 | int& blocksFoundThisSession) | ||
| 434 | { | 651 | { |
| 435 | json req; | 652 | json req; |
| 436 | try { req = json::parse(line); } catch(...){ return; } | 653 | try { req = json::parse(rawLine); } |
| 654 | catch (...) { | ||
| 655 | LogPrint("worker", "[worker] JSON parse error from %s: %.80s\n", | ||
| 656 | m->address.empty() ? "(unauth)" : m->address.c_str(), | ||
| 657 | rawLine.c_str()); | ||
| 658 | return true; // don't disconnect on bad JSON, just ignore the line | ||
| 659 | } | ||
| 437 | 660 | ||
| 438 | json id = req.value("id", json(nullptr)); | 661 | json id = req.value("id", json(nullptr)); |
| 439 | std::string method = req.value("method",""); | 662 | std::string method = req.value("method", ""); |
| 440 | 663 | ||
| 441 | auto reply = [&](json result, json error=nullptr){ | 664 | // Reply helper: always sends result+error pair as Stratum requires |
| 442 | if (!SendLine(m, json{{"id",id},{"result",result},{"error",error}})) | 665 | auto reply = [&](json result, std::string error = "") { |
| 443 | printf("Stratum: failed to reply to miner %s\n", m->address.c_str()); | 666 | json err = error.empty() ? json(nullptr) : json(error); |
| 667 | if (!SendLine(m->fd, json{{"id",id},{"result",result},{"error",err}})) | ||
| 668 | LogPrint("worker", "[pool->worker] reply send FAILED for %s (method=%s)\n", | ||
| 669 | m->address.empty() ? "(unauth)" : m->address.c_str(), | ||
| 670 | method.c_str()); | ||
| 444 | }; | 671 | }; |
| 445 | 672 | ||
| 673 | // ------------------------------------------------------------------ | ||
| 446 | if (method == "mining.subscribe") { | 674 | if (method == "mining.subscribe") { |
| 447 | std::string sid = ToHex(&m->fd, 4); | 675 | std::string sid = ToHex(&m->fd, 4); |
| 448 | printf("Stratum: miner subscribed %s\n", sid.c_str()); | 676 | LogPrint("worker", "[worker->pool] subscribe from fd=%d sid=%s\n", |
| 677 | (int)m->fd, sid.c_str()); | ||
| 449 | reply(json::array({json::array({json::array({"mining.notify",sid})}),sid,4})); | 678 | reply(json::array({json::array({json::array({"mining.notify",sid})}),sid,4})); |
| 450 | return; | 679 | return true; |
| 451 | } | 680 | } |
| 452 | 681 | ||
| 682 | // ------------------------------------------------------------------ | ||
| 453 | if (method == "mining.authorize") { | 683 | if (method == "mining.authorize") { |
| 454 | auto& p = req["params"]; | 684 | auto& p = req["params"]; |
| 455 | m->address = (p.size()>0 && p[0].is_string()) ? p[0].get<std::string>() : ""; | 685 | m->address = (p.size() > 0 && p[0].is_string()) ? p[0].get<std::string>() : ""; |
| 456 | m->worker = (p.size()>1 && p[1].is_string()) ? p[1].get<std::string>() : "worker"; | 686 | m->worker = (p.size() > 1 && p[1].is_string()) ? p[1].get<std::string>() : "worker"; |
| 457 | m->authorised = true; | 687 | m->lastSeen = GetTime(); |
| 458 | printf("Stratum: miner authorized address=%s worker=%s\n", m->address.c_str(), m->worker.c_str()); | ||
| 459 | reply(true); | ||
| 460 | 688 | ||
| 461 | uint160 h; bool valid = AddressToHash160(m->address, h); | 689 | // Validate address before authorising |
| 462 | if (!valid) printf("Stratum: miner %s invalid address '%s' — shares won't pay out\n", | 690 | uint160 h160; bool validAddr = AddressToHash160(m->address, h160); |
| 463 | m->worker.c_str(), m->address.c_str()); | ||
| 464 | 691 | ||
| 465 | { std::lock_guard<std::mutex> lk(gMinerStatsMutex); | 692 | m->authorised = true; // authorise regardless -- shares just won't pay out |
| 466 | auto& ms = gMinerStats[m->address]; | 693 | LogPrint("worker", "[worker->pool] authorize address=%s worker=%s addr_valid=%s\n", |
| 467 | ms.lastSeen = GetTime(); ms.worker = m->worker; } | 694 | m->address.c_str(), m->worker.c_str(), validAddr ? "yes" : "NO"); |
| 468 | 695 | ||
| 469 | if (!SendLine(m, json{{"id",nullptr},{"method","mining.set_difficulty"},{"params",json::array({1})}})) | 696 | if (!validAddr) |
| 470 | printf("Stratum: failed to send difficulty to %s\n", m->address.c_str()); | 697 | LogPrint("worker", "[pool] WARNING: address '%s' is invalid -- " |
| 698 | "miner will hash but shares cannot be paid out\n", | ||
| 699 | m->address.c_str()); | ||
| 471 | 700 | ||
| 472 | StratumJob job; bool have; | 701 | reply(true); |
| 473 | { std::lock_guard<std::mutex> lk(gJobMutex); have=gHaveJob; if(have) job=gCurrentJob; } | 702 | |
| 474 | if (have) { | 703 | // Initialize vardiff state and send initial difficulty |
| 475 | printf("Stratum: sending job %s to %s\n", job.jobId.c_str(), m->address.c_str()); | 704 | m->difficulty = 1.0; |
| 476 | if (!SendLine(m, json{{"id",nullptr},{"method","mining.notify"},{"params",MakeNotifyParams(job,true)}})) | 705 | m->shareTarget = ShareTargetFromDifficulty(m->difficulty); |
| 477 | printf("Stratum: failed to send job %s to %s\n", job.jobId.c_str(), m->address.c_str()); | 706 | m->vardiffWindowStart = GetTime(); |
| 707 | m->vardiffShares = 0; | ||
| 708 | LogPrint("worker", "[pool->worker] initial difficulty=%.4f for %s\n", | ||
| 709 | m->difficulty, m->address.c_str()); | ||
| 710 | if (!SendLine(m->fd, json{{"id",nullptr},{"method","mining.set_difficulty"}, | ||
| 711 | {"params",json::array({m->difficulty})}})) | ||
| 712 | LogPrint("worker", "[pool->worker] set_difficulty send FAILED for %s\n", | ||
| 713 | m->address.c_str()); | ||
| 714 | |||
| 715 | if (gHaveJob) { | ||
| 716 | LogPrint("worker", "[pool->worker] sending job %s to %s\n", | ||
| 717 | gCurrentJob.jobId.c_str(), m->address.c_str()); | ||
| 718 | SendJob(m, true); | ||
| 478 | } else { | 719 | } else { |
| 479 | printf("Stratum: no job available for %s\n", m->address.c_str()); | 720 | LogPrint("worker", "[pool->worker] no job available yet for %s" |
| 721 | " -- will be sent one as soon as the pool builds it\n", | ||
| 722 | m->address.c_str()); | ||
| 480 | } | 723 | } |
| 481 | return; | 724 | return true; |
| 482 | } | 725 | } |
| 483 | 726 | ||
| 484 | if (method == "mining.extranonce.subscribe") { reply(true); return; } | 727 | // ------------------------------------------------------------------ |
| 728 | if (method == "mining.extranonce.subscribe") { reply(true); return true; } | ||
| 729 | if (method == "mining.get_transactions") { reply(json::array()); return true; } | ||
| 485 | 730 | ||
| 731 | // ------------------------------------------------------------------ | ||
| 486 | if (method == "mining.submit") { | 732 | if (method == "mining.submit") { |
| 487 | if (!m->authorised) { reply(false,"not authorised"); return; } | 733 | if (!m->authorised) { |
| 734 | LogPrint("worker", "[worker->pool] submit from unauthorized miner (fd=%d)\n", | ||
| 735 | (int)m->fd); | ||
| 736 | reply(false, "not authorised"); | ||
| 737 | return true; | ||
| 738 | } | ||
| 488 | 739 | ||
| 489 | auto& p = req["params"]; | 740 | auto& p = req["params"]; |
| 490 | if (p.size() < 4) { reply(false,"bad params"); return; } | 741 | if (p.size() < 3) { |
| 742 | LogPrint("worker", "[worker->pool] submit bad params from %s (size=%zu)\n", | ||
| 743 | m->address.c_str(), p.size()); | ||
| 744 | reply(false, "bad params"); | ||
| 745 | return true; | ||
| 746 | } | ||
| 491 | 747 | ||
| 492 | std::string jobId = p[1].get<std::string>(); | 748 | std::string submitJobId = p[1].get<std::string>(); |
| 493 | std::string nonceHex = p[2].get<std::string>(); | 749 | std::string nonceHex = p[2].get<std::string>(); |
| 494 | 750 | ||
| 495 | StratumJob job; | 751 | if (!gHaveJob) { |
| 496 | { std::lock_guard<std::mutex> lk(gJobMutex); | 752 | LogPrint("worker", "[worker->pool] submit from %s but pool has no current job\n", |
| 497 | if (!gHaveJob || gCurrentJob.jobId != jobId) { reply(false,"stale job"); return; } | 753 | m->address.c_str()); |
| 498 | job = gCurrentJob; } | 754 | reply(false, "stale job"); |
| 755 | return true; | ||
| 756 | } | ||
| 757 | if (gCurrentJob.jobId != submitJobId) { | ||
| 758 | LogPrint("worker", "[worker->pool] submit stale job from %s" | ||
| 759 | " (submitted=%s current=%s)\n", | ||
| 760 | m->address.c_str(), submitJobId.c_str(), gCurrentJob.jobId.c_str()); | ||
| 761 | reply(false, "stale job"); | ||
| 762 | return true; | ||
| 763 | } | ||
| 499 | 764 | ||
| 500 | auto nb = FromHex(nonceHex); | 765 | auto nb = FromHex(nonceHex); |
| 501 | if (nb.size()<4) { reply(false,"bad nonce"); return; } | 766 | if (nb.size() < 4) { |
| 767 | LogPrint("worker", "[worker->pool] submit bad nonce from %s: '%s'\n", | ||
| 768 | m->address.c_str(), nonceHex.c_str()); | ||
| 769 | reply(false, "bad nonce"); | ||
| 770 | return true; | ||
| 771 | } | ||
| 502 | unsigned int nNonce; memcpy(&nNonce, nb.data(), 4); | 772 | unsigned int nNonce; memcpy(&nNonce, nb.data(), 4); |
| 503 | 773 | ||
| 504 | CBlock& b = job.block; | 774 | // Rebuild this miner's exact block (unique merkle via extranonce2) |
| 775 | CBlock b = BuildMinerBlock(gCurrentJob, m->extranonce2); | ||
| 505 | b.nNonce = nNonce; | 776 | b.nNonce = nNonce; |
| 506 | unsigned char hdr[80]; | 777 | unsigned char hdr[80]; |
| 507 | memcpy(hdr, &b.nVersion, 4); | 778 | memcpy(hdr, &b.nVersion, 4); |
| 508 | memcpy(hdr+4, &b.hashPrevBlock, 32); | 779 | memcpy(hdr+4, &b.hashPrevBlock, 32); |
| 509 | memcpy(hdr+36, &b.hashMerkleRoot,32); | 780 | memcpy(hdr+36, &b.hashMerkleRoot, 32); |
| 510 | memcpy(hdr+68, &b.nTime, 4); | 781 | memcpy(hdr+68, &b.nTime, 4); |
| 511 | memcpy(hdr+72, &b.nBits, 4); | 782 | memcpy(hdr+72, &b.nBits, 4); |
| 512 | memcpy(hdr+76, &b.nNonce, 4); | 783 | memcpy(hdr+76, &b.nNonce, 4); |
| 513 | 784 | ||
| 514 | uint256 powHash = RandomXPoWHash(hdr, 80); | 785 | uint256 powHash = RandomXPoWHash(hdr, 80); |
| 515 | 786 | ||
| 516 | // Record share in the current round. | 787 | // Check against this miner's personal share target (set by vardiff) |
| 517 | std::string key = MinerKey(m->address, m->worker); | 788 | if (powHash > m->shareTarget) { |
| 518 | { std::lock_guard<std::mutex> lk(gMinerStatsMutex); | 789 | LogPrint("worker", "[worker->pool] high-hash from %s" |
| 519 | MinerStats& ms = gMinerStats[key]; | 790 | " nonce=%u (difficulty=%.4f)\n", |
| 520 | ms.address = m->address; | 791 | m->address.c_str(), nNonce, m->difficulty); |
| 521 | ms.worker = m->worker; | 792 | reply(false, "high-hash"); |
| 522 | ms.roundShares++; | 793 | return true; |
| 523 | ms.totalShares++; | 794 | } |
| 524 | ms.lastSeen = GetTime(); } | 795 | |
| 796 | // Valid share -- record it | ||
| 525 | m->sessionShares++; | 797 | m->sessionShares++; |
| 798 | m->roundShares++; | ||
| 799 | m->totalShares++; | ||
| 800 | m->vardiffShares++; | ||
| 801 | int64 shareTime = GetTime(); | ||
| 802 | m->lastSeen = shareTime; | ||
| 803 | roundShareCount[m->address]++; | ||
| 804 | roundShareTotal++; | ||
| 805 | |||
| 806 | // Update hashrate estimate: expected hashes for this share divided by | ||
| 807 | // the time since the last one, smoothed with an EWMA so a single fast | ||
| 808 | // or slow share doesn't make the number jump around. | ||
| 809 | if (m->lastShareTime > 0) { | ||
| 810 | int64 dt = shareTime - m->lastShareTime; | ||
| 811 | if (dt <= 0) dt = 1; | ||
| 812 | double inst = ExpectedHashesForDifficulty(m->difficulty) / (double)dt; | ||
| 813 | const double alpha = 0.25; | ||
| 814 | m->hashRate = (m->hashRate <= 0.0) ? inst | ||
| 815 | : alpha * inst + (1.0 - alpha) * m->hashRate; | ||
| 816 | } | ||
| 817 | m->lastShareTime = shareTime; | ||
| 526 | 818 | ||
| 527 | if (powHash > job.shareTarget) { reply(true); return; } // valid share, not a full block | 819 | LogPrint("worker", "[worker->pool] valid share from %s" |
| 820 | " nonce=%u job=%s difficulty=%.4f (session: %llu)\n", | ||
| 821 | m->address.c_str(), nNonce, | ||
| 822 | gCurrentJob.jobId.c_str(), m->difficulty, | ||
| 823 | (unsigned long long)m->sessionShares); | ||
| 824 | reply(true); | ||
| 825 | |||
| 826 | // Vardiff: after every VARDIFF_SHARES_PER_CHECK shares, check rate | ||
| 827 | if (m->vardiffShares >= VARDIFF_SHARES_PER_CHECK) { | ||
| 828 | int64 elapsed = GetTime() - m->vardiffWindowStart; | ||
| 829 | if (elapsed <= 0) elapsed = 1; | ||
| 830 | double actualSecsPerShare = (double)elapsed / (double)m->vardiffShares; | ||
| 831 | double ratio = actualSecsPerShare / (double)VARDIFF_TARGET_SECS; | ||
| 832 | // ratio < 1 means shares arriving faster than target (too easy) | ||
| 833 | // ratio > 1 means shares arriving slower than target (too hard) | ||
| 834 | if (ratio < (1.0 / VARDIFF_RETARGET_RATIO) || | ||
| 835 | ratio > VARDIFF_RETARGET_RATIO) { | ||
| 836 | // New difficulty scales inversely with actual share rate | ||
| 837 | double newDiff = m->difficulty / ratio; | ||
| 838 | if (newDiff < VARDIFF_MIN) newDiff = VARDIFF_MIN; | ||
| 839 | if (newDiff > VARDIFF_MAX) newDiff = VARDIFF_MAX; | ||
| 840 | // Only apply if the change is meaningful (>10%) | ||
| 841 | if (newDiff / m->difficulty > 1.1 || m->difficulty / newDiff > 1.1) { | ||
| 842 | m->difficulty = newDiff; | ||
| 843 | m->shareTarget = ShareTargetFromDifficulty(m->difficulty); | ||
| 844 | LogPrint("worker", "[pool] vardiff: %s new difficulty=%.4f" | ||
| 845 | " (%.1fs/share actual vs %ds target)\n", | ||
| 846 | m->address.c_str(), m->difficulty, | ||
| 847 | actualSecsPerShare, (int)VARDIFF_TARGET_SECS); | ||
| 848 | SendLine(m->fd, json{{"id",nullptr}, | ||
| 849 | {"method","mining.set_difficulty"}, | ||
| 850 | {"params",json::array({m->difficulty})}}); | ||
| 851 | // set_difficulty alone doesn't change what the worker | ||
| 852 | // actually hashes against -- it only reads its share | ||
| 853 | // target from mining.notify params[3]. Without this, the | ||
| 854 | // new difficulty wouldn't take effect until the next | ||
| 855 | // natural job broadcast (new block, or the 60s trickle | ||
| 856 | // refresh), so push a fresh notify for this miner now. | ||
| 857 | SendJob(m, false); | ||
| 858 | } | ||
| 859 | } | ||
| 860 | // Reset window | ||
| 861 | m->vardiffWindowStart = GetTime(); | ||
| 862 | m->vardiffShares = 0; | ||
| 863 | } | ||
| 864 | |||
| 865 | if (powHash > gCurrentJob.target) return true; // valid share, not a block | ||
| 866 | |||
| 867 | // Full difficulty met -- submit block to the chain | ||
| 868 | LogPrint("pool", "[pool] BLOCK CANDIDATE from %s height=%d nNonce=%u -- submitting\n", | ||
| 869 | m->address.c_str(), gCurrentJob.height, nNonce); | ||
| 528 | 870 | ||
| 529 | // Full block | ||
| 530 | CBlock* pblock = new CBlock(b); | 871 | CBlock* pblock = new CBlock(b); |
| 531 | bool accepted = false; | 872 | bool accepted = false; |
| 532 | CRITICAL_BLOCK(cs_main) | 873 | CRITICAL_BLOCK(cs_main) |
| 533 | { | 874 | { |
| 875 | int heightBefore = nBestHeight; | ||
| 534 | if (ProcessBlock(NULL, pblock)) { | 876 | if (ProcessBlock(NULL, pblock)) { |
| 535 | accepted = true; | 877 | // ProcessBlock returns true for orphans too -- verify the chain |
| 536 | printf("Pool: BLOCK FOUND by %s height=%d nNonce=%u\n", | 878 | // actually advanced. If nBestHeight didn't increase, the block |
| 537 | m->address.c_str(), job.height, nNonce); | 879 | // was shelved as an orphan (pool was behind the chain tip) and |
| 538 | FoundBlock fb{job.height, GetTime(), m->address, pblock->GetHash()}; | 880 | // no coinbase was added to the wallet. Do not pay out. |
| 539 | { std::lock_guard<std::mutex> lk(gBlocksMutex); | 881 | if (nBestHeight > heightBefore) { |
| 540 | gFoundBlocks.push_front(fb); | 882 | accepted = true; |
| 541 | if (gFoundBlocks.size()>50) gFoundBlocks.pop_back(); } | 883 | LogPrint("pool", "[pool] BLOCK ACCEPTED height=%d by %s\n", |
| 542 | { std::lock_guard<std::mutex> lk(gJobMutex); gHaveJob=false; } | 884 | gCurrentJob.height, m->address.c_str()); |
| 885 | gFoundBlocks.push_front({gCurrentJob.height, GetTime(), m->address}); | ||
| 886 | if (gFoundBlocks.size() > 50) gFoundBlocks.pop_back(); | ||
| 887 | blocksFoundThisSession++; | ||
| 888 | gHaveJob = false; // invalidate job immediately | ||
| 889 | } else { | ||
| 890 | LogPrint("pool", "[pool] BLOCK ORPHANED height=%d by %s" | ||
| 891 | " -- pool was behind chain tip, no payout\n", | ||
| 892 | gCurrentJob.height, m->address.c_str()); | ||
| 893 | gHaveJob = false; // job is stale regardless | ||
| 894 | } | ||
| 543 | } else { | 895 | } else { |
| 896 | LogPrint("pool", "[pool] BLOCK REJECTED height=%d (ProcessBlock returned false)\n", | ||
| 897 | gCurrentJob.height); | ||
| 544 | delete pblock; | 898 | delete pblock; |
| 545 | } | 899 | } |
| 546 | } | 900 | } |
| 547 | reply(accepted); | 901 | |
| 548 | if (accepted) { QueuePayouts(job.height); RebuildJob(); BroadcastJob(true); } | 902 | if (accepted) { |
| 549 | return; | 903 | // Snapshot height before RebuildJob() (which increments it) |
| 904 | int foundHeight = gCurrentJob.height; | ||
| 905 | QueuePayouts(foundHeight, roundShareCount, roundShareTotal); | ||
| 906 | // Reset round shares | ||
| 907 | roundShareCount.clear(); | ||
| 908 | roundShareTotal = 0; | ||
| 909 | for (Miner* mi : gMiners) mi->roundShares = 0; | ||
| 910 | // Build and broadcast new job immediately | ||
| 911 | if (RebuildJob()) { | ||
| 912 | LogPrint("pool", "[pool] new job %s built after block %d\n", | ||
| 913 | gCurrentJob.jobId.c_str(), foundHeight); | ||
| 914 | BroadcastJob(true); | ||
| 915 | } else { | ||
| 916 | LogPrint("pool", "[pool] WARNING: RebuildJob() failed after block %d" | ||
| 917 | " -- miners will wait\n", foundHeight); | ||
| 918 | } | ||
| 919 | } | ||
| 920 | return true; | ||
| 550 | } | 921 | } |
| 551 | 922 | ||
| 552 | if (method == "mining.get_transactions") { reply(json::array()); return; } | 923 | // Unknown method -- log it (can reveal miner software quirks) |
| 924 | LogPrint("worker", "[worker->pool] unknown method '%s' from %s\n", | ||
| 925 | method.c_str(), | ||
| 926 | m->address.empty() ? "(unauth)" : m->address.c_str()); | ||
| 553 | reply(nullptr, "unknown method"); | 927 | reply(nullptr, "unknown method"); |
| 928 | return true; | ||
| 554 | } | 929 | } |
| 555 | 930 | ||
| 556 | static void MinerThreadFn(void* arg) | 931 | // --------------------------------------------------------------------------- |
| 932 | // Stats refresh -- called every 2s from event loop | ||
| 933 | // --------------------------------------------------------------------------- | ||
| 934 | static void RefreshStats(int blocksFoundThisSession, uint64 roundShareTotal) | ||
| 557 | { | 935 | { |
| 558 | Miner* m = (Miner*)arg; | 936 | std::lock_guard<std::mutex> lk(gStatsMutex); |
| 559 | while (!fShutdown && gPoolRunning) { | 937 | |
| 560 | fd_set fds; FD_ZERO(&fds); FD_SET(m->fd, &fds); | 938 | gStats.authorizedMiners = 0; |
| 561 | struct timeval tv={1,0}; | 939 | gStats.blocksFound = blocksFoundThisSession; |
| 562 | if (select((int)m->fd+1, &fds, NULL, NULL, &tv) <= 0) continue; | 940 | gStats.roundShares = roundShareTotal; |
| 563 | char buf[4096]; | 941 | gStats.totalHashRate = 0.0; |
| 564 | int n = recv(m->fd, buf, sizeof(buf)-1, 0); | 942 | for (Miner* m : gMiners) |
| 565 | if (n <= 0) break; | 943 | if (m->authorised) gStats.authorizedMiners++; |
| 566 | buf[n]=0; m->readBuf += buf; | 944 | |
| 567 | size_t pos; | 945 | gWorkerStats.clear(); |
| 568 | while ((pos = m->readBuf.find('\n')) != std::string::npos) { | 946 | for (Miner* m : gMiners) { |
| 569 | std::string line = m->readBuf.substr(0, pos); | 947 | if (!m->authorised || m->lastSeen <= 0) continue; |
| 570 | m->readBuf = m->readBuf.substr(pos+1); | 948 | PoolWorkerStatView v; |
| 571 | if (!line.empty() && line.back()=='\r') line.pop_back(); | 949 | v.address = m->address; |
| 572 | if (!line.empty()) HandleLine(m, line); | 950 | v.worker = m->worker; |
| 573 | } | 951 | v.roundShares = m->roundShares; |
| 952 | v.totalShares = m->totalShares; | ||
| 953 | v.lastSeen = m->lastSeen; | ||
| 954 | v.hashRate = m->hashRate; | ||
| 955 | gWorkerStats.push_back(v); | ||
| 956 | gStats.totalHashRate += m->hashRate; | ||
| 957 | } | ||
| 958 | std::sort(gWorkerStats.begin(), gWorkerStats.end(), | ||
| 959 | [](const PoolWorkerStatView& a, const PoolWorkerStatView& b) { | ||
| 960 | return a.roundShares != b.roundShares ? a.roundShares > b.roundShares | ||
| 961 | : a.lastSeen > b.lastSeen; | ||
| 962 | }); | ||
| 963 | |||
| 964 | // gPendingPayouts is event-loop-only data (no lock needed here since | ||
| 965 | // RefreshStats is always called from the event loop thread). | ||
| 966 | gPayoutViews.clear(); | ||
| 967 | for (const PendingPayout& pp : gPendingPayouts) { | ||
| 968 | PendingPayoutView pv; | ||
| 969 | pv.matureAtHeight = pp.matureAtHeight; | ||
| 970 | pv.recipients = (int)pp.amounts.size(); | ||
| 971 | pv.totalAmount = 0; | ||
| 972 | for (auto& kv : pp.amounts) pv.totalAmount += kv.second; | ||
| 973 | gPayoutViews.push_back(pv); | ||
| 574 | } | 974 | } |
| 575 | sock_close(m->fd); | ||
| 576 | printf("Stratum: miner %s disconnected (%llu shares)\n", | ||
| 577 | m->worker.empty()?"unknown":m->worker.c_str(), | ||
| 578 | (unsigned long long)m->sessionShares); | ||
| 579 | { std::lock_guard<std::mutex> lk(gMinersMutex); | ||
| 580 | auto it = std::find(gMiners.begin(), gMiners.end(), m); | ||
| 581 | if (it != gMiners.end()) gMiners.erase(it); } | ||
| 582 | delete m; | ||
| 583 | } | 975 | } |
| 584 | 976 | ||
| 585 | static void JobWatcherFn(void*) | 977 | // --------------------------------------------------------------------------- |
| 978 | // Event loop | ||
| 979 | // --------------------------------------------------------------------------- | ||
| 980 | static void PoolEventLoop() | ||
| 586 | { | 981 | { |
| 587 | int lastHeight = -1; | 982 | int lastHeight = -1; |
| 983 | int64 lastRefresh = GetTime(); | ||
| 984 | int64 lastStatsRefresh = 0; | ||
| 985 | int blocksFoundThisSession = 0; | ||
| 986 | int64 noJobSince = 0; // 0 = have a job | ||
| 987 | bool warnedNoJob = false; | ||
| 988 | int64 lastNoJobRetry = 0; // throttle RebuildJob calls when no tip | ||
| 989 | |||
| 990 | std::map<std::string, uint64> roundShareCount; | ||
| 991 | uint64 roundShareTotal = 0; | ||
| 992 | |||
| 993 | static const int64 JOB_REFRESH_SECS = 60; // re-stamp nTime periodically | ||
| 994 | static const int64 NO_JOB_WARN_SECS = 15; // warn after this long with no job | ||
| 995 | static const int64 NO_JOB_RETRY_SECS = 5; // how often to retry RebuildJob | ||
| 996 | |||
| 588 | while (!fShutdown && gPoolRunning) { | 997 | while (!fShutdown && gPoolRunning) { |
| 589 | Sleep(500); | 998 | |
| 590 | bool newBlock = false; | 999 | // 1. Drain accept queue |
| 591 | CRITICAL_BLOCK(cs_main) | 1000 | { |
| 592 | { if (nBestHeight != lastHeight && pindexBest) { lastHeight = nBestHeight; newBlock = true; } } | 1001 | std::lock_guard<std::mutex> lk(gReadyMutex); |
| 593 | if (newBlock) { | 1002 | for (btf_socket_t fd : gReadyQueue) { |
| 594 | FlushMaturePayouts(); | 1003 | gMiners.push_back(new Miner(fd)); |
| 595 | if (RebuildJob()) { printf("Stratum: new job height=%d\n", lastHeight+1); BroadcastJob(true); } | 1004 | LogPrint("worker", "[pool] miner fd=%d entered event loop" |
| 596 | } else if (!gHaveJob) { | 1005 | " -- awaiting subscribe/authorize\n", (int)fd); |
| 1006 | } | ||
| 1007 | gReadyQueue.clear(); | ||
| 1008 | } | ||
| 1009 | |||
| 1010 | // 2. Detect new block. | ||
| 1011 | // When our own miner found the block, HandleLine already called | ||
| 1012 | // RebuildJob() + BroadcastJob(true) and set gHaveJob=true. | ||
| 1013 | // We still flush mature payouts and update bookkeeping, but skip | ||
| 1014 | // rebuilding if a fresh job already exists for this height. | ||
| 1015 | { | ||
| 1016 | bool newBlock = false; | ||
| 1017 | CRITICAL_BLOCK(cs_main) | ||
| 1018 | { | ||
| 1019 | if (pindexBest && nBestHeight != lastHeight) { | ||
| 1020 | lastHeight = nBestHeight; | ||
| 1021 | newBlock = true; | ||
| 1022 | } | ||
| 1023 | } | ||
| 1024 | if (newBlock) { | ||
| 1025 | FlushMaturePayouts(); | ||
| 1026 | if (!gHaveJob) { | ||
| 1027 | // External block (not found by our miners), or HandleLine's | ||
| 1028 | // RebuildJob failed. Either way this round is over with no | ||
| 1029 | // payout from us, so clear round shares before starting the | ||
| 1030 | // next one -- otherwise they'd keep accumulating across | ||
| 1031 | // rounds that our own miners didn't win. | ||
| 1032 | roundShareCount.clear(); | ||
| 1033 | roundShareTotal = 0; | ||
| 1034 | for (Miner* mi : gMiners) mi->roundShares = 0; | ||
| 1035 | |||
| 1036 | // Build and broadcast now. | ||
| 1037 | if (RebuildJob()) { | ||
| 1038 | LogPrint("pool", "[pool] new block height=%d -- job %s ready," | ||
| 1039 | " %zu miner(s) connected\n", | ||
| 1040 | lastHeight, gCurrentJob.jobId.c_str(), gMiners.size()); | ||
| 1041 | BroadcastJob(true); | ||
| 1042 | } else { | ||
| 1043 | LogPrint("pool", "[pool] new block height=%d but RebuildJob() failed" | ||
| 1044 | " -- miners will wait\n", lastHeight); | ||
| 1045 | } | ||
| 1046 | } else { | ||
| 1047 | // HandleLine already built and broadcast for this height. | ||
| 1048 | LogPrint("pool", "[pool] new block height=%d -- job already" | ||
| 1049 | " broadcast by submit handler\n", lastHeight); | ||
| 1050 | } | ||
| 1051 | lastRefresh = GetTime(); | ||
| 1052 | noJobSince = 0; | ||
| 1053 | warnedNoJob = false; | ||
| 1054 | } | ||
| 1055 | } | ||
| 1056 | |||
| 1057 | // 3. No-job watchdog (throttled: only retry every NO_JOB_RETRY_SECS) | ||
| 1058 | if (!gHaveJob) { | ||
| 1059 | int64 now = GetTime(); | ||
| 1060 | if (noJobSince == 0) noJobSince = now; | ||
| 1061 | |||
| 1062 | if (now - lastNoJobRetry >= NO_JOB_RETRY_SECS) { | ||
| 1063 | lastNoJobRetry = now; | ||
| 1064 | if (RebuildJob()) { | ||
| 1065 | LogPrint("pool", "[pool] job built after %llds without one\n", | ||
| 1066 | (long long)(now - noJobSince)); | ||
| 1067 | BroadcastJob(false); | ||
| 1068 | noJobSince = 0; | ||
| 1069 | warnedNoJob = false; | ||
| 1070 | lastRefresh = now; | ||
| 1071 | } else if (!warnedNoJob && now - noJobSince >= NO_JOB_WARN_SECS) { | ||
| 1072 | LogPrint("pool", "[pool] STUCK: no job for %llds -- %s." | ||
| 1073 | " Miners are waiting. Will keep retrying every %llds.\n", | ||
| 1074 | (long long)(now - noJobSince), | ||
| 1075 | pindexBest ? "RebuildJob() keeps failing (check above for why)" | ||
| 1076 | : "no chain tip yet (node still syncing)", | ||
| 1077 | (long long)NO_JOB_RETRY_SECS); | ||
| 1078 | warnedNoJob = true; | ||
| 1079 | } | ||
| 1080 | } | ||
| 1081 | } else if (GetTime() - lastRefresh >= JOB_REFRESH_SECS) { | ||
| 1082 | // Periodic nTime refresh -- stale timestamps cause valid hashes to be rejected | ||
| 597 | if (RebuildJob()) BroadcastJob(false); | 1083 | if (RebuildJob()) BroadcastJob(false); |
| 1084 | lastRefresh = GetTime(); | ||
| 1085 | } | ||
| 1086 | |||
| 1087 | // 3.5. Vardiff stall watchdog -- runs independently of share count. | ||
| 1088 | // The normal vardiff check in HandleLine only fires once | ||
| 1089 | // VARDIFF_SHARES_PER_CHECK shares have arrived; a miner that never | ||
| 1090 | // finds a single share never reaches that check, so it can be stuck | ||
| 1091 | // at its initial (or last) difficulty forever. Catch that here. | ||
| 1092 | for (Miner* m : gMiners) { | ||
| 1093 | if (!m->authorised || m->vardiffShares != 0 || m->vardiffWindowStart <= 0) | ||
| 1094 | continue; | ||
| 1095 | int64 stalled = GetTime() - m->vardiffWindowStart; | ||
| 1096 | if (stalled < VARDIFF_STALL_SECS) continue; | ||
| 1097 | |||
| 1098 | double newDiff = m->difficulty / VARDIFF_STALL_CUT; | ||
| 1099 | if (newDiff < VARDIFF_MIN) newDiff = VARDIFF_MIN; | ||
| 1100 | |||
| 1101 | if (newDiff < m->difficulty) { | ||
| 1102 | m->difficulty = newDiff; | ||
| 1103 | m->shareTarget = ShareTargetFromDifficulty(m->difficulty); | ||
| 1104 | m->vardiffWindowStart = GetTime(); | ||
| 1105 | LogPrint("worker", "[pool] vardiff STALL: %s sent zero shares in" | ||
| 1106 | " %llds -- forcing difficulty down to %.6f (no share data" | ||
| 1107 | " to retarget from normally)\n", | ||
| 1108 | m->address.c_str(), (long long)stalled, m->difficulty); | ||
| 1109 | SendLine(m->fd, json{{"id",nullptr}, | ||
| 1110 | {"method","mining.set_difficulty"}, | ||
| 1111 | {"params",json::array({m->difficulty})}}); | ||
| 1112 | // Same reasoning as the normal vardiff retarget above: the | ||
| 1113 | // worker only reads its share target from mining.notify, so | ||
| 1114 | // push a fresh job now instead of waiting on the next | ||
| 1115 | // natural broadcast. | ||
| 1116 | SendJob(m, false); | ||
| 1117 | } else { | ||
| 1118 | // Already at the difficulty floor -- this miner's problem isn't | ||
| 1119 | // difficulty, it's something else (slow hashing, bad connection, | ||
| 1120 | // stuck RandomX light mode, etc). Log once per stall window so | ||
| 1121 | // it's visible without spamming. | ||
| 1122 | LogPrint("worker", "[pool] vardiff STALL: %s still at zero shares" | ||
| 1123 | " after %llds at floor difficulty %.6f -- likely a" | ||
| 1124 | " hashrate/connectivity problem, not a difficulty problem\n", | ||
| 1125 | m->address.c_str(), (long long)stalled, m->difficulty); | ||
| 1126 | m->vardiffWindowStart = GetTime(); // avoid re-logging every tick | ||
| 1127 | } | ||
| 1128 | } | ||
| 1129 | |||
| 1130 | // 4. Select over miner sockets | ||
| 1131 | if (!gMiners.empty()) { | ||
| 1132 | fd_set fds; FD_ZERO(&fds); | ||
| 1133 | int maxfd = 0; | ||
| 1134 | for (Miner* m : gMiners) { | ||
| 1135 | FD_SET(m->fd, &fds); | ||
| 1136 | if ((int)m->fd > maxfd) maxfd = (int)m->fd; | ||
| 1137 | } | ||
| 1138 | struct timeval tv = {0, 50000}; // 50ms | ||
| 1139 | if (select(maxfd + 1, &fds, NULL, NULL, &tv) > 0) { | ||
| 1140 | std::vector<Miner*> dead; | ||
| 1141 | for (Miner* m : gMiners) { | ||
| 1142 | if (!FD_ISSET(m->fd, &fds)) continue; | ||
| 1143 | std::string line; | ||
| 1144 | bool disc = false; | ||
| 1145 | // Drain all complete lines buffered for this miner. | ||
| 1146 | // HandleLine always returns true; disc signals clean disconnect. | ||
| 1147 | while (RecvLine(m->fd, m->readBuf, line, disc)) | ||
| 1148 | HandleLine(m, line, roundShareCount, | ||
| 1149 | roundShareTotal, blocksFoundThisSession); | ||
| 1150 | if (disc) dead.push_back(m); | ||
| 1151 | } | ||
| 1152 | for (Miner* m : dead) { | ||
| 1153 | LogPrint("worker", "[pool] miner %s disconnected" | ||
| 1154 | " (session shares: %llu, round shares: %llu)\n", | ||
| 1155 | m->worker.empty() ? "(never authorized)" : m->worker.c_str(), | ||
| 1156 | (unsigned long long)m->sessionShares, | ||
| 1157 | (unsigned long long)m->roundShares); | ||
| 1158 | sock_close(m->fd); | ||
| 1159 | gMiners.erase(std::find(gMiners.begin(), gMiners.end(), m)); | ||
| 1160 | delete m; | ||
| 1161 | } | ||
| 1162 | } | ||
| 1163 | } else { | ||
| 1164 | Sleep(50); | ||
| 1165 | } | ||
| 1166 | |||
| 1167 | // 5. Refresh GUI stats every 2s | ||
| 1168 | if (GetTime() - lastStatsRefresh >= 2) { | ||
| 1169 | RefreshStats(blocksFoundThisSession, roundShareTotal); | ||
| 1170 | lastStatsRefresh = GetTime(); | ||
| 598 | } | 1171 | } |
| 599 | } | 1172 | } |
| 1173 | |||
| 1174 | for (Miner* m : gMiners) { sock_close(m->fd); delete m; } | ||
| 1175 | gMiners.clear(); | ||
| 600 | } | 1176 | } |
| 601 | 1177 | ||
| 602 | // --------------------------------------------------------------------------- | 1178 | // --------------------------------------------------------------------------- |
| 603 | // Main Stratum accept loop — entry point called from ui.cpp and headless.cpp | 1179 | // Accept threads |
| 604 | // --------------------------------------------------------------------------- | ||
| 605 | // .btf Stratum listener — miners connect via rendezvous relay using the | ||
| 606 | // node's .btf address instead of a raw IP:port. Same Stratum protocol, | ||
| 607 | // same MinerThreadFn handler, works through CGNAT with no port forwarding. | ||
| 608 | // | ||
| 609 | // Keeps one listener registered per relay at all times. When a miner | ||
| 610 | // connects, a replacement listener is spawned immediately so the next | ||
| 611 | // miner doesn't have to wait. | ||
| 612 | // --------------------------------------------------------------------------- | 1180 | // --------------------------------------------------------------------------- |
| 1181 | struct AcceptCtx { unsigned char pk[32]; unsigned char sk[32]; std::string relay; }; | ||
| 613 | 1182 | ||
| 614 | struct BtfAcceptCtx { unsigned char pk[32]; unsigned char sk[32]; string relay; }; | 1183 | // One persistent thread per relay. Loops: register -> wrap -> push -> repeat. |
| 615 | 1184 | static void AcceptOneFn(void* arg) | |
| 616 | // Track active listener count per relay to avoid pile-up when relay is slow | ||
| 617 | static std::map<string,int> gBtfListenerCount; | ||
| 618 | static std::mutex gBtfListenerMutex; | ||
| 619 | |||
| 620 | static void BtfStratumAcceptOneFn(void* arg) | ||
| 621 | { | 1185 | { |
| 622 | BtfAcceptCtx* ctx = (BtfAcceptCtx*)arg; | 1186 | AcceptCtx* ctx = (AcceptCtx*)arg; |
| 623 | unsigned char pk[32], sk[32]; | 1187 | unsigned char pk[32], sk[32]; |
| 624 | memcpy(pk, ctx->pk, 32); memcpy(sk, ctx->sk, 32); | 1188 | memcpy(pk, ctx->pk, 32); memcpy(sk, ctx->sk, 32); |
| 625 | string relay = ctx->relay; | 1189 | std::string relay = ctx->relay; |
| 626 | delete ctx; | 1190 | delete ctx; |
| 627 | 1191 | ||
| 628 | auto decrement = [&]() { | ||
| 629 | std::lock_guard<std::mutex> lk(gBtfListenerMutex); | ||
| 630 | gBtfListenerCount[relay]--; | ||
| 631 | }; | ||
| 632 | |||
| 633 | size_t colon = relay.rfind(':'); | 1192 | size_t colon = relay.rfind(':'); |
| 634 | if (colon == string::npos) { decrement(); return; } | 1193 | if (colon == std::string::npos) { |
| 635 | string strHost = relay.substr(0, colon); | 1194 | LogPrint("pool", "[pool] AcceptOneFn: bad relay address '%s'\n", relay.c_str()); |
| 636 | int nPort = atoi(relay.substr(colon+1).c_str()); | 1195 | return; |
| 637 | |||
| 638 | btf::RvSocket rv = btf::RvServiceRegister(strHost.c_str(), (unsigned short)nPort, pk); | ||
| 639 | if (fShutdown || !gPoolRunning) { if (rv != btf::RV_INVALID) btf::RvClose(rv); decrement(); return; } | ||
| 640 | if (rv == btf::RV_INVALID) { decrement(); return; } | ||
| 641 | |||
| 642 | // Paired: spawn replacement (count transfers to new thread) | ||
| 643 | if (!fShutdown && gPoolRunning) { | ||
| 644 | BtfAcceptCtx* next = new BtfAcceptCtx(); | ||
| 645 | memcpy(next->pk, pk, 32); memcpy(next->sk, sk, 32); | ||
| 646 | next->relay = relay; | ||
| 647 | LaunchThread(BtfStratumAcceptOneFn, next); | ||
| 648 | } else { | ||
| 649 | decrement(); | ||
| 650 | } | 1196 | } |
| 1197 | std::string host = relay.substr(0, colon); | ||
| 1198 | int port = atoi(relay.substr(colon + 1).c_str()); | ||
| 1199 | |||
| 1200 | LogPrint("pool", "[pool] accept thread started for relay %s\n", relay.c_str()); | ||
| 1201 | |||
| 1202 | while (!fShutdown && gPoolRunning) { | ||
| 1203 | // Blocks until a miner connects to us at this relay | ||
| 1204 | btf::RvSocket rv = btf::RvServiceRegister(host.c_str(), (unsigned short)port, pk); | ||
| 651 | 1205 | ||
| 652 | btf_socket_t hSocket = btf::BtfServiceWrap(rv, sk); | 1206 | if (fShutdown || !gPoolRunning) { |
| 653 | if (hSocket == INVALID_SOCKET) return; | 1207 | if (rv != btf::RV_INVALID) btf::RvClose(rv); |
| 1208 | break; | ||
| 1209 | } | ||
| 1210 | if (rv == btf::RV_INVALID) { | ||
| 1211 | LogPrint("pool", "[pool] relay %s: RvServiceRegister failed" | ||
| 1212 | " -- backing off 30s before retry\n", relay.c_str()); | ||
| 1213 | for (int i = 0; i < 30 && !fShutdown && gPoolRunning; i++) Sleep(1000); | ||
| 1214 | continue; | ||
| 1215 | } | ||
| 654 | 1216 | ||
| 655 | printf("Stratum/.btf: miner connected via %s\n", relay.c_str()); | 1217 | // Echan handshake -- blocking but fast (local + relay round-trip) |
| 656 | Miner* m = new Miner(hSocket); | 1218 | btf_socket_t fd = btf::BtfServiceWrap(rv, sk); |
| 657 | { std::lock_guard<std::mutex> lk(gMinersMutex); gMiners.push_back(m); } | 1219 | if (fd == INVALID_SOCKET) { |
| 658 | LaunchThread(MinerThreadFn, m); | 1220 | LogPrint("pool", "[pool] relay %s: BtfServiceWrap failed (echan handshake)" |
| 1221 | " -- miner dropped, will accept next\n", relay.c_str()); | ||
| 1222 | continue; | ||
| 1223 | } | ||
| 1224 | |||
| 1225 | LogPrint("worker", "[pool] miner arrived via relay %s -- pushing to event loop\n", | ||
| 1226 | relay.c_str()); | ||
| 1227 | PushReady(fd); | ||
| 1228 | // Loop immediately: register again so the next miner can connect | ||
| 1229 | } | ||
| 1230 | |||
| 1231 | LogPrint("pool", "[pool] accept thread stopped for relay %s\n", relay.c_str()); | ||
| 659 | } | 1232 | } |
| 660 | 1233 | ||
| 661 | static void BtfStratumAcceptFn(void*) | 1234 | // Spawns one AcceptOneFn per relay. Re-polls relay list every 60s to pick up |
| 1235 | // newly discovered relays. Uses a set to avoid spawning duplicate threads. | ||
| 1236 | static void AcceptLoopFn(void*) | ||
| 662 | { | 1237 | { |
| 663 | printf("Stratum/.btf: starting \xe2\x80\x94 miners can connect via %s\n", | 1238 | LogPrint("pool", "[pool] AcceptLoopFn started -- miners can connect via %s\n", |
| 664 | BtfLocalAddress().c_str()); | 1239 | BtfLocalAddress().c_str()); |
| 665 | 1240 | ||
| 1241 | // Wait for our identity to be ready | ||
| 666 | unsigned char pk[32], sk[32]; | 1242 | unsigned char pk[32], sk[32]; |
| 1243 | int waitSecs = 0; | ||
| 667 | while (!BtfGetIdentity(pk, sk)) { | 1244 | while (!BtfGetIdentity(pk, sk)) { |
| 668 | if (fShutdown || !gPoolRunning) return; | 1245 | if (fShutdown || !gPoolRunning) return; |
| 1246 | if (waitSecs == 0) | ||
| 1247 | LogPrint("pool", "[pool] waiting for .btf identity...\n"); | ||
| 1248 | waitSecs++; | ||
| 669 | Sleep(2000); | 1249 | Sleep(2000); |
| 670 | } | 1250 | } |
| 1251 | LogPrint("pool", "[pool] .btf identity ready after %ds\n", waitSecs * 2); | ||
| 1252 | |||
| 1253 | std::set<std::string> spawned; // relays we've already started a thread for | ||
| 671 | 1254 | ||
| 672 | while (!fShutdown && gPoolRunning) { | 1255 | while (!fShutdown && gPoolRunning) { |
| 673 | vector<string> relays = BtfAllRelays(); | 1256 | vector<string> relays = BtfAllRelays(); |
| 674 | if (relays.empty()) { Sleep(5000); continue; } | 1257 | if (relays.empty()) { |
| 675 | 1258 | LogPrint("pool", "[pool] no relays available -- miners cannot connect yet\n"); | |
| 676 | // Spawn one listener per relay, only if none already active | 1259 | } else { |
| 677 | for (const string& relay : relays) { | 1260 | for (const string& relay : relays) { |
| 678 | std::lock_guard<std::mutex> lk(gBtfListenerMutex); | 1261 | if (spawned.count(relay)) continue; // already running |
| 679 | if (gBtfListenerCount[relay] == 0) { | 1262 | AcceptCtx* ctx = new AcceptCtx(); |
| 680 | gBtfListenerCount[relay]++; | ||
| 681 | BtfAcceptCtx* ctx = new BtfAcceptCtx(); | ||
| 682 | memcpy(ctx->pk, pk, 32); memcpy(ctx->sk, sk, 32); | 1263 | memcpy(ctx->pk, pk, 32); memcpy(ctx->sk, sk, 32); |
| 683 | ctx->relay = relay; | 1264 | ctx->relay = relay; |
| 684 | LaunchThread(BtfStratumAcceptOneFn, ctx); | 1265 | uintptr_t tid = _beginthread(AcceptOneFn, 0, ctx); |
| 1266 | if (tid == (uintptr_t)-1) { | ||
| 1267 | delete ctx; | ||
| 1268 | LogPrint("pool", "[pool] failed to spawn accept thread for %s\n", | ||
| 1269 | relay.c_str()); | ||
| 1270 | } else { | ||
| 1271 | spawned.insert(relay); | ||
| 1272 | LogPrint("pool", "[pool] accept thread spawned for relay %s" | ||
| 1273 | " (%zu total)\n", relay.c_str(), spawned.size()); | ||
| 1274 | } | ||
| 685 | } | 1275 | } |
| 686 | } | 1276 | } |
| 687 | for (int i = 0; i < 30 && !fShutdown && gPoolRunning; i++) Sleep(1000); | 1277 | // Re-poll every 60s -- newly discovered relays get picked up |
| 1278 | for (int i = 0; i < 60 && !fShutdown && gPoolRunning; i++) Sleep(1000); | ||
| 688 | } | 1279 | } |
| 689 | } | 1280 | } |
| 1281 | |||
| 1282 | // --------------------------------------------------------------------------- | ||
| 1283 | // Entry point | ||
| 1284 | // --------------------------------------------------------------------------- | ||
| 690 | void ThreadRPCServer(void*) | 1285 | void ThreadRPCServer(void*) |
| 691 | { | 1286 | { |
| 692 | gPoolRunning = true; | 1287 | gPoolRunning = true; |
| 693 | printf("Bitflash pool server starting\n"); | ||
| 694 | printf(" Stratum .btf: %s (no port forwarding needed)\n", | ||
| 695 | BtfLocalAddress().c_str()); | ||
| 696 | printf(" Mode: operator\n"); | ||
| 697 | 1288 | ||
| 698 | if (RebuildJob()) | 1289 | LogPrint("pool", "[pool] ============================================\n"); |
| 699 | printf("Stratum: initial job seeded height=%d\n", nBestHeight + 1); | 1290 | LogPrint("pool", "[pool] Pool server starting\n"); |
| 1291 | LogPrint("pool", "[pool] .btf address: %s\n", BtfLocalAddress().c_str()); | ||
| 1292 | LogPrint("pool", "[pool] fee: %.2f%%\n", dPoolFeePercent); | ||
| 1293 | |||
| 1294 | if (RebuildJob()) { | ||
| 1295 | LogPrint("pool", "[pool] initial job %s seeded at height %d\n", | ||
| 1296 | gCurrentJob.jobId.c_str(), nBestHeight + 1); | ||
| 1297 | } else { | ||
| 1298 | LogPrint("pool", "[pool] no chain tip yet -- job will build on first block\n"); | ||
| 1299 | } | ||
| 1300 | |||
| 1301 | LoadPendingPayouts(); | ||
| 1302 | |||
| 1303 | _beginthread(AcceptLoopFn, 0, NULL); | ||
| 1304 | _beginthread(ThreadBtfPoolAnnouncer, 0, NULL); | ||
| 1305 | _beginthread(PayoutThreadFn, 0, NULL); | ||
| 700 | 1306 | ||
| 701 | LaunchThread(JobWatcherFn, NULL); | 1307 | PoolEventLoop(); // blocks until gPoolRunning = false or fShutdown |
| 702 | LaunchThread(BtfStratumAcceptFn, NULL); | ||
| 703 | LaunchThread(ThreadBtfPoolAnnouncer, NULL); | ||
| 704 | 1308 | ||
| 705 | while (!fShutdown && gPoolRunning) | 1309 | LogPrint("pool", "[pool] pool server stopped\n"); |
| 706 | Sleep(1000); | 1310 | LogPrint("pool", "[pool] ============================================\n"); |
| 707 | printf("Pool server stopped\n"); | 1311 | gPoolRunning = false; |
| 708 | } | 1312 | } |
diff --git a/src/ui.rc b/src/ui.rc deleted file mode 100644 index ec8b142..0000000 --- a/src/ui.rc +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | bitcoin ICON "rc/bitcoin.ico" | ||
| 2 | |||
| 3 | #include "wx/msw/wx.rc" | ||
| 4 | |||
| 5 | check ICON "rc/check.ico" | ||
| 6 | send16 BITMAP "rc/send16.bmp" | ||
| 7 | send16mask BITMAP "rc/send16mask.bmp" | ||
| 8 | send16masknoshadow BITMAP "rc/send16masknoshadow.bmp" | ||
| 9 | send20 BITMAP "rc/send20.bmp" | ||
| 10 | send20mask BITMAP "rc/send20mask.bmp" | ||
| 11 | addressbook16 BITMAP "rc/addressbook16.bmp" | ||
| 12 | addressbook16mask BITMAP "rc/addressbook16mask.bmp" | ||
| 13 | addressbook20 BITMAP "rc/addressbook20.bmp" | ||
| 14 | addressbook20mask BITMAP "rc/addressbook20mask.bmp" | ||
diff --git a/src/uiproject.fbp b/src/uiproject.fbp deleted file mode 100644 index 57a2950..0000000 --- a/src/uiproject.fbp +++ /dev/null | |||
| @@ -1,11825 +0,0 @@ | |||
| 1 | <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | ||
| 2 | <wxFormBuilder_Project> | ||
| 3 | <FileVersion major="1" minor="9" /> | ||
| 4 | <object class="Project" expanded="1"> | ||
| 5 | <property name="class_decoration"></property> | ||
| 6 | <property name="code_generation">C++</property> | ||
| 7 | <property name="disconnect_events">1</property> | ||
| 8 | <property name="encoding">UTF-8</property> | ||
| 9 | <property name="event_generation">connect</property> | ||
| 10 | <property name="file">uibase</property> | ||
| 11 | <property name="first_id">1000</property> | ||
| 12 | <property name="help_provider">none</property> | ||
| 13 | <property name="internationalize">0</property> | ||
| 14 | <property name="name"></property> | ||
| 15 | <property name="namespace"></property> | ||
| 16 | <property name="path">.</property> | ||
| 17 | <property name="precompiled_header"></property> | ||
| 18 | <property name="relative_path">1</property> | ||
| 19 | <property name="use_enum">0</property> | ||
| 20 | <property name="use_microsoft_bom">0</property> | ||
| 21 | <object class="Frame" expanded="0"> | ||
| 22 | <property name="bg">wxSYS_COLOUR_BTNFACE</property> | ||
| 23 | <property name="center"></property> | ||
| 24 | <property name="context_help"></property> | ||
| 25 | <property name="enabled">1</property> | ||
| 26 | <property name="extra_style"></property> | ||
| 27 | <property name="fg"></property> | ||
| 28 | <property name="font"></property> | ||
| 29 | <property name="hidden">0</property> | ||
| 30 | <property name="id">wxID_MAINFRAME</property> | ||
| 31 | <property name="maximum_size"></property> | ||
| 32 | <property name="minimum_size"></property> | ||
| 33 | <property name="name">CMainFrameBase</property> | ||
| 34 | <property name="pos"></property> | ||
| 35 | <property name="size">705,484</property> | ||
| 36 | <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property> | ||
| 37 | <property name="subclass"></property> | ||
| 38 | <property name="title">Bitcoin</property> | ||
| 39 | <property name="tooltip"></property> | ||
| 40 | <property name="window_extra_style"></property> | ||
| 41 | <property name="window_name"></property> | ||
| 42 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 43 | <property name="xrc_skip_sizer">1</property> | ||
| 44 | <event name="OnActivate"></event> | ||
| 45 | <event name="OnActivateApp"></event> | ||
| 46 | <event name="OnChar"></event> | ||
| 47 | <event name="OnClose">OnClose</event> | ||
| 48 | <event name="OnEnterWindow"></event> | ||
| 49 | <event name="OnEraseBackground"></event> | ||
| 50 | <event name="OnHibernate"></event> | ||
| 51 | <event name="OnIconize"></event> | ||
| 52 | <event name="OnIdle">OnIdle</event> | ||
| 53 | <event name="OnKeyDown"></event> | ||
| 54 | <event name="OnKeyUp"></event> | ||
| 55 | <event name="OnKillFocus"></event> | ||
| 56 | <event name="OnLeaveWindow"></event> | ||
| 57 | <event name="OnLeftDClick"></event> | ||
| 58 | <event name="OnLeftDown"></event> | ||
| 59 | <event name="OnLeftUp"></event> | ||
| 60 | <event name="OnMiddleDClick"></event> | ||
| 61 | <event name="OnMiddleDown"></event> | ||
| 62 | <event name="OnMiddleUp"></event> | ||
| 63 | <event name="OnMotion"></event> | ||
| 64 | <event name="OnMouseEvents">OnMouseEvents</event> | ||
| 65 | <event name="OnMouseWheel"></event> | ||
| 66 | <event name="OnPaint">OnPaint</event> | ||
| 67 | <event name="OnRightDClick"></event> | ||
| 68 | <event name="OnRightDown"></event> | ||
| 69 | <event name="OnRightUp"></event> | ||
| 70 | <event name="OnSetFocus"></event> | ||
| 71 | <event name="OnSize"></event> | ||
| 72 | <event name="OnUpdateUI"></event> | ||
| 73 | <object class="wxMenuBar" expanded="1"> | ||
| 74 | <property name="bg">240,240,240</property> | ||
| 75 | <property name="context_help"></property> | ||
| 76 | <property name="enabled">1</property> | ||
| 77 | <property name="fg"></property> | ||
| 78 | <property name="font"></property> | ||
| 79 | <property name="hidden">0</property> | ||
| 80 | <property name="id">wxID_ANY</property> | ||
| 81 | <property name="label">MyMenuBar</property> | ||
| 82 | <property name="maximum_size"></property> | ||
| 83 | <property name="minimum_size"></property> | ||
| 84 | <property name="name">m_menubar</property> | ||
| 85 | <property name="permission">protected</property> | ||
| 86 | <property name="pos"></property> | ||
| 87 | <property name="size"></property> | ||
| 88 | <property name="style"></property> | ||
| 89 | <property name="subclass"></property> | ||
| 90 | <property name="tooltip"></property> | ||
| 91 | <property name="window_extra_style"></property> | ||
| 92 | <property name="window_name"></property> | ||
| 93 | <property name="window_style"></property> | ||
| 94 | <event name="OnChar"></event> | ||
| 95 | <event name="OnEnterWindow"></event> | ||
| 96 | <event name="OnEraseBackground"></event> | ||
| 97 | <event name="OnKeyDown"></event> | ||
| 98 | <event name="OnKeyUp"></event> | ||
| 99 | <event name="OnKillFocus"></event> | ||
| 100 | <event name="OnLeaveWindow"></event> | ||
| 101 | <event name="OnLeftDClick"></event> | ||
| 102 | <event name="OnLeftDown"></event> | ||
| 103 | <event name="OnLeftUp"></event> | ||
| 104 | <event name="OnMiddleDClick"></event> | ||
| 105 | <event name="OnMiddleDown"></event> | ||
| 106 | <event name="OnMiddleUp"></event> | ||
| 107 | <event name="OnMotion"></event> | ||
| 108 | <event name="OnMouseEvents"></event> | ||
| 109 | <event name="OnMouseWheel"></event> | ||
| 110 | <event name="OnPaint"></event> | ||
| 111 | <event name="OnRightDClick"></event> | ||
| 112 | <event name="OnRightDown"></event> | ||
| 113 | <event name="OnRightUp"></event> | ||
| 114 | <event name="OnSetFocus"></event> | ||
| 115 | <event name="OnSize"></event> | ||
| 116 | <event name="OnUpdateUI"></event> | ||
| 117 | <object class="wxMenu" expanded="1"> | ||
| 118 | <property name="label">&File</property> | ||
| 119 | <property name="name">m_menuFile</property> | ||
| 120 | <property name="permission">protected</property> | ||
| 121 | <object class="wxMenuItem" expanded="1"> | ||
| 122 | <property name="bitmap"></property> | ||
| 123 | <property name="checked">0</property> | ||
| 124 | <property name="enabled">1</property> | ||
| 125 | <property name="help"></property> | ||
| 126 | <property name="id">wxID_ANY</property> | ||
| 127 | <property name="kind">wxITEM_NORMAL</property> | ||
| 128 | <property name="label">E&xit</property> | ||
| 129 | <property name="name">m_menuFileExit</property> | ||
| 130 | <property name="permission">none</property> | ||
| 131 | <property name="shortcut"></property> | ||
| 132 | <property name="unchecked_bitmap"></property> | ||
| 133 | <event name="OnMenuSelection">OnMenuFileExit</event> | ||
| 134 | <event name="OnUpdateUI"></event> | ||
| 135 | </object> | ||
| 136 | </object> | ||
| 137 | <object class="wxMenu" expanded="1"> | ||
| 138 | <property name="label">&Options</property> | ||
| 139 | <property name="name">m_menuOptions</property> | ||
| 140 | <property name="permission">public</property> | ||
| 141 | <object class="wxMenuItem" expanded="1"> | ||
| 142 | <property name="bitmap"></property> | ||
| 143 | <property name="checked">0</property> | ||
| 144 | <property name="enabled">1</property> | ||
| 145 | <property name="help"></property> | ||
| 146 | <property name="id">wxID_OPTIONSGENERATEBITCOINS</property> | ||
| 147 | <property name="kind">wxITEM_CHECK</property> | ||
| 148 | <property name="label">&Generate Coins</property> | ||
| 149 | <property name="name">m_menuOptionsGenerateBitcoins</property> | ||
| 150 | <property name="permission">none</property> | ||
| 151 | <property name="shortcut"></property> | ||
| 152 | <property name="unchecked_bitmap"></property> | ||
| 153 | <event name="OnMenuSelection">OnMenuOptionsGenerate</event> | ||
| 154 | <event name="OnUpdateUI"></event> | ||
| 155 | </object> | ||
| 156 | <object class="wxMenuItem" expanded="1"> | ||
| 157 | <property name="bitmap"></property> | ||
| 158 | <property name="checked">0</property> | ||
| 159 | <property name="enabled">1</property> | ||
| 160 | <property name="help"></property> | ||
| 161 | <property name="id">wxID_ANY</property> | ||
| 162 | <property name="kind">wxITEM_NORMAL</property> | ||
| 163 | <property name="label">&Options...</property> | ||
| 164 | <property name="name">m_menuOptionsOptions</property> | ||
| 165 | <property name="permission">none</property> | ||
| 166 | <property name="shortcut"></property> | ||
| 167 | <property name="unchecked_bitmap"></property> | ||
| 168 | <event name="OnMenuSelection">OnMenuOptionsOptions</event> | ||
| 169 | <event name="OnUpdateUI"></event> | ||
| 170 | </object> | ||
| 171 | </object> | ||
| 172 | <object class="wxMenu" expanded="1"> | ||
| 173 | <property name="label">&Help</property> | ||
| 174 | <property name="name">m_menuHelp</property> | ||
| 175 | <property name="permission">protected</property> | ||
| 176 | <object class="wxMenuItem" expanded="1"> | ||
| 177 | <property name="bitmap"></property> | ||
| 178 | <property name="checked">0</property> | ||
| 179 | <property name="enabled">1</property> | ||
| 180 | <property name="help"></property> | ||
| 181 | <property name="id">wxID_ANY</property> | ||
| 182 | <property name="kind">wxITEM_NORMAL</property> | ||
| 183 | <property name="label">&About...</property> | ||
| 184 | <property name="name">m_menuHelpAbout</property> | ||
| 185 | <property name="permission">none</property> | ||
| 186 | <property name="shortcut"></property> | ||
| 187 | <property name="unchecked_bitmap"></property> | ||
| 188 | <event name="OnMenuSelection">OnMenuHelpAbout</event> | ||
| 189 | <event name="OnUpdateUI"></event> | ||
| 190 | </object> | ||
| 191 | </object> | ||
| 192 | </object> | ||
| 193 | <object class="wxToolBar" expanded="0"> | ||
| 194 | <property name="bg"></property> | ||
| 195 | <property name="bitmapsize">20,20</property> | ||
| 196 | <property name="context_help"></property> | ||
| 197 | <property name="enabled">1</property> | ||
| 198 | <property name="fg"></property> | ||
| 199 | <property name="font">,90,90,-1,70,0</property> | ||
| 200 | <property name="hidden">0</property> | ||
| 201 | <property name="id">wxID_ANY</property> | ||
| 202 | <property name="margins"></property> | ||
| 203 | <property name="maximum_size"></property> | ||
| 204 | <property name="minimum_size"></property> | ||
| 205 | <property name="name">m_toolBar</property> | ||
| 206 | <property name="packing">1</property> | ||
| 207 | <property name="permission">protected</property> | ||
| 208 | <property name="pos"></property> | ||
| 209 | <property name="separation">1</property> | ||
| 210 | <property name="size">-1,-1</property> | ||
| 211 | <property name="style">wxTB_FLAT|wxTB_HORZ_TEXT</property> | ||
| 212 | <property name="subclass"></property> | ||
| 213 | <property name="tooltip"></property> | ||
| 214 | <property name="window_extra_style"></property> | ||
| 215 | <property name="window_name"></property> | ||
| 216 | <property name="window_style"></property> | ||
| 217 | <event name="OnChar"></event> | ||
| 218 | <event name="OnEnterWindow"></event> | ||
| 219 | <event name="OnEraseBackground"></event> | ||
| 220 | <event name="OnKeyDown"></event> | ||
| 221 | <event name="OnKeyUp"></event> | ||
| 222 | <event name="OnKillFocus"></event> | ||
| 223 | <event name="OnLeaveWindow"></event> | ||
| 224 | <event name="OnLeftDClick"></event> | ||
| 225 | <event name="OnLeftDown"></event> | ||
| 226 | <event name="OnLeftUp"></event> | ||
| 227 | <event name="OnMiddleDClick"></event> | ||
| 228 | <event name="OnMiddleDown"></event> | ||
| 229 | <event name="OnMiddleUp"></event> | ||
| 230 | <event name="OnMotion"></event> | ||
| 231 | <event name="OnMouseEvents"></event> | ||
| 232 | <event name="OnMouseWheel"></event> | ||
| 233 | <event name="OnPaint"></event> | ||
| 234 | <event name="OnRightDClick"></event> | ||
| 235 | <event name="OnRightDown"></event> | ||
| 236 | <event name="OnRightUp"></event> | ||
| 237 | <event name="OnSetFocus"></event> | ||
| 238 | <event name="OnSize"></event> | ||
| 239 | <event name="OnUpdateUI"></event> | ||
| 240 | <object class="tool" expanded="1"> | ||
| 241 | <property name="bitmap">send20; Load From Resource</property> | ||
| 242 | <property name="id">wxID_BUTTONSEND</property> | ||
| 243 | <property name="kind">wxITEM_NORMAL</property> | ||
| 244 | <property name="label">&Send Coins</property> | ||
| 245 | <property name="name">m_tool1</property> | ||
| 246 | <property name="statusbar"></property> | ||
| 247 | <property name="tooltip"></property> | ||
| 248 | <event name="OnMenuSelection"></event> | ||
| 249 | <event name="OnToolClicked">OnButtonSend</event> | ||
| 250 | <event name="OnToolEnter"></event> | ||
| 251 | <event name="OnToolRClicked"></event> | ||
| 252 | <event name="OnUpdateUI"></event> | ||
| 253 | </object> | ||
| 254 | <object class="tool" expanded="1"> | ||
| 255 | <property name="bitmap">addressbook20; Load From Resource</property> | ||
| 256 | <property name="id">wxID_BUTTONRECEIVE</property> | ||
| 257 | <property name="kind">wxITEM_NORMAL</property> | ||
| 258 | <property name="label">&Address Book</property> | ||
| 259 | <property name="name">m_tool2</property> | ||
| 260 | <property name="statusbar"></property> | ||
| 261 | <property name="tooltip"></property> | ||
| 262 | <event name="OnMenuSelection"></event> | ||
| 263 | <event name="OnToolClicked">OnButtonAddressBook</event> | ||
| 264 | <event name="OnToolEnter"></event> | ||
| 265 | <event name="OnToolRClicked"></event> | ||
| 266 | <event name="OnUpdateUI"></event> | ||
| 267 | </object> | ||
| 268 | </object> | ||
| 269 | <object class="wxStatusBar" expanded="1"> | ||
| 270 | <property name="bg">240,240,240</property> | ||
| 271 | <property name="context_help"></property> | ||
| 272 | <property name="enabled">1</property> | ||
| 273 | <property name="fg"></property> | ||
| 274 | <property name="fields">1</property> | ||
| 275 | <property name="font"></property> | ||
| 276 | <property name="hidden">0</property> | ||
| 277 | <property name="id">wxID_ANY</property> | ||
| 278 | <property name="maximum_size"></property> | ||
| 279 | <property name="minimum_size"></property> | ||
| 280 | <property name="name">m_statusBar</property> | ||
| 281 | <property name="permission">protected</property> | ||
| 282 | <property name="pos"></property> | ||
| 283 | <property name="size"></property> | ||
| 284 | <property name="style">wxST_SIZEGRIP</property> | ||
| 285 | <property name="subclass"></property> | ||
| 286 | <property name="tooltip"></property> | ||
| 287 | <property name="window_extra_style"></property> | ||
| 288 | <property name="window_name"></property> | ||
| 289 | <property name="window_style"></property> | ||
| 290 | <event name="OnChar"></event> | ||
| 291 | <event name="OnEnterWindow"></event> | ||
| 292 | <event name="OnEraseBackground"></event> | ||
| 293 | <event name="OnKeyDown"></event> | ||
| 294 | <event name="OnKeyUp"></event> | ||
| 295 | <event name="OnKillFocus"></event> | ||
| 296 | <event name="OnLeaveWindow"></event> | ||
| 297 | <event name="OnLeftDClick"></event> | ||
| 298 | <event name="OnLeftDown"></event> | ||
| 299 | <event name="OnLeftUp"></event> | ||
| 300 | <event name="OnMiddleDClick"></event> | ||
| 301 | <event name="OnMiddleDown"></event> | ||
| 302 | <event name="OnMiddleUp"></event> | ||
| 303 | <event name="OnMotion"></event> | ||
| 304 | <event name="OnMouseEvents"></event> | ||
| 305 | <event name="OnMouseWheel"></event> | ||
| 306 | <event name="OnPaint"></event> | ||
| 307 | <event name="OnRightDClick"></event> | ||
| 308 | <event name="OnRightDown"></event> | ||
| 309 | <event name="OnRightUp"></event> | ||
| 310 | <event name="OnSetFocus"></event> | ||
| 311 | <event name="OnSize"></event> | ||
| 312 | <event name="OnUpdateUI"></event> | ||
| 313 | </object> | ||
| 314 | <object class="wxBoxSizer" expanded="0"> | ||
| 315 | <property name="minimum_size"></property> | ||
| 316 | <property name="name">bSizer2</property> | ||
| 317 | <property name="orient">wxVERTICAL</property> | ||
| 318 | <property name="permission">none</property> | ||
| 319 | <object class="sizeritem" expanded="1"> | ||
| 320 | <property name="border">5</property> | ||
| 321 | <property name="flag">wxEXPAND</property> | ||
| 322 | <property name="proportion">0</property> | ||
| 323 | <object class="spacer" expanded="1"> | ||
| 324 | <property name="height">2</property> | ||
| 325 | <property name="permission">protected</property> | ||
| 326 | <property name="width">0</property> | ||
| 327 | </object> | ||
| 328 | </object> | ||
| 329 | <object class="sizeritem" expanded="1"> | ||
| 330 | <property name="border">5</property> | ||
| 331 | <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property> | ||
| 332 | <property name="proportion">0</property> | ||
| 333 | <object class="wxBoxSizer" expanded="1"> | ||
| 334 | <property name="minimum_size"></property> | ||
| 335 | <property name="name">bSizer85</property> | ||
| 336 | <property name="orient">wxHORIZONTAL</property> | ||
| 337 | <property name="permission">none</property> | ||
| 338 | <object class="sizeritem" expanded="1"> | ||
| 339 | <property name="border">5</property> | ||
| 340 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> | ||
| 341 | <property name="proportion">0</property> | ||
| 342 | <object class="wxStaticText" expanded="1"> | ||
| 343 | <property name="bg"></property> | ||
| 344 | <property name="context_help"></property> | ||
| 345 | <property name="enabled">1</property> | ||
| 346 | <property name="fg"></property> | ||
| 347 | <property name="font"></property> | ||
| 348 | <property name="hidden">0</property> | ||
| 349 | <property name="id">wxID_ANY</property> | ||
| 350 | <property name="label">Your Bitcoin Address:</property> | ||
| 351 | <property name="maximum_size"></property> | ||
| 352 | <property name="minimum_size"></property> | ||
| 353 | <property name="name">m_staticText32</property> | ||
| 354 | <property name="permission">protected</property> | ||
| 355 | <property name="pos"></property> | ||
| 356 | <property name="size"></property> | ||
| 357 | <property name="style"></property> | ||
| 358 | <property name="subclass"></property> | ||
| 359 | <property name="tooltip"></property> | ||
| 360 | <property name="window_extra_style"></property> | ||
| 361 | <property name="window_name"></property> | ||
| 362 | <property name="window_style"></property> | ||
| 363 | <property name="wrap">-1</property> | ||
| 364 | <event name="OnChar"></event> | ||
| 365 | <event name="OnEnterWindow"></event> | ||
| 366 | <event name="OnEraseBackground"></event> | ||
| 367 | <event name="OnKeyDown"></event> | ||
| 368 | <event name="OnKeyUp"></event> | ||
| 369 | <event name="OnKillFocus"></event> | ||
| 370 | <event name="OnLeaveWindow"></event> | ||
| 371 | <event name="OnLeftDClick"></event> | ||
| 372 | <event name="OnLeftDown"></event> | ||
| 373 | <event name="OnLeftUp"></event> | ||
| 374 | <event name="OnMiddleDClick"></event> | ||
| 375 | <event name="OnMiddleDown"></event> | ||
| 376 | <event name="OnMiddleUp"></event> | ||
| 377 | <event name="OnMotion"></event> | ||
| 378 | <event name="OnMouseEvents"></event> | ||
| 379 | <event name="OnMouseWheel"></event> | ||
| 380 | <event name="OnPaint"></event> | ||
| 381 | <event name="OnRightDClick"></event> | ||
| 382 | <event name="OnRightDown"></event> | ||
| 383 | <event name="OnRightUp"></event> | ||
| 384 | <event name="OnSetFocus"></event> | ||
| 385 | <event name="OnSize"></event> | ||
| 386 | <event name="OnUpdateUI"></event> | ||
| 387 | </object> | ||
| 388 | </object> | ||
| 389 | <object class="sizeritem" expanded="1"> | ||
| 390 | <property name="border">5</property> | ||
| 391 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 392 | <property name="proportion">0</property> | ||
| 393 | <object class="wxTextCtrl" expanded="1"> | ||
| 394 | <property name="bg">wxSYS_COLOUR_MENU</property> | ||
| 395 | <property name="context_help"></property> | ||
| 396 | <property name="enabled">1</property> | ||
| 397 | <property name="fg"></property> | ||
| 398 | <property name="font"></property> | ||
| 399 | <property name="hidden">0</property> | ||
| 400 | <property name="id">wxID_TEXTCTRLADDRESS</property> | ||
| 401 | <property name="maximum_size">-1,-1</property> | ||
| 402 | <property name="maxlength">0</property> | ||
| 403 | <property name="minimum_size">-1,-1</property> | ||
| 404 | <property name="name">m_textCtrlAddress</property> | ||
| 405 | <property name="permission">protected</property> | ||
| 406 | <property name="pos"></property> | ||
| 407 | <property name="size">250,-1</property> | ||
| 408 | <property name="style">wxTE_READONLY</property> | ||
| 409 | <property name="subclass"></property> | ||
| 410 | <property name="tooltip"></property> | ||
| 411 | <property name="value"></property> | ||
| 412 | <property name="window_extra_style"></property> | ||
| 413 | <property name="window_name"></property> | ||
| 414 | <property name="window_style"></property> | ||
| 415 | <event name="OnChar"></event> | ||
| 416 | <event name="OnEnterWindow"></event> | ||
| 417 | <event name="OnEraseBackground"></event> | ||
| 418 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 419 | <event name="OnKeyUp"></event> | ||
| 420 | <event name="OnKillFocus"></event> | ||
| 421 | <event name="OnLeaveWindow"></event> | ||
| 422 | <event name="OnLeftDClick"></event> | ||
| 423 | <event name="OnLeftDown"></event> | ||
| 424 | <event name="OnLeftUp"></event> | ||
| 425 | <event name="OnMiddleDClick"></event> | ||
| 426 | <event name="OnMiddleDown"></event> | ||
| 427 | <event name="OnMiddleUp"></event> | ||
| 428 | <event name="OnMotion"></event> | ||
| 429 | <event name="OnMouseEvents">OnMouseEventsAddress</event> | ||
| 430 | <event name="OnMouseWheel"></event> | ||
| 431 | <event name="OnPaint"></event> | ||
| 432 | <event name="OnRightDClick"></event> | ||
| 433 | <event name="OnRightDown"></event> | ||
| 434 | <event name="OnRightUp"></event> | ||
| 435 | <event name="OnSetFocus">OnSetFocusAddress</event> | ||
| 436 | <event name="OnSize"></event> | ||
| 437 | <event name="OnText"></event> | ||
| 438 | <event name="OnTextEnter"></event> | ||
| 439 | <event name="OnTextMaxLen"></event> | ||
| 440 | <event name="OnTextURL"></event> | ||
| 441 | <event name="OnUpdateUI"></event> | ||
| 442 | </object> | ||
| 443 | </object> | ||
| 444 | <object class="sizeritem" expanded="1"> | ||
| 445 | <property name="border">5</property> | ||
| 446 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> | ||
| 447 | <property name="proportion">0</property> | ||
| 448 | <object class="wxButton" expanded="1"> | ||
| 449 | <property name="bg"></property> | ||
| 450 | <property name="context_help"></property> | ||
| 451 | <property name="default">0</property> | ||
| 452 | <property name="enabled">1</property> | ||
| 453 | <property name="fg"></property> | ||
| 454 | <property name="font"></property> | ||
| 455 | <property name="hidden">0</property> | ||
| 456 | <property name="id">wxID_BUTTONCOPY</property> | ||
| 457 | <property name="label">&Copy to Clipboard</property> | ||
| 458 | <property name="maximum_size"></property> | ||
| 459 | <property name="minimum_size"></property> | ||
| 460 | <property name="name">m_buttonCopy</property> | ||
| 461 | <property name="permission">protected</property> | ||
| 462 | <property name="pos"></property> | ||
| 463 | <property name="size"></property> | ||
| 464 | <property name="style">wxBU_EXACTFIT</property> | ||
| 465 | <property name="subclass"></property> | ||
| 466 | <property name="tooltip"></property> | ||
| 467 | <property name="window_extra_style"></property> | ||
| 468 | <property name="window_name"></property> | ||
| 469 | <property name="window_style"></property> | ||
| 470 | <event name="OnButtonClick">OnButtonCopy</event> | ||
| 471 | <event name="OnChar"></event> | ||
| 472 | <event name="OnEnterWindow"></event> | ||
| 473 | <event name="OnEraseBackground"></event> | ||
| 474 | <event name="OnKeyDown"></event> | ||
| 475 | <event name="OnKeyUp"></event> | ||
| 476 | <event name="OnKillFocus"></event> | ||
| 477 | <event name="OnLeaveWindow"></event> | ||
| 478 | <event name="OnLeftDClick"></event> | ||
| 479 | <event name="OnLeftDown"></event> | ||
| 480 | <event name="OnLeftUp"></event> | ||
| 481 | <event name="OnMiddleDClick"></event> | ||
| 482 | <event name="OnMiddleDown"></event> | ||
| 483 | <event name="OnMiddleUp"></event> | ||
| 484 | <event name="OnMotion"></event> | ||
| 485 | <event name="OnMouseEvents"></event> | ||
| 486 | <event name="OnMouseWheel"></event> | ||
| 487 | <event name="OnPaint"></event> | ||
| 488 | <event name="OnRightDClick"></event> | ||
| 489 | <event name="OnRightDown"></event> | ||
| 490 | <event name="OnRightUp"></event> | ||
| 491 | <event name="OnSetFocus"></event> | ||
| 492 | <event name="OnSize"></event> | ||
| 493 | <event name="OnUpdateUI"></event> | ||
| 494 | </object> | ||
| 495 | </object> | ||
| 496 | <object class="sizeritem" expanded="1"> | ||
| 497 | <property name="border">5</property> | ||
| 498 | <property name="flag">wxRIGHT</property> | ||
| 499 | <property name="proportion">0</property> | ||
| 500 | <object class="wxButton" expanded="1"> | ||
| 501 | <property name="bg"></property> | ||
| 502 | <property name="context_help"></property> | ||
| 503 | <property name="default">0</property> | ||
| 504 | <property name="enabled">1</property> | ||
| 505 | <property name="fg"></property> | ||
| 506 | <property name="font"></property> | ||
| 507 | <property name="hidden">0</property> | ||
| 508 | <property name="id">wxID_BUTTONCHANGE</property> | ||
| 509 | <property name="label">C&hange...</property> | ||
| 510 | <property name="maximum_size"></property> | ||
| 511 | <property name="minimum_size"></property> | ||
| 512 | <property name="name">m_button91</property> | ||
| 513 | <property name="permission">protected</property> | ||
| 514 | <property name="pos"></property> | ||
| 515 | <property name="size"></property> | ||
| 516 | <property name="style"></property> | ||
| 517 | <property name="subclass"></property> | ||
| 518 | <property name="tooltip"></property> | ||
| 519 | <property name="window_extra_style"></property> | ||
| 520 | <property name="window_name"></property> | ||
| 521 | <property name="window_style"></property> | ||
| 522 | <event name="OnButtonClick">OnButtonChange</event> | ||
| 523 | <event name="OnChar"></event> | ||
| 524 | <event name="OnEnterWindow"></event> | ||
| 525 | <event name="OnEraseBackground"></event> | ||
| 526 | <event name="OnKeyDown"></event> | ||
| 527 | <event name="OnKeyUp"></event> | ||
| 528 | <event name="OnKillFocus"></event> | ||
| 529 | <event name="OnLeaveWindow"></event> | ||
| 530 | <event name="OnLeftDClick"></event> | ||
| 531 | <event name="OnLeftDown"></event> | ||
| 532 | <event name="OnLeftUp"></event> | ||
| 533 | <event name="OnMiddleDClick"></event> | ||
| 534 | <event name="OnMiddleDown"></event> | ||
| 535 | <event name="OnMiddleUp"></event> | ||
| 536 | <event name="OnMotion"></event> | ||
| 537 | <event name="OnMouseEvents"></event> | ||
| 538 | <event name="OnMouseWheel"></event> | ||
| 539 | <event name="OnPaint"></event> | ||
| 540 | <event name="OnRightDClick"></event> | ||
| 541 | <event name="OnRightDown"></event> | ||
| 542 | <event name="OnRightUp"></event> | ||
| 543 | <event name="OnSetFocus"></event> | ||
| 544 | <event name="OnSize"></event> | ||
| 545 | <event name="OnUpdateUI"></event> | ||
| 546 | </object> | ||
| 547 | </object> | ||
| 548 | <object class="sizeritem" expanded="1"> | ||
| 549 | <property name="border">5</property> | ||
| 550 | <property name="flag">wxEXPAND</property> | ||
| 551 | <property name="proportion">0</property> | ||
| 552 | <object class="spacer" expanded="1"> | ||
| 553 | <property name="height">0</property> | ||
| 554 | <property name="permission">protected</property> | ||
| 555 | <property name="width">0</property> | ||
| 556 | </object> | ||
| 557 | </object> | ||
| 558 | </object> | ||
| 559 | </object> | ||
| 560 | <object class="sizeritem" expanded="1"> | ||
| 561 | <property name="border">5</property> | ||
| 562 | <property name="flag">wxEXPAND</property> | ||
| 563 | <property name="proportion">0</property> | ||
| 564 | <object class="wxBoxSizer" expanded="1"> | ||
| 565 | <property name="minimum_size"></property> | ||
| 566 | <property name="name">bSizer3</property> | ||
| 567 | <property name="orient">wxHORIZONTAL</property> | ||
| 568 | <property name="permission">none</property> | ||
| 569 | <object class="sizeritem" expanded="1"> | ||
| 570 | <property name="border">5</property> | ||
| 571 | <property name="flag">wxEXPAND|wxALIGN_BOTTOM|wxALL</property> | ||
| 572 | <property name="proportion">1</property> | ||
| 573 | <object class="wxPanel" expanded="1"> | ||
| 574 | <property name="bg"></property> | ||
| 575 | <property name="context_help"></property> | ||
| 576 | <property name="enabled">1</property> | ||
| 577 | <property name="fg"></property> | ||
| 578 | <property name="font"></property> | ||
| 579 | <property name="hidden">0</property> | ||
| 580 | <property name="id">wxID_ANY</property> | ||
| 581 | <property name="maximum_size"></property> | ||
| 582 | <property name="minimum_size"></property> | ||
| 583 | <property name="name">m_panel14</property> | ||
| 584 | <property name="permission">protected</property> | ||
| 585 | <property name="pos"></property> | ||
| 586 | <property name="size"></property> | ||
| 587 | <property name="subclass"></property> | ||
| 588 | <property name="tooltip"></property> | ||
| 589 | <property name="window_extra_style"></property> | ||
| 590 | <property name="window_name"></property> | ||
| 591 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 592 | <event name="OnChar"></event> | ||
| 593 | <event name="OnEnterWindow"></event> | ||
| 594 | <event name="OnEraseBackground"></event> | ||
| 595 | <event name="OnKeyDown"></event> | ||
| 596 | <event name="OnKeyUp"></event> | ||
| 597 | <event name="OnKillFocus"></event> | ||
| 598 | <event name="OnLeaveWindow"></event> | ||
| 599 | <event name="OnLeftDClick"></event> | ||
| 600 | <event name="OnLeftDown"></event> | ||
| 601 | <event name="OnLeftUp"></event> | ||
| 602 | <event name="OnMiddleDClick"></event> | ||
| 603 | <event name="OnMiddleDown"></event> | ||
| 604 | <event name="OnMiddleUp"></event> | ||
| 605 | <event name="OnMotion"></event> | ||
| 606 | <event name="OnMouseEvents"></event> | ||
| 607 | <event name="OnMouseWheel"></event> | ||
| 608 | <event name="OnPaint"></event> | ||
| 609 | <event name="OnRightDClick"></event> | ||
| 610 | <event name="OnRightDown"></event> | ||
| 611 | <event name="OnRightUp"></event> | ||
| 612 | <event name="OnSetFocus"></event> | ||
| 613 | <event name="OnSize"></event> | ||
| 614 | <event name="OnUpdateUI"></event> | ||
| 615 | <object class="wxBoxSizer" expanded="1"> | ||
| 616 | <property name="minimum_size"></property> | ||
| 617 | <property name="name">bSizer66</property> | ||
| 618 | <property name="orient">wxHORIZONTAL</property> | ||
| 619 | <property name="permission">none</property> | ||
| 620 | <object class="sizeritem" expanded="1"> | ||
| 621 | <property name="border">5</property> | ||
| 622 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 623 | <property name="proportion">0</property> | ||
| 624 | <object class="wxStaticText" expanded="1"> | ||
| 625 | <property name="bg"></property> | ||
| 626 | <property name="context_help"></property> | ||
| 627 | <property name="enabled">1</property> | ||
| 628 | <property name="fg"></property> | ||
| 629 | <property name="font"></property> | ||
| 630 | <property name="hidden">0</property> | ||
| 631 | <property name="id">wxID_ANY</property> | ||
| 632 | <property name="label">Balance:</property> | ||
| 633 | <property name="maximum_size"></property> | ||
| 634 | <property name="minimum_size"></property> | ||
| 635 | <property name="name">m_staticText41</property> | ||
| 636 | <property name="permission">protected</property> | ||
| 637 | <property name="pos"></property> | ||
| 638 | <property name="size">-1,15</property> | ||
| 639 | <property name="style"></property> | ||
| 640 | <property name="subclass"></property> | ||
| 641 | <property name="tooltip"></property> | ||
| 642 | <property name="window_extra_style"></property> | ||
| 643 | <property name="window_name"></property> | ||
| 644 | <property name="window_style"></property> | ||
| 645 | <property name="wrap">-1</property> | ||
| 646 | <event name="OnChar"></event> | ||
| 647 | <event name="OnEnterWindow"></event> | ||
| 648 | <event name="OnEraseBackground"></event> | ||
| 649 | <event name="OnKeyDown"></event> | ||
| 650 | <event name="OnKeyUp"></event> | ||
| 651 | <event name="OnKillFocus"></event> | ||
| 652 | <event name="OnLeaveWindow"></event> | ||
| 653 | <event name="OnLeftDClick"></event> | ||
| 654 | <event name="OnLeftDown"></event> | ||
| 655 | <event name="OnLeftUp"></event> | ||
| 656 | <event name="OnMiddleDClick"></event> | ||
| 657 | <event name="OnMiddleDown"></event> | ||
| 658 | <event name="OnMiddleUp"></event> | ||
| 659 | <event name="OnMotion"></event> | ||
| 660 | <event name="OnMouseEvents"></event> | ||
| 661 | <event name="OnMouseWheel"></event> | ||
| 662 | <event name="OnPaint"></event> | ||
| 663 | <event name="OnRightDClick"></event> | ||
| 664 | <event name="OnRightDown"></event> | ||
| 665 | <event name="OnRightUp"></event> | ||
| 666 | <event name="OnSetFocus"></event> | ||
| 667 | <event name="OnSize"></event> | ||
| 668 | <event name="OnUpdateUI"></event> | ||
| 669 | </object> | ||
| 670 | </object> | ||
| 671 | <object class="sizeritem" expanded="1"> | ||
| 672 | <property name="border">5</property> | ||
| 673 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> | ||
| 674 | <property name="proportion">0</property> | ||
| 675 | <object class="wxStaticText" expanded="1"> | ||
| 676 | <property name="bg">240,240,240</property> | ||
| 677 | <property name="context_help"></property> | ||
| 678 | <property name="enabled">1</property> | ||
| 679 | <property name="fg"></property> | ||
| 680 | <property name="font">,90,90,8,70,0</property> | ||
| 681 | <property name="hidden">0</property> | ||
| 682 | <property name="id">wxID_ANY</property> | ||
| 683 | <property name="label"></property> | ||
| 684 | <property name="maximum_size"></property> | ||
| 685 | <property name="minimum_size"></property> | ||
| 686 | <property name="name">m_staticTextBalance</property> | ||
| 687 | <property name="permission">protected</property> | ||
| 688 | <property name="pos"></property> | ||
| 689 | <property name="size">120,15</property> | ||
| 690 | <property name="style">wxALIGN_RIGHT|wxST_NO_AUTORESIZE</property> | ||
| 691 | <property name="subclass"></property> | ||
| 692 | <property name="tooltip"></property> | ||
| 693 | <property name="window_extra_style"></property> | ||
| 694 | <property name="window_name"></property> | ||
| 695 | <property name="window_style"></property> | ||
| 696 | <property name="wrap">-1</property> | ||
| 697 | <event name="OnChar"></event> | ||
| 698 | <event name="OnEnterWindow"></event> | ||
| 699 | <event name="OnEraseBackground"></event> | ||
| 700 | <event name="OnKeyDown"></event> | ||
| 701 | <event name="OnKeyUp"></event> | ||
| 702 | <event name="OnKillFocus"></event> | ||
| 703 | <event name="OnLeaveWindow"></event> | ||
| 704 | <event name="OnLeftDClick"></event> | ||
| 705 | <event name="OnLeftDown"></event> | ||
| 706 | <event name="OnLeftUp"></event> | ||
| 707 | <event name="OnMiddleDClick"></event> | ||
| 708 | <event name="OnMiddleDown"></event> | ||
| 709 | <event name="OnMiddleUp"></event> | ||
| 710 | <event name="OnMotion"></event> | ||
| 711 | <event name="OnMouseEvents"></event> | ||
| 712 | <event name="OnMouseWheel"></event> | ||
| 713 | <event name="OnPaint"></event> | ||
| 714 | <event name="OnRightDClick"></event> | ||
| 715 | <event name="OnRightDown"></event> | ||
| 716 | <event name="OnRightUp"></event> | ||
| 717 | <event name="OnSetFocus"></event> | ||
| 718 | <event name="OnSize"></event> | ||
| 719 | <event name="OnUpdateUI"></event> | ||
| 720 | </object> | ||
| 721 | </object> | ||
| 722 | </object> | ||
| 723 | </object> | ||
| 724 | </object> | ||
| 725 | <object class="sizeritem" expanded="1"> | ||
| 726 | <property name="border">5</property> | ||
| 727 | <property name="flag">wxEXPAND</property> | ||
| 728 | <property name="proportion">0</property> | ||
| 729 | <object class="spacer" expanded="1"> | ||
| 730 | <property name="height">0</property> | ||
| 731 | <property name="permission">protected</property> | ||
| 732 | <property name="width">0</property> | ||
| 733 | </object> | ||
| 734 | </object> | ||
| 735 | <object class="sizeritem" expanded="1"> | ||
| 736 | <property name="border">5</property> | ||
| 737 | <property name="flag">wxALIGN_BOTTOM|wxTOP|wxRIGHT|wxLEFT</property> | ||
| 738 | <property name="proportion">0</property> | ||
| 739 | <object class="wxChoice" expanded="1"> | ||
| 740 | <property name="bg"></property> | ||
| 741 | <property name="choices">" All" " Sent" " Received" " In Progress"</property> | ||
| 742 | <property name="context_help"></property> | ||
| 743 | <property name="enabled">1</property> | ||
| 744 | <property name="fg"></property> | ||
| 745 | <property name="font"></property> | ||
| 746 | <property name="hidden">1</property> | ||
| 747 | <property name="id">wxID_ANY</property> | ||
| 748 | <property name="maximum_size"></property> | ||
| 749 | <property name="minimum_size"></property> | ||
| 750 | <property name="name">m_choiceFilter</property> | ||
| 751 | <property name="permission">protected</property> | ||
| 752 | <property name="pos"></property> | ||
| 753 | <property name="selection">0</property> | ||
| 754 | <property name="size">110,-1</property> | ||
| 755 | <property name="subclass"></property> | ||
| 756 | <property name="tooltip"></property> | ||
| 757 | <property name="window_extra_style"></property> | ||
| 758 | <property name="window_name"></property> | ||
| 759 | <property name="window_style"></property> | ||
| 760 | <event name="OnChar"></event> | ||
| 761 | <event name="OnChoice"></event> | ||
| 762 | <event name="OnEnterWindow"></event> | ||
| 763 | <event name="OnEraseBackground"></event> | ||
| 764 | <event name="OnKeyDown"></event> | ||
| 765 | <event name="OnKeyUp"></event> | ||
| 766 | <event name="OnKillFocus"></event> | ||
| 767 | <event name="OnLeaveWindow"></event> | ||
| 768 | <event name="OnLeftDClick"></event> | ||
| 769 | <event name="OnLeftDown"></event> | ||
| 770 | <event name="OnLeftUp"></event> | ||
| 771 | <event name="OnMiddleDClick"></event> | ||
| 772 | <event name="OnMiddleDown"></event> | ||
| 773 | <event name="OnMiddleUp"></event> | ||
| 774 | <event name="OnMotion"></event> | ||
| 775 | <event name="OnMouseEvents"></event> | ||
| 776 | <event name="OnMouseWheel"></event> | ||
| 777 | <event name="OnPaint"></event> | ||
| 778 | <event name="OnRightDClick"></event> | ||
| 779 | <event name="OnRightDown"></event> | ||
| 780 | <event name="OnRightUp"></event> | ||
| 781 | <event name="OnSetFocus"></event> | ||
| 782 | <event name="OnSize"></event> | ||
| 783 | <event name="OnUpdateUI"></event> | ||
| 784 | </object> | ||
| 785 | </object> | ||
| 786 | </object> | ||
| 787 | </object> | ||
| 788 | <object class="sizeritem" expanded="1"> | ||
| 789 | <property name="border">5</property> | ||
| 790 | <property name="flag">wxEXPAND</property> | ||
| 791 | <property name="proportion">1</property> | ||
| 792 | <object class="wxNotebook" expanded="1"> | ||
| 793 | <property name="bg"></property> | ||
| 794 | <property name="bitmapsize"></property> | ||
| 795 | <property name="context_help"></property> | ||
| 796 | <property name="enabled">1</property> | ||
| 797 | <property name="fg"></property> | ||
| 798 | <property name="font"></property> | ||
| 799 | <property name="hidden">0</property> | ||
| 800 | <property name="id">wxID_ANY</property> | ||
| 801 | <property name="maximum_size"></property> | ||
| 802 | <property name="minimum_size"></property> | ||
| 803 | <property name="name">m_notebook</property> | ||
| 804 | <property name="permission">protected</property> | ||
| 805 | <property name="pos"></property> | ||
| 806 | <property name="size"></property> | ||
| 807 | <property name="style"></property> | ||
| 808 | <property name="subclass"></property> | ||
| 809 | <property name="tooltip"></property> | ||
| 810 | <property name="window_extra_style"></property> | ||
| 811 | <property name="window_name"></property> | ||
| 812 | <property name="window_style"></property> | ||
| 813 | <event name="OnChar"></event> | ||
| 814 | <event name="OnEnterWindow"></event> | ||
| 815 | <event name="OnEraseBackground"></event> | ||
| 816 | <event name="OnKeyDown"></event> | ||
| 817 | <event name="OnKeyUp"></event> | ||
| 818 | <event name="OnKillFocus"></event> | ||
| 819 | <event name="OnLeaveWindow"></event> | ||
| 820 | <event name="OnLeftDClick"></event> | ||
| 821 | <event name="OnLeftDown"></event> | ||
| 822 | <event name="OnLeftUp"></event> | ||
| 823 | <event name="OnMiddleDClick"></event> | ||
| 824 | <event name="OnMiddleDown"></event> | ||
| 825 | <event name="OnMiddleUp"></event> | ||
| 826 | <event name="OnMotion"></event> | ||
| 827 | <event name="OnMouseEvents"></event> | ||
| 828 | <event name="OnMouseWheel"></event> | ||
| 829 | <event name="OnNotebookPageChanged"></event> | ||
| 830 | <event name="OnNotebookPageChanging"></event> | ||
| 831 | <event name="OnPaint"></event> | ||
| 832 | <event name="OnRightDClick"></event> | ||
| 833 | <event name="OnRightDown"></event> | ||
| 834 | <event name="OnRightUp"></event> | ||
| 835 | <event name="OnSetFocus"></event> | ||
| 836 | <event name="OnSize"></event> | ||
| 837 | <event name="OnUpdateUI"></event> | ||
| 838 | <object class="notebookpage" expanded="1"> | ||
| 839 | <property name="bitmap"></property> | ||
| 840 | <property name="label">All Transactions</property> | ||
| 841 | <property name="select">0</property> | ||
| 842 | <object class="wxPanel" expanded="1"> | ||
| 843 | <property name="bg"></property> | ||
| 844 | <property name="context_help"></property> | ||
| 845 | <property name="enabled">1</property> | ||
| 846 | <property name="fg"></property> | ||
| 847 | <property name="font"></property> | ||
| 848 | <property name="hidden">0</property> | ||
| 849 | <property name="id">wxID_ANY</property> | ||
| 850 | <property name="maximum_size"></property> | ||
| 851 | <property name="minimum_size"></property> | ||
| 852 | <property name="name">m_panel7</property> | ||
| 853 | <property name="permission">protected</property> | ||
| 854 | <property name="pos"></property> | ||
| 855 | <property name="size"></property> | ||
| 856 | <property name="subclass"></property> | ||
| 857 | <property name="tooltip"></property> | ||
| 858 | <property name="window_extra_style"></property> | ||
| 859 | <property name="window_name"></property> | ||
| 860 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 861 | <event name="OnChar"></event> | ||
| 862 | <event name="OnEnterWindow"></event> | ||
| 863 | <event name="OnEraseBackground"></event> | ||
| 864 | <event name="OnKeyDown"></event> | ||
| 865 | <event name="OnKeyUp"></event> | ||
| 866 | <event name="OnKillFocus"></event> | ||
| 867 | <event name="OnLeaveWindow"></event> | ||
| 868 | <event name="OnLeftDClick"></event> | ||
| 869 | <event name="OnLeftDown"></event> | ||
| 870 | <event name="OnLeftUp"></event> | ||
| 871 | <event name="OnMiddleDClick"></event> | ||
| 872 | <event name="OnMiddleDown"></event> | ||
| 873 | <event name="OnMiddleUp"></event> | ||
| 874 | <event name="OnMotion"></event> | ||
| 875 | <event name="OnMouseEvents"></event> | ||
| 876 | <event name="OnMouseWheel"></event> | ||
| 877 | <event name="OnPaint"></event> | ||
| 878 | <event name="OnRightDClick"></event> | ||
| 879 | <event name="OnRightDown"></event> | ||
| 880 | <event name="OnRightUp"></event> | ||
| 881 | <event name="OnSetFocus"></event> | ||
| 882 | <event name="OnSize"></event> | ||
| 883 | <event name="OnUpdateUI"></event> | ||
| 884 | <object class="wxBoxSizer" expanded="1"> | ||
| 885 | <property name="minimum_size"></property> | ||
| 886 | <property name="name">bSizer157</property> | ||
| 887 | <property name="orient">wxVERTICAL</property> | ||
| 888 | <property name="permission">none</property> | ||
| 889 | <object class="sizeritem" expanded="1"> | ||
| 890 | <property name="border">5</property> | ||
| 891 | <property name="flag">wxEXPAND|wxALL</property> | ||
| 892 | <property name="proportion">1</property> | ||
| 893 | <object class="wxListCtrl" expanded="1"> | ||
| 894 | <property name="bg"></property> | ||
| 895 | <property name="context_help"></property> | ||
| 896 | <property name="enabled">1</property> | ||
| 897 | <property name="fg"></property> | ||
| 898 | <property name="font"></property> | ||
| 899 | <property name="hidden">0</property> | ||
| 900 | <property name="id">wxID_ANY</property> | ||
| 901 | <property name="maximum_size"></property> | ||
| 902 | <property name="minimum_size"></property> | ||
| 903 | <property name="name">m_listCtrl</property> | ||
| 904 | <property name="permission">public</property> | ||
| 905 | <property name="pos"></property> | ||
| 906 | <property name="size"></property> | ||
| 907 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_DESCENDING</property> | ||
| 908 | <property name="subclass"></property> | ||
| 909 | <property name="tooltip"></property> | ||
| 910 | <property name="window_extra_style"></property> | ||
| 911 | <property name="window_name"></property> | ||
| 912 | <property name="window_style">wxALWAYS_SHOW_SB</property> | ||
| 913 | <event name="OnChar"></event> | ||
| 914 | <event name="OnEnterWindow"></event> | ||
| 915 | <event name="OnEraseBackground"></event> | ||
| 916 | <event name="OnKeyDown"></event> | ||
| 917 | <event name="OnKeyUp"></event> | ||
| 918 | <event name="OnKillFocus"></event> | ||
| 919 | <event name="OnLeaveWindow"></event> | ||
| 920 | <event name="OnLeftDClick"></event> | ||
| 921 | <event name="OnLeftDown"></event> | ||
| 922 | <event name="OnLeftUp"></event> | ||
| 923 | <event name="OnListBeginDrag"></event> | ||
| 924 | <event name="OnListBeginLabelEdit"></event> | ||
| 925 | <event name="OnListBeginRDrag"></event> | ||
| 926 | <event name="OnListCacheHint"></event> | ||
| 927 | <event name="OnListColBeginDrag">OnListColBeginDrag</event> | ||
| 928 | <event name="OnListColClick"></event> | ||
| 929 | <event name="OnListColDragging"></event> | ||
| 930 | <event name="OnListColEndDrag"></event> | ||
| 931 | <event name="OnListColRightClick"></event> | ||
| 932 | <event name="OnListDeleteAllItems"></event> | ||
| 933 | <event name="OnListDeleteItem"></event> | ||
| 934 | <event name="OnListEndLabelEdit"></event> | ||
| 935 | <event name="OnListInsertItem"></event> | ||
| 936 | <event name="OnListItemActivated">OnListItemActivatedAllTransactions</event> | ||
| 937 | <event name="OnListItemDeselected"></event> | ||
| 938 | <event name="OnListItemFocused"></event> | ||
| 939 | <event name="OnListItemMiddleClick"></event> | ||
| 940 | <event name="OnListItemRightClick"></event> | ||
| 941 | <event name="OnListItemSelected"></event> | ||
| 942 | <event name="OnListKeyDown"></event> | ||
| 943 | <event name="OnMiddleDClick"></event> | ||
| 944 | <event name="OnMiddleDown"></event> | ||
| 945 | <event name="OnMiddleUp"></event> | ||
| 946 | <event name="OnMotion"></event> | ||
| 947 | <event name="OnMouseEvents"></event> | ||
| 948 | <event name="OnMouseWheel"></event> | ||
| 949 | <event name="OnPaint">OnPaintListCtrl</event> | ||
| 950 | <event name="OnRightDClick"></event> | ||
| 951 | <event name="OnRightDown"></event> | ||
| 952 | <event name="OnRightUp"></event> | ||
| 953 | <event name="OnSetFocus"></event> | ||
| 954 | <event name="OnSize"></event> | ||
| 955 | <event name="OnUpdateUI"></event> | ||
| 956 | </object> | ||
| 957 | </object> | ||
| 958 | </object> | ||
| 959 | </object> | ||
| 960 | </object> | ||
| 961 | </object> | ||
| 962 | </object> | ||
| 963 | <object class="sizeritem" expanded="1"> | ||
| 964 | <property name="border">5</property> | ||
| 965 | <property name="flag">wxEXPAND</property> | ||
| 966 | <property name="proportion">1</property> | ||
| 967 | <object class="wxBoxSizer" expanded="1"> | ||
| 968 | <property name="minimum_size"></property> | ||
| 969 | <property name="name">bSizer_TabsForFutureUse</property> | ||
| 970 | <property name="orient">wxVERTICAL</property> | ||
| 971 | <property name="permission">none</property> | ||
| 972 | <object class="sizeritem" expanded="1"> | ||
| 973 | <property name="border">5</property> | ||
| 974 | <property name="flag">wxEXPAND | wxALL</property> | ||
| 975 | <property name="proportion">1</property> | ||
| 976 | <object class="wxPanel" expanded="1"> | ||
| 977 | <property name="bg"></property> | ||
| 978 | <property name="context_help"></property> | ||
| 979 | <property name="enabled">1</property> | ||
| 980 | <property name="fg"></property> | ||
| 981 | <property name="font"></property> | ||
| 982 | <property name="hidden">1</property> | ||
| 983 | <property name="id">wxID_ANY</property> | ||
| 984 | <property name="maximum_size"></property> | ||
| 985 | <property name="minimum_size"></property> | ||
| 986 | <property name="name">m_panel9</property> | ||
| 987 | <property name="permission">protected</property> | ||
| 988 | <property name="pos"></property> | ||
| 989 | <property name="size"></property> | ||
| 990 | <property name="subclass"></property> | ||
| 991 | <property name="tooltip"></property> | ||
| 992 | <property name="window_extra_style"></property> | ||
| 993 | <property name="window_name"></property> | ||
| 994 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 995 | <event name="OnChar"></event> | ||
| 996 | <event name="OnEnterWindow"></event> | ||
| 997 | <event name="OnEraseBackground"></event> | ||
| 998 | <event name="OnKeyDown"></event> | ||
| 999 | <event name="OnKeyUp"></event> | ||
| 1000 | <event name="OnKillFocus"></event> | ||
| 1001 | <event name="OnLeaveWindow"></event> | ||
| 1002 | <event name="OnLeftDClick"></event> | ||
| 1003 | <event name="OnLeftDown"></event> | ||
| 1004 | <event name="OnLeftUp"></event> | ||
| 1005 | <event name="OnMiddleDClick"></event> | ||
| 1006 | <event name="OnMiddleDown"></event> | ||
| 1007 | <event name="OnMiddleUp"></event> | ||
| 1008 | <event name="OnMotion"></event> | ||
| 1009 | <event name="OnMouseEvents"></event> | ||
| 1010 | <event name="OnMouseWheel"></event> | ||
| 1011 | <event name="OnPaint"></event> | ||
| 1012 | <event name="OnRightDClick"></event> | ||
| 1013 | <event name="OnRightDown"></event> | ||
| 1014 | <event name="OnRightUp"></event> | ||
| 1015 | <event name="OnSetFocus"></event> | ||
| 1016 | <event name="OnSize"></event> | ||
| 1017 | <event name="OnUpdateUI"></event> | ||
| 1018 | <object class="wxBoxSizer" expanded="1"> | ||
| 1019 | <property name="minimum_size"></property> | ||
| 1020 | <property name="name">bSizer159</property> | ||
| 1021 | <property name="orient">wxVERTICAL</property> | ||
| 1022 | <property name="permission">none</property> | ||
| 1023 | <object class="sizeritem" expanded="1"> | ||
| 1024 | <property name="border">5</property> | ||
| 1025 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 1026 | <property name="proportion">1</property> | ||
| 1027 | <object class="wxListCtrl" expanded="1"> | ||
| 1028 | <property name="bg"></property> | ||
| 1029 | <property name="context_help"></property> | ||
| 1030 | <property name="enabled">1</property> | ||
| 1031 | <property name="fg"></property> | ||
| 1032 | <property name="font"></property> | ||
| 1033 | <property name="hidden">0</property> | ||
| 1034 | <property name="id">wxID_ANY</property> | ||
| 1035 | <property name="maximum_size"></property> | ||
| 1036 | <property name="minimum_size"></property> | ||
| 1037 | <property name="name">m_listCtrlEscrows</property> | ||
| 1038 | <property name="permission">public</property> | ||
| 1039 | <property name="pos"></property> | ||
| 1040 | <property name="size"></property> | ||
| 1041 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property> | ||
| 1042 | <property name="subclass"></property> | ||
| 1043 | <property name="tooltip"></property> | ||
| 1044 | <property name="window_extra_style"></property> | ||
| 1045 | <property name="window_name"></property> | ||
| 1046 | <property name="window_style"></property> | ||
| 1047 | <event name="OnChar"></event> | ||
| 1048 | <event name="OnEnterWindow"></event> | ||
| 1049 | <event name="OnEraseBackground"></event> | ||
| 1050 | <event name="OnKeyDown"></event> | ||
| 1051 | <event name="OnKeyUp"></event> | ||
| 1052 | <event name="OnKillFocus"></event> | ||
| 1053 | <event name="OnLeaveWindow"></event> | ||
| 1054 | <event name="OnLeftDClick"></event> | ||
| 1055 | <event name="OnLeftDown"></event> | ||
| 1056 | <event name="OnLeftUp"></event> | ||
| 1057 | <event name="OnListBeginDrag"></event> | ||
| 1058 | <event name="OnListBeginLabelEdit"></event> | ||
| 1059 | <event name="OnListBeginRDrag"></event> | ||
| 1060 | <event name="OnListCacheHint"></event> | ||
| 1061 | <event name="OnListColBeginDrag"></event> | ||
| 1062 | <event name="OnListColClick"></event> | ||
| 1063 | <event name="OnListColDragging"></event> | ||
| 1064 | <event name="OnListColEndDrag"></event> | ||
| 1065 | <event name="OnListColRightClick"></event> | ||
| 1066 | <event name="OnListDeleteAllItems"></event> | ||
| 1067 | <event name="OnListDeleteItem"></event> | ||
| 1068 | <event name="OnListEndLabelEdit"></event> | ||
| 1069 | <event name="OnListInsertItem"></event> | ||
| 1070 | <event name="OnListItemActivated"></event> | ||
| 1071 | <event name="OnListItemDeselected"></event> | ||
| 1072 | <event name="OnListItemFocused"></event> | ||
| 1073 | <event name="OnListItemMiddleClick"></event> | ||
| 1074 | <event name="OnListItemRightClick"></event> | ||
| 1075 | <event name="OnListItemSelected"></event> | ||
| 1076 | <event name="OnListKeyDown"></event> | ||
| 1077 | <event name="OnMiddleDClick"></event> | ||
| 1078 | <event name="OnMiddleDown"></event> | ||
| 1079 | <event name="OnMiddleUp"></event> | ||
| 1080 | <event name="OnMotion"></event> | ||
| 1081 | <event name="OnMouseEvents"></event> | ||
| 1082 | <event name="OnMouseWheel"></event> | ||
| 1083 | <event name="OnPaint"></event> | ||
| 1084 | <event name="OnRightDClick"></event> | ||
| 1085 | <event name="OnRightDown"></event> | ||
| 1086 | <event name="OnRightUp"></event> | ||
| 1087 | <event name="OnSetFocus"></event> | ||
| 1088 | <event name="OnSize"></event> | ||
| 1089 | <event name="OnUpdateUI"></event> | ||
| 1090 | </object> | ||
| 1091 | </object> | ||
| 1092 | </object> | ||
| 1093 | </object> | ||
| 1094 | </object> | ||
| 1095 | <object class="sizeritem" expanded="1"> | ||
| 1096 | <property name="border">5</property> | ||
| 1097 | <property name="flag">wxEXPAND | wxALL</property> | ||
| 1098 | <property name="proportion">1</property> | ||
| 1099 | <object class="wxPanel" expanded="1"> | ||
| 1100 | <property name="bg"></property> | ||
| 1101 | <property name="context_help"></property> | ||
| 1102 | <property name="enabled">1</property> | ||
| 1103 | <property name="fg"></property> | ||
| 1104 | <property name="font"></property> | ||
| 1105 | <property name="hidden">1</property> | ||
| 1106 | <property name="id">wxID_ANY</property> | ||
| 1107 | <property name="maximum_size"></property> | ||
| 1108 | <property name="minimum_size"></property> | ||
| 1109 | <property name="name">m_panel8</property> | ||
| 1110 | <property name="permission">protected</property> | ||
| 1111 | <property name="pos"></property> | ||
| 1112 | <property name="size"></property> | ||
| 1113 | <property name="subclass"></property> | ||
| 1114 | <property name="tooltip"></property> | ||
| 1115 | <property name="window_extra_style"></property> | ||
| 1116 | <property name="window_name"></property> | ||
| 1117 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 1118 | <event name="OnChar"></event> | ||
| 1119 | <event name="OnEnterWindow"></event> | ||
| 1120 | <event name="OnEraseBackground"></event> | ||
| 1121 | <event name="OnKeyDown"></event> | ||
| 1122 | <event name="OnKeyUp"></event> | ||
| 1123 | <event name="OnKillFocus"></event> | ||
| 1124 | <event name="OnLeaveWindow"></event> | ||
| 1125 | <event name="OnLeftDClick"></event> | ||
| 1126 | <event name="OnLeftDown"></event> | ||
| 1127 | <event name="OnLeftUp"></event> | ||
| 1128 | <event name="OnMiddleDClick"></event> | ||
| 1129 | <event name="OnMiddleDown"></event> | ||
| 1130 | <event name="OnMiddleUp"></event> | ||
| 1131 | <event name="OnMotion"></event> | ||
| 1132 | <event name="OnMouseEvents"></event> | ||
| 1133 | <event name="OnMouseWheel"></event> | ||
| 1134 | <event name="OnPaint"></event> | ||
| 1135 | <event name="OnRightDClick"></event> | ||
| 1136 | <event name="OnRightDown"></event> | ||
| 1137 | <event name="OnRightUp"></event> | ||
| 1138 | <event name="OnSetFocus"></event> | ||
| 1139 | <event name="OnSize"></event> | ||
| 1140 | <event name="OnUpdateUI"></event> | ||
| 1141 | <object class="wxBoxSizer" expanded="1"> | ||
| 1142 | <property name="minimum_size"></property> | ||
| 1143 | <property name="name">bSizer158</property> | ||
| 1144 | <property name="orient">wxVERTICAL</property> | ||
| 1145 | <property name="permission">none</property> | ||
| 1146 | <object class="sizeritem" expanded="1"> | ||
| 1147 | <property name="border">5</property> | ||
| 1148 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 1149 | <property name="proportion">1</property> | ||
| 1150 | <object class="wxListCtrl" expanded="1"> | ||
| 1151 | <property name="bg"></property> | ||
| 1152 | <property name="context_help"></property> | ||
| 1153 | <property name="enabled">1</property> | ||
| 1154 | <property name="fg"></property> | ||
| 1155 | <property name="font"></property> | ||
| 1156 | <property name="hidden">0</property> | ||
| 1157 | <property name="id">wxID_ANY</property> | ||
| 1158 | <property name="maximum_size"></property> | ||
| 1159 | <property name="minimum_size"></property> | ||
| 1160 | <property name="name">m_listCtrlOrdersSent</property> | ||
| 1161 | <property name="permission">public</property> | ||
| 1162 | <property name="pos"></property> | ||
| 1163 | <property name="size"></property> | ||
| 1164 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property> | ||
| 1165 | <property name="subclass"></property> | ||
| 1166 | <property name="tooltip"></property> | ||
| 1167 | <property name="window_extra_style"></property> | ||
| 1168 | <property name="window_name"></property> | ||
| 1169 | <property name="window_style"></property> | ||
| 1170 | <event name="OnChar"></event> | ||
| 1171 | <event name="OnEnterWindow"></event> | ||
| 1172 | <event name="OnEraseBackground"></event> | ||
| 1173 | <event name="OnKeyDown"></event> | ||
| 1174 | <event name="OnKeyUp"></event> | ||
| 1175 | <event name="OnKillFocus"></event> | ||
| 1176 | <event name="OnLeaveWindow"></event> | ||
| 1177 | <event name="OnLeftDClick"></event> | ||
| 1178 | <event name="OnLeftDown"></event> | ||
| 1179 | <event name="OnLeftUp"></event> | ||
| 1180 | <event name="OnListBeginDrag"></event> | ||
| 1181 | <event name="OnListBeginLabelEdit"></event> | ||
| 1182 | <event name="OnListBeginRDrag"></event> | ||
| 1183 | <event name="OnListCacheHint"></event> | ||
| 1184 | <event name="OnListColBeginDrag"></event> | ||
| 1185 | <event name="OnListColClick"></event> | ||
| 1186 | <event name="OnListColDragging"></event> | ||
| 1187 | <event name="OnListColEndDrag"></event> | ||
| 1188 | <event name="OnListColRightClick"></event> | ||
| 1189 | <event name="OnListDeleteAllItems"></event> | ||
| 1190 | <event name="OnListDeleteItem"></event> | ||
| 1191 | <event name="OnListEndLabelEdit"></event> | ||
| 1192 | <event name="OnListInsertItem"></event> | ||
| 1193 | <event name="OnListItemActivated">OnListItemActivatedOrdersSent</event> | ||
| 1194 | <event name="OnListItemDeselected"></event> | ||
| 1195 | <event name="OnListItemFocused"></event> | ||
| 1196 | <event name="OnListItemMiddleClick"></event> | ||
| 1197 | <event name="OnListItemRightClick"></event> | ||
| 1198 | <event name="OnListItemSelected"></event> | ||
| 1199 | <event name="OnListKeyDown"></event> | ||
| 1200 | <event name="OnMiddleDClick"></event> | ||
| 1201 | <event name="OnMiddleDown"></event> | ||
| 1202 | <event name="OnMiddleUp"></event> | ||
| 1203 | <event name="OnMotion"></event> | ||
| 1204 | <event name="OnMouseEvents"></event> | ||
| 1205 | <event name="OnMouseWheel"></event> | ||
| 1206 | <event name="OnPaint"></event> | ||
| 1207 | <event name="OnRightDClick"></event> | ||
| 1208 | <event name="OnRightDown"></event> | ||
| 1209 | <event name="OnRightUp"></event> | ||
| 1210 | <event name="OnSetFocus"></event> | ||
| 1211 | <event name="OnSize"></event> | ||
| 1212 | <event name="OnUpdateUI"></event> | ||
| 1213 | </object> | ||
| 1214 | </object> | ||
| 1215 | </object> | ||
| 1216 | </object> | ||
| 1217 | </object> | ||
| 1218 | <object class="sizeritem" expanded="1"> | ||
| 1219 | <property name="border">5</property> | ||
| 1220 | <property name="flag">wxEXPAND | wxALL</property> | ||
| 1221 | <property name="proportion">1</property> | ||
| 1222 | <object class="wxPanel" expanded="1"> | ||
| 1223 | <property name="bg"></property> | ||
| 1224 | <property name="context_help"></property> | ||
| 1225 | <property name="enabled">1</property> | ||
| 1226 | <property name="fg"></property> | ||
| 1227 | <property name="font"></property> | ||
| 1228 | <property name="hidden">1</property> | ||
| 1229 | <property name="id">wxID_ANY</property> | ||
| 1230 | <property name="maximum_size"></property> | ||
| 1231 | <property name="minimum_size"></property> | ||
| 1232 | <property name="name">m_panel10</property> | ||
| 1233 | <property name="permission">protected</property> | ||
| 1234 | <property name="pos"></property> | ||
| 1235 | <property name="size"></property> | ||
| 1236 | <property name="subclass"></property> | ||
| 1237 | <property name="tooltip"></property> | ||
| 1238 | <property name="window_extra_style"></property> | ||
| 1239 | <property name="window_name"></property> | ||
| 1240 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 1241 | <event name="OnChar"></event> | ||
| 1242 | <event name="OnEnterWindow"></event> | ||
| 1243 | <event name="OnEraseBackground"></event> | ||
| 1244 | <event name="OnKeyDown"></event> | ||
| 1245 | <event name="OnKeyUp"></event> | ||
| 1246 | <event name="OnKillFocus"></event> | ||
| 1247 | <event name="OnLeaveWindow"></event> | ||
| 1248 | <event name="OnLeftDClick"></event> | ||
| 1249 | <event name="OnLeftDown"></event> | ||
| 1250 | <event name="OnLeftUp"></event> | ||
| 1251 | <event name="OnMiddleDClick"></event> | ||
| 1252 | <event name="OnMiddleDown"></event> | ||
| 1253 | <event name="OnMiddleUp"></event> | ||
| 1254 | <event name="OnMotion"></event> | ||
| 1255 | <event name="OnMouseEvents"></event> | ||
| 1256 | <event name="OnMouseWheel"></event> | ||
| 1257 | <event name="OnPaint"></event> | ||
| 1258 | <event name="OnRightDClick"></event> | ||
| 1259 | <event name="OnRightDown"></event> | ||
| 1260 | <event name="OnRightUp"></event> | ||
| 1261 | <event name="OnSetFocus"></event> | ||
| 1262 | <event name="OnSize"></event> | ||
| 1263 | <event name="OnUpdateUI"></event> | ||
| 1264 | <object class="wxBoxSizer" expanded="1"> | ||
| 1265 | <property name="minimum_size"></property> | ||
| 1266 | <property name="name">bSizer160</property> | ||
| 1267 | <property name="orient">wxVERTICAL</property> | ||
| 1268 | <property name="permission">none</property> | ||
| 1269 | <object class="sizeritem" expanded="1"> | ||
| 1270 | <property name="border">5</property> | ||
| 1271 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 1272 | <property name="proportion">1</property> | ||
| 1273 | <object class="wxListCtrl" expanded="1"> | ||
| 1274 | <property name="bg"></property> | ||
| 1275 | <property name="context_help"></property> | ||
| 1276 | <property name="enabled">1</property> | ||
| 1277 | <property name="fg"></property> | ||
| 1278 | <property name="font"></property> | ||
| 1279 | <property name="hidden">0</property> | ||
| 1280 | <property name="id">wxID_ANY</property> | ||
| 1281 | <property name="maximum_size"></property> | ||
| 1282 | <property name="minimum_size"></property> | ||
| 1283 | <property name="name">m_listCtrlProductsSent</property> | ||
| 1284 | <property name="permission">public</property> | ||
| 1285 | <property name="pos"></property> | ||
| 1286 | <property name="size"></property> | ||
| 1287 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property> | ||
| 1288 | <property name="subclass"></property> | ||
| 1289 | <property name="tooltip"></property> | ||
| 1290 | <property name="window_extra_style"></property> | ||
| 1291 | <property name="window_name"></property> | ||
| 1292 | <property name="window_style"></property> | ||
| 1293 | <event name="OnChar"></event> | ||
| 1294 | <event name="OnEnterWindow"></event> | ||
| 1295 | <event name="OnEraseBackground"></event> | ||
| 1296 | <event name="OnKeyDown"></event> | ||
| 1297 | <event name="OnKeyUp"></event> | ||
| 1298 | <event name="OnKillFocus"></event> | ||
| 1299 | <event name="OnLeaveWindow"></event> | ||
| 1300 | <event name="OnLeftDClick"></event> | ||
| 1301 | <event name="OnLeftDown"></event> | ||
| 1302 | <event name="OnLeftUp"></event> | ||
| 1303 | <event name="OnListBeginDrag"></event> | ||
| 1304 | <event name="OnListBeginLabelEdit"></event> | ||
| 1305 | <event name="OnListBeginRDrag"></event> | ||
| 1306 | <event name="OnListCacheHint"></event> | ||
| 1307 | <event name="OnListColBeginDrag"></event> | ||
| 1308 | <event name="OnListColClick"></event> | ||
| 1309 | <event name="OnListColDragging"></event> | ||
| 1310 | <event name="OnListColEndDrag"></event> | ||
| 1311 | <event name="OnListColRightClick"></event> | ||
| 1312 | <event name="OnListDeleteAllItems"></event> | ||
| 1313 | <event name="OnListDeleteItem"></event> | ||
| 1314 | <event name="OnListEndLabelEdit"></event> | ||
| 1315 | <event name="OnListInsertItem"></event> | ||
| 1316 | <event name="OnListItemActivated">OnListItemActivatedProductsSent</event> | ||
| 1317 | <event name="OnListItemDeselected"></event> | ||
| 1318 | <event name="OnListItemFocused"></event> | ||
| 1319 | <event name="OnListItemMiddleClick"></event> | ||
| 1320 | <event name="OnListItemRightClick"></event> | ||
| 1321 | <event name="OnListItemSelected"></event> | ||
| 1322 | <event name="OnListKeyDown"></event> | ||
| 1323 | <event name="OnMiddleDClick"></event> | ||
| 1324 | <event name="OnMiddleDown"></event> | ||
| 1325 | <event name="OnMiddleUp"></event> | ||
| 1326 | <event name="OnMotion"></event> | ||
| 1327 | <event name="OnMouseEvents"></event> | ||
| 1328 | <event name="OnMouseWheel"></event> | ||
| 1329 | <event name="OnPaint"></event> | ||
| 1330 | <event name="OnRightDClick"></event> | ||
| 1331 | <event name="OnRightDown"></event> | ||
| 1332 | <event name="OnRightUp"></event> | ||
| 1333 | <event name="OnSetFocus"></event> | ||
| 1334 | <event name="OnSize"></event> | ||
| 1335 | <event name="OnUpdateUI"></event> | ||
| 1336 | </object> | ||
| 1337 | </object> | ||
| 1338 | </object> | ||
| 1339 | </object> | ||
| 1340 | </object> | ||
| 1341 | <object class="sizeritem" expanded="1"> | ||
| 1342 | <property name="border">5</property> | ||
| 1343 | <property name="flag">wxEXPAND | wxALL</property> | ||
| 1344 | <property name="proportion">1</property> | ||
| 1345 | <object class="wxPanel" expanded="1"> | ||
| 1346 | <property name="bg"></property> | ||
| 1347 | <property name="context_help"></property> | ||
| 1348 | <property name="enabled">1</property> | ||
| 1349 | <property name="fg"></property> | ||
| 1350 | <property name="font"></property> | ||
| 1351 | <property name="hidden">1</property> | ||
| 1352 | <property name="id">wxID_ANY</property> | ||
| 1353 | <property name="maximum_size"></property> | ||
| 1354 | <property name="minimum_size"></property> | ||
| 1355 | <property name="name">m_panel11</property> | ||
| 1356 | <property name="permission">protected</property> | ||
| 1357 | <property name="pos"></property> | ||
| 1358 | <property name="size"></property> | ||
| 1359 | <property name="subclass"></property> | ||
| 1360 | <property name="tooltip"></property> | ||
| 1361 | <property name="window_extra_style"></property> | ||
| 1362 | <property name="window_name"></property> | ||
| 1363 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 1364 | <event name="OnChar"></event> | ||
| 1365 | <event name="OnEnterWindow"></event> | ||
| 1366 | <event name="OnEraseBackground"></event> | ||
| 1367 | <event name="OnKeyDown"></event> | ||
| 1368 | <event name="OnKeyUp"></event> | ||
| 1369 | <event name="OnKillFocus"></event> | ||
| 1370 | <event name="OnLeaveWindow"></event> | ||
| 1371 | <event name="OnLeftDClick"></event> | ||
| 1372 | <event name="OnLeftDown"></event> | ||
| 1373 | <event name="OnLeftUp"></event> | ||
| 1374 | <event name="OnMiddleDClick"></event> | ||
| 1375 | <event name="OnMiddleDown"></event> | ||
| 1376 | <event name="OnMiddleUp"></event> | ||
| 1377 | <event name="OnMotion"></event> | ||
| 1378 | <event name="OnMouseEvents"></event> | ||
| 1379 | <event name="OnMouseWheel"></event> | ||
| 1380 | <event name="OnPaint"></event> | ||
| 1381 | <event name="OnRightDClick"></event> | ||
| 1382 | <event name="OnRightDown"></event> | ||
| 1383 | <event name="OnRightUp"></event> | ||
| 1384 | <event name="OnSetFocus"></event> | ||
| 1385 | <event name="OnSize"></event> | ||
| 1386 | <event name="OnUpdateUI"></event> | ||
| 1387 | <object class="wxBoxSizer" expanded="1"> | ||
| 1388 | <property name="minimum_size"></property> | ||
| 1389 | <property name="name">bSizer161</property> | ||
| 1390 | <property name="orient">wxVERTICAL</property> | ||
| 1391 | <property name="permission">none</property> | ||
| 1392 | <object class="sizeritem" expanded="1"> | ||
| 1393 | <property name="border">5</property> | ||
| 1394 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 1395 | <property name="proportion">1</property> | ||
| 1396 | <object class="wxListCtrl" expanded="1"> | ||
| 1397 | <property name="bg"></property> | ||
| 1398 | <property name="context_help"></property> | ||
| 1399 | <property name="enabled">1</property> | ||
| 1400 | <property name="fg"></property> | ||
| 1401 | <property name="font"></property> | ||
| 1402 | <property name="hidden">0</property> | ||
| 1403 | <property name="id">wxID_ANY</property> | ||
| 1404 | <property name="maximum_size"></property> | ||
| 1405 | <property name="minimum_size"></property> | ||
| 1406 | <property name="name">m_listCtrlOrdersReceived</property> | ||
| 1407 | <property name="permission">public</property> | ||
| 1408 | <property name="pos"></property> | ||
| 1409 | <property name="size"></property> | ||
| 1410 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property> | ||
| 1411 | <property name="subclass"></property> | ||
| 1412 | <property name="tooltip"></property> | ||
| 1413 | <property name="window_extra_style"></property> | ||
| 1414 | <property name="window_name"></property> | ||
| 1415 | <property name="window_style"></property> | ||
| 1416 | <event name="OnChar"></event> | ||
| 1417 | <event name="OnEnterWindow"></event> | ||
| 1418 | <event name="OnEraseBackground"></event> | ||
| 1419 | <event name="OnKeyDown"></event> | ||
| 1420 | <event name="OnKeyUp"></event> | ||
| 1421 | <event name="OnKillFocus"></event> | ||
| 1422 | <event name="OnLeaveWindow"></event> | ||
| 1423 | <event name="OnLeftDClick"></event> | ||
| 1424 | <event name="OnLeftDown"></event> | ||
| 1425 | <event name="OnLeftUp"></event> | ||
| 1426 | <event name="OnListBeginDrag"></event> | ||
| 1427 | <event name="OnListBeginLabelEdit"></event> | ||
| 1428 | <event name="OnListBeginRDrag"></event> | ||
| 1429 | <event name="OnListCacheHint"></event> | ||
| 1430 | <event name="OnListColBeginDrag"></event> | ||
| 1431 | <event name="OnListColClick"></event> | ||
| 1432 | <event name="OnListColDragging"></event> | ||
| 1433 | <event name="OnListColEndDrag"></event> | ||
| 1434 | <event name="OnListColRightClick"></event> | ||
| 1435 | <event name="OnListDeleteAllItems"></event> | ||
| 1436 | <event name="OnListDeleteItem"></event> | ||
| 1437 | <event name="OnListEndLabelEdit"></event> | ||
| 1438 | <event name="OnListInsertItem"></event> | ||
| 1439 | <event name="OnListItemActivated">OnListItemActivatedOrdersReceived</event> | ||
| 1440 | <event name="OnListItemDeselected"></event> | ||
| 1441 | <event name="OnListItemFocused"></event> | ||
| 1442 | <event name="OnListItemMiddleClick"></event> | ||
| 1443 | <event name="OnListItemRightClick"></event> | ||
| 1444 | <event name="OnListItemSelected"></event> | ||
| 1445 | <event name="OnListKeyDown"></event> | ||
| 1446 | <event name="OnMiddleDClick"></event> | ||
| 1447 | <event name="OnMiddleDown"></event> | ||
| 1448 | <event name="OnMiddleUp"></event> | ||
| 1449 | <event name="OnMotion"></event> | ||
| 1450 | <event name="OnMouseEvents"></event> | ||
| 1451 | <event name="OnMouseWheel"></event> | ||
| 1452 | <event name="OnPaint"></event> | ||
| 1453 | <event name="OnRightDClick"></event> | ||
| 1454 | <event name="OnRightDown"></event> | ||
| 1455 | <event name="OnRightUp"></event> | ||
| 1456 | <event name="OnSetFocus"></event> | ||
| 1457 | <event name="OnSize"></event> | ||
| 1458 | <event name="OnUpdateUI"></event> | ||
| 1459 | </object> | ||
| 1460 | </object> | ||
| 1461 | </object> | ||
| 1462 | </object> | ||
| 1463 | </object> | ||
| 1464 | </object> | ||
| 1465 | </object> | ||
| 1466 | </object> | ||
| 1467 | </object> | ||
| 1468 | <object class="Dialog" expanded="0"> | ||
| 1469 | <property name="bg"></property> | ||
| 1470 | <property name="center"></property> | ||
| 1471 | <property name="context_help"></property> | ||
| 1472 | <property name="enabled">1</property> | ||
| 1473 | <property name="extra_style"></property> | ||
| 1474 | <property name="fg"></property> | ||
| 1475 | <property name="font"></property> | ||
| 1476 | <property name="hidden">0</property> | ||
| 1477 | <property name="id">wxID_ANY</property> | ||
| 1478 | <property name="maximum_size"></property> | ||
| 1479 | <property name="minimum_size"></property> | ||
| 1480 | <property name="name">CTxDetailsDialogBase</property> | ||
| 1481 | <property name="pos"></property> | ||
| 1482 | <property name="size">620,450</property> | ||
| 1483 | <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> | ||
| 1484 | <property name="subclass"></property> | ||
| 1485 | <property name="title">Transaction Details</property> | ||
| 1486 | <property name="tooltip"></property> | ||
| 1487 | <property name="window_extra_style"></property> | ||
| 1488 | <property name="window_name"></property> | ||
| 1489 | <property name="window_style"></property> | ||
| 1490 | <event name="OnActivate"></event> | ||
| 1491 | <event name="OnActivateApp"></event> | ||
| 1492 | <event name="OnChar"></event> | ||
| 1493 | <event name="OnClose"></event> | ||
| 1494 | <event name="OnEnterWindow"></event> | ||
| 1495 | <event name="OnEraseBackground"></event> | ||
| 1496 | <event name="OnHibernate"></event> | ||
| 1497 | <event name="OnIconize"></event> | ||
| 1498 | <event name="OnIdle"></event> | ||
| 1499 | <event name="OnInitDialog"></event> | ||
| 1500 | <event name="OnKeyDown"></event> | ||
| 1501 | <event name="OnKeyUp"></event> | ||
| 1502 | <event name="OnKillFocus"></event> | ||
| 1503 | <event name="OnLeaveWindow"></event> | ||
| 1504 | <event name="OnLeftDClick"></event> | ||
| 1505 | <event name="OnLeftDown"></event> | ||
| 1506 | <event name="OnLeftUp"></event> | ||
| 1507 | <event name="OnMiddleDClick"></event> | ||
| 1508 | <event name="OnMiddleDown"></event> | ||
| 1509 | <event name="OnMiddleUp"></event> | ||
| 1510 | <event name="OnMotion"></event> | ||
| 1511 | <event name="OnMouseEvents"></event> | ||
| 1512 | <event name="OnMouseWheel"></event> | ||
| 1513 | <event name="OnPaint"></event> | ||
| 1514 | <event name="OnRightDClick"></event> | ||
| 1515 | <event name="OnRightDown"></event> | ||
| 1516 | <event name="OnRightUp"></event> | ||
| 1517 | <event name="OnSetFocus"></event> | ||
| 1518 | <event name="OnSize"></event> | ||
| 1519 | <event name="OnUpdateUI"></event> | ||
| 1520 | <object class="wxBoxSizer" expanded="1"> | ||
| 1521 | <property name="minimum_size"></property> | ||
| 1522 | <property name="name">bSizer64</property> | ||
| 1523 | <property name="orient">wxVERTICAL</property> | ||
| 1524 | <property name="permission">none</property> | ||
| 1525 | <object class="sizeritem" expanded="1"> | ||
| 1526 | <property name="border">5</property> | ||
| 1527 | <property name="flag">wxEXPAND</property> | ||
| 1528 | <property name="proportion">1</property> | ||
| 1529 | <object class="wxBoxSizer" expanded="1"> | ||
| 1530 | <property name="minimum_size"></property> | ||
| 1531 | <property name="name">bSizer66</property> | ||
| 1532 | <property name="orient">wxVERTICAL</property> | ||
| 1533 | <property name="permission">none</property> | ||
| 1534 | <object class="sizeritem" expanded="1"> | ||
| 1535 | <property name="border">5</property> | ||
| 1536 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 1537 | <property name="proportion">1</property> | ||
| 1538 | <object class="wxHtmlWindow" expanded="1"> | ||
| 1539 | <property name="bg"></property> | ||
| 1540 | <property name="context_help"></property> | ||
| 1541 | <property name="enabled">1</property> | ||
| 1542 | <property name="fg"></property> | ||
| 1543 | <property name="font"></property> | ||
| 1544 | <property name="hidden">0</property> | ||
| 1545 | <property name="id">wxID_ANY</property> | ||
| 1546 | <property name="maximum_size"></property> | ||
| 1547 | <property name="minimum_size"></property> | ||
| 1548 | <property name="name">m_htmlWin</property> | ||
| 1549 | <property name="permission">protected</property> | ||
| 1550 | <property name="pos"></property> | ||
| 1551 | <property name="size"></property> | ||
| 1552 | <property name="style">wxHW_SCROLLBAR_AUTO</property> | ||
| 1553 | <property name="subclass"></property> | ||
| 1554 | <property name="tooltip"></property> | ||
| 1555 | <property name="window_extra_style"></property> | ||
| 1556 | <property name="window_name"></property> | ||
| 1557 | <property name="window_style"></property> | ||
| 1558 | <event name="OnChar"></event> | ||
| 1559 | <event name="OnEnterWindow"></event> | ||
| 1560 | <event name="OnEraseBackground"></event> | ||
| 1561 | <event name="OnHtmlCellClicked"></event> | ||
| 1562 | <event name="OnHtmlCellHover"></event> | ||
| 1563 | <event name="OnHtmlLinkClicked"></event> | ||
| 1564 | <event name="OnKeyDown"></event> | ||
| 1565 | <event name="OnKeyUp"></event> | ||
| 1566 | <event name="OnKillFocus"></event> | ||
| 1567 | <event name="OnLeaveWindow"></event> | ||
| 1568 | <event name="OnLeftDClick"></event> | ||
| 1569 | <event name="OnLeftDown"></event> | ||
| 1570 | <event name="OnLeftUp"></event> | ||
| 1571 | <event name="OnMiddleDClick"></event> | ||
| 1572 | <event name="OnMiddleDown"></event> | ||
| 1573 | <event name="OnMiddleUp"></event> | ||
| 1574 | <event name="OnMotion"></event> | ||
| 1575 | <event name="OnMouseEvents"></event> | ||
| 1576 | <event name="OnMouseWheel"></event> | ||
| 1577 | <event name="OnPaint"></event> | ||
| 1578 | <event name="OnRightDClick"></event> | ||
| 1579 | <event name="OnRightDown"></event> | ||
| 1580 | <event name="OnRightUp"></event> | ||
| 1581 | <event name="OnSetFocus"></event> | ||
| 1582 | <event name="OnSize"></event> | ||
| 1583 | <event name="OnUpdateUI"></event> | ||
| 1584 | </object> | ||
| 1585 | </object> | ||
| 1586 | </object> | ||
| 1587 | </object> | ||
| 1588 | <object class="sizeritem" expanded="1"> | ||
| 1589 | <property name="border">5</property> | ||
| 1590 | <property name="flag">wxALIGN_RIGHT</property> | ||
| 1591 | <property name="proportion">0</property> | ||
| 1592 | <object class="wxBoxSizer" expanded="1"> | ||
| 1593 | <property name="minimum_size"></property> | ||
| 1594 | <property name="name">bSizer65</property> | ||
| 1595 | <property name="orient">wxVERTICAL</property> | ||
| 1596 | <property name="permission">none</property> | ||
| 1597 | <object class="sizeritem" expanded="1"> | ||
| 1598 | <property name="border">5</property> | ||
| 1599 | <property name="flag">wxALL</property> | ||
| 1600 | <property name="proportion">0</property> | ||
| 1601 | <object class="wxButton" expanded="1"> | ||
| 1602 | <property name="bg"></property> | ||
| 1603 | <property name="context_help"></property> | ||
| 1604 | <property name="default">0</property> | ||
| 1605 | <property name="enabled">1</property> | ||
| 1606 | <property name="fg"></property> | ||
| 1607 | <property name="font"></property> | ||
| 1608 | <property name="hidden">0</property> | ||
| 1609 | <property name="id">wxID_OK</property> | ||
| 1610 | <property name="label">OK</property> | ||
| 1611 | <property name="maximum_size"></property> | ||
| 1612 | <property name="minimum_size"></property> | ||
| 1613 | <property name="name">m_buttonOK</property> | ||
| 1614 | <property name="permission">protected</property> | ||
| 1615 | <property name="pos"></property> | ||
| 1616 | <property name="size">85,25</property> | ||
| 1617 | <property name="style"></property> | ||
| 1618 | <property name="subclass"></property> | ||
| 1619 | <property name="tooltip"></property> | ||
| 1620 | <property name="window_extra_style"></property> | ||
| 1621 | <property name="window_name"></property> | ||
| 1622 | <property name="window_style"></property> | ||
| 1623 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 1624 | <event name="OnChar"></event> | ||
| 1625 | <event name="OnEnterWindow"></event> | ||
| 1626 | <event name="OnEraseBackground"></event> | ||
| 1627 | <event name="OnKeyDown"></event> | ||
| 1628 | <event name="OnKeyUp"></event> | ||
| 1629 | <event name="OnKillFocus"></event> | ||
| 1630 | <event name="OnLeaveWindow"></event> | ||
| 1631 | <event name="OnLeftDClick"></event> | ||
| 1632 | <event name="OnLeftDown"></event> | ||
| 1633 | <event name="OnLeftUp"></event> | ||
| 1634 | <event name="OnMiddleDClick"></event> | ||
| 1635 | <event name="OnMiddleDown"></event> | ||
| 1636 | <event name="OnMiddleUp"></event> | ||
| 1637 | <event name="OnMotion"></event> | ||
| 1638 | <event name="OnMouseEvents"></event> | ||
| 1639 | <event name="OnMouseWheel"></event> | ||
| 1640 | <event name="OnPaint"></event> | ||
| 1641 | <event name="OnRightDClick"></event> | ||
| 1642 | <event name="OnRightDown"></event> | ||
| 1643 | <event name="OnRightUp"></event> | ||
| 1644 | <event name="OnSetFocus"></event> | ||
| 1645 | <event name="OnSize"></event> | ||
| 1646 | <event name="OnUpdateUI"></event> | ||
| 1647 | </object> | ||
| 1648 | </object> | ||
| 1649 | </object> | ||
| 1650 | </object> | ||
| 1651 | </object> | ||
| 1652 | </object> | ||
| 1653 | <object class="Dialog" expanded="0"> | ||
| 1654 | <property name="bg"></property> | ||
| 1655 | <property name="center"></property> | ||
| 1656 | <property name="context_help"></property> | ||
| 1657 | <property name="enabled">1</property> | ||
| 1658 | <property name="extra_style"></property> | ||
| 1659 | <property name="fg"></property> | ||
| 1660 | <property name="font"></property> | ||
| 1661 | <property name="hidden">0</property> | ||
| 1662 | <property name="id">wxID_ANY</property> | ||
| 1663 | <property name="maximum_size"></property> | ||
| 1664 | <property name="minimum_size"></property> | ||
| 1665 | <property name="name">COptionsDialogBase</property> | ||
| 1666 | <property name="pos"></property> | ||
| 1667 | <property name="size">500,261</property> | ||
| 1668 | <property name="style">wxDEFAULT_DIALOG_STYLE</property> | ||
| 1669 | <property name="subclass"></property> | ||
| 1670 | <property name="title">Options</property> | ||
| 1671 | <property name="tooltip"></property> | ||
| 1672 | <property name="window_extra_style"></property> | ||
| 1673 | <property name="window_name"></property> | ||
| 1674 | <property name="window_style"></property> | ||
| 1675 | <event name="OnActivate"></event> | ||
| 1676 | <event name="OnActivateApp"></event> | ||
| 1677 | <event name="OnChar"></event> | ||
| 1678 | <event name="OnClose"></event> | ||
| 1679 | <event name="OnEnterWindow"></event> | ||
| 1680 | <event name="OnEraseBackground"></event> | ||
| 1681 | <event name="OnHibernate"></event> | ||
| 1682 | <event name="OnIconize"></event> | ||
| 1683 | <event name="OnIdle"></event> | ||
| 1684 | <event name="OnInitDialog"></event> | ||
| 1685 | <event name="OnKeyDown"></event> | ||
| 1686 | <event name="OnKeyUp"></event> | ||
| 1687 | <event name="OnKillFocus"></event> | ||
| 1688 | <event name="OnLeaveWindow"></event> | ||
| 1689 | <event name="OnLeftDClick"></event> | ||
| 1690 | <event name="OnLeftDown"></event> | ||
| 1691 | <event name="OnLeftUp"></event> | ||
| 1692 | <event name="OnMiddleDClick"></event> | ||
| 1693 | <event name="OnMiddleDown"></event> | ||
| 1694 | <event name="OnMiddleUp"></event> | ||
| 1695 | <event name="OnMotion"></event> | ||
| 1696 | <event name="OnMouseEvents"></event> | ||
| 1697 | <event name="OnMouseWheel"></event> | ||
| 1698 | <event name="OnPaint"></event> | ||
| 1699 | <event name="OnRightDClick"></event> | ||
| 1700 | <event name="OnRightDown"></event> | ||
| 1701 | <event name="OnRightUp"></event> | ||
| 1702 | <event name="OnSetFocus"></event> | ||
| 1703 | <event name="OnSize"></event> | ||
| 1704 | <event name="OnUpdateUI"></event> | ||
| 1705 | <object class="wxBoxSizer" expanded="1"> | ||
| 1706 | <property name="minimum_size"></property> | ||
| 1707 | <property name="name">bSizer55</property> | ||
| 1708 | <property name="orient">wxVERTICAL</property> | ||
| 1709 | <property name="permission">none</property> | ||
| 1710 | <object class="sizeritem" expanded="1"> | ||
| 1711 | <property name="border">5</property> | ||
| 1712 | <property name="flag">wxEXPAND|wxLEFT</property> | ||
| 1713 | <property name="proportion">1</property> | ||
| 1714 | <object class="wxBoxSizer" expanded="1"> | ||
| 1715 | <property name="minimum_size"></property> | ||
| 1716 | <property name="name">bSizer57</property> | ||
| 1717 | <property name="orient">wxVERTICAL</property> | ||
| 1718 | <property name="permission">none</property> | ||
| 1719 | <object class="sizeritem" expanded="1"> | ||
| 1720 | <property name="border">5</property> | ||
| 1721 | <property name="flag">wxEXPAND</property> | ||
| 1722 | <property name="proportion">0</property> | ||
| 1723 | <object class="spacer" expanded="1"> | ||
| 1724 | <property name="height">20</property> | ||
| 1725 | <property name="permission">protected</property> | ||
| 1726 | <property name="width">0</property> | ||
| 1727 | </object> | ||
| 1728 | </object> | ||
| 1729 | <object class="sizeritem" expanded="1"> | ||
| 1730 | <property name="border">5</property> | ||
| 1731 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> | ||
| 1732 | <property name="proportion">0</property> | ||
| 1733 | <object class="wxStaticText" expanded="1"> | ||
| 1734 | <property name="bg"></property> | ||
| 1735 | <property name="context_help"></property> | ||
| 1736 | <property name="enabled">1</property> | ||
| 1737 | <property name="fg"></property> | ||
| 1738 | <property name="font"></property> | ||
| 1739 | <property name="hidden">0</property> | ||
| 1740 | <property name="id">wxID_ANY</property> | ||
| 1741 | <property name="label">Optional transaction fee you give to the nodes that process your transactions.</property> | ||
| 1742 | <property name="maximum_size"></property> | ||
| 1743 | <property name="minimum_size"></property> | ||
| 1744 | <property name="name">m_staticText32</property> | ||
| 1745 | <property name="permission">protected</property> | ||
| 1746 | <property name="pos"></property> | ||
| 1747 | <property name="size"></property> | ||
| 1748 | <property name="style"></property> | ||
| 1749 | <property name="subclass"></property> | ||
| 1750 | <property name="tooltip"></property> | ||
| 1751 | <property name="window_extra_style"></property> | ||
| 1752 | <property name="window_name"></property> | ||
| 1753 | <property name="window_style"></property> | ||
| 1754 | <property name="wrap">-1</property> | ||
| 1755 | <event name="OnChar"></event> | ||
| 1756 | <event name="OnEnterWindow"></event> | ||
| 1757 | <event name="OnEraseBackground"></event> | ||
| 1758 | <event name="OnKeyDown"></event> | ||
| 1759 | <event name="OnKeyUp"></event> | ||
| 1760 | <event name="OnKillFocus"></event> | ||
| 1761 | <event name="OnLeaveWindow"></event> | ||
| 1762 | <event name="OnLeftDClick"></event> | ||
| 1763 | <event name="OnLeftDown"></event> | ||
| 1764 | <event name="OnLeftUp"></event> | ||
| 1765 | <event name="OnMiddleDClick"></event> | ||
| 1766 | <event name="OnMiddleDown"></event> | ||
| 1767 | <event name="OnMiddleUp"></event> | ||
| 1768 | <event name="OnMotion"></event> | ||
| 1769 | <event name="OnMouseEvents"></event> | ||
| 1770 | <event name="OnMouseWheel"></event> | ||
| 1771 | <event name="OnPaint"></event> | ||
| 1772 | <event name="OnRightDClick"></event> | ||
| 1773 | <event name="OnRightDown"></event> | ||
| 1774 | <event name="OnRightUp"></event> | ||
| 1775 | <event name="OnSetFocus"></event> | ||
| 1776 | <event name="OnSize"></event> | ||
| 1777 | <event name="OnUpdateUI"></event> | ||
| 1778 | </object> | ||
| 1779 | </object> | ||
| 1780 | <object class="sizeritem" expanded="1"> | ||
| 1781 | <property name="border">5</property> | ||
| 1782 | <property name="flag">wxEXPAND</property> | ||
| 1783 | <property name="proportion">0</property> | ||
| 1784 | <object class="wxBoxSizer" expanded="1"> | ||
| 1785 | <property name="minimum_size"></property> | ||
| 1786 | <property name="name">bSizer56</property> | ||
| 1787 | <property name="orient">wxHORIZONTAL</property> | ||
| 1788 | <property name="permission">none</property> | ||
| 1789 | <object class="sizeritem" expanded="1"> | ||
| 1790 | <property name="border">5</property> | ||
| 1791 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 1792 | <property name="proportion">0</property> | ||
| 1793 | <object class="wxStaticText" expanded="1"> | ||
| 1794 | <property name="bg"></property> | ||
| 1795 | <property name="context_help"></property> | ||
| 1796 | <property name="enabled">1</property> | ||
| 1797 | <property name="fg"></property> | ||
| 1798 | <property name="font"></property> | ||
| 1799 | <property name="hidden">0</property> | ||
| 1800 | <property name="id">wxID_ANY</property> | ||
| 1801 | <property name="label">Transaction fee:</property> | ||
| 1802 | <property name="maximum_size"></property> | ||
| 1803 | <property name="minimum_size"></property> | ||
| 1804 | <property name="name">m_staticText31</property> | ||
| 1805 | <property name="permission">protected</property> | ||
| 1806 | <property name="pos"></property> | ||
| 1807 | <property name="size"></property> | ||
| 1808 | <property name="style"></property> | ||
| 1809 | <property name="subclass"></property> | ||
| 1810 | <property name="tooltip"></property> | ||
| 1811 | <property name="window_extra_style"></property> | ||
| 1812 | <property name="window_name"></property> | ||
| 1813 | <property name="window_style"></property> | ||
| 1814 | <property name="wrap">-1</property> | ||
| 1815 | <event name="OnChar"></event> | ||
| 1816 | <event name="OnEnterWindow"></event> | ||
| 1817 | <event name="OnEraseBackground"></event> | ||
| 1818 | <event name="OnKeyDown"></event> | ||
| 1819 | <event name="OnKeyUp"></event> | ||
| 1820 | <event name="OnKillFocus"></event> | ||
| 1821 | <event name="OnLeaveWindow"></event> | ||
| 1822 | <event name="OnLeftDClick"></event> | ||
| 1823 | <event name="OnLeftDown"></event> | ||
| 1824 | <event name="OnLeftUp"></event> | ||
| 1825 | <event name="OnMiddleDClick"></event> | ||
| 1826 | <event name="OnMiddleDown"></event> | ||
| 1827 | <event name="OnMiddleUp"></event> | ||
| 1828 | <event name="OnMotion"></event> | ||
| 1829 | <event name="OnMouseEvents"></event> | ||
| 1830 | <event name="OnMouseWheel"></event> | ||
| 1831 | <event name="OnPaint"></event> | ||
| 1832 | <event name="OnRightDClick"></event> | ||
| 1833 | <event name="OnRightDown"></event> | ||
| 1834 | <event name="OnRightUp"></event> | ||
| 1835 | <event name="OnSetFocus"></event> | ||
| 1836 | <event name="OnSize"></event> | ||
| 1837 | <event name="OnUpdateUI"></event> | ||
| 1838 | </object> | ||
| 1839 | </object> | ||
| 1840 | <object class="sizeritem" expanded="1"> | ||
| 1841 | <property name="border">5</property> | ||
| 1842 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 1843 | <property name="proportion">0</property> | ||
| 1844 | <object class="wxTextCtrl" expanded="1"> | ||
| 1845 | <property name="bg"></property> | ||
| 1846 | <property name="context_help"></property> | ||
| 1847 | <property name="enabled">1</property> | ||
| 1848 | <property name="fg"></property> | ||
| 1849 | <property name="font"></property> | ||
| 1850 | <property name="hidden">0</property> | ||
| 1851 | <property name="id">wxID_TRANSACTIONFEE</property> | ||
| 1852 | <property name="maximum_size"></property> | ||
| 1853 | <property name="maxlength">0</property> | ||
| 1854 | <property name="minimum_size"></property> | ||
| 1855 | <property name="name">m_textCtrlTransactionFee</property> | ||
| 1856 | <property name="permission">protected</property> | ||
| 1857 | <property name="pos"></property> | ||
| 1858 | <property name="size">70,-1</property> | ||
| 1859 | <property name="style"></property> | ||
| 1860 | <property name="subclass"></property> | ||
| 1861 | <property name="tooltip"></property> | ||
| 1862 | <property name="value"></property> | ||
| 1863 | <property name="window_extra_style"></property> | ||
| 1864 | <property name="window_name"></property> | ||
| 1865 | <property name="window_style"></property> | ||
| 1866 | <event name="OnChar"></event> | ||
| 1867 | <event name="OnEnterWindow"></event> | ||
| 1868 | <event name="OnEraseBackground"></event> | ||
| 1869 | <event name="OnKeyDown"></event> | ||
| 1870 | <event name="OnKeyUp"></event> | ||
| 1871 | <event name="OnKillFocus">OnKillFocusTransactionFee</event> | ||
| 1872 | <event name="OnLeaveWindow"></event> | ||
| 1873 | <event name="OnLeftDClick"></event> | ||
| 1874 | <event name="OnLeftDown"></event> | ||
| 1875 | <event name="OnLeftUp"></event> | ||
| 1876 | <event name="OnMiddleDClick"></event> | ||
| 1877 | <event name="OnMiddleDown"></event> | ||
| 1878 | <event name="OnMiddleUp"></event> | ||
| 1879 | <event name="OnMotion"></event> | ||
| 1880 | <event name="OnMouseEvents"></event> | ||
| 1881 | <event name="OnMouseWheel"></event> | ||
| 1882 | <event name="OnPaint"></event> | ||
| 1883 | <event name="OnRightDClick"></event> | ||
| 1884 | <event name="OnRightDown"></event> | ||
| 1885 | <event name="OnRightUp"></event> | ||
| 1886 | <event name="OnSetFocus"></event> | ||
| 1887 | <event name="OnSize"></event> | ||
| 1888 | <event name="OnText"></event> | ||
| 1889 | <event name="OnTextEnter"></event> | ||
| 1890 | <event name="OnTextMaxLen"></event> | ||
| 1891 | <event name="OnTextURL"></event> | ||
| 1892 | <event name="OnUpdateUI"></event> | ||
| 1893 | </object> | ||
| 1894 | </object> | ||
| 1895 | </object> | ||
| 1896 | </object> | ||
| 1897 | </object> | ||
| 1898 | </object> | ||
| 1899 | <object class="sizeritem" expanded="1"> | ||
| 1900 | <property name="border">5</property> | ||
| 1901 | <property name="flag">wxALIGN_RIGHT</property> | ||
| 1902 | <property name="proportion">0</property> | ||
| 1903 | <object class="wxBoxSizer" expanded="1"> | ||
| 1904 | <property name="minimum_size"></property> | ||
| 1905 | <property name="name">bSizer58</property> | ||
| 1906 | <property name="orient">wxHORIZONTAL</property> | ||
| 1907 | <property name="permission">none</property> | ||
| 1908 | <object class="sizeritem" expanded="1"> | ||
| 1909 | <property name="border">5</property> | ||
| 1910 | <property name="flag">wxALL</property> | ||
| 1911 | <property name="proportion">0</property> | ||
| 1912 | <object class="wxButton" expanded="1"> | ||
| 1913 | <property name="bg"></property> | ||
| 1914 | <property name="context_help"></property> | ||
| 1915 | <property name="default">0</property> | ||
| 1916 | <property name="enabled">1</property> | ||
| 1917 | <property name="fg"></property> | ||
| 1918 | <property name="font"></property> | ||
| 1919 | <property name="hidden">0</property> | ||
| 1920 | <property name="id">wxID_OK</property> | ||
| 1921 | <property name="label">OK</property> | ||
| 1922 | <property name="maximum_size"></property> | ||
| 1923 | <property name="minimum_size"></property> | ||
| 1924 | <property name="name">m_buttonOK</property> | ||
| 1925 | <property name="permission">protected</property> | ||
| 1926 | <property name="pos"></property> | ||
| 1927 | <property name="size">85,25</property> | ||
| 1928 | <property name="style"></property> | ||
| 1929 | <property name="subclass"></property> | ||
| 1930 | <property name="tooltip"></property> | ||
| 1931 | <property name="window_extra_style"></property> | ||
| 1932 | <property name="window_name"></property> | ||
| 1933 | <property name="window_style"></property> | ||
| 1934 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 1935 | <event name="OnChar"></event> | ||
| 1936 | <event name="OnEnterWindow"></event> | ||
| 1937 | <event name="OnEraseBackground"></event> | ||
| 1938 | <event name="OnKeyDown"></event> | ||
| 1939 | <event name="OnKeyUp"></event> | ||
| 1940 | <event name="OnKillFocus"></event> | ||
| 1941 | <event name="OnLeaveWindow"></event> | ||
| 1942 | <event name="OnLeftDClick"></event> | ||
| 1943 | <event name="OnLeftDown"></event> | ||
| 1944 | <event name="OnLeftUp"></event> | ||
| 1945 | <event name="OnMiddleDClick"></event> | ||
| 1946 | <event name="OnMiddleDown"></event> | ||
| 1947 | <event name="OnMiddleUp"></event> | ||
| 1948 | <event name="OnMotion"></event> | ||
| 1949 | <event name="OnMouseEvents"></event> | ||
| 1950 | <event name="OnMouseWheel"></event> | ||
| 1951 | <event name="OnPaint"></event> | ||
| 1952 | <event name="OnRightDClick"></event> | ||
| 1953 | <event name="OnRightDown"></event> | ||
| 1954 | <event name="OnRightUp"></event> | ||
| 1955 | <event name="OnSetFocus"></event> | ||
| 1956 | <event name="OnSize"></event> | ||
| 1957 | <event name="OnUpdateUI"></event> | ||
| 1958 | </object> | ||
| 1959 | </object> | ||
| 1960 | <object class="sizeritem" expanded="1"> | ||
| 1961 | <property name="border">5</property> | ||
| 1962 | <property name="flag">wxALL</property> | ||
| 1963 | <property name="proportion">0</property> | ||
| 1964 | <object class="wxButton" expanded="1"> | ||
| 1965 | <property name="bg"></property> | ||
| 1966 | <property name="context_help"></property> | ||
| 1967 | <property name="default">0</property> | ||
| 1968 | <property name="enabled">1</property> | ||
| 1969 | <property name="fg"></property> | ||
| 1970 | <property name="font"></property> | ||
| 1971 | <property name="hidden">0</property> | ||
| 1972 | <property name="id">wxID_CANCEL</property> | ||
| 1973 | <property name="label">Cancel</property> | ||
| 1974 | <property name="maximum_size"></property> | ||
| 1975 | <property name="minimum_size">85,25</property> | ||
| 1976 | <property name="name">m_buttonCancel</property> | ||
| 1977 | <property name="permission">protected</property> | ||
| 1978 | <property name="pos"></property> | ||
| 1979 | <property name="size">-1,-1</property> | ||
| 1980 | <property name="style"></property> | ||
| 1981 | <property name="subclass"></property> | ||
| 1982 | <property name="tooltip"></property> | ||
| 1983 | <property name="window_extra_style"></property> | ||
| 1984 | <property name="window_name"></property> | ||
| 1985 | <property name="window_style"></property> | ||
| 1986 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 1987 | <event name="OnChar"></event> | ||
| 1988 | <event name="OnEnterWindow"></event> | ||
| 1989 | <event name="OnEraseBackground"></event> | ||
| 1990 | <event name="OnKeyDown"></event> | ||
| 1991 | <event name="OnKeyUp"></event> | ||
| 1992 | <event name="OnKillFocus"></event> | ||
| 1993 | <event name="OnLeaveWindow"></event> | ||
| 1994 | <event name="OnLeftDClick"></event> | ||
| 1995 | <event name="OnLeftDown"></event> | ||
| 1996 | <event name="OnLeftUp"></event> | ||
| 1997 | <event name="OnMiddleDClick"></event> | ||
| 1998 | <event name="OnMiddleDown"></event> | ||
| 1999 | <event name="OnMiddleUp"></event> | ||
| 2000 | <event name="OnMotion"></event> | ||
| 2001 | <event name="OnMouseEvents"></event> | ||
| 2002 | <event name="OnMouseWheel"></event> | ||
| 2003 | <event name="OnPaint"></event> | ||
| 2004 | <event name="OnRightDClick"></event> | ||
| 2005 | <event name="OnRightDown"></event> | ||
| 2006 | <event name="OnRightUp"></event> | ||
| 2007 | <event name="OnSetFocus"></event> | ||
| 2008 | <event name="OnSize"></event> | ||
| 2009 | <event name="OnUpdateUI"></event> | ||
| 2010 | </object> | ||
| 2011 | </object> | ||
| 2012 | </object> | ||
| 2013 | </object> | ||
| 2014 | </object> | ||
| 2015 | </object> | ||
| 2016 | <object class="Dialog" expanded="0"> | ||
| 2017 | <property name="bg"></property> | ||
| 2018 | <property name="center"></property> | ||
| 2019 | <property name="context_help"></property> | ||
| 2020 | <property name="enabled">1</property> | ||
| 2021 | <property name="extra_style"></property> | ||
| 2022 | <property name="fg"></property> | ||
| 2023 | <property name="font"></property> | ||
| 2024 | <property name="hidden">0</property> | ||
| 2025 | <property name="id">wxID_ANY</property> | ||
| 2026 | <property name="maximum_size"></property> | ||
| 2027 | <property name="minimum_size"></property> | ||
| 2028 | <property name="name">CAboutDialogBase</property> | ||
| 2029 | <property name="pos"></property> | ||
| 2030 | <property name="size">507,298</property> | ||
| 2031 | <property name="style">wxDEFAULT_DIALOG_STYLE</property> | ||
| 2032 | <property name="subclass"></property> | ||
| 2033 | <property name="title">About Bitcoin</property> | ||
| 2034 | <property name="tooltip"></property> | ||
| 2035 | <property name="window_extra_style"></property> | ||
| 2036 | <property name="window_name"></property> | ||
| 2037 | <property name="window_style"></property> | ||
| 2038 | <event name="OnActivate"></event> | ||
| 2039 | <event name="OnActivateApp"></event> | ||
| 2040 | <event name="OnChar"></event> | ||
| 2041 | <event name="OnClose"></event> | ||
| 2042 | <event name="OnEnterWindow"></event> | ||
| 2043 | <event name="OnEraseBackground"></event> | ||
| 2044 | <event name="OnHibernate"></event> | ||
| 2045 | <event name="OnIconize"></event> | ||
| 2046 | <event name="OnIdle"></event> | ||
| 2047 | <event name="OnInitDialog"></event> | ||
| 2048 | <event name="OnKeyDown"></event> | ||
| 2049 | <event name="OnKeyUp"></event> | ||
| 2050 | <event name="OnKillFocus"></event> | ||
| 2051 | <event name="OnLeaveWindow"></event> | ||
| 2052 | <event name="OnLeftDClick"></event> | ||
| 2053 | <event name="OnLeftDown"></event> | ||
| 2054 | <event name="OnLeftUp"></event> | ||
| 2055 | <event name="OnMiddleDClick"></event> | ||
| 2056 | <event name="OnMiddleDown"></event> | ||
| 2057 | <event name="OnMiddleUp"></event> | ||
| 2058 | <event name="OnMotion"></event> | ||
| 2059 | <event name="OnMouseEvents"></event> | ||
| 2060 | <event name="OnMouseWheel"></event> | ||
| 2061 | <event name="OnPaint"></event> | ||
| 2062 | <event name="OnRightDClick"></event> | ||
| 2063 | <event name="OnRightDown"></event> | ||
| 2064 | <event name="OnRightUp"></event> | ||
| 2065 | <event name="OnSetFocus"></event> | ||
| 2066 | <event name="OnSize"></event> | ||
| 2067 | <event name="OnUpdateUI"></event> | ||
| 2068 | <object class="wxBoxSizer" expanded="0"> | ||
| 2069 | <property name="minimum_size"></property> | ||
| 2070 | <property name="name">bSizer60</property> | ||
| 2071 | <property name="orient">wxVERTICAL</property> | ||
| 2072 | <property name="permission">none</property> | ||
| 2073 | <object class="sizeritem" expanded="1"> | ||
| 2074 | <property name="border">5</property> | ||
| 2075 | <property name="flag">wxEXPAND</property> | ||
| 2076 | <property name="proportion">1</property> | ||
| 2077 | <object class="wxBoxSizer" expanded="1"> | ||
| 2078 | <property name="minimum_size"></property> | ||
| 2079 | <property name="name">bSizer62</property> | ||
| 2080 | <property name="orient">wxHORIZONTAL</property> | ||
| 2081 | <property name="permission">none</property> | ||
| 2082 | <object class="sizeritem" expanded="1"> | ||
| 2083 | <property name="border">5</property> | ||
| 2084 | <property name="flag">wxEXPAND</property> | ||
| 2085 | <property name="proportion">0</property> | ||
| 2086 | <object class="spacer" expanded="1"> | ||
| 2087 | <property name="height">0</property> | ||
| 2088 | <property name="permission">protected</property> | ||
| 2089 | <property name="width">60</property> | ||
| 2090 | </object> | ||
| 2091 | </object> | ||
| 2092 | <object class="sizeritem" expanded="1"> | ||
| 2093 | <property name="border">5</property> | ||
| 2094 | <property name="flag">wxEXPAND</property> | ||
| 2095 | <property name="proportion">1</property> | ||
| 2096 | <object class="wxBoxSizer" expanded="1"> | ||
| 2097 | <property name="minimum_size"></property> | ||
| 2098 | <property name="name">bSizer63</property> | ||
| 2099 | <property name="orient">wxVERTICAL</property> | ||
| 2100 | <property name="permission">none</property> | ||
| 2101 | <object class="sizeritem" expanded="1"> | ||
| 2102 | <property name="border">5</property> | ||
| 2103 | <property name="flag">wxEXPAND</property> | ||
| 2104 | <property name="proportion">0</property> | ||
| 2105 | <object class="spacer" expanded="1"> | ||
| 2106 | <property name="height">50</property> | ||
| 2107 | <property name="permission">protected</property> | ||
| 2108 | <property name="width">0</property> | ||
| 2109 | </object> | ||
| 2110 | </object> | ||
| 2111 | <object class="sizeritem" expanded="1"> | ||
| 2112 | <property name="border">5</property> | ||
| 2113 | <property name="flag">wxEXPAND</property> | ||
| 2114 | <property name="proportion">0</property> | ||
| 2115 | <object class="wxBoxSizer" expanded="1"> | ||
| 2116 | <property name="minimum_size"></property> | ||
| 2117 | <property name="name">bSizer64</property> | ||
| 2118 | <property name="orient">wxHORIZONTAL</property> | ||
| 2119 | <property name="permission">none</property> | ||
| 2120 | <object class="sizeritem" expanded="1"> | ||
| 2121 | <property name="border">5</property> | ||
| 2122 | <property name="flag">wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 2123 | <property name="proportion">0</property> | ||
| 2124 | <object class="wxStaticText" expanded="1"> | ||
| 2125 | <property name="bg"></property> | ||
| 2126 | <property name="context_help"></property> | ||
| 2127 | <property name="enabled">1</property> | ||
| 2128 | <property name="fg"></property> | ||
| 2129 | <property name="font">Tahoma,90,92,10,74,0</property> | ||
| 2130 | <property name="hidden">0</property> | ||
| 2131 | <property name="id">wxID_ANY</property> | ||
| 2132 | <property name="label">Bitcoin </property> | ||
| 2133 | <property name="maximum_size"></property> | ||
| 2134 | <property name="minimum_size"></property> | ||
| 2135 | <property name="name">m_staticText40</property> | ||
| 2136 | <property name="permission">protected</property> | ||
| 2137 | <property name="pos"></property> | ||
| 2138 | <property name="size"></property> | ||
| 2139 | <property name="style"></property> | ||
| 2140 | <property name="subclass"></property> | ||
| 2141 | <property name="tooltip"></property> | ||
| 2142 | <property name="window_extra_style"></property> | ||
| 2143 | <property name="window_name"></property> | ||
| 2144 | <property name="window_style"></property> | ||
| 2145 | <property name="wrap">-1</property> | ||
| 2146 | <event name="OnChar"></event> | ||
| 2147 | <event name="OnEnterWindow"></event> | ||
| 2148 | <event name="OnEraseBackground"></event> | ||
| 2149 | <event name="OnKeyDown"></event> | ||
| 2150 | <event name="OnKeyUp"></event> | ||
| 2151 | <event name="OnKillFocus"></event> | ||
| 2152 | <event name="OnLeaveWindow"></event> | ||
| 2153 | <event name="OnLeftDClick"></event> | ||
| 2154 | <event name="OnLeftDown"></event> | ||
| 2155 | <event name="OnLeftUp"></event> | ||
| 2156 | <event name="OnMiddleDClick"></event> | ||
| 2157 | <event name="OnMiddleDown"></event> | ||
| 2158 | <event name="OnMiddleUp"></event> | ||
| 2159 | <event name="OnMotion"></event> | ||
| 2160 | <event name="OnMouseEvents"></event> | ||
| 2161 | <event name="OnMouseWheel"></event> | ||
| 2162 | <event name="OnPaint"></event> | ||
| 2163 | <event name="OnRightDClick"></event> | ||
| 2164 | <event name="OnRightDown"></event> | ||
| 2165 | <event name="OnRightUp"></event> | ||
| 2166 | <event name="OnSetFocus"></event> | ||
| 2167 | <event name="OnSize"></event> | ||
| 2168 | <event name="OnUpdateUI"></event> | ||
| 2169 | </object> | ||
| 2170 | </object> | ||
| 2171 | <object class="sizeritem" expanded="1"> | ||
| 2172 | <property name="border">5</property> | ||
| 2173 | <property name="flag">wxALIGN_BOTTOM|wxTOP|wxBOTTOM|wxRIGHT</property> | ||
| 2174 | <property name="proportion">0</property> | ||
| 2175 | <object class="wxStaticText" expanded="1"> | ||
| 2176 | <property name="bg"></property> | ||
| 2177 | <property name="context_help"></property> | ||
| 2178 | <property name="enabled">1</property> | ||
| 2179 | <property name="fg"></property> | ||
| 2180 | <property name="font">Tahoma,90,90,10,74,0</property> | ||
| 2181 | <property name="hidden">0</property> | ||
| 2182 | <property name="id">wxID_ANY</property> | ||
| 2183 | <property name="label">version</property> | ||
| 2184 | <property name="maximum_size"></property> | ||
| 2185 | <property name="minimum_size"></property> | ||
| 2186 | <property name="name">m_staticTextVersion</property> | ||
| 2187 | <property name="permission">public</property> | ||
| 2188 | <property name="pos"></property> | ||
| 2189 | <property name="size"></property> | ||
| 2190 | <property name="style"></property> | ||
| 2191 | <property name="subclass"></property> | ||
| 2192 | <property name="tooltip"></property> | ||
| 2193 | <property name="window_extra_style"></property> | ||
| 2194 | <property name="window_name"></property> | ||
| 2195 | <property name="window_style"></property> | ||
| 2196 | <property name="wrap">-1</property> | ||
| 2197 | <event name="OnChar"></event> | ||
| 2198 | <event name="OnEnterWindow"></event> | ||
| 2199 | <event name="OnEraseBackground"></event> | ||
| 2200 | <event name="OnKeyDown"></event> | ||
| 2201 | <event name="OnKeyUp"></event> | ||
| 2202 | <event name="OnKillFocus"></event> | ||
| 2203 | <event name="OnLeaveWindow"></event> | ||
| 2204 | <event name="OnLeftDClick"></event> | ||
| 2205 | <event name="OnLeftDown"></event> | ||
| 2206 | <event name="OnLeftUp"></event> | ||
| 2207 | <event name="OnMiddleDClick"></event> | ||
| 2208 | <event name="OnMiddleDown"></event> | ||
| 2209 | <event name="OnMiddleUp"></event> | ||
| 2210 | <event name="OnMotion"></event> | ||
| 2211 | <event name="OnMouseEvents"></event> | ||
| 2212 | <event name="OnMouseWheel"></event> | ||
| 2213 | <event name="OnPaint"></event> | ||
| 2214 | <event name="OnRightDClick"></event> | ||
| 2215 | <event name="OnRightDown"></event> | ||
| 2216 | <event name="OnRightUp"></event> | ||
| 2217 | <event name="OnSetFocus"></event> | ||
| 2218 | <event name="OnSize"></event> | ||
| 2219 | <event name="OnUpdateUI"></event> | ||
| 2220 | </object> | ||
| 2221 | </object> | ||
| 2222 | </object> | ||
| 2223 | </object> | ||
| 2224 | <object class="sizeritem" expanded="1"> | ||
| 2225 | <property name="border">5</property> | ||
| 2226 | <property name="flag">wxEXPAND</property> | ||
| 2227 | <property name="proportion">0</property> | ||
| 2228 | <object class="spacer" expanded="1"> | ||
| 2229 | <property name="height">4</property> | ||
| 2230 | <property name="permission">protected</property> | ||
| 2231 | <property name="width">0</property> | ||
| 2232 | </object> | ||
| 2233 | </object> | ||
| 2234 | <object class="sizeritem" expanded="1"> | ||
| 2235 | <property name="border">5</property> | ||
| 2236 | <property name="flag">wxALL</property> | ||
| 2237 | <property name="proportion">0</property> | ||
| 2238 | <object class="wxStaticText" expanded="1"> | ||
| 2239 | <property name="bg"></property> | ||
| 2240 | <property name="context_help"></property> | ||
| 2241 | <property name="enabled">1</property> | ||
| 2242 | <property name="fg"></property> | ||
| 2243 | <property name="font"></property> | ||
| 2244 | <property name="hidden">0</property> | ||
| 2245 | <property name="id">wxID_ANY</property> | ||
| 2246 | <property name="label">Copyright © 2009 Satoshi Nakamoto.

This is experimental software. Do not rely on it for actual financial transactions.

Distributed under the MIT/X11 software license, see the accompanying file license.txt or http://www.opensource.org/licenses/mit-license.php.

This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/) and cryptographic software written by Eric Young (eay@cryptsoft.com).</property> | ||
| 2247 | <property name="maximum_size"></property> | ||
| 2248 | <property name="minimum_size"></property> | ||
| 2249 | <property name="name">m_staticTextMain</property> | ||
| 2250 | <property name="permission">protected</property> | ||
| 2251 | <property name="pos"></property> | ||
| 2252 | <property name="size"></property> | ||
| 2253 | <property name="style"></property> | ||
| 2254 | <property name="subclass"></property> | ||
| 2255 | <property name="tooltip"></property> | ||
| 2256 | <property name="window_extra_style"></property> | ||
| 2257 | <property name="window_name"></property> | ||
| 2258 | <property name="window_style"></property> | ||
| 2259 | <property name="wrap">400</property> | ||
| 2260 | <event name="OnChar"></event> | ||
| 2261 | <event name="OnEnterWindow"></event> | ||
| 2262 | <event name="OnEraseBackground"></event> | ||
| 2263 | <event name="OnKeyDown"></event> | ||
| 2264 | <event name="OnKeyUp"></event> | ||
| 2265 | <event name="OnKillFocus"></event> | ||
| 2266 | <event name="OnLeaveWindow"></event> | ||
| 2267 | <event name="OnLeftDClick"></event> | ||
| 2268 | <event name="OnLeftDown"></event> | ||
| 2269 | <event name="OnLeftUp"></event> | ||
| 2270 | <event name="OnMiddleDClick"></event> | ||
| 2271 | <event name="OnMiddleDown"></event> | ||
| 2272 | <event name="OnMiddleUp"></event> | ||
| 2273 | <event name="OnMotion"></event> | ||
| 2274 | <event name="OnMouseEvents"></event> | ||
| 2275 | <event name="OnMouseWheel"></event> | ||
| 2276 | <event name="OnPaint"></event> | ||
| 2277 | <event name="OnRightDClick"></event> | ||
| 2278 | <event name="OnRightDown"></event> | ||
| 2279 | <event name="OnRightUp"></event> | ||
| 2280 | <event name="OnSetFocus"></event> | ||
| 2281 | <event name="OnSize"></event> | ||
| 2282 | <event name="OnUpdateUI"></event> | ||
| 2283 | </object> | ||
| 2284 | </object> | ||
| 2285 | <object class="sizeritem" expanded="1"> | ||
| 2286 | <property name="border">5</property> | ||
| 2287 | <property name="flag">wxEXPAND</property> | ||
| 2288 | <property name="proportion">1</property> | ||
| 2289 | <object class="spacer" expanded="1"> | ||
| 2290 | <property name="height">0</property> | ||
| 2291 | <property name="permission">protected</property> | ||
| 2292 | <property name="width">0</property> | ||
| 2293 | </object> | ||
| 2294 | </object> | ||
| 2295 | </object> | ||
| 2296 | </object> | ||
| 2297 | </object> | ||
| 2298 | </object> | ||
| 2299 | <object class="sizeritem" expanded="1"> | ||
| 2300 | <property name="border">5</property> | ||
| 2301 | <property name="flag">wxALIGN_RIGHT|wxEXPAND</property> | ||
| 2302 | <property name="proportion">0</property> | ||
| 2303 | <object class="wxBoxSizer" expanded="1"> | ||
| 2304 | <property name="minimum_size"></property> | ||
| 2305 | <property name="name">bSizer61</property> | ||
| 2306 | <property name="orient">wxHORIZONTAL</property> | ||
| 2307 | <property name="permission">none</property> | ||
| 2308 | <object class="sizeritem" expanded="1"> | ||
| 2309 | <property name="border">5</property> | ||
| 2310 | <property name="flag">wxEXPAND</property> | ||
| 2311 | <property name="proportion">1</property> | ||
| 2312 | <object class="spacer" expanded="1"> | ||
| 2313 | <property name="height">0</property> | ||
| 2314 | <property name="permission">protected</property> | ||
| 2315 | <property name="width">0</property> | ||
| 2316 | </object> | ||
| 2317 | </object> | ||
| 2318 | <object class="sizeritem" expanded="1"> | ||
| 2319 | <property name="border">5</property> | ||
| 2320 | <property name="flag">wxALL</property> | ||
| 2321 | <property name="proportion">0</property> | ||
| 2322 | <object class="wxButton" expanded="1"> | ||
| 2323 | <property name="bg"></property> | ||
| 2324 | <property name="context_help"></property> | ||
| 2325 | <property name="default">0</property> | ||
| 2326 | <property name="enabled">1</property> | ||
| 2327 | <property name="fg"></property> | ||
| 2328 | <property name="font"></property> | ||
| 2329 | <property name="hidden">0</property> | ||
| 2330 | <property name="id">wxID_OK</property> | ||
| 2331 | <property name="label">OK</property> | ||
| 2332 | <property name="maximum_size"></property> | ||
| 2333 | <property name="minimum_size"></property> | ||
| 2334 | <property name="name">m_buttonOK</property> | ||
| 2335 | <property name="permission">protected</property> | ||
| 2336 | <property name="pos"></property> | ||
| 2337 | <property name="size">85,25</property> | ||
| 2338 | <property name="style"></property> | ||
| 2339 | <property name="subclass"></property> | ||
| 2340 | <property name="tooltip"></property> | ||
| 2341 | <property name="window_extra_style"></property> | ||
| 2342 | <property name="window_name"></property> | ||
| 2343 | <property name="window_style"></property> | ||
| 2344 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 2345 | <event name="OnChar"></event> | ||
| 2346 | <event name="OnEnterWindow"></event> | ||
| 2347 | <event name="OnEraseBackground"></event> | ||
| 2348 | <event name="OnKeyDown"></event> | ||
| 2349 | <event name="OnKeyUp"></event> | ||
| 2350 | <event name="OnKillFocus"></event> | ||
| 2351 | <event name="OnLeaveWindow"></event> | ||
| 2352 | <event name="OnLeftDClick"></event> | ||
| 2353 | <event name="OnLeftDown"></event> | ||
| 2354 | <event name="OnLeftUp"></event> | ||
| 2355 | <event name="OnMiddleDClick"></event> | ||
| 2356 | <event name="OnMiddleDown"></event> | ||
| 2357 | <event name="OnMiddleUp"></event> | ||
| 2358 | <event name="OnMotion"></event> | ||
| 2359 | <event name="OnMouseEvents"></event> | ||
| 2360 | <event name="OnMouseWheel"></event> | ||
| 2361 | <event name="OnPaint"></event> | ||
| 2362 | <event name="OnRightDClick"></event> | ||
| 2363 | <event name="OnRightDown"></event> | ||
| 2364 | <event name="OnRightUp"></event> | ||
| 2365 | <event name="OnSetFocus"></event> | ||
| 2366 | <event name="OnSize"></event> | ||
| 2367 | <event name="OnUpdateUI"></event> | ||
| 2368 | </object> | ||
| 2369 | </object> | ||
| 2370 | </object> | ||
| 2371 | </object> | ||
| 2372 | </object> | ||
| 2373 | </object> | ||
| 2374 | <object class="Dialog" expanded="0"> | ||
| 2375 | <property name="bg"></property> | ||
| 2376 | <property name="center"></property> | ||
| 2377 | <property name="context_help"></property> | ||
| 2378 | <property name="enabled">1</property> | ||
| 2379 | <property name="extra_style"></property> | ||
| 2380 | <property name="fg"></property> | ||
| 2381 | <property name="font"></property> | ||
| 2382 | <property name="hidden">0</property> | ||
| 2383 | <property name="id">wxID_ANY</property> | ||
| 2384 | <property name="maximum_size"></property> | ||
| 2385 | <property name="minimum_size"></property> | ||
| 2386 | <property name="name">CSendDialogBase</property> | ||
| 2387 | <property name="pos"></property> | ||
| 2388 | <property name="size">675,338</property> | ||
| 2389 | <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> | ||
| 2390 | <property name="subclass"></property> | ||
| 2391 | <property name="title">Send Coins</property> | ||
| 2392 | <property name="tooltip"></property> | ||
| 2393 | <property name="window_extra_style"></property> | ||
| 2394 | <property name="window_name"></property> | ||
| 2395 | <property name="window_style"></property> | ||
| 2396 | <event name="OnActivate"></event> | ||
| 2397 | <event name="OnActivateApp"></event> | ||
| 2398 | <event name="OnChar"></event> | ||
| 2399 | <event name="OnClose"></event> | ||
| 2400 | <event name="OnEnterWindow"></event> | ||
| 2401 | <event name="OnEraseBackground"></event> | ||
| 2402 | <event name="OnHibernate"></event> | ||
| 2403 | <event name="OnIconize"></event> | ||
| 2404 | <event name="OnIdle"></event> | ||
| 2405 | <event name="OnInitDialog"></event> | ||
| 2406 | <event name="OnKeyDown"></event> | ||
| 2407 | <event name="OnKeyUp"></event> | ||
| 2408 | <event name="OnKillFocus"></event> | ||
| 2409 | <event name="OnLeaveWindow"></event> | ||
| 2410 | <event name="OnLeftDClick"></event> | ||
| 2411 | <event name="OnLeftDown"></event> | ||
| 2412 | <event name="OnLeftUp"></event> | ||
| 2413 | <event name="OnMiddleDClick"></event> | ||
| 2414 | <event name="OnMiddleDown"></event> | ||
| 2415 | <event name="OnMiddleUp"></event> | ||
| 2416 | <event name="OnMotion"></event> | ||
| 2417 | <event name="OnMouseEvents"></event> | ||
| 2418 | <event name="OnMouseWheel"></event> | ||
| 2419 | <event name="OnPaint"></event> | ||
| 2420 | <event name="OnRightDClick"></event> | ||
| 2421 | <event name="OnRightDown"></event> | ||
| 2422 | <event name="OnRightUp"></event> | ||
| 2423 | <event name="OnSetFocus"></event> | ||
| 2424 | <event name="OnSize"></event> | ||
| 2425 | <event name="OnUpdateUI"></event> | ||
| 2426 | <object class="wxBoxSizer" expanded="1"> | ||
| 2427 | <property name="minimum_size"></property> | ||
| 2428 | <property name="name">bSizer21</property> | ||
| 2429 | <property name="orient">wxVERTICAL</property> | ||
| 2430 | <property name="permission">none</property> | ||
| 2431 | <object class="sizeritem" expanded="1"> | ||
| 2432 | <property name="border">5</property> | ||
| 2433 | <property name="flag">wxEXPAND</property> | ||
| 2434 | <property name="proportion">0</property> | ||
| 2435 | <object class="spacer" expanded="1"> | ||
| 2436 | <property name="height">5</property> | ||
| 2437 | <property name="permission">protected</property> | ||
| 2438 | <property name="width">0</property> | ||
| 2439 | </object> | ||
| 2440 | </object> | ||
| 2441 | <object class="sizeritem" expanded="1"> | ||
| 2442 | <property name="border">5</property> | ||
| 2443 | <property name="flag">wxEXPAND|wxLEFT</property> | ||
| 2444 | <property name="proportion">0</property> | ||
| 2445 | <object class="wxFlexGridSizer" expanded="0"> | ||
| 2446 | <property name="cols">2</property> | ||
| 2447 | <property name="flexible_direction">wxBOTH</property> | ||
| 2448 | <property name="growablecols">1</property> | ||
| 2449 | <property name="growablerows"></property> | ||
| 2450 | <property name="hgap">0</property> | ||
| 2451 | <property name="minimum_size"></property> | ||
| 2452 | <property name="name">fgSizer1</property> | ||
| 2453 | <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property> | ||
| 2454 | <property name="permission">none</property> | ||
| 2455 | <property name="rows">3</property> | ||
| 2456 | <property name="vgap">0</property> | ||
| 2457 | <object class="sizeritem" expanded="1"> | ||
| 2458 | <property name="border">5</property> | ||
| 2459 | <property name="flag">wxEXPAND</property> | ||
| 2460 | <property name="proportion">0</property> | ||
| 2461 | <object class="spacer" expanded="1"> | ||
| 2462 | <property name="height">0</property> | ||
| 2463 | <property name="permission">protected</property> | ||
| 2464 | <property name="width">0</property> | ||
| 2465 | </object> | ||
| 2466 | </object> | ||
| 2467 | <object class="sizeritem" expanded="1"> | ||
| 2468 | <property name="border">5</property> | ||
| 2469 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 2470 | <property name="proportion">0</property> | ||
| 2471 | <object class="wxStaticText" expanded="1"> | ||
| 2472 | <property name="bg"></property> | ||
| 2473 | <property name="context_help"></property> | ||
| 2474 | <property name="enabled">1</property> | ||
| 2475 | <property name="fg"></property> | ||
| 2476 | <property name="font"></property> | ||
| 2477 | <property name="hidden">0</property> | ||
| 2478 | <property name="id">wxID_ANY</property> | ||
| 2479 | <property name="label">Enter the recipient's IP address (e.g. 123.45.6.7) for online transfer with comments and confirmation, 
or bitcoin address (e.g. 1NS17iag9jJgTHD1VXjvLCEnZuQ3rJED9L) if recipient is not online.</property> | ||
| 2480 | <property name="maximum_size"></property> | ||
| 2481 | <property name="minimum_size"></property> | ||
| 2482 | <property name="name">m_staticText14</property> | ||
| 2483 | <property name="permission">protected</property> | ||
| 2484 | <property name="pos"></property> | ||
| 2485 | <property name="size"></property> | ||
| 2486 | <property name="style"></property> | ||
| 2487 | <property name="subclass"></property> | ||
| 2488 | <property name="tooltip"></property> | ||
| 2489 | <property name="window_extra_style"></property> | ||
| 2490 | <property name="window_name"></property> | ||
| 2491 | <property name="window_style"></property> | ||
| 2492 | <property name="wrap">-1</property> | ||
| 2493 | <event name="OnChar"></event> | ||
| 2494 | <event name="OnEnterWindow"></event> | ||
| 2495 | <event name="OnEraseBackground"></event> | ||
| 2496 | <event name="OnKeyDown"></event> | ||
| 2497 | <event name="OnKeyUp"></event> | ||
| 2498 | <event name="OnKillFocus"></event> | ||
| 2499 | <event name="OnLeaveWindow"></event> | ||
| 2500 | <event name="OnLeftDClick"></event> | ||
| 2501 | <event name="OnLeftDown"></event> | ||
| 2502 | <event name="OnLeftUp"></event> | ||
| 2503 | <event name="OnMiddleDClick"></event> | ||
| 2504 | <event name="OnMiddleDown"></event> | ||
| 2505 | <event name="OnMiddleUp"></event> | ||
| 2506 | <event name="OnMotion"></event> | ||
| 2507 | <event name="OnMouseEvents"></event> | ||
| 2508 | <event name="OnMouseWheel"></event> | ||
| 2509 | <event name="OnPaint"></event> | ||
| 2510 | <event name="OnRightDClick"></event> | ||
| 2511 | <event name="OnRightDown"></event> | ||
| 2512 | <event name="OnRightUp"></event> | ||
| 2513 | <event name="OnSetFocus"></event> | ||
| 2514 | <event name="OnSize"></event> | ||
| 2515 | <event name="OnUpdateUI"></event> | ||
| 2516 | </object> | ||
| 2517 | </object> | ||
| 2518 | <object class="sizeritem" expanded="1"> | ||
| 2519 | <property name="border">5</property> | ||
| 2520 | <property name="flag">wxEXPAND|wxLEFT</property> | ||
| 2521 | <property name="proportion">1</property> | ||
| 2522 | <object class="wxBoxSizer" expanded="1"> | ||
| 2523 | <property name="minimum_size">70,-1</property> | ||
| 2524 | <property name="name">bSizer47</property> | ||
| 2525 | <property name="orient">wxHORIZONTAL</property> | ||
| 2526 | <property name="permission">none</property> | ||
| 2527 | <object class="sizeritem" expanded="1"> | ||
| 2528 | <property name="border">5</property> | ||
| 2529 | <property name="flag">wxEXPAND</property> | ||
| 2530 | <property name="proportion">1</property> | ||
| 2531 | <object class="spacer" expanded="1"> | ||
| 2532 | <property name="height">0</property> | ||
| 2533 | <property name="permission">protected</property> | ||
| 2534 | <property name="width">0</property> | ||
| 2535 | </object> | ||
| 2536 | </object> | ||
| 2537 | <object class="sizeritem" expanded="1"> | ||
| 2538 | <property name="border">5</property> | ||
| 2539 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 2540 | <property name="proportion">0</property> | ||
| 2541 | <object class="wxStaticBitmap" expanded="1"> | ||
| 2542 | <property name="bg"></property> | ||
| 2543 | <property name="bitmap">check; Load From Icon Resource [-1; -1]</property> | ||
| 2544 | <property name="context_help"></property> | ||
| 2545 | <property name="enabled">1</property> | ||
| 2546 | <property name="fg"></property> | ||
| 2547 | <property name="font"></property> | ||
| 2548 | <property name="hidden">0</property> | ||
| 2549 | <property name="id">wxID_ANY</property> | ||
| 2550 | <property name="maximum_size"></property> | ||
| 2551 | <property name="minimum_size"></property> | ||
| 2552 | <property name="name">m_bitmapCheckMark</property> | ||
| 2553 | <property name="permission">protected</property> | ||
| 2554 | <property name="pos"></property> | ||
| 2555 | <property name="size">16,16</property> | ||
| 2556 | <property name="subclass"></property> | ||
| 2557 | <property name="tooltip"></property> | ||
| 2558 | <property name="window_extra_style"></property> | ||
| 2559 | <property name="window_name"></property> | ||
| 2560 | <property name="window_style"></property> | ||
| 2561 | <event name="OnChar"></event> | ||
| 2562 | <event name="OnEnterWindow"></event> | ||
| 2563 | <event name="OnEraseBackground"></event> | ||
| 2564 | <event name="OnKeyDown"></event> | ||
| 2565 | <event name="OnKeyUp"></event> | ||
| 2566 | <event name="OnKillFocus"></event> | ||
| 2567 | <event name="OnLeaveWindow"></event> | ||
| 2568 | <event name="OnLeftDClick"></event> | ||
| 2569 | <event name="OnLeftDown"></event> | ||
| 2570 | <event name="OnLeftUp"></event> | ||
| 2571 | <event name="OnMiddleDClick"></event> | ||
| 2572 | <event name="OnMiddleDown"></event> | ||
| 2573 | <event name="OnMiddleUp"></event> | ||
| 2574 | <event name="OnMotion"></event> | ||
| 2575 | <event name="OnMouseEvents"></event> | ||
| 2576 | <event name="OnMouseWheel"></event> | ||
| 2577 | <event name="OnPaint"></event> | ||
| 2578 | <event name="OnRightDClick"></event> | ||
| 2579 | <event name="OnRightDown"></event> | ||
| 2580 | <event name="OnRightUp"></event> | ||
| 2581 | <event name="OnSetFocus"></event> | ||
| 2582 | <event name="OnSize"></event> | ||
| 2583 | <event name="OnUpdateUI"></event> | ||
| 2584 | </object> | ||
| 2585 | </object> | ||
| 2586 | <object class="sizeritem" expanded="1"> | ||
| 2587 | <property name="border">5</property> | ||
| 2588 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 2589 | <property name="proportion">0</property> | ||
| 2590 | <object class="wxStaticText" expanded="1"> | ||
| 2591 | <property name="bg"></property> | ||
| 2592 | <property name="context_help"></property> | ||
| 2593 | <property name="enabled">1</property> | ||
| 2594 | <property name="fg"></property> | ||
| 2595 | <property name="font"></property> | ||
| 2596 | <property name="hidden">0</property> | ||
| 2597 | <property name="id">wxID_ANY</property> | ||
| 2598 | <property name="label">Pay &To:</property> | ||
| 2599 | <property name="maximum_size"></property> | ||
| 2600 | <property name="minimum_size"></property> | ||
| 2601 | <property name="name">m_staticText36</property> | ||
| 2602 | <property name="permission">protected</property> | ||
| 2603 | <property name="pos"></property> | ||
| 2604 | <property name="size">-1,-1</property> | ||
| 2605 | <property name="style">wxALIGN_RIGHT</property> | ||
| 2606 | <property name="subclass"></property> | ||
| 2607 | <property name="tooltip"></property> | ||
| 2608 | <property name="window_extra_style"></property> | ||
| 2609 | <property name="window_name"></property> | ||
| 2610 | <property name="window_style"></property> | ||
| 2611 | <property name="wrap">-1</property> | ||
| 2612 | <event name="OnChar"></event> | ||
| 2613 | <event name="OnEnterWindow"></event> | ||
| 2614 | <event name="OnEraseBackground"></event> | ||
| 2615 | <event name="OnKeyDown"></event> | ||
| 2616 | <event name="OnKeyUp"></event> | ||
| 2617 | <event name="OnKillFocus"></event> | ||
| 2618 | <event name="OnLeaveWindow"></event> | ||
| 2619 | <event name="OnLeftDClick"></event> | ||
| 2620 | <event name="OnLeftDown"></event> | ||
| 2621 | <event name="OnLeftUp"></event> | ||
| 2622 | <event name="OnMiddleDClick"></event> | ||
| 2623 | <event name="OnMiddleDown"></event> | ||
| 2624 | <event name="OnMiddleUp"></event> | ||
| 2625 | <event name="OnMotion"></event> | ||
| 2626 | <event name="OnMouseEvents"></event> | ||
| 2627 | <event name="OnMouseWheel"></event> | ||
| 2628 | <event name="OnPaint"></event> | ||
| 2629 | <event name="OnRightDClick"></event> | ||
| 2630 | <event name="OnRightDown"></event> | ||
| 2631 | <event name="OnRightUp"></event> | ||
| 2632 | <event name="OnSetFocus"></event> | ||
| 2633 | <event name="OnSize"></event> | ||
| 2634 | <event name="OnUpdateUI"></event> | ||
| 2635 | </object> | ||
| 2636 | </object> | ||
| 2637 | </object> | ||
| 2638 | </object> | ||
| 2639 | <object class="sizeritem" expanded="1"> | ||
| 2640 | <property name="border">5</property> | ||
| 2641 | <property name="flag">wxEXPAND|wxRIGHT</property> | ||
| 2642 | <property name="proportion">1</property> | ||
| 2643 | <object class="wxBoxSizer" expanded="1"> | ||
| 2644 | <property name="minimum_size"></property> | ||
| 2645 | <property name="name">bSizer19</property> | ||
| 2646 | <property name="orient">wxHORIZONTAL</property> | ||
| 2647 | <property name="permission">none</property> | ||
| 2648 | <object class="sizeritem" expanded="1"> | ||
| 2649 | <property name="border">5</property> | ||
| 2650 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> | ||
| 2651 | <property name="proportion">1</property> | ||
| 2652 | <object class="wxTextCtrl" expanded="1"> | ||
| 2653 | <property name="bg"></property> | ||
| 2654 | <property name="context_help"></property> | ||
| 2655 | <property name="enabled">1</property> | ||
| 2656 | <property name="fg"></property> | ||
| 2657 | <property name="font"></property> | ||
| 2658 | <property name="hidden">0</property> | ||
| 2659 | <property name="id">wxID_TEXTCTRLPAYTO</property> | ||
| 2660 | <property name="maximum_size"></property> | ||
| 2661 | <property name="maxlength">0</property> | ||
| 2662 | <property name="minimum_size"></property> | ||
| 2663 | <property name="name">m_textCtrlAddress</property> | ||
| 2664 | <property name="permission">protected</property> | ||
| 2665 | <property name="pos"></property> | ||
| 2666 | <property name="size"></property> | ||
| 2667 | <property name="style"></property> | ||
| 2668 | <property name="subclass"></property> | ||
| 2669 | <property name="tooltip"></property> | ||
| 2670 | <property name="value"></property> | ||
| 2671 | <property name="window_extra_style"></property> | ||
| 2672 | <property name="window_name"></property> | ||
| 2673 | <property name="window_style"></property> | ||
| 2674 | <event name="OnChar"></event> | ||
| 2675 | <event name="OnEnterWindow"></event> | ||
| 2676 | <event name="OnEraseBackground"></event> | ||
| 2677 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 2678 | <event name="OnKeyUp"></event> | ||
| 2679 | <event name="OnKillFocus"></event> | ||
| 2680 | <event name="OnLeaveWindow"></event> | ||
| 2681 | <event name="OnLeftDClick"></event> | ||
| 2682 | <event name="OnLeftDown"></event> | ||
| 2683 | <event name="OnLeftUp"></event> | ||
| 2684 | <event name="OnMiddleDClick"></event> | ||
| 2685 | <event name="OnMiddleDown"></event> | ||
| 2686 | <event name="OnMiddleUp"></event> | ||
| 2687 | <event name="OnMotion"></event> | ||
| 2688 | <event name="OnMouseEvents"></event> | ||
| 2689 | <event name="OnMouseWheel"></event> | ||
| 2690 | <event name="OnPaint"></event> | ||
| 2691 | <event name="OnRightDClick"></event> | ||
| 2692 | <event name="OnRightDown"></event> | ||
| 2693 | <event name="OnRightUp"></event> | ||
| 2694 | <event name="OnSetFocus"></event> | ||
| 2695 | <event name="OnSize"></event> | ||
| 2696 | <event name="OnText">OnTextAddress</event> | ||
| 2697 | <event name="OnTextEnter"></event> | ||
| 2698 | <event name="OnTextMaxLen"></event> | ||
| 2699 | <event name="OnTextURL"></event> | ||
| 2700 | <event name="OnUpdateUI"></event> | ||
| 2701 | </object> | ||
| 2702 | </object> | ||
| 2703 | <object class="sizeritem" expanded="1"> | ||
| 2704 | <property name="border">5</property> | ||
| 2705 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> | ||
| 2706 | <property name="proportion">0</property> | ||
| 2707 | <object class="wxButton" expanded="1"> | ||
| 2708 | <property name="bg"></property> | ||
| 2709 | <property name="context_help"></property> | ||
| 2710 | <property name="default">0</property> | ||
| 2711 | <property name="enabled">1</property> | ||
| 2712 | <property name="fg"></property> | ||
| 2713 | <property name="font"></property> | ||
| 2714 | <property name="hidden">0</property> | ||
| 2715 | <property name="id">wxID_BUTTONPASTE</property> | ||
| 2716 | <property name="label">&Paste</property> | ||
| 2717 | <property name="maximum_size"></property> | ||
| 2718 | <property name="minimum_size"></property> | ||
| 2719 | <property name="name">m_buttonPaste</property> | ||
| 2720 | <property name="permission">protected</property> | ||
| 2721 | <property name="pos"></property> | ||
| 2722 | <property name="size">-1,-1</property> | ||
| 2723 | <property name="style">wxBU_EXACTFIT</property> | ||
| 2724 | <property name="subclass"></property> | ||
| 2725 | <property name="tooltip"></property> | ||
| 2726 | <property name="window_extra_style"></property> | ||
| 2727 | <property name="window_name"></property> | ||
| 2728 | <property name="window_style"></property> | ||
| 2729 | <event name="OnButtonClick">OnButtonPaste</event> | ||
| 2730 | <event name="OnChar"></event> | ||
| 2731 | <event name="OnEnterWindow"></event> | ||
| 2732 | <event name="OnEraseBackground"></event> | ||
| 2733 | <event name="OnKeyDown"></event> | ||
| 2734 | <event name="OnKeyUp"></event> | ||
| 2735 | <event name="OnKillFocus"></event> | ||
| 2736 | <event name="OnLeaveWindow"></event> | ||
| 2737 | <event name="OnLeftDClick"></event> | ||
| 2738 | <event name="OnLeftDown"></event> | ||
| 2739 | <event name="OnLeftUp"></event> | ||
| 2740 | <event name="OnMiddleDClick"></event> | ||
| 2741 | <event name="OnMiddleDown"></event> | ||
| 2742 | <event name="OnMiddleUp"></event> | ||
| 2743 | <event name="OnMotion"></event> | ||
| 2744 | <event name="OnMouseEvents"></event> | ||
| 2745 | <event name="OnMouseWheel"></event> | ||
| 2746 | <event name="OnPaint"></event> | ||
| 2747 | <event name="OnRightDClick"></event> | ||
| 2748 | <event name="OnRightDown"></event> | ||
| 2749 | <event name="OnRightUp"></event> | ||
| 2750 | <event name="OnSetFocus"></event> | ||
| 2751 | <event name="OnSize"></event> | ||
| 2752 | <event name="OnUpdateUI"></event> | ||
| 2753 | </object> | ||
| 2754 | </object> | ||
| 2755 | <object class="sizeritem" expanded="1"> | ||
| 2756 | <property name="border">5</property> | ||
| 2757 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> | ||
| 2758 | <property name="proportion">0</property> | ||
| 2759 | <object class="wxButton" expanded="1"> | ||
| 2760 | <property name="bg"></property> | ||
| 2761 | <property name="context_help"></property> | ||
| 2762 | <property name="default">0</property> | ||
| 2763 | <property name="enabled">1</property> | ||
| 2764 | <property name="fg"></property> | ||
| 2765 | <property name="font"></property> | ||
| 2766 | <property name="hidden">0</property> | ||
| 2767 | <property name="id">wxID_BUTTONADDRESSBOOK</property> | ||
| 2768 | <property name="label"> Address &Book...</property> | ||
| 2769 | <property name="maximum_size"></property> | ||
| 2770 | <property name="minimum_size"></property> | ||
| 2771 | <property name="name">m_buttonAddress</property> | ||
| 2772 | <property name="permission">protected</property> | ||
| 2773 | <property name="pos"></property> | ||
| 2774 | <property name="size"></property> | ||
| 2775 | <property name="style"></property> | ||
| 2776 | <property name="subclass"></property> | ||
| 2777 | <property name="tooltip"></property> | ||
| 2778 | <property name="window_extra_style"></property> | ||
| 2779 | <property name="window_name"></property> | ||
| 2780 | <property name="window_style"></property> | ||
| 2781 | <event name="OnButtonClick">OnButtonAddressBook</event> | ||
| 2782 | <event name="OnChar"></event> | ||
| 2783 | <event name="OnEnterWindow"></event> | ||
| 2784 | <event name="OnEraseBackground"></event> | ||
| 2785 | <event name="OnKeyDown"></event> | ||
| 2786 | <event name="OnKeyUp"></event> | ||
| 2787 | <event name="OnKillFocus"></event> | ||
| 2788 | <event name="OnLeaveWindow"></event> | ||
| 2789 | <event name="OnLeftDClick"></event> | ||
| 2790 | <event name="OnLeftDown"></event> | ||
| 2791 | <event name="OnLeftUp"></event> | ||
| 2792 | <event name="OnMiddleDClick"></event> | ||
| 2793 | <event name="OnMiddleDown"></event> | ||
| 2794 | <event name="OnMiddleUp"></event> | ||
| 2795 | <event name="OnMotion"></event> | ||
| 2796 | <event name="OnMouseEvents"></event> | ||
| 2797 | <event name="OnMouseWheel"></event> | ||
| 2798 | <event name="OnPaint"></event> | ||
| 2799 | <event name="OnRightDClick"></event> | ||
| 2800 | <event name="OnRightDown"></event> | ||
| 2801 | <event name="OnRightUp"></event> | ||
| 2802 | <event name="OnSetFocus"></event> | ||
| 2803 | <event name="OnSize"></event> | ||
| 2804 | <event name="OnUpdateUI"></event> | ||
| 2805 | </object> | ||
| 2806 | </object> | ||
| 2807 | </object> | ||
| 2808 | </object> | ||
| 2809 | <object class="sizeritem" expanded="1"> | ||
| 2810 | <property name="border">5</property> | ||
| 2811 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM|wxLEFT|wxALIGN_RIGHT</property> | ||
| 2812 | <property name="proportion">0</property> | ||
| 2813 | <object class="wxStaticText" expanded="1"> | ||
| 2814 | <property name="bg"></property> | ||
| 2815 | <property name="context_help"></property> | ||
| 2816 | <property name="enabled">1</property> | ||
| 2817 | <property name="fg"></property> | ||
| 2818 | <property name="font"></property> | ||
| 2819 | <property name="hidden">0</property> | ||
| 2820 | <property name="id">wxID_ANY</property> | ||
| 2821 | <property name="label">&Amount:</property> | ||
| 2822 | <property name="maximum_size"></property> | ||
| 2823 | <property name="minimum_size"></property> | ||
| 2824 | <property name="name">m_staticText19</property> | ||
| 2825 | <property name="permission">protected</property> | ||
| 2826 | <property name="pos"></property> | ||
| 2827 | <property name="size">-1,-1</property> | ||
| 2828 | <property name="style">wxALIGN_RIGHT</property> | ||
| 2829 | <property name="subclass"></property> | ||
| 2830 | <property name="tooltip"></property> | ||
| 2831 | <property name="window_extra_style"></property> | ||
| 2832 | <property name="window_name"></property> | ||
| 2833 | <property name="window_style"></property> | ||
| 2834 | <property name="wrap">-1</property> | ||
| 2835 | <event name="OnChar"></event> | ||
| 2836 | <event name="OnEnterWindow"></event> | ||
| 2837 | <event name="OnEraseBackground"></event> | ||
| 2838 | <event name="OnKeyDown"></event> | ||
| 2839 | <event name="OnKeyUp"></event> | ||
| 2840 | <event name="OnKillFocus"></event> | ||
| 2841 | <event name="OnLeaveWindow"></event> | ||
| 2842 | <event name="OnLeftDClick"></event> | ||
| 2843 | <event name="OnLeftDown"></event> | ||
| 2844 | <event name="OnLeftUp"></event> | ||
| 2845 | <event name="OnMiddleDClick"></event> | ||
| 2846 | <event name="OnMiddleDown"></event> | ||
| 2847 | <event name="OnMiddleUp"></event> | ||
| 2848 | <event name="OnMotion"></event> | ||
| 2849 | <event name="OnMouseEvents"></event> | ||
| 2850 | <event name="OnMouseWheel"></event> | ||
| 2851 | <event name="OnPaint"></event> | ||
| 2852 | <event name="OnRightDClick"></event> | ||
| 2853 | <event name="OnRightDown"></event> | ||
| 2854 | <event name="OnRightUp"></event> | ||
| 2855 | <event name="OnSetFocus"></event> | ||
| 2856 | <event name="OnSize"></event> | ||
| 2857 | <event name="OnUpdateUI"></event> | ||
| 2858 | </object> | ||
| 2859 | </object> | ||
| 2860 | <object class="sizeritem" expanded="1"> | ||
| 2861 | <property name="border">5</property> | ||
| 2862 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> | ||
| 2863 | <property name="proportion">0</property> | ||
| 2864 | <object class="wxTextCtrl" expanded="1"> | ||
| 2865 | <property name="bg"></property> | ||
| 2866 | <property name="context_help"></property> | ||
| 2867 | <property name="enabled">1</property> | ||
| 2868 | <property name="fg"></property> | ||
| 2869 | <property name="font">,90,90,-1,70,0</property> | ||
| 2870 | <property name="hidden">0</property> | ||
| 2871 | <property name="id">wxID_TEXTCTRLAMOUNT</property> | ||
| 2872 | <property name="maximum_size"></property> | ||
| 2873 | <property name="maxlength">20</property> | ||
| 2874 | <property name="minimum_size"></property> | ||
| 2875 | <property name="name">m_textCtrlAmount</property> | ||
| 2876 | <property name="permission">protected</property> | ||
| 2877 | <property name="pos"></property> | ||
| 2878 | <property name="size">145,-1</property> | ||
| 2879 | <property name="style"></property> | ||
| 2880 | <property name="subclass"></property> | ||
| 2881 | <property name="tooltip"></property> | ||
| 2882 | <property name="value"></property> | ||
| 2883 | <property name="window_extra_style"></property> | ||
| 2884 | <property name="window_name"></property> | ||
| 2885 | <property name="window_style"></property> | ||
| 2886 | <event name="OnChar"></event> | ||
| 2887 | <event name="OnEnterWindow"></event> | ||
| 2888 | <event name="OnEraseBackground"></event> | ||
| 2889 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 2890 | <event name="OnKeyUp"></event> | ||
| 2891 | <event name="OnKillFocus">OnKillFocusAmount</event> | ||
| 2892 | <event name="OnLeaveWindow"></event> | ||
| 2893 | <event name="OnLeftDClick"></event> | ||
| 2894 | <event name="OnLeftDown"></event> | ||
| 2895 | <event name="OnLeftUp"></event> | ||
| 2896 | <event name="OnMiddleDClick"></event> | ||
| 2897 | <event name="OnMiddleDown"></event> | ||
| 2898 | <event name="OnMiddleUp"></event> | ||
| 2899 | <event name="OnMotion"></event> | ||
| 2900 | <event name="OnMouseEvents"></event> | ||
| 2901 | <event name="OnMouseWheel"></event> | ||
| 2902 | <event name="OnPaint"></event> | ||
| 2903 | <event name="OnRightDClick"></event> | ||
| 2904 | <event name="OnRightDown"></event> | ||
| 2905 | <event name="OnRightUp"></event> | ||
| 2906 | <event name="OnSetFocus"></event> | ||
| 2907 | <event name="OnSize"></event> | ||
| 2908 | <event name="OnText"></event> | ||
| 2909 | <event name="OnTextEnter"></event> | ||
| 2910 | <event name="OnTextMaxLen"></event> | ||
| 2911 | <event name="OnTextURL"></event> | ||
| 2912 | <event name="OnUpdateUI"></event> | ||
| 2913 | </object> | ||
| 2914 | </object> | ||
| 2915 | <object class="sizeritem" expanded="1"> | ||
| 2916 | <property name="border">5</property> | ||
| 2917 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 2918 | <property name="proportion">0</property> | ||
| 2919 | <object class="wxStaticText" expanded="1"> | ||
| 2920 | <property name="bg"></property> | ||
| 2921 | <property name="context_help"></property> | ||
| 2922 | <property name="enabled">1</property> | ||
| 2923 | <property name="fg"></property> | ||
| 2924 | <property name="font"></property> | ||
| 2925 | <property name="hidden">0</property> | ||
| 2926 | <property name="id">wxID_ANY</property> | ||
| 2927 | <property name="label">T&ransfer:</property> | ||
| 2928 | <property name="maximum_size"></property> | ||
| 2929 | <property name="minimum_size"></property> | ||
| 2930 | <property name="name">m_staticText20</property> | ||
| 2931 | <property name="permission">protected</property> | ||
| 2932 | <property name="pos"></property> | ||
| 2933 | <property name="size">-1,-1</property> | ||
| 2934 | <property name="style">wxALIGN_RIGHT</property> | ||
| 2935 | <property name="subclass"></property> | ||
| 2936 | <property name="tooltip"></property> | ||
| 2937 | <property name="window_extra_style"></property> | ||
| 2938 | <property name="window_name"></property> | ||
| 2939 | <property name="window_style"></property> | ||
| 2940 | <property name="wrap">-1</property> | ||
| 2941 | <event name="OnChar"></event> | ||
| 2942 | <event name="OnEnterWindow"></event> | ||
| 2943 | <event name="OnEraseBackground"></event> | ||
| 2944 | <event name="OnKeyDown"></event> | ||
| 2945 | <event name="OnKeyUp"></event> | ||
| 2946 | <event name="OnKillFocus"></event> | ||
| 2947 | <event name="OnLeaveWindow"></event> | ||
| 2948 | <event name="OnLeftDClick"></event> | ||
| 2949 | <event name="OnLeftDown"></event> | ||
| 2950 | <event name="OnLeftUp"></event> | ||
| 2951 | <event name="OnMiddleDClick"></event> | ||
| 2952 | <event name="OnMiddleDown"></event> | ||
| 2953 | <event name="OnMiddleUp"></event> | ||
| 2954 | <event name="OnMotion"></event> | ||
| 2955 | <event name="OnMouseEvents"></event> | ||
| 2956 | <event name="OnMouseWheel"></event> | ||
| 2957 | <event name="OnPaint"></event> | ||
| 2958 | <event name="OnRightDClick"></event> | ||
| 2959 | <event name="OnRightDown"></event> | ||
| 2960 | <event name="OnRightUp"></event> | ||
| 2961 | <event name="OnSetFocus"></event> | ||
| 2962 | <event name="OnSize"></event> | ||
| 2963 | <event name="OnUpdateUI"></event> | ||
| 2964 | </object> | ||
| 2965 | </object> | ||
| 2966 | <object class="sizeritem" expanded="1"> | ||
| 2967 | <property name="border">5</property> | ||
| 2968 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property> | ||
| 2969 | <property name="proportion">0</property> | ||
| 2970 | <object class="wxChoice" expanded="1"> | ||
| 2971 | <property name="bg"></property> | ||
| 2972 | <property name="choices">" Standard"</property> | ||
| 2973 | <property name="context_help"></property> | ||
| 2974 | <property name="enabled">1</property> | ||
| 2975 | <property name="fg"></property> | ||
| 2976 | <property name="font"></property> | ||
| 2977 | <property name="hidden">0</property> | ||
| 2978 | <property name="id">wxID_CHOICETRANSFERTYPE</property> | ||
| 2979 | <property name="maximum_size"></property> | ||
| 2980 | <property name="minimum_size"></property> | ||
| 2981 | <property name="name">m_choiceTransferType</property> | ||
| 2982 | <property name="permission">protected</property> | ||
| 2983 | <property name="pos"></property> | ||
| 2984 | <property name="selection">0</property> | ||
| 2985 | <property name="size"></property> | ||
| 2986 | <property name="subclass"></property> | ||
| 2987 | <property name="tooltip"></property> | ||
| 2988 | <property name="window_extra_style"></property> | ||
| 2989 | <property name="window_name"></property> | ||
| 2990 | <property name="window_style"></property> | ||
| 2991 | <event name="OnChar"></event> | ||
| 2992 | <event name="OnChoice"></event> | ||
| 2993 | <event name="OnEnterWindow"></event> | ||
| 2994 | <event name="OnEraseBackground"></event> | ||
| 2995 | <event name="OnKeyDown"></event> | ||
| 2996 | <event name="OnKeyUp"></event> | ||
| 2997 | <event name="OnKillFocus"></event> | ||
| 2998 | <event name="OnLeaveWindow"></event> | ||
| 2999 | <event name="OnLeftDClick"></event> | ||
| 3000 | <event name="OnLeftDown"></event> | ||
| 3001 | <event name="OnLeftUp"></event> | ||
| 3002 | <event name="OnMiddleDClick"></event> | ||
| 3003 | <event name="OnMiddleDown"></event> | ||
| 3004 | <event name="OnMiddleUp"></event> | ||
| 3005 | <event name="OnMotion"></event> | ||
| 3006 | <event name="OnMouseEvents"></event> | ||
| 3007 | <event name="OnMouseWheel"></event> | ||
| 3008 | <event name="OnPaint"></event> | ||
| 3009 | <event name="OnRightDClick"></event> | ||
| 3010 | <event name="OnRightDown"></event> | ||
| 3011 | <event name="OnRightUp"></event> | ||
| 3012 | <event name="OnSetFocus"></event> | ||
| 3013 | <event name="OnSize"></event> | ||
| 3014 | <event name="OnUpdateUI"></event> | ||
| 3015 | </object> | ||
| 3016 | </object> | ||
| 3017 | </object> | ||
| 3018 | </object> | ||
| 3019 | <object class="sizeritem" expanded="1"> | ||
| 3020 | <property name="border">5</property> | ||
| 3021 | <property name="flag">wxEXPAND</property> | ||
| 3022 | <property name="proportion">0</property> | ||
| 3023 | <object class="wxBoxSizer" expanded="1"> | ||
| 3024 | <property name="minimum_size"></property> | ||
| 3025 | <property name="name">bSizer672</property> | ||
| 3026 | <property name="orient">wxHORIZONTAL</property> | ||
| 3027 | <property name="permission">none</property> | ||
| 3028 | <object class="sizeritem" expanded="1"> | ||
| 3029 | <property name="border">5</property> | ||
| 3030 | <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property> | ||
| 3031 | <property name="proportion">1</property> | ||
| 3032 | <object class="wxBoxSizer" expanded="1"> | ||
| 3033 | <property name="minimum_size"></property> | ||
| 3034 | <property name="name">bSizer681</property> | ||
| 3035 | <property name="orient">wxVERTICAL</property> | ||
| 3036 | <property name="permission">none</property> | ||
| 3037 | <object class="sizeritem" expanded="1"> | ||
| 3038 | <property name="border">5</property> | ||
| 3039 | <property name="flag">wxBOTTOM|wxLEFT</property> | ||
| 3040 | <property name="proportion">0</property> | ||
| 3041 | <object class="wxStaticText" expanded="1"> | ||
| 3042 | <property name="bg"></property> | ||
| 3043 | <property name="context_help"></property> | ||
| 3044 | <property name="enabled">1</property> | ||
| 3045 | <property name="fg"></property> | ||
| 3046 | <property name="font"></property> | ||
| 3047 | <property name="hidden">0</property> | ||
| 3048 | <property name="id">wxID_ANY</property> | ||
| 3049 | <property name="label">&From:</property> | ||
| 3050 | <property name="maximum_size"></property> | ||
| 3051 | <property name="minimum_size"></property> | ||
| 3052 | <property name="name">m_staticTextFrom</property> | ||
| 3053 | <property name="permission">protected</property> | ||
| 3054 | <property name="pos"></property> | ||
| 3055 | <property name="size"></property> | ||
| 3056 | <property name="style"></property> | ||
| 3057 | <property name="subclass"></property> | ||
| 3058 | <property name="tooltip"></property> | ||
| 3059 | <property name="window_extra_style"></property> | ||
| 3060 | <property name="window_name"></property> | ||
| 3061 | <property name="window_style"></property> | ||
| 3062 | <property name="wrap">-1</property> | ||
| 3063 | <event name="OnChar"></event> | ||
| 3064 | <event name="OnEnterWindow"></event> | ||
| 3065 | <event name="OnEraseBackground"></event> | ||
| 3066 | <event name="OnKeyDown"></event> | ||
| 3067 | <event name="OnKeyUp"></event> | ||
| 3068 | <event name="OnKillFocus"></event> | ||
| 3069 | <event name="OnLeaveWindow"></event> | ||
| 3070 | <event name="OnLeftDClick"></event> | ||
| 3071 | <event name="OnLeftDown"></event> | ||
| 3072 | <event name="OnLeftUp"></event> | ||
| 3073 | <event name="OnMiddleDClick"></event> | ||
| 3074 | <event name="OnMiddleDown"></event> | ||
| 3075 | <event name="OnMiddleUp"></event> | ||
| 3076 | <event name="OnMotion"></event> | ||
| 3077 | <event name="OnMouseEvents"></event> | ||
| 3078 | <event name="OnMouseWheel"></event> | ||
| 3079 | <event name="OnPaint"></event> | ||
| 3080 | <event name="OnRightDClick"></event> | ||
| 3081 | <event name="OnRightDown"></event> | ||
| 3082 | <event name="OnRightUp"></event> | ||
| 3083 | <event name="OnSetFocus"></event> | ||
| 3084 | <event name="OnSize"></event> | ||
| 3085 | <event name="OnUpdateUI"></event> | ||
| 3086 | </object> | ||
| 3087 | </object> | ||
| 3088 | <object class="sizeritem" expanded="1"> | ||
| 3089 | <property name="border">5</property> | ||
| 3090 | <property name="flag">wxLEFT|wxEXPAND</property> | ||
| 3091 | <property name="proportion">0</property> | ||
| 3092 | <object class="wxTextCtrl" expanded="1"> | ||
| 3093 | <property name="bg"></property> | ||
| 3094 | <property name="context_help"></property> | ||
| 3095 | <property name="enabled">1</property> | ||
| 3096 | <property name="fg"></property> | ||
| 3097 | <property name="font"></property> | ||
| 3098 | <property name="hidden">0</property> | ||
| 3099 | <property name="id">wxID_ANY</property> | ||
| 3100 | <property name="maximum_size"></property> | ||
| 3101 | <property name="maxlength">0</property> | ||
| 3102 | <property name="minimum_size"></property> | ||
| 3103 | <property name="name">m_textCtrlFrom</property> | ||
| 3104 | <property name="permission">protected</property> | ||
| 3105 | <property name="pos"></property> | ||
| 3106 | <property name="size">-1,-1</property> | ||
| 3107 | <property name="style"></property> | ||
| 3108 | <property name="subclass"></property> | ||
| 3109 | <property name="tooltip"></property> | ||
| 3110 | <property name="value"></property> | ||
| 3111 | <property name="window_extra_style"></property> | ||
| 3112 | <property name="window_name"></property> | ||
| 3113 | <property name="window_style"></property> | ||
| 3114 | <event name="OnChar"></event> | ||
| 3115 | <event name="OnEnterWindow"></event> | ||
| 3116 | <event name="OnEraseBackground"></event> | ||
| 3117 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 3118 | <event name="OnKeyUp"></event> | ||
| 3119 | <event name="OnKillFocus"></event> | ||
| 3120 | <event name="OnLeaveWindow"></event> | ||
| 3121 | <event name="OnLeftDClick"></event> | ||
| 3122 | <event name="OnLeftDown"></event> | ||
| 3123 | <event name="OnLeftUp"></event> | ||
| 3124 | <event name="OnMiddleDClick"></event> | ||
| 3125 | <event name="OnMiddleDown"></event> | ||
| 3126 | <event name="OnMiddleUp"></event> | ||
| 3127 | <event name="OnMotion"></event> | ||
| 3128 | <event name="OnMouseEvents"></event> | ||
| 3129 | <event name="OnMouseWheel"></event> | ||
| 3130 | <event name="OnPaint"></event> | ||
| 3131 | <event name="OnRightDClick"></event> | ||
| 3132 | <event name="OnRightDown"></event> | ||
| 3133 | <event name="OnRightUp"></event> | ||
| 3134 | <event name="OnSetFocus"></event> | ||
| 3135 | <event name="OnSize"></event> | ||
| 3136 | <event name="OnText"></event> | ||
| 3137 | <event name="OnTextEnter"></event> | ||
| 3138 | <event name="OnTextMaxLen"></event> | ||
| 3139 | <event name="OnTextURL"></event> | ||
| 3140 | <event name="OnUpdateUI"></event> | ||
| 3141 | </object> | ||
| 3142 | </object> | ||
| 3143 | </object> | ||
| 3144 | </object> | ||
| 3145 | </object> | ||
| 3146 | </object> | ||
| 3147 | <object class="sizeritem" expanded="1"> | ||
| 3148 | <property name="border">5</property> | ||
| 3149 | <property name="flag">wxEXPAND</property> | ||
| 3150 | <property name="proportion">1</property> | ||
| 3151 | <object class="wxBoxSizer" expanded="1"> | ||
| 3152 | <property name="minimum_size"></property> | ||
| 3153 | <property name="name">bSizer67</property> | ||
| 3154 | <property name="orient">wxHORIZONTAL</property> | ||
| 3155 | <property name="permission">none</property> | ||
| 3156 | <object class="sizeritem" expanded="1"> | ||
| 3157 | <property name="border">5</property> | ||
| 3158 | <property name="flag">wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT</property> | ||
| 3159 | <property name="proportion">1</property> | ||
| 3160 | <object class="wxBoxSizer" expanded="1"> | ||
| 3161 | <property name="minimum_size"></property> | ||
| 3162 | <property name="name">bSizer68</property> | ||
| 3163 | <property name="orient">wxVERTICAL</property> | ||
| 3164 | <property name="permission">none</property> | ||
| 3165 | <object class="sizeritem" expanded="1"> | ||
| 3166 | <property name="border">5</property> | ||
| 3167 | <property name="flag">wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 3168 | <property name="proportion">0</property> | ||
| 3169 | <object class="wxStaticText" expanded="1"> | ||
| 3170 | <property name="bg"></property> | ||
| 3171 | <property name="context_help"></property> | ||
| 3172 | <property name="enabled">1</property> | ||
| 3173 | <property name="fg"></property> | ||
| 3174 | <property name="font"></property> | ||
| 3175 | <property name="hidden">0</property> | ||
| 3176 | <property name="id">wxID_ANY</property> | ||
| 3177 | <property name="label">&Message:</property> | ||
| 3178 | <property name="maximum_size"></property> | ||
| 3179 | <property name="minimum_size"></property> | ||
| 3180 | <property name="name">m_staticTextMessage</property> | ||
| 3181 | <property name="permission">protected</property> | ||
| 3182 | <property name="pos"></property> | ||
| 3183 | <property name="size"></property> | ||
| 3184 | <property name="style"></property> | ||
| 3185 | <property name="subclass"></property> | ||
| 3186 | <property name="tooltip"></property> | ||
| 3187 | <property name="window_extra_style"></property> | ||
| 3188 | <property name="window_name"></property> | ||
| 3189 | <property name="window_style"></property> | ||
| 3190 | <property name="wrap">-1</property> | ||
| 3191 | <event name="OnChar"></event> | ||
| 3192 | <event name="OnEnterWindow"></event> | ||
| 3193 | <event name="OnEraseBackground"></event> | ||
| 3194 | <event name="OnKeyDown"></event> | ||
| 3195 | <event name="OnKeyUp"></event> | ||
| 3196 | <event name="OnKillFocus"></event> | ||
| 3197 | <event name="OnLeaveWindow"></event> | ||
| 3198 | <event name="OnLeftDClick"></event> | ||
| 3199 | <event name="OnLeftDown"></event> | ||
| 3200 | <event name="OnLeftUp"></event> | ||
| 3201 | <event name="OnMiddleDClick"></event> | ||
| 3202 | <event name="OnMiddleDown"></event> | ||
| 3203 | <event name="OnMiddleUp"></event> | ||
| 3204 | <event name="OnMotion"></event> | ||
| 3205 | <event name="OnMouseEvents"></event> | ||
| 3206 | <event name="OnMouseWheel"></event> | ||
| 3207 | <event name="OnPaint"></event> | ||
| 3208 | <event name="OnRightDClick"></event> | ||
| 3209 | <event name="OnRightDown"></event> | ||
| 3210 | <event name="OnRightUp"></event> | ||
| 3211 | <event name="OnSetFocus"></event> | ||
| 3212 | <event name="OnSize"></event> | ||
| 3213 | <event name="OnUpdateUI"></event> | ||
| 3214 | </object> | ||
| 3215 | </object> | ||
| 3216 | <object class="sizeritem" expanded="1"> | ||
| 3217 | <property name="border">5</property> | ||
| 3218 | <property name="flag">wxEXPAND|wxLEFT</property> | ||
| 3219 | <property name="proportion">1</property> | ||
| 3220 | <object class="wxTextCtrl" expanded="1"> | ||
| 3221 | <property name="bg"></property> | ||
| 3222 | <property name="context_help"></property> | ||
| 3223 | <property name="enabled">1</property> | ||
| 3224 | <property name="fg"></property> | ||
| 3225 | <property name="font"></property> | ||
| 3226 | <property name="hidden">0</property> | ||
| 3227 | <property name="id">wxID_ANY</property> | ||
| 3228 | <property name="maximum_size"></property> | ||
| 3229 | <property name="maxlength">0</property> | ||
| 3230 | <property name="minimum_size"></property> | ||
| 3231 | <property name="name">m_textCtrlMessage</property> | ||
| 3232 | <property name="permission">protected</property> | ||
| 3233 | <property name="pos"></property> | ||
| 3234 | <property name="size"></property> | ||
| 3235 | <property name="style">wxTE_MULTILINE</property> | ||
| 3236 | <property name="subclass"></property> | ||
| 3237 | <property name="tooltip"></property> | ||
| 3238 | <property name="value"></property> | ||
| 3239 | <property name="window_extra_style"></property> | ||
| 3240 | <property name="window_name"></property> | ||
| 3241 | <property name="window_style"></property> | ||
| 3242 | <event name="OnChar"></event> | ||
| 3243 | <event name="OnEnterWindow"></event> | ||
| 3244 | <event name="OnEraseBackground"></event> | ||
| 3245 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 3246 | <event name="OnKeyUp"></event> | ||
| 3247 | <event name="OnKillFocus"></event> | ||
| 3248 | <event name="OnLeaveWindow"></event> | ||
| 3249 | <event name="OnLeftDClick"></event> | ||
| 3250 | <event name="OnLeftDown"></event> | ||
| 3251 | <event name="OnLeftUp"></event> | ||
| 3252 | <event name="OnMiddleDClick"></event> | ||
| 3253 | <event name="OnMiddleDown"></event> | ||
| 3254 | <event name="OnMiddleUp"></event> | ||
| 3255 | <event name="OnMotion"></event> | ||
| 3256 | <event name="OnMouseEvents"></event> | ||
| 3257 | <event name="OnMouseWheel"></event> | ||
| 3258 | <event name="OnPaint"></event> | ||
| 3259 | <event name="OnRightDClick"></event> | ||
| 3260 | <event name="OnRightDown"></event> | ||
| 3261 | <event name="OnRightUp"></event> | ||
| 3262 | <event name="OnSetFocus"></event> | ||
| 3263 | <event name="OnSize"></event> | ||
| 3264 | <event name="OnText"></event> | ||
| 3265 | <event name="OnTextEnter"></event> | ||
| 3266 | <event name="OnTextMaxLen"></event> | ||
| 3267 | <event name="OnTextURL"></event> | ||
| 3268 | <event name="OnUpdateUI"></event> | ||
| 3269 | </object> | ||
| 3270 | </object> | ||
| 3271 | </object> | ||
| 3272 | </object> | ||
| 3273 | </object> | ||
| 3274 | </object> | ||
| 3275 | <object class="sizeritem" expanded="1"> | ||
| 3276 | <property name="border">5</property> | ||
| 3277 | <property name="flag">wxEXPAND</property> | ||
| 3278 | <property name="proportion">0</property> | ||
| 3279 | <object class="wxBoxSizer" expanded="1"> | ||
| 3280 | <property name="minimum_size"></property> | ||
| 3281 | <property name="name">bSizer23</property> | ||
| 3282 | <property name="orient">wxHORIZONTAL</property> | ||
| 3283 | <property name="permission">none</property> | ||
| 3284 | <object class="sizeritem" expanded="1"> | ||
| 3285 | <property name="border">5</property> | ||
| 3286 | <property name="flag">wxEXPAND</property> | ||
| 3287 | <property name="proportion">1</property> | ||
| 3288 | <object class="spacer" expanded="1"> | ||
| 3289 | <property name="height">0</property> | ||
| 3290 | <property name="permission">protected</property> | ||
| 3291 | <property name="width">0</property> | ||
| 3292 | </object> | ||
| 3293 | </object> | ||
| 3294 | <object class="sizeritem" expanded="1"> | ||
| 3295 | <property name="border">5</property> | ||
| 3296 | <property name="flag">wxALL</property> | ||
| 3297 | <property name="proportion">0</property> | ||
| 3298 | <object class="wxButton" expanded="1"> | ||
| 3299 | <property name="bg"></property> | ||
| 3300 | <property name="context_help"></property> | ||
| 3301 | <property name="default">0</property> | ||
| 3302 | <property name="enabled">1</property> | ||
| 3303 | <property name="fg"></property> | ||
| 3304 | <property name="font">,90,90,-1,70,0</property> | ||
| 3305 | <property name="hidden">0</property> | ||
| 3306 | <property name="id">wxID_BUTTONSEND</property> | ||
| 3307 | <property name="label">&Send</property> | ||
| 3308 | <property name="maximum_size"></property> | ||
| 3309 | <property name="minimum_size">85,25</property> | ||
| 3310 | <property name="name">m_buttonSend</property> | ||
| 3311 | <property name="permission">protected</property> | ||
| 3312 | <property name="pos"></property> | ||
| 3313 | <property name="size">-1,-1</property> | ||
| 3314 | <property name="style"></property> | ||
| 3315 | <property name="subclass"></property> | ||
| 3316 | <property name="tooltip"></property> | ||
| 3317 | <property name="window_extra_style"></property> | ||
| 3318 | <property name="window_name"></property> | ||
| 3319 | <property name="window_style"></property> | ||
| 3320 | <event name="OnButtonClick">OnButtonSend</event> | ||
| 3321 | <event name="OnChar"></event> | ||
| 3322 | <event name="OnEnterWindow"></event> | ||
| 3323 | <event name="OnEraseBackground"></event> | ||
| 3324 | <event name="OnKeyDown"></event> | ||
| 3325 | <event name="OnKeyUp"></event> | ||
| 3326 | <event name="OnKillFocus"></event> | ||
| 3327 | <event name="OnLeaveWindow"></event> | ||
| 3328 | <event name="OnLeftDClick"></event> | ||
| 3329 | <event name="OnLeftDown"></event> | ||
| 3330 | <event name="OnLeftUp"></event> | ||
| 3331 | <event name="OnMiddleDClick"></event> | ||
| 3332 | <event name="OnMiddleDown"></event> | ||
| 3333 | <event name="OnMiddleUp"></event> | ||
| 3334 | <event name="OnMotion"></event> | ||
| 3335 | <event name="OnMouseEvents"></event> | ||
| 3336 | <event name="OnMouseWheel"></event> | ||
| 3337 | <event name="OnPaint"></event> | ||
| 3338 | <event name="OnRightDClick"></event> | ||
| 3339 | <event name="OnRightDown"></event> | ||
| 3340 | <event name="OnRightUp"></event> | ||
| 3341 | <event name="OnSetFocus"></event> | ||
| 3342 | <event name="OnSize"></event> | ||
| 3343 | <event name="OnUpdateUI"></event> | ||
| 3344 | </object> | ||
| 3345 | </object> | ||
| 3346 | <object class="sizeritem" expanded="1"> | ||
| 3347 | <property name="border">5</property> | ||
| 3348 | <property name="flag">wxALL</property> | ||
| 3349 | <property name="proportion">0</property> | ||
| 3350 | <object class="wxButton" expanded="1"> | ||
| 3351 | <property name="bg"></property> | ||
| 3352 | <property name="context_help"></property> | ||
| 3353 | <property name="default">0</property> | ||
| 3354 | <property name="enabled">1</property> | ||
| 3355 | <property name="fg"></property> | ||
| 3356 | <property name="font"></property> | ||
| 3357 | <property name="hidden">0</property> | ||
| 3358 | <property name="id">wxID_CANCEL</property> | ||
| 3359 | <property name="label">Cancel</property> | ||
| 3360 | <property name="maximum_size"></property> | ||
| 3361 | <property name="minimum_size">85,25</property> | ||
| 3362 | <property name="name">m_buttonCancel</property> | ||
| 3363 | <property name="permission">protected</property> | ||
| 3364 | <property name="pos"></property> | ||
| 3365 | <property name="size">-1,-1</property> | ||
| 3366 | <property name="style"></property> | ||
| 3367 | <property name="subclass"></property> | ||
| 3368 | <property name="tooltip"></property> | ||
| 3369 | <property name="window_extra_style"></property> | ||
| 3370 | <property name="window_name"></property> | ||
| 3371 | <property name="window_style"></property> | ||
| 3372 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 3373 | <event name="OnChar"></event> | ||
| 3374 | <event name="OnEnterWindow"></event> | ||
| 3375 | <event name="OnEraseBackground"></event> | ||
| 3376 | <event name="OnKeyDown"></event> | ||
| 3377 | <event name="OnKeyUp"></event> | ||
| 3378 | <event name="OnKillFocus"></event> | ||
| 3379 | <event name="OnLeaveWindow"></event> | ||
| 3380 | <event name="OnLeftDClick"></event> | ||
| 3381 | <event name="OnLeftDown"></event> | ||
| 3382 | <event name="OnLeftUp"></event> | ||
| 3383 | <event name="OnMiddleDClick"></event> | ||
| 3384 | <event name="OnMiddleDown"></event> | ||
| 3385 | <event name="OnMiddleUp"></event> | ||
| 3386 | <event name="OnMotion"></event> | ||
| 3387 | <event name="OnMouseEvents"></event> | ||
| 3388 | <event name="OnMouseWheel"></event> | ||
| 3389 | <event name="OnPaint"></event> | ||
| 3390 | <event name="OnRightDClick"></event> | ||
| 3391 | <event name="OnRightDown"></event> | ||
| 3392 | <event name="OnRightUp"></event> | ||
| 3393 | <event name="OnSetFocus"></event> | ||
| 3394 | <event name="OnSize"></event> | ||
| 3395 | <event name="OnUpdateUI"></event> | ||
| 3396 | </object> | ||
| 3397 | </object> | ||
| 3398 | </object> | ||
| 3399 | </object> | ||
| 3400 | </object> | ||
| 3401 | </object> | ||
| 3402 | <object class="Dialog" expanded="1"> | ||
| 3403 | <property name="bg"></property> | ||
| 3404 | <property name="center"></property> | ||
| 3405 | <property name="context_help"></property> | ||
| 3406 | <property name="enabled">1</property> | ||
| 3407 | <property name="extra_style"></property> | ||
| 3408 | <property name="fg"></property> | ||
| 3409 | <property name="font"></property> | ||
| 3410 | <property name="hidden">0</property> | ||
| 3411 | <property name="id">wxID_ANY</property> | ||
| 3412 | <property name="maximum_size"></property> | ||
| 3413 | <property name="minimum_size"></property> | ||
| 3414 | <property name="name">CSendingDialogBase</property> | ||
| 3415 | <property name="pos"></property> | ||
| 3416 | <property name="size">442,151</property> | ||
| 3417 | <property name="style">wxDEFAULT_DIALOG_STYLE</property> | ||
| 3418 | <property name="subclass"></property> | ||
| 3419 | <property name="title">Sending...</property> | ||
| 3420 | <property name="tooltip"></property> | ||
| 3421 | <property name="window_extra_style"></property> | ||
| 3422 | <property name="window_name"></property> | ||
| 3423 | <property name="window_style"></property> | ||
| 3424 | <event name="OnActivate"></event> | ||
| 3425 | <event name="OnActivateApp"></event> | ||
| 3426 | <event name="OnChar"></event> | ||
| 3427 | <event name="OnClose">OnClose</event> | ||
| 3428 | <event name="OnEnterWindow"></event> | ||
| 3429 | <event name="OnEraseBackground"></event> | ||
| 3430 | <event name="OnHibernate"></event> | ||
| 3431 | <event name="OnIconize"></event> | ||
| 3432 | <event name="OnIdle"></event> | ||
| 3433 | <event name="OnInitDialog"></event> | ||
| 3434 | <event name="OnKeyDown"></event> | ||
| 3435 | <event name="OnKeyUp"></event> | ||
| 3436 | <event name="OnKillFocus"></event> | ||
| 3437 | <event name="OnLeaveWindow"></event> | ||
| 3438 | <event name="OnLeftDClick"></event> | ||
| 3439 | <event name="OnLeftDown"></event> | ||
| 3440 | <event name="OnLeftUp"></event> | ||
| 3441 | <event name="OnMiddleDClick"></event> | ||
| 3442 | <event name="OnMiddleDown"></event> | ||
| 3443 | <event name="OnMiddleUp"></event> | ||
| 3444 | <event name="OnMotion"></event> | ||
| 3445 | <event name="OnMouseEvents"></event> | ||
| 3446 | <event name="OnMouseWheel"></event> | ||
| 3447 | <event name="OnPaint">OnPaint</event> | ||
| 3448 | <event name="OnRightDClick"></event> | ||
| 3449 | <event name="OnRightDown"></event> | ||
| 3450 | <event name="OnRightUp"></event> | ||
| 3451 | <event name="OnSetFocus"></event> | ||
| 3452 | <event name="OnSize"></event> | ||
| 3453 | <event name="OnUpdateUI"></event> | ||
| 3454 | <object class="wxBoxSizer" expanded="1"> | ||
| 3455 | <property name="minimum_size"></property> | ||
| 3456 | <property name="name">bSizer68</property> | ||
| 3457 | <property name="orient">wxVERTICAL</property> | ||
| 3458 | <property name="permission">none</property> | ||
| 3459 | <object class="sizeritem" expanded="1"> | ||
| 3460 | <property name="border">8</property> | ||
| 3461 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property> | ||
| 3462 | <property name="proportion">0</property> | ||
| 3463 | <object class="wxStaticText" expanded="1"> | ||
| 3464 | <property name="bg"></property> | ||
| 3465 | <property name="context_help"></property> | ||
| 3466 | <property name="enabled">1</property> | ||
| 3467 | <property name="fg"></property> | ||
| 3468 | <property name="font"></property> | ||
| 3469 | <property name="hidden">0</property> | ||
| 3470 | <property name="id">wxID_ANY</property> | ||
| 3471 | <property name="label"></property> | ||
| 3472 | <property name="maximum_size"></property> | ||
| 3473 | <property name="minimum_size"></property> | ||
| 3474 | <property name="name">m_staticTextSending</property> | ||
| 3475 | <property name="permission">protected</property> | ||
| 3476 | <property name="pos"></property> | ||
| 3477 | <property name="size">-1,14</property> | ||
| 3478 | <property name="style"></property> | ||
| 3479 | <property name="subclass"></property> | ||
| 3480 | <property name="tooltip"></property> | ||
| 3481 | <property name="window_extra_style"></property> | ||
| 3482 | <property name="window_name"></property> | ||
| 3483 | <property name="window_style"></property> | ||
| 3484 | <property name="wrap">-1</property> | ||
| 3485 | <event name="OnChar"></event> | ||
| 3486 | <event name="OnEnterWindow"></event> | ||
| 3487 | <event name="OnEraseBackground"></event> | ||
| 3488 | <event name="OnKeyDown"></event> | ||
| 3489 | <event name="OnKeyUp"></event> | ||
| 3490 | <event name="OnKillFocus"></event> | ||
| 3491 | <event name="OnLeaveWindow"></event> | ||
| 3492 | <event name="OnLeftDClick"></event> | ||
| 3493 | <event name="OnLeftDown"></event> | ||
| 3494 | <event name="OnLeftUp"></event> | ||
| 3495 | <event name="OnMiddleDClick"></event> | ||
| 3496 | <event name="OnMiddleDown"></event> | ||
| 3497 | <event name="OnMiddleUp"></event> | ||
| 3498 | <event name="OnMotion"></event> | ||
| 3499 | <event name="OnMouseEvents"></event> | ||
| 3500 | <event name="OnMouseWheel"></event> | ||
| 3501 | <event name="OnPaint"></event> | ||
| 3502 | <event name="OnRightDClick"></event> | ||
| 3503 | <event name="OnRightDown"></event> | ||
| 3504 | <event name="OnRightUp"></event> | ||
| 3505 | <event name="OnSetFocus"></event> | ||
| 3506 | <event name="OnSize"></event> | ||
| 3507 | <event name="OnUpdateUI"></event> | ||
| 3508 | </object> | ||
| 3509 | </object> | ||
| 3510 | <object class="sizeritem" expanded="1"> | ||
| 3511 | <property name="border">10</property> | ||
| 3512 | <property name="flag">wxEXPAND|wxRIGHT|wxLEFT</property> | ||
| 3513 | <property name="proportion">1</property> | ||
| 3514 | <object class="wxTextCtrl" expanded="1"> | ||
| 3515 | <property name="bg">wxSYS_COLOUR_BTNFACE</property> | ||
| 3516 | <property name="context_help"></property> | ||
| 3517 | <property name="enabled">1</property> | ||
| 3518 | <property name="fg"></property> | ||
| 3519 | <property name="font"></property> | ||
| 3520 | <property name="hidden">0</property> | ||
| 3521 | <property name="id">wxID_ANY</property> | ||
| 3522 | <property name="maximum_size"></property> | ||
| 3523 | <property name="maxlength">0</property> | ||
| 3524 | <property name="minimum_size"></property> | ||
| 3525 | <property name="name">m_textCtrlStatus</property> | ||
| 3526 | <property name="permission">protected</property> | ||
| 3527 | <property name="pos"></property> | ||
| 3528 | <property name="size"></property> | ||
| 3529 | <property name="style">wxTE_CENTRE|wxTE_MULTILINE|wxTE_NO_VSCROLL|wxTE_READONLY</property> | ||
| 3530 | <property name="subclass"></property> | ||
| 3531 | <property name="tooltip"></property> | ||
| 3532 | <property name="value">

Connecting...</property> | ||
| 3533 | <property name="window_extra_style"></property> | ||
| 3534 | <property name="window_name"></property> | ||
| 3535 | <property name="window_style">wxNO_BORDER</property> | ||
| 3536 | <event name="OnChar"></event> | ||
| 3537 | <event name="OnEnterWindow"></event> | ||
| 3538 | <event name="OnEraseBackground"></event> | ||
| 3539 | <event name="OnKeyDown"></event> | ||
| 3540 | <event name="OnKeyUp"></event> | ||
| 3541 | <event name="OnKillFocus"></event> | ||
| 3542 | <event name="OnLeaveWindow"></event> | ||
| 3543 | <event name="OnLeftDClick"></event> | ||
| 3544 | <event name="OnLeftDown"></event> | ||
| 3545 | <event name="OnLeftUp"></event> | ||
| 3546 | <event name="OnMiddleDClick"></event> | ||
| 3547 | <event name="OnMiddleDown"></event> | ||
| 3548 | <event name="OnMiddleUp"></event> | ||
| 3549 | <event name="OnMotion"></event> | ||
| 3550 | <event name="OnMouseEvents"></event> | ||
| 3551 | <event name="OnMouseWheel"></event> | ||
| 3552 | <event name="OnPaint"></event> | ||
| 3553 | <event name="OnRightDClick"></event> | ||
| 3554 | <event name="OnRightDown"></event> | ||
| 3555 | <event name="OnRightUp"></event> | ||
| 3556 | <event name="OnSetFocus"></event> | ||
| 3557 | <event name="OnSize"></event> | ||
| 3558 | <event name="OnText"></event> | ||
| 3559 | <event name="OnTextEnter"></event> | ||
| 3560 | <event name="OnTextMaxLen"></event> | ||
| 3561 | <event name="OnTextURL"></event> | ||
| 3562 | <event name="OnUpdateUI"></event> | ||
| 3563 | </object> | ||
| 3564 | </object> | ||
| 3565 | <object class="sizeritem" expanded="1"> | ||
| 3566 | <property name="border">5</property> | ||
| 3567 | <property name="flag">wxEXPAND</property> | ||
| 3568 | <property name="proportion">0</property> | ||
| 3569 | <object class="wxBoxSizer" expanded="1"> | ||
| 3570 | <property name="minimum_size"></property> | ||
| 3571 | <property name="name">bSizer69</property> | ||
| 3572 | <property name="orient">wxHORIZONTAL</property> | ||
| 3573 | <property name="permission">none</property> | ||
| 3574 | <object class="sizeritem" expanded="1"> | ||
| 3575 | <property name="border">5</property> | ||
| 3576 | <property name="flag">wxEXPAND</property> | ||
| 3577 | <property name="proportion">1</property> | ||
| 3578 | <object class="spacer" expanded="1"> | ||
| 3579 | <property name="height">0</property> | ||
| 3580 | <property name="permission">protected</property> | ||
| 3581 | <property name="width">0</property> | ||
| 3582 | </object> | ||
| 3583 | </object> | ||
| 3584 | <object class="sizeritem" expanded="1"> | ||
| 3585 | <property name="border">5</property> | ||
| 3586 | <property name="flag">wxALL</property> | ||
| 3587 | <property name="proportion">0</property> | ||
| 3588 | <object class="wxButton" expanded="1"> | ||
| 3589 | <property name="bg"></property> | ||
| 3590 | <property name="context_help"></property> | ||
| 3591 | <property name="default">0</property> | ||
| 3592 | <property name="enabled">0</property> | ||
| 3593 | <property name="fg"></property> | ||
| 3594 | <property name="font"></property> | ||
| 3595 | <property name="hidden">0</property> | ||
| 3596 | <property name="id">wxID_ANY</property> | ||
| 3597 | <property name="label">OK</property> | ||
| 3598 | <property name="maximum_size"></property> | ||
| 3599 | <property name="minimum_size">85,25</property> | ||
| 3600 | <property name="name">m_buttonOK</property> | ||
| 3601 | <property name="permission">protected</property> | ||
| 3602 | <property name="pos"></property> | ||
| 3603 | <property name="size"></property> | ||
| 3604 | <property name="style"></property> | ||
| 3605 | <property name="subclass"></property> | ||
| 3606 | <property name="tooltip"></property> | ||
| 3607 | <property name="window_extra_style"></property> | ||
| 3608 | <property name="window_name"></property> | ||
| 3609 | <property name="window_style"></property> | ||
| 3610 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 3611 | <event name="OnChar"></event> | ||
| 3612 | <event name="OnEnterWindow"></event> | ||
| 3613 | <event name="OnEraseBackground"></event> | ||
| 3614 | <event name="OnKeyDown"></event> | ||
| 3615 | <event name="OnKeyUp"></event> | ||
| 3616 | <event name="OnKillFocus"></event> | ||
| 3617 | <event name="OnLeaveWindow"></event> | ||
| 3618 | <event name="OnLeftDClick"></event> | ||
| 3619 | <event name="OnLeftDown"></event> | ||
| 3620 | <event name="OnLeftUp"></event> | ||
| 3621 | <event name="OnMiddleDClick"></event> | ||
| 3622 | <event name="OnMiddleDown"></event> | ||
| 3623 | <event name="OnMiddleUp"></event> | ||
| 3624 | <event name="OnMotion"></event> | ||
| 3625 | <event name="OnMouseEvents"></event> | ||
| 3626 | <event name="OnMouseWheel"></event> | ||
| 3627 | <event name="OnPaint"></event> | ||
| 3628 | <event name="OnRightDClick"></event> | ||
| 3629 | <event name="OnRightDown"></event> | ||
| 3630 | <event name="OnRightUp"></event> | ||
| 3631 | <event name="OnSetFocus"></event> | ||
| 3632 | <event name="OnSize"></event> | ||
| 3633 | <event name="OnUpdateUI"></event> | ||
| 3634 | </object> | ||
| 3635 | </object> | ||
| 3636 | <object class="sizeritem" expanded="1"> | ||
| 3637 | <property name="border">5</property> | ||
| 3638 | <property name="flag">wxALL</property> | ||
| 3639 | <property name="proportion">0</property> | ||
| 3640 | <object class="wxButton" expanded="1"> | ||
| 3641 | <property name="bg"></property> | ||
| 3642 | <property name="context_help"></property> | ||
| 3643 | <property name="default">0</property> | ||
| 3644 | <property name="enabled">1</property> | ||
| 3645 | <property name="fg"></property> | ||
| 3646 | <property name="font"></property> | ||
| 3647 | <property name="hidden">0</property> | ||
| 3648 | <property name="id">wxID_CANCEL</property> | ||
| 3649 | <property name="label">Cancel</property> | ||
| 3650 | <property name="maximum_size"></property> | ||
| 3651 | <property name="minimum_size">85,25</property> | ||
| 3652 | <property name="name">m_buttonCancel</property> | ||
| 3653 | <property name="permission">protected</property> | ||
| 3654 | <property name="pos"></property> | ||
| 3655 | <property name="size">-1,-1</property> | ||
| 3656 | <property name="style"></property> | ||
| 3657 | <property name="subclass"></property> | ||
| 3658 | <property name="tooltip"></property> | ||
| 3659 | <property name="window_extra_style"></property> | ||
| 3660 | <property name="window_name"></property> | ||
| 3661 | <property name="window_style"></property> | ||
| 3662 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 3663 | <event name="OnChar"></event> | ||
| 3664 | <event name="OnEnterWindow"></event> | ||
| 3665 | <event name="OnEraseBackground"></event> | ||
| 3666 | <event name="OnKeyDown"></event> | ||
| 3667 | <event name="OnKeyUp"></event> | ||
| 3668 | <event name="OnKillFocus"></event> | ||
| 3669 | <event name="OnLeaveWindow"></event> | ||
| 3670 | <event name="OnLeftDClick"></event> | ||
| 3671 | <event name="OnLeftDown"></event> | ||
| 3672 | <event name="OnLeftUp"></event> | ||
| 3673 | <event name="OnMiddleDClick"></event> | ||
| 3674 | <event name="OnMiddleDown"></event> | ||
| 3675 | <event name="OnMiddleUp"></event> | ||
| 3676 | <event name="OnMotion"></event> | ||
| 3677 | <event name="OnMouseEvents"></event> | ||
| 3678 | <event name="OnMouseWheel"></event> | ||
| 3679 | <event name="OnPaint"></event> | ||
| 3680 | <event name="OnRightDClick"></event> | ||
| 3681 | <event name="OnRightDown"></event> | ||
| 3682 | <event name="OnRightUp"></event> | ||
| 3683 | <event name="OnSetFocus"></event> | ||
| 3684 | <event name="OnSize"></event> | ||
| 3685 | <event name="OnUpdateUI"></event> | ||
| 3686 | </object> | ||
| 3687 | </object> | ||
| 3688 | </object> | ||
| 3689 | </object> | ||
| 3690 | </object> | ||
| 3691 | </object> | ||
| 3692 | <object class="Dialog" expanded="0"> | ||
| 3693 | <property name="bg"></property> | ||
| 3694 | <property name="center"></property> | ||
| 3695 | <property name="context_help"></property> | ||
| 3696 | <property name="enabled">1</property> | ||
| 3697 | <property name="extra_style"></property> | ||
| 3698 | <property name="fg"></property> | ||
| 3699 | <property name="font"></property> | ||
| 3700 | <property name="hidden">0</property> | ||
| 3701 | <property name="id">wxID_ANY</property> | ||
| 3702 | <property name="maximum_size"></property> | ||
| 3703 | <property name="minimum_size"></property> | ||
| 3704 | <property name="name">CYourAddressDialogBase</property> | ||
| 3705 | <property name="pos"></property> | ||
| 3706 | <property name="size">610,390</property> | ||
| 3707 | <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> | ||
| 3708 | <property name="subclass"></property> | ||
| 3709 | <property name="title">Your Bitcoin Address</property> | ||
| 3710 | <property name="tooltip"></property> | ||
| 3711 | <property name="window_extra_style"></property> | ||
| 3712 | <property name="window_name"></property> | ||
| 3713 | <property name="window_style"></property> | ||
| 3714 | <event name="OnActivate"></event> | ||
| 3715 | <event name="OnActivateApp"></event> | ||
| 3716 | <event name="OnChar"></event> | ||
| 3717 | <event name="OnClose">OnClose</event> | ||
| 3718 | <event name="OnEnterWindow"></event> | ||
| 3719 | <event name="OnEraseBackground"></event> | ||
| 3720 | <event name="OnHibernate"></event> | ||
| 3721 | <event name="OnIconize"></event> | ||
| 3722 | <event name="OnIdle"></event> | ||
| 3723 | <event name="OnInitDialog"></event> | ||
| 3724 | <event name="OnKeyDown"></event> | ||
| 3725 | <event name="OnKeyUp"></event> | ||
| 3726 | <event name="OnKillFocus"></event> | ||
| 3727 | <event name="OnLeaveWindow"></event> | ||
| 3728 | <event name="OnLeftDClick"></event> | ||
| 3729 | <event name="OnLeftDown"></event> | ||
| 3730 | <event name="OnLeftUp"></event> | ||
| 3731 | <event name="OnMiddleDClick"></event> | ||
| 3732 | <event name="OnMiddleDown"></event> | ||
| 3733 | <event name="OnMiddleUp"></event> | ||
| 3734 | <event name="OnMotion"></event> | ||
| 3735 | <event name="OnMouseEvents"></event> | ||
| 3736 | <event name="OnMouseWheel"></event> | ||
| 3737 | <event name="OnPaint"></event> | ||
| 3738 | <event name="OnRightDClick"></event> | ||
| 3739 | <event name="OnRightDown"></event> | ||
| 3740 | <event name="OnRightUp"></event> | ||
| 3741 | <event name="OnSetFocus"></event> | ||
| 3742 | <event name="OnSize"></event> | ||
| 3743 | <event name="OnUpdateUI"></event> | ||
| 3744 | <object class="wxBoxSizer" expanded="1"> | ||
| 3745 | <property name="minimum_size"></property> | ||
| 3746 | <property name="name">bSizer68</property> | ||
| 3747 | <property name="orient">wxVERTICAL</property> | ||
| 3748 | <property name="permission">none</property> | ||
| 3749 | <object class="sizeritem" expanded="1"> | ||
| 3750 | <property name="border">5</property> | ||
| 3751 | <property name="flag">wxEXPAND</property> | ||
| 3752 | <property name="proportion">0</property> | ||
| 3753 | <object class="spacer" expanded="1"> | ||
| 3754 | <property name="height">5</property> | ||
| 3755 | <property name="permission">protected</property> | ||
| 3756 | <property name="width">0</property> | ||
| 3757 | </object> | ||
| 3758 | </object> | ||
| 3759 | <object class="sizeritem" expanded="1"> | ||
| 3760 | <property name="border">5</property> | ||
| 3761 | <property name="flag">wxALL</property> | ||
| 3762 | <property name="proportion">0</property> | ||
| 3763 | <object class="wxStaticText" expanded="1"> | ||
| 3764 | <property name="bg"></property> | ||
| 3765 | <property name="context_help"></property> | ||
| 3766 | <property name="enabled">1</property> | ||
| 3767 | <property name="fg"></property> | ||
| 3768 | <property name="font"></property> | ||
| 3769 | <property name="hidden">0</property> | ||
| 3770 | <property name="id">wxID_ANY</property> | ||
| 3771 | <property name="label">These are your Bitcoin addresses for receiving payments.
You may want to give a different one to each sender so you can keep track of who is paying you.</property> | ||
| 3772 | <property name="maximum_size"></property> | ||
| 3773 | <property name="minimum_size"></property> | ||
| 3774 | <property name="name">m_staticText45</property> | ||
| 3775 | <property name="permission">protected</property> | ||
| 3776 | <property name="pos"></property> | ||
| 3777 | <property name="size"></property> | ||
| 3778 | <property name="style"></property> | ||
| 3779 | <property name="subclass"></property> | ||
| 3780 | <property name="tooltip"></property> | ||
| 3781 | <property name="window_extra_style"></property> | ||
| 3782 | <property name="window_name"></property> | ||
| 3783 | <property name="window_style"></property> | ||
| 3784 | <property name="wrap">600</property> | ||
| 3785 | <event name="OnChar"></event> | ||
| 3786 | <event name="OnEnterWindow"></event> | ||
| 3787 | <event name="OnEraseBackground"></event> | ||
| 3788 | <event name="OnKeyDown"></event> | ||
| 3789 | <event name="OnKeyUp"></event> | ||
| 3790 | <event name="OnKillFocus"></event> | ||
| 3791 | <event name="OnLeaveWindow"></event> | ||
| 3792 | <event name="OnLeftDClick"></event> | ||
| 3793 | <event name="OnLeftDown"></event> | ||
| 3794 | <event name="OnLeftUp"></event> | ||
| 3795 | <event name="OnMiddleDClick"></event> | ||
| 3796 | <event name="OnMiddleDown"></event> | ||
| 3797 | <event name="OnMiddleUp"></event> | ||
| 3798 | <event name="OnMotion"></event> | ||
| 3799 | <event name="OnMouseEvents"></event> | ||
| 3800 | <event name="OnMouseWheel"></event> | ||
| 3801 | <event name="OnPaint"></event> | ||
| 3802 | <event name="OnRightDClick"></event> | ||
| 3803 | <event name="OnRightDown"></event> | ||
| 3804 | <event name="OnRightUp"></event> | ||
| 3805 | <event name="OnSetFocus"></event> | ||
| 3806 | <event name="OnSize"></event> | ||
| 3807 | <event name="OnUpdateUI"></event> | ||
| 3808 | </object> | ||
| 3809 | </object> | ||
| 3810 | <object class="sizeritem" expanded="1"> | ||
| 3811 | <property name="border">5</property> | ||
| 3812 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 3813 | <property name="proportion">1</property> | ||
| 3814 | <object class="wxListCtrl" expanded="1"> | ||
| 3815 | <property name="bg"></property> | ||
| 3816 | <property name="context_help"></property> | ||
| 3817 | <property name="enabled">1</property> | ||
| 3818 | <property name="fg"></property> | ||
| 3819 | <property name="font"></property> | ||
| 3820 | <property name="hidden">0</property> | ||
| 3821 | <property name="id">wxID_LISTCTRL</property> | ||
| 3822 | <property name="maximum_size"></property> | ||
| 3823 | <property name="minimum_size"></property> | ||
| 3824 | <property name="name">m_listCtrl</property> | ||
| 3825 | <property name="permission">protected</property> | ||
| 3826 | <property name="pos"></property> | ||
| 3827 | <property name="size"></property> | ||
| 3828 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING</property> | ||
| 3829 | <property name="subclass"></property> | ||
| 3830 | <property name="tooltip"></property> | ||
| 3831 | <property name="window_extra_style"></property> | ||
| 3832 | <property name="window_name"></property> | ||
| 3833 | <property name="window_style"></property> | ||
| 3834 | <event name="OnChar"></event> | ||
| 3835 | <event name="OnEnterWindow"></event> | ||
| 3836 | <event name="OnEraseBackground"></event> | ||
| 3837 | <event name="OnKeyDown"></event> | ||
| 3838 | <event name="OnKeyUp"></event> | ||
| 3839 | <event name="OnKillFocus"></event> | ||
| 3840 | <event name="OnLeaveWindow"></event> | ||
| 3841 | <event name="OnLeftDClick"></event> | ||
| 3842 | <event name="OnLeftDown"></event> | ||
| 3843 | <event name="OnLeftUp"></event> | ||
| 3844 | <event name="OnListBeginDrag"></event> | ||
| 3845 | <event name="OnListBeginLabelEdit"></event> | ||
| 3846 | <event name="OnListBeginRDrag"></event> | ||
| 3847 | <event name="OnListCacheHint"></event> | ||
| 3848 | <event name="OnListColBeginDrag"></event> | ||
| 3849 | <event name="OnListColClick"></event> | ||
| 3850 | <event name="OnListColDragging"></event> | ||
| 3851 | <event name="OnListColEndDrag"></event> | ||
| 3852 | <event name="OnListColRightClick"></event> | ||
| 3853 | <event name="OnListDeleteAllItems"></event> | ||
| 3854 | <event name="OnListDeleteItem"></event> | ||
| 3855 | <event name="OnListEndLabelEdit">OnListEndLabelEdit</event> | ||
| 3856 | <event name="OnListInsertItem"></event> | ||
| 3857 | <event name="OnListItemActivated">OnListItemActivated</event> | ||
| 3858 | <event name="OnListItemDeselected"></event> | ||
| 3859 | <event name="OnListItemFocused"></event> | ||
| 3860 | <event name="OnListItemMiddleClick"></event> | ||
| 3861 | <event name="OnListItemRightClick"></event> | ||
| 3862 | <event name="OnListItemSelected">OnListItemSelected</event> | ||
| 3863 | <event name="OnListKeyDown"></event> | ||
| 3864 | <event name="OnMiddleDClick"></event> | ||
| 3865 | <event name="OnMiddleDown"></event> | ||
| 3866 | <event name="OnMiddleUp"></event> | ||
| 3867 | <event name="OnMotion"></event> | ||
| 3868 | <event name="OnMouseEvents"></event> | ||
| 3869 | <event name="OnMouseWheel"></event> | ||
| 3870 | <event name="OnPaint"></event> | ||
| 3871 | <event name="OnRightDClick"></event> | ||
| 3872 | <event name="OnRightDown"></event> | ||
| 3873 | <event name="OnRightUp"></event> | ||
| 3874 | <event name="OnSetFocus"></event> | ||
| 3875 | <event name="OnSize"></event> | ||
| 3876 | <event name="OnUpdateUI"></event> | ||
| 3877 | </object> | ||
| 3878 | </object> | ||
| 3879 | <object class="sizeritem" expanded="1"> | ||
| 3880 | <property name="border">5</property> | ||
| 3881 | <property name="flag">wxEXPAND</property> | ||
| 3882 | <property name="proportion">0</property> | ||
| 3883 | <object class="wxBoxSizer" expanded="1"> | ||
| 3884 | <property name="minimum_size"></property> | ||
| 3885 | <property name="name">bSizer69</property> | ||
| 3886 | <property name="orient">wxHORIZONTAL</property> | ||
| 3887 | <property name="permission">none</property> | ||
| 3888 | <object class="sizeritem" expanded="1"> | ||
| 3889 | <property name="border">5</property> | ||
| 3890 | <property name="flag">wxEXPAND</property> | ||
| 3891 | <property name="proportion">1</property> | ||
| 3892 | <object class="spacer" expanded="1"> | ||
| 3893 | <property name="height">0</property> | ||
| 3894 | <property name="permission">protected</property> | ||
| 3895 | <property name="width">0</property> | ||
| 3896 | </object> | ||
| 3897 | </object> | ||
| 3898 | <object class="sizeritem" expanded="1"> | ||
| 3899 | <property name="border">5</property> | ||
| 3900 | <property name="flag">wxALL</property> | ||
| 3901 | <property name="proportion">0</property> | ||
| 3902 | <object class="wxButton" expanded="1"> | ||
| 3903 | <property name="bg"></property> | ||
| 3904 | <property name="context_help"></property> | ||
| 3905 | <property name="default">0</property> | ||
| 3906 | <property name="enabled">1</property> | ||
| 3907 | <property name="fg"></property> | ||
| 3908 | <property name="font"></property> | ||
| 3909 | <property name="hidden">0</property> | ||
| 3910 | <property name="id">wxID_BUTTONRENAME</property> | ||
| 3911 | <property name="label">&Rename...</property> | ||
| 3912 | <property name="maximum_size"></property> | ||
| 3913 | <property name="minimum_size">85,25</property> | ||
| 3914 | <property name="name">m_buttonRename</property> | ||
| 3915 | <property name="permission">protected</property> | ||
| 3916 | <property name="pos"></property> | ||
| 3917 | <property name="size"></property> | ||
| 3918 | <property name="style"></property> | ||
| 3919 | <property name="subclass"></property> | ||
| 3920 | <property name="tooltip"></property> | ||
| 3921 | <property name="window_extra_style"></property> | ||
| 3922 | <property name="window_name"></property> | ||
| 3923 | <property name="window_style"></property> | ||
| 3924 | <event name="OnButtonClick">OnButtonRename</event> | ||
| 3925 | <event name="OnChar"></event> | ||
| 3926 | <event name="OnEnterWindow"></event> | ||
| 3927 | <event name="OnEraseBackground"></event> | ||
| 3928 | <event name="OnKeyDown"></event> | ||
| 3929 | <event name="OnKeyUp"></event> | ||
| 3930 | <event name="OnKillFocus"></event> | ||
| 3931 | <event name="OnLeaveWindow"></event> | ||
| 3932 | <event name="OnLeftDClick"></event> | ||
| 3933 | <event name="OnLeftDown"></event> | ||
| 3934 | <event name="OnLeftUp"></event> | ||
| 3935 | <event name="OnMiddleDClick"></event> | ||
| 3936 | <event name="OnMiddleDown"></event> | ||
| 3937 | <event name="OnMiddleUp"></event> | ||
| 3938 | <event name="OnMotion"></event> | ||
| 3939 | <event name="OnMouseEvents"></event> | ||
| 3940 | <event name="OnMouseWheel"></event> | ||
| 3941 | <event name="OnPaint"></event> | ||
| 3942 | <event name="OnRightDClick"></event> | ||
| 3943 | <event name="OnRightDown"></event> | ||
| 3944 | <event name="OnRightUp"></event> | ||
| 3945 | <event name="OnSetFocus"></event> | ||
| 3946 | <event name="OnSize"></event> | ||
| 3947 | <event name="OnUpdateUI"></event> | ||
| 3948 | </object> | ||
| 3949 | </object> | ||
| 3950 | <object class="sizeritem" expanded="1"> | ||
| 3951 | <property name="border">5</property> | ||
| 3952 | <property name="flag">wxALL</property> | ||
| 3953 | <property name="proportion">0</property> | ||
| 3954 | <object class="wxButton" expanded="1"> | ||
| 3955 | <property name="bg"></property> | ||
| 3956 | <property name="context_help"></property> | ||
| 3957 | <property name="default">0</property> | ||
| 3958 | <property name="enabled">1</property> | ||
| 3959 | <property name="fg"></property> | ||
| 3960 | <property name="font"></property> | ||
| 3961 | <property name="hidden">0</property> | ||
| 3962 | <property name="id">wxID_BUTTONNEW</property> | ||
| 3963 | <property name="label">&New Address...</property> | ||
| 3964 | <property name="maximum_size"></property> | ||
| 3965 | <property name="minimum_size">110,25</property> | ||
| 3966 | <property name="name">m_buttonNew</property> | ||
| 3967 | <property name="permission">protected</property> | ||
| 3968 | <property name="pos"></property> | ||
| 3969 | <property name="size">-1,-1</property> | ||
| 3970 | <property name="style"></property> | ||
| 3971 | <property name="subclass"></property> | ||
| 3972 | <property name="tooltip"></property> | ||
| 3973 | <property name="window_extra_style"></property> | ||
| 3974 | <property name="window_name"></property> | ||
| 3975 | <property name="window_style"></property> | ||
| 3976 | <event name="OnButtonClick">OnButtonNew</event> | ||
| 3977 | <event name="OnChar"></event> | ||
| 3978 | <event name="OnEnterWindow"></event> | ||
| 3979 | <event name="OnEraseBackground"></event> | ||
| 3980 | <event name="OnKeyDown"></event> | ||
| 3981 | <event name="OnKeyUp"></event> | ||
| 3982 | <event name="OnKillFocus"></event> | ||
| 3983 | <event name="OnLeaveWindow"></event> | ||
| 3984 | <event name="OnLeftDClick"></event> | ||
| 3985 | <event name="OnLeftDown"></event> | ||
| 3986 | <event name="OnLeftUp"></event> | ||
| 3987 | <event name="OnMiddleDClick"></event> | ||
| 3988 | <event name="OnMiddleDown"></event> | ||
| 3989 | <event name="OnMiddleUp"></event> | ||
| 3990 | <event name="OnMotion"></event> | ||
| 3991 | <event name="OnMouseEvents"></event> | ||
| 3992 | <event name="OnMouseWheel"></event> | ||
| 3993 | <event name="OnPaint"></event> | ||
| 3994 | <event name="OnRightDClick"></event> | ||
| 3995 | <event name="OnRightDown"></event> | ||
| 3996 | <event name="OnRightUp"></event> | ||
| 3997 | <event name="OnSetFocus"></event> | ||
| 3998 | <event name="OnSize"></event> | ||
| 3999 | <event name="OnUpdateUI"></event> | ||
| 4000 | </object> | ||
| 4001 | </object> | ||
| 4002 | <object class="sizeritem" expanded="1"> | ||
| 4003 | <property name="border">5</property> | ||
| 4004 | <property name="flag">wxALL</property> | ||
| 4005 | <property name="proportion">0</property> | ||
| 4006 | <object class="wxButton" expanded="1"> | ||
| 4007 | <property name="bg"></property> | ||
| 4008 | <property name="context_help"></property> | ||
| 4009 | <property name="default">0</property> | ||
| 4010 | <property name="enabled">1</property> | ||
| 4011 | <property name="fg"></property> | ||
| 4012 | <property name="font"></property> | ||
| 4013 | <property name="hidden">0</property> | ||
| 4014 | <property name="id">wxID_BUTTONCOPY</property> | ||
| 4015 | <property name="label">&Copy to Clipboard</property> | ||
| 4016 | <property name="maximum_size"></property> | ||
| 4017 | <property name="minimum_size">120,25</property> | ||
| 4018 | <property name="name">m_buttonCopy</property> | ||
| 4019 | <property name="permission">protected</property> | ||
| 4020 | <property name="pos"></property> | ||
| 4021 | <property name="size">-1,-1</property> | ||
| 4022 | <property name="style"></property> | ||
| 4023 | <property name="subclass"></property> | ||
| 4024 | <property name="tooltip"></property> | ||
| 4025 | <property name="window_extra_style"></property> | ||
| 4026 | <property name="window_name"></property> | ||
| 4027 | <property name="window_style"></property> | ||
| 4028 | <event name="OnButtonClick">OnButtonCopy</event> | ||
| 4029 | <event name="OnChar"></event> | ||
| 4030 | <event name="OnEnterWindow"></event> | ||
| 4031 | <event name="OnEraseBackground"></event> | ||
| 4032 | <event name="OnKeyDown"></event> | ||
| 4033 | <event name="OnKeyUp"></event> | ||
| 4034 | <event name="OnKillFocus"></event> | ||
| 4035 | <event name="OnLeaveWindow"></event> | ||
| 4036 | <event name="OnLeftDClick"></event> | ||
| 4037 | <event name="OnLeftDown"></event> | ||
| 4038 | <event name="OnLeftUp"></event> | ||
| 4039 | <event name="OnMiddleDClick"></event> | ||
| 4040 | <event name="OnMiddleDown"></event> | ||
| 4041 | <event name="OnMiddleUp"></event> | ||
| 4042 | <event name="OnMotion"></event> | ||
| 4043 | <event name="OnMouseEvents"></event> | ||
| 4044 | <event name="OnMouseWheel"></event> | ||
| 4045 | <event name="OnPaint"></event> | ||
| 4046 | <event name="OnRightDClick"></event> | ||
| 4047 | <event name="OnRightDown"></event> | ||
| 4048 | <event name="OnRightUp"></event> | ||
| 4049 | <event name="OnSetFocus"></event> | ||
| 4050 | <event name="OnSize"></event> | ||
| 4051 | <event name="OnUpdateUI"></event> | ||
| 4052 | </object> | ||
| 4053 | </object> | ||
| 4054 | <object class="sizeritem" expanded="1"> | ||
| 4055 | <property name="border">5</property> | ||
| 4056 | <property name="flag">wxALL</property> | ||
| 4057 | <property name="proportion">0</property> | ||
| 4058 | <object class="wxButton" expanded="1"> | ||
| 4059 | <property name="bg"></property> | ||
| 4060 | <property name="context_help"></property> | ||
| 4061 | <property name="default">0</property> | ||
| 4062 | <property name="enabled">1</property> | ||
| 4063 | <property name="fg"></property> | ||
| 4064 | <property name="font"></property> | ||
| 4065 | <property name="hidden">0</property> | ||
| 4066 | <property name="id">wxID_OK</property> | ||
| 4067 | <property name="label">OK</property> | ||
| 4068 | <property name="maximum_size"></property> | ||
| 4069 | <property name="minimum_size">85,25</property> | ||
| 4070 | <property name="name">m_buttonOK</property> | ||
| 4071 | <property name="permission">protected</property> | ||
| 4072 | <property name="pos"></property> | ||
| 4073 | <property name="size"></property> | ||
| 4074 | <property name="style"></property> | ||
| 4075 | <property name="subclass"></property> | ||
| 4076 | <property name="tooltip"></property> | ||
| 4077 | <property name="window_extra_style"></property> | ||
| 4078 | <property name="window_name"></property> | ||
| 4079 | <property name="window_style"></property> | ||
| 4080 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 4081 | <event name="OnChar"></event> | ||
| 4082 | <event name="OnEnterWindow"></event> | ||
| 4083 | <event name="OnEraseBackground"></event> | ||
| 4084 | <event name="OnKeyDown"></event> | ||
| 4085 | <event name="OnKeyUp"></event> | ||
| 4086 | <event name="OnKillFocus"></event> | ||
| 4087 | <event name="OnLeaveWindow"></event> | ||
| 4088 | <event name="OnLeftDClick"></event> | ||
| 4089 | <event name="OnLeftDown"></event> | ||
| 4090 | <event name="OnLeftUp"></event> | ||
| 4091 | <event name="OnMiddleDClick"></event> | ||
| 4092 | <event name="OnMiddleDown"></event> | ||
| 4093 | <event name="OnMiddleUp"></event> | ||
| 4094 | <event name="OnMotion"></event> | ||
| 4095 | <event name="OnMouseEvents"></event> | ||
| 4096 | <event name="OnMouseWheel"></event> | ||
| 4097 | <event name="OnPaint"></event> | ||
| 4098 | <event name="OnRightDClick"></event> | ||
| 4099 | <event name="OnRightDown"></event> | ||
| 4100 | <event name="OnRightUp"></event> | ||
| 4101 | <event name="OnSetFocus"></event> | ||
| 4102 | <event name="OnSize"></event> | ||
| 4103 | <event name="OnUpdateUI"></event> | ||
| 4104 | </object> | ||
| 4105 | </object> | ||
| 4106 | <object class="sizeritem" expanded="1"> | ||
| 4107 | <property name="border">5</property> | ||
| 4108 | <property name="flag">wxALL</property> | ||
| 4109 | <property name="proportion">0</property> | ||
| 4110 | <object class="wxButton" expanded="1"> | ||
| 4111 | <property name="bg"></property> | ||
| 4112 | <property name="context_help"></property> | ||
| 4113 | <property name="default">0</property> | ||
| 4114 | <property name="enabled">1</property> | ||
| 4115 | <property name="fg"></property> | ||
| 4116 | <property name="font"></property> | ||
| 4117 | <property name="hidden">0</property> | ||
| 4118 | <property name="id">wxID_CANCEL</property> | ||
| 4119 | <property name="label">Cancel</property> | ||
| 4120 | <property name="maximum_size"></property> | ||
| 4121 | <property name="minimum_size">85,25</property> | ||
| 4122 | <property name="name">m_buttonCancel</property> | ||
| 4123 | <property name="permission">protected</property> | ||
| 4124 | <property name="pos"></property> | ||
| 4125 | <property name="size">-1,-1</property> | ||
| 4126 | <property name="style"></property> | ||
| 4127 | <property name="subclass"></property> | ||
| 4128 | <property name="tooltip"></property> | ||
| 4129 | <property name="window_extra_style"></property> | ||
| 4130 | <property name="window_name"></property> | ||
| 4131 | <property name="window_style"></property> | ||
| 4132 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 4133 | <event name="OnChar"></event> | ||
| 4134 | <event name="OnEnterWindow"></event> | ||
| 4135 | <event name="OnEraseBackground"></event> | ||
| 4136 | <event name="OnKeyDown"></event> | ||
| 4137 | <event name="OnKeyUp"></event> | ||
| 4138 | <event name="OnKillFocus"></event> | ||
| 4139 | <event name="OnLeaveWindow"></event> | ||
| 4140 | <event name="OnLeftDClick"></event> | ||
| 4141 | <event name="OnLeftDown"></event> | ||
| 4142 | <event name="OnLeftUp"></event> | ||
| 4143 | <event name="OnMiddleDClick"></event> | ||
| 4144 | <event name="OnMiddleDown"></event> | ||
| 4145 | <event name="OnMiddleUp"></event> | ||
| 4146 | <event name="OnMotion"></event> | ||
| 4147 | <event name="OnMouseEvents"></event> | ||
| 4148 | <event name="OnMouseWheel"></event> | ||
| 4149 | <event name="OnPaint"></event> | ||
| 4150 | <event name="OnRightDClick"></event> | ||
| 4151 | <event name="OnRightDown"></event> | ||
| 4152 | <event name="OnRightUp"></event> | ||
| 4153 | <event name="OnSetFocus"></event> | ||
| 4154 | <event name="OnSize"></event> | ||
| 4155 | <event name="OnUpdateUI"></event> | ||
| 4156 | </object> | ||
| 4157 | </object> | ||
| 4158 | </object> | ||
| 4159 | </object> | ||
| 4160 | </object> | ||
| 4161 | </object> | ||
| 4162 | <object class="Dialog" expanded="0"> | ||
| 4163 | <property name="bg"></property> | ||
| 4164 | <property name="center"></property> | ||
| 4165 | <property name="context_help"></property> | ||
| 4166 | <property name="enabled">1</property> | ||
| 4167 | <property name="extra_style"></property> | ||
| 4168 | <property name="fg"></property> | ||
| 4169 | <property name="font"></property> | ||
| 4170 | <property name="hidden">0</property> | ||
| 4171 | <property name="id">wxID_ANY</property> | ||
| 4172 | <property name="maximum_size"></property> | ||
| 4173 | <property name="minimum_size"></property> | ||
| 4174 | <property name="name">CAddressBookDialogBase</property> | ||
| 4175 | <property name="pos"></property> | ||
| 4176 | <property name="size">610,390</property> | ||
| 4177 | <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> | ||
| 4178 | <property name="subclass"></property> | ||
| 4179 | <property name="title">Address Book</property> | ||
| 4180 | <property name="tooltip"></property> | ||
| 4181 | <property name="window_extra_style"></property> | ||
| 4182 | <property name="window_name"></property> | ||
| 4183 | <property name="window_style"></property> | ||
| 4184 | <event name="OnActivate"></event> | ||
| 4185 | <event name="OnActivateApp"></event> | ||
| 4186 | <event name="OnChar"></event> | ||
| 4187 | <event name="OnClose">OnClose</event> | ||
| 4188 | <event name="OnEnterWindow"></event> | ||
| 4189 | <event name="OnEraseBackground"></event> | ||
| 4190 | <event name="OnHibernate"></event> | ||
| 4191 | <event name="OnIconize"></event> | ||
| 4192 | <event name="OnIdle"></event> | ||
| 4193 | <event name="OnInitDialog"></event> | ||
| 4194 | <event name="OnKeyDown"></event> | ||
| 4195 | <event name="OnKeyUp"></event> | ||
| 4196 | <event name="OnKillFocus"></event> | ||
| 4197 | <event name="OnLeaveWindow"></event> | ||
| 4198 | <event name="OnLeftDClick"></event> | ||
| 4199 | <event name="OnLeftDown"></event> | ||
| 4200 | <event name="OnLeftUp"></event> | ||
| 4201 | <event name="OnMiddleDClick"></event> | ||
| 4202 | <event name="OnMiddleDown"></event> | ||
| 4203 | <event name="OnMiddleUp"></event> | ||
| 4204 | <event name="OnMotion"></event> | ||
| 4205 | <event name="OnMouseEvents"></event> | ||
| 4206 | <event name="OnMouseWheel"></event> | ||
| 4207 | <event name="OnPaint"></event> | ||
| 4208 | <event name="OnRightDClick"></event> | ||
| 4209 | <event name="OnRightDown"></event> | ||
| 4210 | <event name="OnRightUp"></event> | ||
| 4211 | <event name="OnSetFocus"></event> | ||
| 4212 | <event name="OnSize"></event> | ||
| 4213 | <event name="OnUpdateUI"></event> | ||
| 4214 | <object class="wxBoxSizer" expanded="1"> | ||
| 4215 | <property name="minimum_size"></property> | ||
| 4216 | <property name="name">bSizer68</property> | ||
| 4217 | <property name="orient">wxVERTICAL</property> | ||
| 4218 | <property name="permission">none</property> | ||
| 4219 | <object class="sizeritem" expanded="1"> | ||
| 4220 | <property name="border">5</property> | ||
| 4221 | <property name="flag">wxEXPAND</property> | ||
| 4222 | <property name="proportion">0</property> | ||
| 4223 | <object class="spacer" expanded="1"> | ||
| 4224 | <property name="height">5</property> | ||
| 4225 | <property name="permission">protected</property> | ||
| 4226 | <property name="width">0</property> | ||
| 4227 | </object> | ||
| 4228 | </object> | ||
| 4229 | <object class="sizeritem" expanded="1"> | ||
| 4230 | <property name="border">5</property> | ||
| 4231 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 4232 | <property name="proportion">0</property> | ||
| 4233 | <object class="wxStaticText" expanded="1"> | ||
| 4234 | <property name="bg"></property> | ||
| 4235 | <property name="context_help"></property> | ||
| 4236 | <property name="enabled">1</property> | ||
| 4237 | <property name="fg"></property> | ||
| 4238 | <property name="font"></property> | ||
| 4239 | <property name="hidden">1</property> | ||
| 4240 | <property name="id">wxID_ANY</property> | ||
| 4241 | <property name="label">Bitcoin Address</property> | ||
| 4242 | <property name="maximum_size"></property> | ||
| 4243 | <property name="minimum_size"></property> | ||
| 4244 | <property name="name">m_staticText55</property> | ||
| 4245 | <property name="permission">protected</property> | ||
| 4246 | <property name="pos"></property> | ||
| 4247 | <property name="size"></property> | ||
| 4248 | <property name="style"></property> | ||
| 4249 | <property name="subclass"></property> | ||
| 4250 | <property name="tooltip"></property> | ||
| 4251 | <property name="window_extra_style"></property> | ||
| 4252 | <property name="window_name"></property> | ||
| 4253 | <property name="window_style"></property> | ||
| 4254 | <property name="wrap">-1</property> | ||
| 4255 | <event name="OnChar"></event> | ||
| 4256 | <event name="OnEnterWindow"></event> | ||
| 4257 | <event name="OnEraseBackground"></event> | ||
| 4258 | <event name="OnKeyDown"></event> | ||
| 4259 | <event name="OnKeyUp"></event> | ||
| 4260 | <event name="OnKillFocus"></event> | ||
| 4261 | <event name="OnLeaveWindow"></event> | ||
| 4262 | <event name="OnLeftDClick"></event> | ||
| 4263 | <event name="OnLeftDown"></event> | ||
| 4264 | <event name="OnLeftUp"></event> | ||
| 4265 | <event name="OnMiddleDClick"></event> | ||
| 4266 | <event name="OnMiddleDown"></event> | ||
| 4267 | <event name="OnMiddleUp"></event> | ||
| 4268 | <event name="OnMotion"></event> | ||
| 4269 | <event name="OnMouseEvents"></event> | ||
| 4270 | <event name="OnMouseWheel"></event> | ||
| 4271 | <event name="OnPaint"></event> | ||
| 4272 | <event name="OnRightDClick"></event> | ||
| 4273 | <event name="OnRightDown"></event> | ||
| 4274 | <event name="OnRightUp"></event> | ||
| 4275 | <event name="OnSetFocus"></event> | ||
| 4276 | <event name="OnSize"></event> | ||
| 4277 | <event name="OnUpdateUI"></event> | ||
| 4278 | </object> | ||
| 4279 | </object> | ||
| 4280 | <object class="sizeritem" expanded="1"> | ||
| 4281 | <property name="border">5</property> | ||
| 4282 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 4283 | <property name="proportion">1</property> | ||
| 4284 | <object class="wxListCtrl" expanded="1"> | ||
| 4285 | <property name="bg"></property> | ||
| 4286 | <property name="context_help"></property> | ||
| 4287 | <property name="enabled">1</property> | ||
| 4288 | <property name="fg"></property> | ||
| 4289 | <property name="font"></property> | ||
| 4290 | <property name="hidden">0</property> | ||
| 4291 | <property name="id">wxID_LISTCTRL</property> | ||
| 4292 | <property name="maximum_size"></property> | ||
| 4293 | <property name="minimum_size"></property> | ||
| 4294 | <property name="name">m_listCtrl</property> | ||
| 4295 | <property name="permission">protected</property> | ||
| 4296 | <property name="pos"></property> | ||
| 4297 | <property name="size"></property> | ||
| 4298 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT|wxLC_SORT_ASCENDING</property> | ||
| 4299 | <property name="subclass"></property> | ||
| 4300 | <property name="tooltip"></property> | ||
| 4301 | <property name="window_extra_style"></property> | ||
| 4302 | <property name="window_name"></property> | ||
| 4303 | <property name="window_style"></property> | ||
| 4304 | <event name="OnChar"></event> | ||
| 4305 | <event name="OnEnterWindow"></event> | ||
| 4306 | <event name="OnEraseBackground"></event> | ||
| 4307 | <event name="OnKeyDown"></event> | ||
| 4308 | <event name="OnKeyUp"></event> | ||
| 4309 | <event name="OnKillFocus"></event> | ||
| 4310 | <event name="OnLeaveWindow"></event> | ||
| 4311 | <event name="OnLeftDClick"></event> | ||
| 4312 | <event name="OnLeftDown"></event> | ||
| 4313 | <event name="OnLeftUp"></event> | ||
| 4314 | <event name="OnListBeginDrag"></event> | ||
| 4315 | <event name="OnListBeginLabelEdit"></event> | ||
| 4316 | <event name="OnListBeginRDrag"></event> | ||
| 4317 | <event name="OnListCacheHint"></event> | ||
| 4318 | <event name="OnListColBeginDrag"></event> | ||
| 4319 | <event name="OnListColClick"></event> | ||
| 4320 | <event name="OnListColDragging"></event> | ||
| 4321 | <event name="OnListColEndDrag"></event> | ||
| 4322 | <event name="OnListColRightClick"></event> | ||
| 4323 | <event name="OnListDeleteAllItems"></event> | ||
| 4324 | <event name="OnListDeleteItem"></event> | ||
| 4325 | <event name="OnListEndLabelEdit">OnListEndLabelEdit</event> | ||
| 4326 | <event name="OnListInsertItem"></event> | ||
| 4327 | <event name="OnListItemActivated">OnListItemActivated</event> | ||
| 4328 | <event name="OnListItemDeselected"></event> | ||
| 4329 | <event name="OnListItemFocused"></event> | ||
| 4330 | <event name="OnListItemMiddleClick"></event> | ||
| 4331 | <event name="OnListItemRightClick"></event> | ||
| 4332 | <event name="OnListItemSelected">OnListItemSelected</event> | ||
| 4333 | <event name="OnListKeyDown"></event> | ||
| 4334 | <event name="OnMiddleDClick"></event> | ||
| 4335 | <event name="OnMiddleDown"></event> | ||
| 4336 | <event name="OnMiddleUp"></event> | ||
| 4337 | <event name="OnMotion"></event> | ||
| 4338 | <event name="OnMouseEvents"></event> | ||
| 4339 | <event name="OnMouseWheel"></event> | ||
| 4340 | <event name="OnPaint"></event> | ||
| 4341 | <event name="OnRightDClick"></event> | ||
| 4342 | <event name="OnRightDown"></event> | ||
| 4343 | <event name="OnRightUp"></event> | ||
| 4344 | <event name="OnSetFocus"></event> | ||
| 4345 | <event name="OnSize"></event> | ||
| 4346 | <event name="OnUpdateUI"></event> | ||
| 4347 | </object> | ||
| 4348 | </object> | ||
| 4349 | <object class="sizeritem" expanded="1"> | ||
| 4350 | <property name="border">5</property> | ||
| 4351 | <property name="flag">wxEXPAND</property> | ||
| 4352 | <property name="proportion">0</property> | ||
| 4353 | <object class="wxBoxSizer" expanded="1"> | ||
| 4354 | <property name="minimum_size"></property> | ||
| 4355 | <property name="name">bSizer69</property> | ||
| 4356 | <property name="orient">wxHORIZONTAL</property> | ||
| 4357 | <property name="permission">none</property> | ||
| 4358 | <object class="sizeritem" expanded="1"> | ||
| 4359 | <property name="border">5</property> | ||
| 4360 | <property name="flag">wxEXPAND</property> | ||
| 4361 | <property name="proportion">1</property> | ||
| 4362 | <object class="spacer" expanded="1"> | ||
| 4363 | <property name="height">0</property> | ||
| 4364 | <property name="permission">protected</property> | ||
| 4365 | <property name="width">0</property> | ||
| 4366 | </object> | ||
| 4367 | </object> | ||
| 4368 | <object class="sizeritem" expanded="1"> | ||
| 4369 | <property name="border">5</property> | ||
| 4370 | <property name="flag">wxALL</property> | ||
| 4371 | <property name="proportion">0</property> | ||
| 4372 | <object class="wxButton" expanded="1"> | ||
| 4373 | <property name="bg"></property> | ||
| 4374 | <property name="context_help"></property> | ||
| 4375 | <property name="default">0</property> | ||
| 4376 | <property name="enabled">1</property> | ||
| 4377 | <property name="fg"></property> | ||
| 4378 | <property name="font"></property> | ||
| 4379 | <property name="hidden">0</property> | ||
| 4380 | <property name="id">wxID_BUTTONEDIT</property> | ||
| 4381 | <property name="label">&Edit...</property> | ||
| 4382 | <property name="maximum_size"></property> | ||
| 4383 | <property name="minimum_size">85,25</property> | ||
| 4384 | <property name="name">m_buttonEdit</property> | ||
| 4385 | <property name="permission">protected</property> | ||
| 4386 | <property name="pos"></property> | ||
| 4387 | <property name="size"></property> | ||
| 4388 | <property name="style"></property> | ||
| 4389 | <property name="subclass"></property> | ||
| 4390 | <property name="tooltip"></property> | ||
| 4391 | <property name="window_extra_style"></property> | ||
| 4392 | <property name="window_name"></property> | ||
| 4393 | <property name="window_style"></property> | ||
| 4394 | <event name="OnButtonClick">OnButtonEdit</event> | ||
| 4395 | <event name="OnChar"></event> | ||
| 4396 | <event name="OnEnterWindow"></event> | ||
| 4397 | <event name="OnEraseBackground"></event> | ||
| 4398 | <event name="OnKeyDown"></event> | ||
| 4399 | <event name="OnKeyUp"></event> | ||
| 4400 | <event name="OnKillFocus"></event> | ||
| 4401 | <event name="OnLeaveWindow"></event> | ||
| 4402 | <event name="OnLeftDClick"></event> | ||
| 4403 | <event name="OnLeftDown"></event> | ||
| 4404 | <event name="OnLeftUp"></event> | ||
| 4405 | <event name="OnMiddleDClick"></event> | ||
| 4406 | <event name="OnMiddleDown"></event> | ||
| 4407 | <event name="OnMiddleUp"></event> | ||
| 4408 | <event name="OnMotion"></event> | ||
| 4409 | <event name="OnMouseEvents"></event> | ||
| 4410 | <event name="OnMouseWheel"></event> | ||
| 4411 | <event name="OnPaint"></event> | ||
| 4412 | <event name="OnRightDClick"></event> | ||
| 4413 | <event name="OnRightDown"></event> | ||
| 4414 | <event name="OnRightUp"></event> | ||
| 4415 | <event name="OnSetFocus"></event> | ||
| 4416 | <event name="OnSize"></event> | ||
| 4417 | <event name="OnUpdateUI"></event> | ||
| 4418 | </object> | ||
| 4419 | </object> | ||
| 4420 | <object class="sizeritem" expanded="1"> | ||
| 4421 | <property name="border">5</property> | ||
| 4422 | <property name="flag">wxALL</property> | ||
| 4423 | <property name="proportion">0</property> | ||
| 4424 | <object class="wxButton" expanded="1"> | ||
| 4425 | <property name="bg"></property> | ||
| 4426 | <property name="context_help"></property> | ||
| 4427 | <property name="default">0</property> | ||
| 4428 | <property name="enabled">1</property> | ||
| 4429 | <property name="fg"></property> | ||
| 4430 | <property name="font"></property> | ||
| 4431 | <property name="hidden">0</property> | ||
| 4432 | <property name="id">wxID_BUTTONNEW</property> | ||
| 4433 | <property name="label">&New Address...</property> | ||
| 4434 | <property name="maximum_size"></property> | ||
| 4435 | <property name="minimum_size">110,25</property> | ||
| 4436 | <property name="name">m_buttonNew</property> | ||
| 4437 | <property name="permission">protected</property> | ||
| 4438 | <property name="pos"></property> | ||
| 4439 | <property name="size"></property> | ||
| 4440 | <property name="style"></property> | ||
| 4441 | <property name="subclass"></property> | ||
| 4442 | <property name="tooltip"></property> | ||
| 4443 | <property name="window_extra_style"></property> | ||
| 4444 | <property name="window_name"></property> | ||
| 4445 | <property name="window_style"></property> | ||
| 4446 | <event name="OnButtonClick">OnButtonNew</event> | ||
| 4447 | <event name="OnChar"></event> | ||
| 4448 | <event name="OnEnterWindow"></event> | ||
| 4449 | <event name="OnEraseBackground"></event> | ||
| 4450 | <event name="OnKeyDown"></event> | ||
| 4451 | <event name="OnKeyUp"></event> | ||
| 4452 | <event name="OnKillFocus"></event> | ||
| 4453 | <event name="OnLeaveWindow"></event> | ||
| 4454 | <event name="OnLeftDClick"></event> | ||
| 4455 | <event name="OnLeftDown"></event> | ||
| 4456 | <event name="OnLeftUp"></event> | ||
| 4457 | <event name="OnMiddleDClick"></event> | ||
| 4458 | <event name="OnMiddleDown"></event> | ||
| 4459 | <event name="OnMiddleUp"></event> | ||
| 4460 | <event name="OnMotion"></event> | ||
| 4461 | <event name="OnMouseEvents"></event> | ||
| 4462 | <event name="OnMouseWheel"></event> | ||
| 4463 | <event name="OnPaint"></event> | ||
| 4464 | <event name="OnRightDClick"></event> | ||
| 4465 | <event name="OnRightDown"></event> | ||
| 4466 | <event name="OnRightUp"></event> | ||
| 4467 | <event name="OnSetFocus"></event> | ||
| 4468 | <event name="OnSize"></event> | ||
| 4469 | <event name="OnUpdateUI"></event> | ||
| 4470 | </object> | ||
| 4471 | </object> | ||
| 4472 | <object class="sizeritem" expanded="1"> | ||
| 4473 | <property name="border">5</property> | ||
| 4474 | <property name="flag">wxALL</property> | ||
| 4475 | <property name="proportion">0</property> | ||
| 4476 | <object class="wxButton" expanded="1"> | ||
| 4477 | <property name="bg"></property> | ||
| 4478 | <property name="context_help"></property> | ||
| 4479 | <property name="default">0</property> | ||
| 4480 | <property name="enabled">1</property> | ||
| 4481 | <property name="fg"></property> | ||
| 4482 | <property name="font"></property> | ||
| 4483 | <property name="hidden">0</property> | ||
| 4484 | <property name="id">wxID_BUTTONDELETE</property> | ||
| 4485 | <property name="label">&Delete</property> | ||
| 4486 | <property name="maximum_size"></property> | ||
| 4487 | <property name="minimum_size">85,25</property> | ||
| 4488 | <property name="name">m_buttonDelete</property> | ||
| 4489 | <property name="permission">protected</property> | ||
| 4490 | <property name="pos"></property> | ||
| 4491 | <property name="size"></property> | ||
| 4492 | <property name="style"></property> | ||
| 4493 | <property name="subclass"></property> | ||
| 4494 | <property name="tooltip"></property> | ||
| 4495 | <property name="window_extra_style"></property> | ||
| 4496 | <property name="window_name"></property> | ||
| 4497 | <property name="window_style"></property> | ||
| 4498 | <event name="OnButtonClick">OnButtonDelete</event> | ||
| 4499 | <event name="OnChar"></event> | ||
| 4500 | <event name="OnEnterWindow"></event> | ||
| 4501 | <event name="OnEraseBackground"></event> | ||
| 4502 | <event name="OnKeyDown"></event> | ||
| 4503 | <event name="OnKeyUp"></event> | ||
| 4504 | <event name="OnKillFocus"></event> | ||
| 4505 | <event name="OnLeaveWindow"></event> | ||
| 4506 | <event name="OnLeftDClick"></event> | ||
| 4507 | <event name="OnLeftDown"></event> | ||
| 4508 | <event name="OnLeftUp"></event> | ||
| 4509 | <event name="OnMiddleDClick"></event> | ||
| 4510 | <event name="OnMiddleDown"></event> | ||
| 4511 | <event name="OnMiddleUp"></event> | ||
| 4512 | <event name="OnMotion"></event> | ||
| 4513 | <event name="OnMouseEvents"></event> | ||
| 4514 | <event name="OnMouseWheel"></event> | ||
| 4515 | <event name="OnPaint"></event> | ||
| 4516 | <event name="OnRightDClick"></event> | ||
| 4517 | <event name="OnRightDown"></event> | ||
| 4518 | <event name="OnRightUp"></event> | ||
| 4519 | <event name="OnSetFocus"></event> | ||
| 4520 | <event name="OnSize"></event> | ||
| 4521 | <event name="OnUpdateUI"></event> | ||
| 4522 | </object> | ||
| 4523 | </object> | ||
| 4524 | <object class="sizeritem" expanded="1"> | ||
| 4525 | <property name="border">5</property> | ||
| 4526 | <property name="flag">wxALL</property> | ||
| 4527 | <property name="proportion">0</property> | ||
| 4528 | <object class="wxButton" expanded="1"> | ||
| 4529 | <property name="bg"></property> | ||
| 4530 | <property name="context_help"></property> | ||
| 4531 | <property name="default">0</property> | ||
| 4532 | <property name="enabled">1</property> | ||
| 4533 | <property name="fg"></property> | ||
| 4534 | <property name="font"></property> | ||
| 4535 | <property name="hidden">0</property> | ||
| 4536 | <property name="id">wxID_OK</property> | ||
| 4537 | <property name="label">OK</property> | ||
| 4538 | <property name="maximum_size"></property> | ||
| 4539 | <property name="minimum_size">85,25</property> | ||
| 4540 | <property name="name">m_buttonOK</property> | ||
| 4541 | <property name="permission">protected</property> | ||
| 4542 | <property name="pos"></property> | ||
| 4543 | <property name="size">-1,-1</property> | ||
| 4544 | <property name="style"></property> | ||
| 4545 | <property name="subclass"></property> | ||
| 4546 | <property name="tooltip"></property> | ||
| 4547 | <property name="window_extra_style"></property> | ||
| 4548 | <property name="window_name"></property> | ||
| 4549 | <property name="window_style"></property> | ||
| 4550 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 4551 | <event name="OnChar"></event> | ||
| 4552 | <event name="OnEnterWindow"></event> | ||
| 4553 | <event name="OnEraseBackground"></event> | ||
| 4554 | <event name="OnKeyDown"></event> | ||
| 4555 | <event name="OnKeyUp"></event> | ||
| 4556 | <event name="OnKillFocus"></event> | ||
| 4557 | <event name="OnLeaveWindow"></event> | ||
| 4558 | <event name="OnLeftDClick"></event> | ||
| 4559 | <event name="OnLeftDown"></event> | ||
| 4560 | <event name="OnLeftUp"></event> | ||
| 4561 | <event name="OnMiddleDClick"></event> | ||
| 4562 | <event name="OnMiddleDown"></event> | ||
| 4563 | <event name="OnMiddleUp"></event> | ||
| 4564 | <event name="OnMotion"></event> | ||
| 4565 | <event name="OnMouseEvents"></event> | ||
| 4566 | <event name="OnMouseWheel"></event> | ||
| 4567 | <event name="OnPaint"></event> | ||
| 4568 | <event name="OnRightDClick"></event> | ||
| 4569 | <event name="OnRightDown"></event> | ||
| 4570 | <event name="OnRightUp"></event> | ||
| 4571 | <event name="OnSetFocus"></event> | ||
| 4572 | <event name="OnSize"></event> | ||
| 4573 | <event name="OnUpdateUI"></event> | ||
| 4574 | </object> | ||
| 4575 | </object> | ||
| 4576 | <object class="sizeritem" expanded="1"> | ||
| 4577 | <property name="border">5</property> | ||
| 4578 | <property name="flag">wxALL</property> | ||
| 4579 | <property name="proportion">0</property> | ||
| 4580 | <object class="wxButton" expanded="1"> | ||
| 4581 | <property name="bg"></property> | ||
| 4582 | <property name="context_help"></property> | ||
| 4583 | <property name="default">0</property> | ||
| 4584 | <property name="enabled">1</property> | ||
| 4585 | <property name="fg"></property> | ||
| 4586 | <property name="font"></property> | ||
| 4587 | <property name="hidden">0</property> | ||
| 4588 | <property name="id">wxID_CANCEL</property> | ||
| 4589 | <property name="label">Cancel</property> | ||
| 4590 | <property name="maximum_size"></property> | ||
| 4591 | <property name="minimum_size">85,25</property> | ||
| 4592 | <property name="name">m_buttonCancel</property> | ||
| 4593 | <property name="permission">public</property> | ||
| 4594 | <property name="pos"></property> | ||
| 4595 | <property name="size">-1,-1</property> | ||
| 4596 | <property name="style"></property> | ||
| 4597 | <property name="subclass"></property> | ||
| 4598 | <property name="tooltip"></property> | ||
| 4599 | <property name="window_extra_style"></property> | ||
| 4600 | <property name="window_name"></property> | ||
| 4601 | <property name="window_style"></property> | ||
| 4602 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 4603 | <event name="OnChar"></event> | ||
| 4604 | <event name="OnEnterWindow"></event> | ||
| 4605 | <event name="OnEraseBackground"></event> | ||
| 4606 | <event name="OnKeyDown"></event> | ||
| 4607 | <event name="OnKeyUp"></event> | ||
| 4608 | <event name="OnKillFocus"></event> | ||
| 4609 | <event name="OnLeaveWindow"></event> | ||
| 4610 | <event name="OnLeftDClick"></event> | ||
| 4611 | <event name="OnLeftDown"></event> | ||
| 4612 | <event name="OnLeftUp"></event> | ||
| 4613 | <event name="OnMiddleDClick"></event> | ||
| 4614 | <event name="OnMiddleDown"></event> | ||
| 4615 | <event name="OnMiddleUp"></event> | ||
| 4616 | <event name="OnMotion"></event> | ||
| 4617 | <event name="OnMouseEvents"></event> | ||
| 4618 | <event name="OnMouseWheel"></event> | ||
| 4619 | <event name="OnPaint"></event> | ||
| 4620 | <event name="OnRightDClick"></event> | ||
| 4621 | <event name="OnRightDown"></event> | ||
| 4622 | <event name="OnRightUp"></event> | ||
| 4623 | <event name="OnSetFocus"></event> | ||
| 4624 | <event name="OnSize"></event> | ||
| 4625 | <event name="OnUpdateUI"></event> | ||
| 4626 | </object> | ||
| 4627 | </object> | ||
| 4628 | </object> | ||
| 4629 | </object> | ||
| 4630 | </object> | ||
| 4631 | </object> | ||
| 4632 | <object class="Dialog" expanded="0"> | ||
| 4633 | <property name="bg"></property> | ||
| 4634 | <property name="center"></property> | ||
| 4635 | <property name="context_help"></property> | ||
| 4636 | <property name="enabled">1</property> | ||
| 4637 | <property name="extra_style"></property> | ||
| 4638 | <property name="fg"></property> | ||
| 4639 | <property name="font"></property> | ||
| 4640 | <property name="hidden">0</property> | ||
| 4641 | <property name="id">wxID_ANY</property> | ||
| 4642 | <property name="maximum_size"></property> | ||
| 4643 | <property name="minimum_size"></property> | ||
| 4644 | <property name="name">CProductsDialogBase</property> | ||
| 4645 | <property name="pos"></property> | ||
| 4646 | <property name="size">708,535</property> | ||
| 4647 | <property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property> | ||
| 4648 | <property name="subclass"></property> | ||
| 4649 | <property name="title">Marketplace</property> | ||
| 4650 | <property name="tooltip"></property> | ||
| 4651 | <property name="window_extra_style"></property> | ||
| 4652 | <property name="window_name"></property> | ||
| 4653 | <property name="window_style"></property> | ||
| 4654 | <event name="OnActivate"></event> | ||
| 4655 | <event name="OnActivateApp"></event> | ||
| 4656 | <event name="OnChar"></event> | ||
| 4657 | <event name="OnClose"></event> | ||
| 4658 | <event name="OnEnterWindow"></event> | ||
| 4659 | <event name="OnEraseBackground"></event> | ||
| 4660 | <event name="OnHibernate"></event> | ||
| 4661 | <event name="OnIconize"></event> | ||
| 4662 | <event name="OnIdle"></event> | ||
| 4663 | <event name="OnInitDialog"></event> | ||
| 4664 | <event name="OnKeyDown"></event> | ||
| 4665 | <event name="OnKeyUp"></event> | ||
| 4666 | <event name="OnKillFocus"></event> | ||
| 4667 | <event name="OnLeaveWindow"></event> | ||
| 4668 | <event name="OnLeftDClick"></event> | ||
| 4669 | <event name="OnLeftDown"></event> | ||
| 4670 | <event name="OnLeftUp"></event> | ||
| 4671 | <event name="OnMiddleDClick"></event> | ||
| 4672 | <event name="OnMiddleDown"></event> | ||
| 4673 | <event name="OnMiddleUp"></event> | ||
| 4674 | <event name="OnMotion"></event> | ||
| 4675 | <event name="OnMouseEvents"></event> | ||
| 4676 | <event name="OnMouseWheel"></event> | ||
| 4677 | <event name="OnPaint"></event> | ||
| 4678 | <event name="OnRightDClick"></event> | ||
| 4679 | <event name="OnRightDown"></event> | ||
| 4680 | <event name="OnRightUp"></event> | ||
| 4681 | <event name="OnSetFocus"></event> | ||
| 4682 | <event name="OnSize"></event> | ||
| 4683 | <event name="OnUpdateUI"></event> | ||
| 4684 | <object class="wxBoxSizer" expanded="1"> | ||
| 4685 | <property name="minimum_size"></property> | ||
| 4686 | <property name="name">bSizer22</property> | ||
| 4687 | <property name="orient">wxVERTICAL</property> | ||
| 4688 | <property name="permission">none</property> | ||
| 4689 | <object class="sizeritem" expanded="1"> | ||
| 4690 | <property name="border">5</property> | ||
| 4691 | <property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT</property> | ||
| 4692 | <property name="proportion">0</property> | ||
| 4693 | <object class="wxBoxSizer" expanded="1"> | ||
| 4694 | <property name="minimum_size"></property> | ||
| 4695 | <property name="name">bSizer23</property> | ||
| 4696 | <property name="orient">wxHORIZONTAL</property> | ||
| 4697 | <property name="permission">none</property> | ||
| 4698 | <object class="sizeritem" expanded="1"> | ||
| 4699 | <property name="border">5</property> | ||
| 4700 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 4701 | <property name="proportion">0</property> | ||
| 4702 | <object class="wxComboBox" expanded="1"> | ||
| 4703 | <property name="bg"></property> | ||
| 4704 | <property name="choices">"(Any Category)"</property> | ||
| 4705 | <property name="context_help"></property> | ||
| 4706 | <property name="enabled">1</property> | ||
| 4707 | <property name="fg"></property> | ||
| 4708 | <property name="font"></property> | ||
| 4709 | <property name="hidden">0</property> | ||
| 4710 | <property name="id">wxID_ANY</property> | ||
| 4711 | <property name="maximum_size"></property> | ||
| 4712 | <property name="minimum_size"></property> | ||
| 4713 | <property name="name">m_comboBoxCategory</property> | ||
| 4714 | <property name="permission">protected</property> | ||
| 4715 | <property name="pos"></property> | ||
| 4716 | <property name="size">150,-1</property> | ||
| 4717 | <property name="style"></property> | ||
| 4718 | <property name="subclass"></property> | ||
| 4719 | <property name="tooltip"></property> | ||
| 4720 | <property name="value">(Any Category)</property> | ||
| 4721 | <property name="window_extra_style"></property> | ||
| 4722 | <property name="window_name"></property> | ||
| 4723 | <property name="window_style"></property> | ||
| 4724 | <event name="OnChar"></event> | ||
| 4725 | <event name="OnCombobox">OnCombobox</event> | ||
| 4726 | <event name="OnEnterWindow"></event> | ||
| 4727 | <event name="OnEraseBackground"></event> | ||
| 4728 | <event name="OnKeyDown"></event> | ||
| 4729 | <event name="OnKeyUp"></event> | ||
| 4730 | <event name="OnKillFocus"></event> | ||
| 4731 | <event name="OnLeaveWindow"></event> | ||
| 4732 | <event name="OnLeftDClick"></event> | ||
| 4733 | <event name="OnLeftDown"></event> | ||
| 4734 | <event name="OnLeftUp"></event> | ||
| 4735 | <event name="OnMiddleDClick"></event> | ||
| 4736 | <event name="OnMiddleDown"></event> | ||
| 4737 | <event name="OnMiddleUp"></event> | ||
| 4738 | <event name="OnMotion"></event> | ||
| 4739 | <event name="OnMouseEvents"></event> | ||
| 4740 | <event name="OnMouseWheel"></event> | ||
| 4741 | <event name="OnPaint"></event> | ||
| 4742 | <event name="OnRightDClick"></event> | ||
| 4743 | <event name="OnRightDown"></event> | ||
| 4744 | <event name="OnRightUp"></event> | ||
| 4745 | <event name="OnSetFocus"></event> | ||
| 4746 | <event name="OnSize"></event> | ||
| 4747 | <event name="OnText"></event> | ||
| 4748 | <event name="OnTextEnter"></event> | ||
| 4749 | <event name="OnUpdateUI"></event> | ||
| 4750 | </object> | ||
| 4751 | </object> | ||
| 4752 | <object class="sizeritem" expanded="1"> | ||
| 4753 | <property name="border">5</property> | ||
| 4754 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 4755 | <property name="proportion">1</property> | ||
| 4756 | <object class="wxTextCtrl" expanded="1"> | ||
| 4757 | <property name="bg"></property> | ||
| 4758 | <property name="context_help"></property> | ||
| 4759 | <property name="enabled">1</property> | ||
| 4760 | <property name="fg"></property> | ||
| 4761 | <property name="font"></property> | ||
| 4762 | <property name="hidden">0</property> | ||
| 4763 | <property name="id">wxID_ANY</property> | ||
| 4764 | <property name="maximum_size"></property> | ||
| 4765 | <property name="maxlength">0</property> | ||
| 4766 | <property name="minimum_size"></property> | ||
| 4767 | <property name="name">m_textCtrlSearch</property> | ||
| 4768 | <property name="permission">protected</property> | ||
| 4769 | <property name="pos"></property> | ||
| 4770 | <property name="size"></property> | ||
| 4771 | <property name="style"></property> | ||
| 4772 | <property name="subclass"></property> | ||
| 4773 | <property name="tooltip"></property> | ||
| 4774 | <property name="value"></property> | ||
| 4775 | <property name="window_extra_style"></property> | ||
| 4776 | <property name="window_name"></property> | ||
| 4777 | <property name="window_style"></property> | ||
| 4778 | <event name="OnChar"></event> | ||
| 4779 | <event name="OnEnterWindow"></event> | ||
| 4780 | <event name="OnEraseBackground"></event> | ||
| 4781 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 4782 | <event name="OnKeyUp"></event> | ||
| 4783 | <event name="OnKillFocus"></event> | ||
| 4784 | <event name="OnLeaveWindow"></event> | ||
| 4785 | <event name="OnLeftDClick"></event> | ||
| 4786 | <event name="OnLeftDown"></event> | ||
| 4787 | <event name="OnLeftUp"></event> | ||
| 4788 | <event name="OnMiddleDClick"></event> | ||
| 4789 | <event name="OnMiddleDown"></event> | ||
| 4790 | <event name="OnMiddleUp"></event> | ||
| 4791 | <event name="OnMotion"></event> | ||
| 4792 | <event name="OnMouseEvents"></event> | ||
| 4793 | <event name="OnMouseWheel"></event> | ||
| 4794 | <event name="OnPaint"></event> | ||
| 4795 | <event name="OnRightDClick"></event> | ||
| 4796 | <event name="OnRightDown"></event> | ||
| 4797 | <event name="OnRightUp"></event> | ||
| 4798 | <event name="OnSetFocus"></event> | ||
| 4799 | <event name="OnSize"></event> | ||
| 4800 | <event name="OnText"></event> | ||
| 4801 | <event name="OnTextEnter"></event> | ||
| 4802 | <event name="OnTextMaxLen"></event> | ||
| 4803 | <event name="OnTextURL"></event> | ||
| 4804 | <event name="OnUpdateUI"></event> | ||
| 4805 | </object> | ||
| 4806 | </object> | ||
| 4807 | <object class="sizeritem" expanded="1"> | ||
| 4808 | <property name="border">5</property> | ||
| 4809 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 4810 | <property name="proportion">0</property> | ||
| 4811 | <object class="wxButton" expanded="1"> | ||
| 4812 | <property name="bg"></property> | ||
| 4813 | <property name="context_help"></property> | ||
| 4814 | <property name="default">0</property> | ||
| 4815 | <property name="enabled">1</property> | ||
| 4816 | <property name="fg"></property> | ||
| 4817 | <property name="font"></property> | ||
| 4818 | <property name="hidden">0</property> | ||
| 4819 | <property name="id">wxID_ANY</property> | ||
| 4820 | <property name="label">&Search</property> | ||
| 4821 | <property name="maximum_size"></property> | ||
| 4822 | <property name="minimum_size"></property> | ||
| 4823 | <property name="name">m_buttonSearch</property> | ||
| 4824 | <property name="permission">protected</property> | ||
| 4825 | <property name="pos"></property> | ||
| 4826 | <property name="size"></property> | ||
| 4827 | <property name="style"></property> | ||
| 4828 | <property name="subclass"></property> | ||
| 4829 | <property name="tooltip"></property> | ||
| 4830 | <property name="window_extra_style"></property> | ||
| 4831 | <property name="window_name"></property> | ||
| 4832 | <property name="window_style"></property> | ||
| 4833 | <event name="OnButtonClick">OnButtonSearch</event> | ||
| 4834 | <event name="OnChar"></event> | ||
| 4835 | <event name="OnEnterWindow"></event> | ||
| 4836 | <event name="OnEraseBackground"></event> | ||
| 4837 | <event name="OnKeyDown"></event> | ||
| 4838 | <event name="OnKeyUp"></event> | ||
| 4839 | <event name="OnKillFocus"></event> | ||
| 4840 | <event name="OnLeaveWindow"></event> | ||
| 4841 | <event name="OnLeftDClick"></event> | ||
| 4842 | <event name="OnLeftDown"></event> | ||
| 4843 | <event name="OnLeftUp"></event> | ||
| 4844 | <event name="OnMiddleDClick"></event> | ||
| 4845 | <event name="OnMiddleDown"></event> | ||
| 4846 | <event name="OnMiddleUp"></event> | ||
| 4847 | <event name="OnMotion"></event> | ||
| 4848 | <event name="OnMouseEvents"></event> | ||
| 4849 | <event name="OnMouseWheel"></event> | ||
| 4850 | <event name="OnPaint"></event> | ||
| 4851 | <event name="OnRightDClick"></event> | ||
| 4852 | <event name="OnRightDown"></event> | ||
| 4853 | <event name="OnRightUp"></event> | ||
| 4854 | <event name="OnSetFocus"></event> | ||
| 4855 | <event name="OnSize"></event> | ||
| 4856 | <event name="OnUpdateUI"></event> | ||
| 4857 | </object> | ||
| 4858 | </object> | ||
| 4859 | </object> | ||
| 4860 | </object> | ||
| 4861 | <object class="sizeritem" expanded="1"> | ||
| 4862 | <property name="border">5</property> | ||
| 4863 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 4864 | <property name="proportion">1</property> | ||
| 4865 | <object class="wxListCtrl" expanded="1"> | ||
| 4866 | <property name="bg"></property> | ||
| 4867 | <property name="context_help"></property> | ||
| 4868 | <property name="enabled">1</property> | ||
| 4869 | <property name="fg"></property> | ||
| 4870 | <property name="font"></property> | ||
| 4871 | <property name="hidden">0</property> | ||
| 4872 | <property name="id">wxID_ANY</property> | ||
| 4873 | <property name="maximum_size"></property> | ||
| 4874 | <property name="minimum_size"></property> | ||
| 4875 | <property name="name">m_listCtrl</property> | ||
| 4876 | <property name="permission">protected</property> | ||
| 4877 | <property name="pos"></property> | ||
| 4878 | <property name="size"></property> | ||
| 4879 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property> | ||
| 4880 | <property name="subclass"></property> | ||
| 4881 | <property name="tooltip"></property> | ||
| 4882 | <property name="window_extra_style"></property> | ||
| 4883 | <property name="window_name"></property> | ||
| 4884 | <property name="window_style"></property> | ||
| 4885 | <event name="OnChar"></event> | ||
| 4886 | <event name="OnEnterWindow"></event> | ||
| 4887 | <event name="OnEraseBackground"></event> | ||
| 4888 | <event name="OnKeyDown"></event> | ||
| 4889 | <event name="OnKeyUp"></event> | ||
| 4890 | <event name="OnKillFocus"></event> | ||
| 4891 | <event name="OnLeaveWindow"></event> | ||
| 4892 | <event name="OnLeftDClick"></event> | ||
| 4893 | <event name="OnLeftDown"></event> | ||
| 4894 | <event name="OnLeftUp"></event> | ||
| 4895 | <event name="OnListBeginDrag"></event> | ||
| 4896 | <event name="OnListBeginLabelEdit"></event> | ||
| 4897 | <event name="OnListBeginRDrag"></event> | ||
| 4898 | <event name="OnListCacheHint"></event> | ||
| 4899 | <event name="OnListColBeginDrag"></event> | ||
| 4900 | <event name="OnListColClick"></event> | ||
| 4901 | <event name="OnListColDragging"></event> | ||
| 4902 | <event name="OnListColEndDrag"></event> | ||
| 4903 | <event name="OnListColRightClick"></event> | ||
| 4904 | <event name="OnListDeleteAllItems"></event> | ||
| 4905 | <event name="OnListDeleteItem"></event> | ||
| 4906 | <event name="OnListEndLabelEdit"></event> | ||
| 4907 | <event name="OnListInsertItem"></event> | ||
| 4908 | <event name="OnListItemActivated">OnListItemActivated</event> | ||
| 4909 | <event name="OnListItemDeselected"></event> | ||
| 4910 | <event name="OnListItemFocused"></event> | ||
| 4911 | <event name="OnListItemMiddleClick"></event> | ||
| 4912 | <event name="OnListItemRightClick"></event> | ||
| 4913 | <event name="OnListItemSelected"></event> | ||
| 4914 | <event name="OnListKeyDown"></event> | ||
| 4915 | <event name="OnMiddleDClick"></event> | ||
| 4916 | <event name="OnMiddleDown"></event> | ||
| 4917 | <event name="OnMiddleUp"></event> | ||
| 4918 | <event name="OnMotion"></event> | ||
| 4919 | <event name="OnMouseEvents"></event> | ||
| 4920 | <event name="OnMouseWheel"></event> | ||
| 4921 | <event name="OnPaint"></event> | ||
| 4922 | <event name="OnRightDClick"></event> | ||
| 4923 | <event name="OnRightDown"></event> | ||
| 4924 | <event name="OnRightUp"></event> | ||
| 4925 | <event name="OnSetFocus"></event> | ||
| 4926 | <event name="OnSize"></event> | ||
| 4927 | <event name="OnUpdateUI"></event> | ||
| 4928 | </object> | ||
| 4929 | </object> | ||
| 4930 | </object> | ||
| 4931 | </object> | ||
| 4932 | <object class="Frame" expanded="0"> | ||
| 4933 | <property name="bg">wxSYS_COLOUR_MENU</property> | ||
| 4934 | <property name="center"></property> | ||
| 4935 | <property name="context_help"></property> | ||
| 4936 | <property name="enabled">1</property> | ||
| 4937 | <property name="extra_style"></property> | ||
| 4938 | <property name="fg"></property> | ||
| 4939 | <property name="font"></property> | ||
| 4940 | <property name="hidden">0</property> | ||
| 4941 | <property name="id">wxID_ANY</property> | ||
| 4942 | <property name="maximum_size"></property> | ||
| 4943 | <property name="minimum_size"></property> | ||
| 4944 | <property name="name">CEditProductDialogBase</property> | ||
| 4945 | <property name="pos"></property> | ||
| 4946 | <property name="size">660,640</property> | ||
| 4947 | <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property> | ||
| 4948 | <property name="subclass"></property> | ||
| 4949 | <property name="title">Edit Product</property> | ||
| 4950 | <property name="tooltip"></property> | ||
| 4951 | <property name="window_extra_style"></property> | ||
| 4952 | <property name="window_name"></property> | ||
| 4953 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 4954 | <property name="xrc_skip_sizer">1</property> | ||
| 4955 | <event name="OnActivate"></event> | ||
| 4956 | <event name="OnActivateApp"></event> | ||
| 4957 | <event name="OnChar"></event> | ||
| 4958 | <event name="OnClose"></event> | ||
| 4959 | <event name="OnEnterWindow"></event> | ||
| 4960 | <event name="OnEraseBackground"></event> | ||
| 4961 | <event name="OnHibernate"></event> | ||
| 4962 | <event name="OnIconize"></event> | ||
| 4963 | <event name="OnIdle"></event> | ||
| 4964 | <event name="OnKeyDown"></event> | ||
| 4965 | <event name="OnKeyUp"></event> | ||
| 4966 | <event name="OnKillFocus"></event> | ||
| 4967 | <event name="OnLeaveWindow"></event> | ||
| 4968 | <event name="OnLeftDClick"></event> | ||
| 4969 | <event name="OnLeftDown"></event> | ||
| 4970 | <event name="OnLeftUp"></event> | ||
| 4971 | <event name="OnMiddleDClick"></event> | ||
| 4972 | <event name="OnMiddleDown"></event> | ||
| 4973 | <event name="OnMiddleUp"></event> | ||
| 4974 | <event name="OnMotion"></event> | ||
| 4975 | <event name="OnMouseEvents"></event> | ||
| 4976 | <event name="OnMouseWheel"></event> | ||
| 4977 | <event name="OnPaint"></event> | ||
| 4978 | <event name="OnRightDClick"></event> | ||
| 4979 | <event name="OnRightDown"></event> | ||
| 4980 | <event name="OnRightUp"></event> | ||
| 4981 | <event name="OnSetFocus"></event> | ||
| 4982 | <event name="OnSize"></event> | ||
| 4983 | <event name="OnUpdateUI"></event> | ||
| 4984 | <object class="wxBoxSizer" expanded="1"> | ||
| 4985 | <property name="minimum_size"></property> | ||
| 4986 | <property name="name">bSizer20</property> | ||
| 4987 | <property name="orient">wxVERTICAL</property> | ||
| 4988 | <property name="permission">none</property> | ||
| 4989 | <object class="sizeritem" expanded="1"> | ||
| 4990 | <property name="border">5</property> | ||
| 4991 | <property name="flag">wxEXPAND|wxALL</property> | ||
| 4992 | <property name="proportion">1</property> | ||
| 4993 | <object class="wxScrolledWindow" expanded="1"> | ||
| 4994 | <property name="bg">wxSYS_COLOUR_WINDOW</property> | ||
| 4995 | <property name="context_help"></property> | ||
| 4996 | <property name="enabled">1</property> | ||
| 4997 | <property name="fg"></property> | ||
| 4998 | <property name="font"></property> | ||
| 4999 | <property name="hidden">0</property> | ||
| 5000 | <property name="id">wxID_ANY</property> | ||
| 5001 | <property name="maximum_size"></property> | ||
| 5002 | <property name="minimum_size"></property> | ||
| 5003 | <property name="name">m_scrolledWindow</property> | ||
| 5004 | <property name="permission">protected</property> | ||
| 5005 | <property name="pos"></property> | ||
| 5006 | <property name="scroll_rate_x">5</property> | ||
| 5007 | <property name="scroll_rate_y">5</property> | ||
| 5008 | <property name="size"></property> | ||
| 5009 | <property name="subclass"></property> | ||
| 5010 | <property name="tooltip"></property> | ||
| 5011 | <property name="window_extra_style"></property> | ||
| 5012 | <property name="window_name"></property> | ||
| 5013 | <property name="window_style">wxHSCROLL|wxTAB_TRAVERSAL|wxVSCROLL</property> | ||
| 5014 | <event name="OnChar"></event> | ||
| 5015 | <event name="OnEnterWindow"></event> | ||
| 5016 | <event name="OnEraseBackground"></event> | ||
| 5017 | <event name="OnKeyDown"></event> | ||
| 5018 | <event name="OnKeyUp"></event> | ||
| 5019 | <event name="OnKillFocus"></event> | ||
| 5020 | <event name="OnLeaveWindow"></event> | ||
| 5021 | <event name="OnLeftDClick"></event> | ||
| 5022 | <event name="OnLeftDown"></event> | ||
| 5023 | <event name="OnLeftUp"></event> | ||
| 5024 | <event name="OnMiddleDClick"></event> | ||
| 5025 | <event name="OnMiddleDown"></event> | ||
| 5026 | <event name="OnMiddleUp"></event> | ||
| 5027 | <event name="OnMotion"></event> | ||
| 5028 | <event name="OnMouseEvents"></event> | ||
| 5029 | <event name="OnMouseWheel"></event> | ||
| 5030 | <event name="OnPaint"></event> | ||
| 5031 | <event name="OnRightDClick"></event> | ||
| 5032 | <event name="OnRightDown"></event> | ||
| 5033 | <event name="OnRightUp"></event> | ||
| 5034 | <event name="OnSetFocus"></event> | ||
| 5035 | <event name="OnSize"></event> | ||
| 5036 | <event name="OnUpdateUI"></event> | ||
| 5037 | <object class="wxBoxSizer" expanded="1"> | ||
| 5038 | <property name="minimum_size"></property> | ||
| 5039 | <property name="name">bSizer21</property> | ||
| 5040 | <property name="orient">wxVERTICAL</property> | ||
| 5041 | <property name="permission">none</property> | ||
| 5042 | <object class="sizeritem" expanded="1"> | ||
| 5043 | <property name="border">5</property> | ||
| 5044 | <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property> | ||
| 5045 | <property name="proportion">0</property> | ||
| 5046 | <object class="wxFlexGridSizer" expanded="1"> | ||
| 5047 | <property name="cols">2</property> | ||
| 5048 | <property name="flexible_direction">wxBOTH</property> | ||
| 5049 | <property name="growablecols">1</property> | ||
| 5050 | <property name="growablerows"></property> | ||
| 5051 | <property name="hgap">0</property> | ||
| 5052 | <property name="minimum_size"></property> | ||
| 5053 | <property name="name">fgSizer8</property> | ||
| 5054 | <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property> | ||
| 5055 | <property name="permission">none</property> | ||
| 5056 | <property name="rows">0</property> | ||
| 5057 | <property name="vgap">0</property> | ||
| 5058 | <object class="sizeritem" expanded="1"> | ||
| 5059 | <property name="border">5</property> | ||
| 5060 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 5061 | <property name="proportion">0</property> | ||
| 5062 | <object class="wxStaticText" expanded="1"> | ||
| 5063 | <property name="bg"></property> | ||
| 5064 | <property name="context_help"></property> | ||
| 5065 | <property name="enabled">1</property> | ||
| 5066 | <property name="fg"></property> | ||
| 5067 | <property name="font"></property> | ||
| 5068 | <property name="hidden">0</property> | ||
| 5069 | <property name="id">wxID_ANY</property> | ||
| 5070 | <property name="label">Category</property> | ||
| 5071 | <property name="maximum_size"></property> | ||
| 5072 | <property name="minimum_size"></property> | ||
| 5073 | <property name="name">m_staticText106</property> | ||
| 5074 | <property name="permission">protected</property> | ||
| 5075 | <property name="pos"></property> | ||
| 5076 | <property name="size"></property> | ||
| 5077 | <property name="style">wxALIGN_RIGHT</property> | ||
| 5078 | <property name="subclass"></property> | ||
| 5079 | <property name="tooltip"></property> | ||
| 5080 | <property name="window_extra_style"></property> | ||
| 5081 | <property name="window_name"></property> | ||
| 5082 | <property name="window_style"></property> | ||
| 5083 | <property name="wrap">-1</property> | ||
| 5084 | <event name="OnChar"></event> | ||
| 5085 | <event name="OnEnterWindow"></event> | ||
| 5086 | <event name="OnEraseBackground"></event> | ||
| 5087 | <event name="OnKeyDown"></event> | ||
| 5088 | <event name="OnKeyUp"></event> | ||
| 5089 | <event name="OnKillFocus"></event> | ||
| 5090 | <event name="OnLeaveWindow"></event> | ||
| 5091 | <event name="OnLeftDClick"></event> | ||
| 5092 | <event name="OnLeftDown"></event> | ||
| 5093 | <event name="OnLeftUp"></event> | ||
| 5094 | <event name="OnMiddleDClick"></event> | ||
| 5095 | <event name="OnMiddleDown"></event> | ||
| 5096 | <event name="OnMiddleUp"></event> | ||
| 5097 | <event name="OnMotion"></event> | ||
| 5098 | <event name="OnMouseEvents"></event> | ||
| 5099 | <event name="OnMouseWheel"></event> | ||
| 5100 | <event name="OnPaint"></event> | ||
| 5101 | <event name="OnRightDClick"></event> | ||
| 5102 | <event name="OnRightDown"></event> | ||
| 5103 | <event name="OnRightUp"></event> | ||
| 5104 | <event name="OnSetFocus"></event> | ||
| 5105 | <event name="OnSize"></event> | ||
| 5106 | <event name="OnUpdateUI"></event> | ||
| 5107 | </object> | ||
| 5108 | </object> | ||
| 5109 | <object class="sizeritem" expanded="1"> | ||
| 5110 | <property name="border">5</property> | ||
| 5111 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 5112 | <property name="proportion">0</property> | ||
| 5113 | <object class="wxComboBox" expanded="1"> | ||
| 5114 | <property name="bg"></property> | ||
| 5115 | <property name="choices"></property> | ||
| 5116 | <property name="context_help"></property> | ||
| 5117 | <property name="enabled">1</property> | ||
| 5118 | <property name="fg"></property> | ||
| 5119 | <property name="font"></property> | ||
| 5120 | <property name="hidden">0</property> | ||
| 5121 | <property name="id">wxID_ANY</property> | ||
| 5122 | <property name="maximum_size"></property> | ||
| 5123 | <property name="minimum_size">180,-1</property> | ||
| 5124 | <property name="name">m_comboBoxCategory</property> | ||
| 5125 | <property name="permission">protected</property> | ||
| 5126 | <property name="pos"></property> | ||
| 5127 | <property name="size"></property> | ||
| 5128 | <property name="style"></property> | ||
| 5129 | <property name="subclass"></property> | ||
| 5130 | <property name="tooltip"></property> | ||
| 5131 | <property name="value"></property> | ||
| 5132 | <property name="window_extra_style"></property> | ||
| 5133 | <property name="window_name"></property> | ||
| 5134 | <property name="window_style"></property> | ||
| 5135 | <event name="OnChar"></event> | ||
| 5136 | <event name="OnCombobox"></event> | ||
| 5137 | <event name="OnEnterWindow"></event> | ||
| 5138 | <event name="OnEraseBackground"></event> | ||
| 5139 | <event name="OnKeyDown"></event> | ||
| 5140 | <event name="OnKeyUp"></event> | ||
| 5141 | <event name="OnKillFocus"></event> | ||
| 5142 | <event name="OnLeaveWindow"></event> | ||
| 5143 | <event name="OnLeftDClick"></event> | ||
| 5144 | <event name="OnLeftDown"></event> | ||
| 5145 | <event name="OnLeftUp"></event> | ||
| 5146 | <event name="OnMiddleDClick"></event> | ||
| 5147 | <event name="OnMiddleDown"></event> | ||
| 5148 | <event name="OnMiddleUp"></event> | ||
| 5149 | <event name="OnMotion"></event> | ||
| 5150 | <event name="OnMouseEvents"></event> | ||
| 5151 | <event name="OnMouseWheel"></event> | ||
| 5152 | <event name="OnPaint"></event> | ||
| 5153 | <event name="OnRightDClick"></event> | ||
| 5154 | <event name="OnRightDown"></event> | ||
| 5155 | <event name="OnRightUp"></event> | ||
| 5156 | <event name="OnSetFocus"></event> | ||
| 5157 | <event name="OnSize"></event> | ||
| 5158 | <event name="OnText"></event> | ||
| 5159 | <event name="OnTextEnter"></event> | ||
| 5160 | <event name="OnUpdateUI"></event> | ||
| 5161 | </object> | ||
| 5162 | </object> | ||
| 5163 | <object class="sizeritem" expanded="1"> | ||
| 5164 | <property name="border">5</property> | ||
| 5165 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 5166 | <property name="proportion">0</property> | ||
| 5167 | <object class="wxStaticText" expanded="1"> | ||
| 5168 | <property name="bg"></property> | ||
| 5169 | <property name="context_help"></property> | ||
| 5170 | <property name="enabled">1</property> | ||
| 5171 | <property name="fg"></property> | ||
| 5172 | <property name="font"></property> | ||
| 5173 | <property name="hidden">0</property> | ||
| 5174 | <property name="id">wxID_ANY</property> | ||
| 5175 | <property name="label">Title</property> | ||
| 5176 | <property name="maximum_size"></property> | ||
| 5177 | <property name="minimum_size"></property> | ||
| 5178 | <property name="name">m_staticText108</property> | ||
| 5179 | <property name="permission">protected</property> | ||
| 5180 | <property name="pos"></property> | ||
| 5181 | <property name="size"></property> | ||
| 5182 | <property name="style">wxALIGN_RIGHT</property> | ||
| 5183 | <property name="subclass"></property> | ||
| 5184 | <property name="tooltip"></property> | ||
| 5185 | <property name="window_extra_style"></property> | ||
| 5186 | <property name="window_name"></property> | ||
| 5187 | <property name="window_style"></property> | ||
| 5188 | <property name="wrap">-1</property> | ||
| 5189 | <event name="OnChar"></event> | ||
| 5190 | <event name="OnEnterWindow"></event> | ||
| 5191 | <event name="OnEraseBackground"></event> | ||
| 5192 | <event name="OnKeyDown"></event> | ||
| 5193 | <event name="OnKeyUp"></event> | ||
| 5194 | <event name="OnKillFocus"></event> | ||
| 5195 | <event name="OnLeaveWindow"></event> | ||
| 5196 | <event name="OnLeftDClick"></event> | ||
| 5197 | <event name="OnLeftDown"></event> | ||
| 5198 | <event name="OnLeftUp"></event> | ||
| 5199 | <event name="OnMiddleDClick"></event> | ||
| 5200 | <event name="OnMiddleDown"></event> | ||
| 5201 | <event name="OnMiddleUp"></event> | ||
| 5202 | <event name="OnMotion"></event> | ||
| 5203 | <event name="OnMouseEvents"></event> | ||
| 5204 | <event name="OnMouseWheel"></event> | ||
| 5205 | <event name="OnPaint"></event> | ||
| 5206 | <event name="OnRightDClick"></event> | ||
| 5207 | <event name="OnRightDown"></event> | ||
| 5208 | <event name="OnRightUp"></event> | ||
| 5209 | <event name="OnSetFocus"></event> | ||
| 5210 | <event name="OnSize"></event> | ||
| 5211 | <event name="OnUpdateUI"></event> | ||
| 5212 | </object> | ||
| 5213 | </object> | ||
| 5214 | <object class="sizeritem" expanded="1"> | ||
| 5215 | <property name="border">5</property> | ||
| 5216 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND</property> | ||
| 5217 | <property name="proportion">1</property> | ||
| 5218 | <object class="wxTextCtrl" expanded="1"> | ||
| 5219 | <property name="bg"></property> | ||
| 5220 | <property name="context_help"></property> | ||
| 5221 | <property name="enabled">1</property> | ||
| 5222 | <property name="fg"></property> | ||
| 5223 | <property name="font"></property> | ||
| 5224 | <property name="hidden">0</property> | ||
| 5225 | <property name="id">wxID_ANY</property> | ||
| 5226 | <property name="maximum_size"></property> | ||
| 5227 | <property name="maxlength">0</property> | ||
| 5228 | <property name="minimum_size"></property> | ||
| 5229 | <property name="name">m_textCtrlTitle</property> | ||
| 5230 | <property name="permission">protected</property> | ||
| 5231 | <property name="pos"></property> | ||
| 5232 | <property name="size"></property> | ||
| 5233 | <property name="style"></property> | ||
| 5234 | <property name="subclass"></property> | ||
| 5235 | <property name="tooltip"></property> | ||
| 5236 | <property name="value"></property> | ||
| 5237 | <property name="window_extra_style"></property> | ||
| 5238 | <property name="window_name"></property> | ||
| 5239 | <property name="window_style"></property> | ||
| 5240 | <event name="OnChar"></event> | ||
| 5241 | <event name="OnEnterWindow"></event> | ||
| 5242 | <event name="OnEraseBackground"></event> | ||
| 5243 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5244 | <event name="OnKeyUp"></event> | ||
| 5245 | <event name="OnKillFocus"></event> | ||
| 5246 | <event name="OnLeaveWindow"></event> | ||
| 5247 | <event name="OnLeftDClick"></event> | ||
| 5248 | <event name="OnLeftDown"></event> | ||
| 5249 | <event name="OnLeftUp"></event> | ||
| 5250 | <event name="OnMiddleDClick"></event> | ||
| 5251 | <event name="OnMiddleDown"></event> | ||
| 5252 | <event name="OnMiddleUp"></event> | ||
| 5253 | <event name="OnMotion"></event> | ||
| 5254 | <event name="OnMouseEvents"></event> | ||
| 5255 | <event name="OnMouseWheel"></event> | ||
| 5256 | <event name="OnPaint"></event> | ||
| 5257 | <event name="OnRightDClick"></event> | ||
| 5258 | <event name="OnRightDown"></event> | ||
| 5259 | <event name="OnRightUp"></event> | ||
| 5260 | <event name="OnSetFocus"></event> | ||
| 5261 | <event name="OnSize"></event> | ||
| 5262 | <event name="OnText"></event> | ||
| 5263 | <event name="OnTextEnter"></event> | ||
| 5264 | <event name="OnTextMaxLen"></event> | ||
| 5265 | <event name="OnTextURL"></event> | ||
| 5266 | <event name="OnUpdateUI"></event> | ||
| 5267 | </object> | ||
| 5268 | </object> | ||
| 5269 | <object class="sizeritem" expanded="1"> | ||
| 5270 | <property name="border">5</property> | ||
| 5271 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 5272 | <property name="proportion">0</property> | ||
| 5273 | <object class="wxStaticText" expanded="1"> | ||
| 5274 | <property name="bg"></property> | ||
| 5275 | <property name="context_help"></property> | ||
| 5276 | <property name="enabled">1</property> | ||
| 5277 | <property name="fg"></property> | ||
| 5278 | <property name="font"></property> | ||
| 5279 | <property name="hidden">0</property> | ||
| 5280 | <property name="id">wxID_ANY</property> | ||
| 5281 | <property name="label">Price</property> | ||
| 5282 | <property name="maximum_size"></property> | ||
| 5283 | <property name="minimum_size"></property> | ||
| 5284 | <property name="name">m_staticText107</property> | ||
| 5285 | <property name="permission">protected</property> | ||
| 5286 | <property name="pos"></property> | ||
| 5287 | <property name="size"></property> | ||
| 5288 | <property name="style">wxALIGN_RIGHT</property> | ||
| 5289 | <property name="subclass"></property> | ||
| 5290 | <property name="tooltip"></property> | ||
| 5291 | <property name="window_extra_style"></property> | ||
| 5292 | <property name="window_name"></property> | ||
| 5293 | <property name="window_style"></property> | ||
| 5294 | <property name="wrap">-1</property> | ||
| 5295 | <event name="OnChar"></event> | ||
| 5296 | <event name="OnEnterWindow"></event> | ||
| 5297 | <event name="OnEraseBackground"></event> | ||
| 5298 | <event name="OnKeyDown"></event> | ||
| 5299 | <event name="OnKeyUp"></event> | ||
| 5300 | <event name="OnKillFocus"></event> | ||
| 5301 | <event name="OnLeaveWindow"></event> | ||
| 5302 | <event name="OnLeftDClick"></event> | ||
| 5303 | <event name="OnLeftDown"></event> | ||
| 5304 | <event name="OnLeftUp"></event> | ||
| 5305 | <event name="OnMiddleDClick"></event> | ||
| 5306 | <event name="OnMiddleDown"></event> | ||
| 5307 | <event name="OnMiddleUp"></event> | ||
| 5308 | <event name="OnMotion"></event> | ||
| 5309 | <event name="OnMouseEvents"></event> | ||
| 5310 | <event name="OnMouseWheel"></event> | ||
| 5311 | <event name="OnPaint"></event> | ||
| 5312 | <event name="OnRightDClick"></event> | ||
| 5313 | <event name="OnRightDown"></event> | ||
| 5314 | <event name="OnRightUp"></event> | ||
| 5315 | <event name="OnSetFocus"></event> | ||
| 5316 | <event name="OnSize"></event> | ||
| 5317 | <event name="OnUpdateUI"></event> | ||
| 5318 | </object> | ||
| 5319 | </object> | ||
| 5320 | <object class="sizeritem" expanded="1"> | ||
| 5321 | <property name="border">5</property> | ||
| 5322 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 5323 | <property name="proportion">0</property> | ||
| 5324 | <object class="wxTextCtrl" expanded="1"> | ||
| 5325 | <property name="bg"></property> | ||
| 5326 | <property name="context_help"></property> | ||
| 5327 | <property name="enabled">1</property> | ||
| 5328 | <property name="fg"></property> | ||
| 5329 | <property name="font"></property> | ||
| 5330 | <property name="hidden">0</property> | ||
| 5331 | <property name="id">wxID_ANY</property> | ||
| 5332 | <property name="maximum_size"></property> | ||
| 5333 | <property name="maxlength">0</property> | ||
| 5334 | <property name="minimum_size">105,-1</property> | ||
| 5335 | <property name="name">m_textCtrlPrice</property> | ||
| 5336 | <property name="permission">protected</property> | ||
| 5337 | <property name="pos"></property> | ||
| 5338 | <property name="size"></property> | ||
| 5339 | <property name="style"></property> | ||
| 5340 | <property name="subclass"></property> | ||
| 5341 | <property name="tooltip"></property> | ||
| 5342 | <property name="value"></property> | ||
| 5343 | <property name="window_extra_style"></property> | ||
| 5344 | <property name="window_name"></property> | ||
| 5345 | <property name="window_style"></property> | ||
| 5346 | <event name="OnChar"></event> | ||
| 5347 | <event name="OnEnterWindow"></event> | ||
| 5348 | <event name="OnEraseBackground"></event> | ||
| 5349 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5350 | <event name="OnKeyUp"></event> | ||
| 5351 | <event name="OnKillFocus"></event> | ||
| 5352 | <event name="OnLeaveWindow"></event> | ||
| 5353 | <event name="OnLeftDClick"></event> | ||
| 5354 | <event name="OnLeftDown"></event> | ||
| 5355 | <event name="OnLeftUp"></event> | ||
| 5356 | <event name="OnMiddleDClick"></event> | ||
| 5357 | <event name="OnMiddleDown"></event> | ||
| 5358 | <event name="OnMiddleUp"></event> | ||
| 5359 | <event name="OnMotion"></event> | ||
| 5360 | <event name="OnMouseEvents"></event> | ||
| 5361 | <event name="OnMouseWheel"></event> | ||
| 5362 | <event name="OnPaint"></event> | ||
| 5363 | <event name="OnRightDClick"></event> | ||
| 5364 | <event name="OnRightDown"></event> | ||
| 5365 | <event name="OnRightUp"></event> | ||
| 5366 | <event name="OnSetFocus"></event> | ||
| 5367 | <event name="OnSize"></event> | ||
| 5368 | <event name="OnText"></event> | ||
| 5369 | <event name="OnTextEnter"></event> | ||
| 5370 | <event name="OnTextMaxLen"></event> | ||
| 5371 | <event name="OnTextURL"></event> | ||
| 5372 | <event name="OnUpdateUI"></event> | ||
| 5373 | </object> | ||
| 5374 | </object> | ||
| 5375 | </object> | ||
| 5376 | </object> | ||
| 5377 | <object class="sizeritem" expanded="1"> | ||
| 5378 | <property name="border">5</property> | ||
| 5379 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 5380 | <property name="proportion">0</property> | ||
| 5381 | <object class="wxStaticText" expanded="1"> | ||
| 5382 | <property name="bg"></property> | ||
| 5383 | <property name="context_help"></property> | ||
| 5384 | <property name="enabled">1</property> | ||
| 5385 | <property name="fg"></property> | ||
| 5386 | <property name="font"></property> | ||
| 5387 | <property name="hidden">0</property> | ||
| 5388 | <property name="id">wxID_ANY</property> | ||
| 5389 | <property name="label">Page 1: Description</property> | ||
| 5390 | <property name="maximum_size"></property> | ||
| 5391 | <property name="minimum_size"></property> | ||
| 5392 | <property name="name">m_staticText22</property> | ||
| 5393 | <property name="permission">protected</property> | ||
| 5394 | <property name="pos"></property> | ||
| 5395 | <property name="size"></property> | ||
| 5396 | <property name="style"></property> | ||
| 5397 | <property name="subclass"></property> | ||
| 5398 | <property name="tooltip"></property> | ||
| 5399 | <property name="window_extra_style"></property> | ||
| 5400 | <property name="window_name"></property> | ||
| 5401 | <property name="window_style"></property> | ||
| 5402 | <property name="wrap">-1</property> | ||
| 5403 | <event name="OnChar"></event> | ||
| 5404 | <event name="OnEnterWindow"></event> | ||
| 5405 | <event name="OnEraseBackground"></event> | ||
| 5406 | <event name="OnKeyDown"></event> | ||
| 5407 | <event name="OnKeyUp"></event> | ||
| 5408 | <event name="OnKillFocus"></event> | ||
| 5409 | <event name="OnLeaveWindow"></event> | ||
| 5410 | <event name="OnLeftDClick"></event> | ||
| 5411 | <event name="OnLeftDown"></event> | ||
| 5412 | <event name="OnLeftUp"></event> | ||
| 5413 | <event name="OnMiddleDClick"></event> | ||
| 5414 | <event name="OnMiddleDown"></event> | ||
| 5415 | <event name="OnMiddleUp"></event> | ||
| 5416 | <event name="OnMotion"></event> | ||
| 5417 | <event name="OnMouseEvents"></event> | ||
| 5418 | <event name="OnMouseWheel"></event> | ||
| 5419 | <event name="OnPaint"></event> | ||
| 5420 | <event name="OnRightDClick"></event> | ||
| 5421 | <event name="OnRightDown"></event> | ||
| 5422 | <event name="OnRightUp"></event> | ||
| 5423 | <event name="OnSetFocus"></event> | ||
| 5424 | <event name="OnSize"></event> | ||
| 5425 | <event name="OnUpdateUI"></event> | ||
| 5426 | </object> | ||
| 5427 | </object> | ||
| 5428 | <object class="sizeritem" expanded="1"> | ||
| 5429 | <property name="border">5</property> | ||
| 5430 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 5431 | <property name="proportion">0</property> | ||
| 5432 | <object class="wxTextCtrl" expanded="1"> | ||
| 5433 | <property name="bg"></property> | ||
| 5434 | <property name="context_help"></property> | ||
| 5435 | <property name="enabled">1</property> | ||
| 5436 | <property name="fg"></property> | ||
| 5437 | <property name="font"></property> | ||
| 5438 | <property name="hidden">0</property> | ||
| 5439 | <property name="id">wxID_ANY</property> | ||
| 5440 | <property name="maximum_size"></property> | ||
| 5441 | <property name="maxlength">0</property> | ||
| 5442 | <property name="minimum_size">-1,170</property> | ||
| 5443 | <property name="name">m_textCtrlDescription</property> | ||
| 5444 | <property name="permission">protected</property> | ||
| 5445 | <property name="pos"></property> | ||
| 5446 | <property name="size"></property> | ||
| 5447 | <property name="style">wxTE_MULTILINE</property> | ||
| 5448 | <property name="subclass"></property> | ||
| 5449 | <property name="tooltip"></property> | ||
| 5450 | <property name="value"></property> | ||
| 5451 | <property name="window_extra_style"></property> | ||
| 5452 | <property name="window_name"></property> | ||
| 5453 | <property name="window_style"></property> | ||
| 5454 | <event name="OnChar"></event> | ||
| 5455 | <event name="OnEnterWindow"></event> | ||
| 5456 | <event name="OnEraseBackground"></event> | ||
| 5457 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5458 | <event name="OnKeyUp"></event> | ||
| 5459 | <event name="OnKillFocus"></event> | ||
| 5460 | <event name="OnLeaveWindow"></event> | ||
| 5461 | <event name="OnLeftDClick"></event> | ||
| 5462 | <event name="OnLeftDown"></event> | ||
| 5463 | <event name="OnLeftUp"></event> | ||
| 5464 | <event name="OnMiddleDClick"></event> | ||
| 5465 | <event name="OnMiddleDown"></event> | ||
| 5466 | <event name="OnMiddleUp"></event> | ||
| 5467 | <event name="OnMotion"></event> | ||
| 5468 | <event name="OnMouseEvents"></event> | ||
| 5469 | <event name="OnMouseWheel"></event> | ||
| 5470 | <event name="OnPaint"></event> | ||
| 5471 | <event name="OnRightDClick"></event> | ||
| 5472 | <event name="OnRightDown"></event> | ||
| 5473 | <event name="OnRightUp"></event> | ||
| 5474 | <event name="OnSetFocus"></event> | ||
| 5475 | <event name="OnSize"></event> | ||
| 5476 | <event name="OnText"></event> | ||
| 5477 | <event name="OnTextEnter"></event> | ||
| 5478 | <event name="OnTextMaxLen"></event> | ||
| 5479 | <event name="OnTextURL"></event> | ||
| 5480 | <event name="OnUpdateUI"></event> | ||
| 5481 | </object> | ||
| 5482 | </object> | ||
| 5483 | <object class="sizeritem" expanded="1"> | ||
| 5484 | <property name="border">5</property> | ||
| 5485 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 5486 | <property name="proportion">0</property> | ||
| 5487 | <object class="wxStaticText" expanded="1"> | ||
| 5488 | <property name="bg"></property> | ||
| 5489 | <property name="context_help"></property> | ||
| 5490 | <property name="enabled">1</property> | ||
| 5491 | <property name="fg"></property> | ||
| 5492 | <property name="font"></property> | ||
| 5493 | <property name="hidden">0</property> | ||
| 5494 | <property name="id">wxID_ANY</property> | ||
| 5495 | <property name="label">Page 2: Order Form</property> | ||
| 5496 | <property name="maximum_size"></property> | ||
| 5497 | <property name="minimum_size"></property> | ||
| 5498 | <property name="name">m_staticText23</property> | ||
| 5499 | <property name="permission">protected</property> | ||
| 5500 | <property name="pos"></property> | ||
| 5501 | <property name="size"></property> | ||
| 5502 | <property name="style"></property> | ||
| 5503 | <property name="subclass"></property> | ||
| 5504 | <property name="tooltip"></property> | ||
| 5505 | <property name="window_extra_style"></property> | ||
| 5506 | <property name="window_name"></property> | ||
| 5507 | <property name="window_style"></property> | ||
| 5508 | <property name="wrap">-1</property> | ||
| 5509 | <event name="OnChar"></event> | ||
| 5510 | <event name="OnEnterWindow"></event> | ||
| 5511 | <event name="OnEraseBackground"></event> | ||
| 5512 | <event name="OnKeyDown"></event> | ||
| 5513 | <event name="OnKeyUp"></event> | ||
| 5514 | <event name="OnKillFocus"></event> | ||
| 5515 | <event name="OnLeaveWindow"></event> | ||
| 5516 | <event name="OnLeftDClick"></event> | ||
| 5517 | <event name="OnLeftDown"></event> | ||
| 5518 | <event name="OnLeftUp"></event> | ||
| 5519 | <event name="OnMiddleDClick"></event> | ||
| 5520 | <event name="OnMiddleDown"></event> | ||
| 5521 | <event name="OnMiddleUp"></event> | ||
| 5522 | <event name="OnMotion"></event> | ||
| 5523 | <event name="OnMouseEvents"></event> | ||
| 5524 | <event name="OnMouseWheel"></event> | ||
| 5525 | <event name="OnPaint"></event> | ||
| 5526 | <event name="OnRightDClick"></event> | ||
| 5527 | <event name="OnRightDown"></event> | ||
| 5528 | <event name="OnRightUp"></event> | ||
| 5529 | <event name="OnSetFocus"></event> | ||
| 5530 | <event name="OnSize"></event> | ||
| 5531 | <event name="OnUpdateUI"></event> | ||
| 5532 | </object> | ||
| 5533 | </object> | ||
| 5534 | <object class="sizeritem" expanded="1"> | ||
| 5535 | <property name="border">5</property> | ||
| 5536 | <property name="flag">wxEXPAND|wxALL</property> | ||
| 5537 | <property name="proportion">0</property> | ||
| 5538 | <object class="wxTextCtrl" expanded="1"> | ||
| 5539 | <property name="bg"></property> | ||
| 5540 | <property name="context_help"></property> | ||
| 5541 | <property name="enabled">1</property> | ||
| 5542 | <property name="fg"></property> | ||
| 5543 | <property name="font"></property> | ||
| 5544 | <property name="hidden">0</property> | ||
| 5545 | <property name="id">wxID_ANY</property> | ||
| 5546 | <property name="maximum_size"></property> | ||
| 5547 | <property name="maxlength">0</property> | ||
| 5548 | <property name="minimum_size">-1,120</property> | ||
| 5549 | <property name="name">m_textCtrlInstructions</property> | ||
| 5550 | <property name="permission">protected</property> | ||
| 5551 | <property name="pos"></property> | ||
| 5552 | <property name="size"></property> | ||
| 5553 | <property name="style">wxTE_MULTILINE</property> | ||
| 5554 | <property name="subclass"></property> | ||
| 5555 | <property name="tooltip"></property> | ||
| 5556 | <property name="value"></property> | ||
| 5557 | <property name="window_extra_style"></property> | ||
| 5558 | <property name="window_name"></property> | ||
| 5559 | <property name="window_style"></property> | ||
| 5560 | <event name="OnChar"></event> | ||
| 5561 | <event name="OnEnterWindow"></event> | ||
| 5562 | <event name="OnEraseBackground"></event> | ||
| 5563 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5564 | <event name="OnKeyUp"></event> | ||
| 5565 | <event name="OnKillFocus"></event> | ||
| 5566 | <event name="OnLeaveWindow"></event> | ||
| 5567 | <event name="OnLeftDClick"></event> | ||
| 5568 | <event name="OnLeftDown"></event> | ||
| 5569 | <event name="OnLeftUp"></event> | ||
| 5570 | <event name="OnMiddleDClick"></event> | ||
| 5571 | <event name="OnMiddleDown"></event> | ||
| 5572 | <event name="OnMiddleUp"></event> | ||
| 5573 | <event name="OnMotion"></event> | ||
| 5574 | <event name="OnMouseEvents"></event> | ||
| 5575 | <event name="OnMouseWheel"></event> | ||
| 5576 | <event name="OnPaint"></event> | ||
| 5577 | <event name="OnRightDClick"></event> | ||
| 5578 | <event name="OnRightDown"></event> | ||
| 5579 | <event name="OnRightUp"></event> | ||
| 5580 | <event name="OnSetFocus"></event> | ||
| 5581 | <event name="OnSize"></event> | ||
| 5582 | <event name="OnText"></event> | ||
| 5583 | <event name="OnTextEnter"></event> | ||
| 5584 | <event name="OnTextMaxLen"></event> | ||
| 5585 | <event name="OnTextURL"></event> | ||
| 5586 | <event name="OnUpdateUI"></event> | ||
| 5587 | </object> | ||
| 5588 | </object> | ||
| 5589 | <object class="sizeritem" expanded="1"> | ||
| 5590 | <property name="border">5</property> | ||
| 5591 | <property name="flag">wxEXPAND</property> | ||
| 5592 | <property name="proportion">0</property> | ||
| 5593 | <object class="wxFlexGridSizer" expanded="0"> | ||
| 5594 | <property name="cols">3</property> | ||
| 5595 | <property name="flexible_direction">wxBOTH</property> | ||
| 5596 | <property name="growablecols">1</property> | ||
| 5597 | <property name="growablerows"></property> | ||
| 5598 | <property name="hgap">0</property> | ||
| 5599 | <property name="minimum_size"></property> | ||
| 5600 | <property name="name">fgSizer5</property> | ||
| 5601 | <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property> | ||
| 5602 | <property name="permission">public</property> | ||
| 5603 | <property name="rows">0</property> | ||
| 5604 | <property name="vgap">0</property> | ||
| 5605 | <object class="sizeritem" expanded="1"> | ||
| 5606 | <property name="border">5</property> | ||
| 5607 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT</property> | ||
| 5608 | <property name="proportion">0</property> | ||
| 5609 | <object class="wxStaticText" expanded="1"> | ||
| 5610 | <property name="bg"></property> | ||
| 5611 | <property name="context_help"></property> | ||
| 5612 | <property name="enabled">1</property> | ||
| 5613 | <property name="fg"></property> | ||
| 5614 | <property name="font"></property> | ||
| 5615 | <property name="hidden">0</property> | ||
| 5616 | <property name="id">wxID_ANY</property> | ||
| 5617 | <property name="label">Label</property> | ||
| 5618 | <property name="maximum_size"></property> | ||
| 5619 | <property name="minimum_size"></property> | ||
| 5620 | <property name="name">m_staticText24</property> | ||
| 5621 | <property name="permission">protected</property> | ||
| 5622 | <property name="pos"></property> | ||
| 5623 | <property name="size"></property> | ||
| 5624 | <property name="style"></property> | ||
| 5625 | <property name="subclass"></property> | ||
| 5626 | <property name="tooltip"></property> | ||
| 5627 | <property name="window_extra_style"></property> | ||
| 5628 | <property name="window_name"></property> | ||
| 5629 | <property name="window_style"></property> | ||
| 5630 | <property name="wrap">-1</property> | ||
| 5631 | <event name="OnChar"></event> | ||
| 5632 | <event name="OnEnterWindow"></event> | ||
| 5633 | <event name="OnEraseBackground"></event> | ||
| 5634 | <event name="OnKeyDown"></event> | ||
| 5635 | <event name="OnKeyUp"></event> | ||
| 5636 | <event name="OnKillFocus"></event> | ||
| 5637 | <event name="OnLeaveWindow"></event> | ||
| 5638 | <event name="OnLeftDClick"></event> | ||
| 5639 | <event name="OnLeftDown"></event> | ||
| 5640 | <event name="OnLeftUp"></event> | ||
| 5641 | <event name="OnMiddleDClick"></event> | ||
| 5642 | <event name="OnMiddleDown"></event> | ||
| 5643 | <event name="OnMiddleUp"></event> | ||
| 5644 | <event name="OnMotion"></event> | ||
| 5645 | <event name="OnMouseEvents"></event> | ||
| 5646 | <event name="OnMouseWheel"></event> | ||
| 5647 | <event name="OnPaint"></event> | ||
| 5648 | <event name="OnRightDClick"></event> | ||
| 5649 | <event name="OnRightDown"></event> | ||
| 5650 | <event name="OnRightUp"></event> | ||
| 5651 | <event name="OnSetFocus"></event> | ||
| 5652 | <event name="OnSize"></event> | ||
| 5653 | <event name="OnUpdateUI"></event> | ||
| 5654 | </object> | ||
| 5655 | </object> | ||
| 5656 | <object class="sizeritem" expanded="1"> | ||
| 5657 | <property name="border">5</property> | ||
| 5658 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxRIGHT|wxLEFT</property> | ||
| 5659 | <property name="proportion">0</property> | ||
| 5660 | <object class="wxStaticText" expanded="1"> | ||
| 5661 | <property name="bg"></property> | ||
| 5662 | <property name="context_help"></property> | ||
| 5663 | <property name="enabled">1</property> | ||
| 5664 | <property name="fg"></property> | ||
| 5665 | <property name="font"></property> | ||
| 5666 | <property name="hidden">0</property> | ||
| 5667 | <property name="id">wxID_ANY</property> | ||
| 5668 | <property name="label">Comma separated list of choices, or leave blank for text field</property> | ||
| 5669 | <property name="maximum_size"></property> | ||
| 5670 | <property name="minimum_size"></property> | ||
| 5671 | <property name="name">m_staticText25</property> | ||
| 5672 | <property name="permission">protected</property> | ||
| 5673 | <property name="pos"></property> | ||
| 5674 | <property name="size"></property> | ||
| 5675 | <property name="style"></property> | ||
| 5676 | <property name="subclass"></property> | ||
| 5677 | <property name="tooltip"></property> | ||
| 5678 | <property name="window_extra_style"></property> | ||
| 5679 | <property name="window_name"></property> | ||
| 5680 | <property name="window_style"></property> | ||
| 5681 | <property name="wrap">-1</property> | ||
| 5682 | <event name="OnChar"></event> | ||
| 5683 | <event name="OnEnterWindow"></event> | ||
| 5684 | <event name="OnEraseBackground"></event> | ||
| 5685 | <event name="OnKeyDown"></event> | ||
| 5686 | <event name="OnKeyUp"></event> | ||
| 5687 | <event name="OnKillFocus"></event> | ||
| 5688 | <event name="OnLeaveWindow"></event> | ||
| 5689 | <event name="OnLeftDClick"></event> | ||
| 5690 | <event name="OnLeftDown"></event> | ||
| 5691 | <event name="OnLeftUp"></event> | ||
| 5692 | <event name="OnMiddleDClick"></event> | ||
| 5693 | <event name="OnMiddleDown"></event> | ||
| 5694 | <event name="OnMiddleUp"></event> | ||
| 5695 | <event name="OnMotion"></event> | ||
| 5696 | <event name="OnMouseEvents"></event> | ||
| 5697 | <event name="OnMouseWheel"></event> | ||
| 5698 | <event name="OnPaint"></event> | ||
| 5699 | <event name="OnRightDClick"></event> | ||
| 5700 | <event name="OnRightDown"></event> | ||
| 5701 | <event name="OnRightUp"></event> | ||
| 5702 | <event name="OnSetFocus"></event> | ||
| 5703 | <event name="OnSize"></event> | ||
| 5704 | <event name="OnUpdateUI"></event> | ||
| 5705 | </object> | ||
| 5706 | </object> | ||
| 5707 | <object class="sizeritem" expanded="1"> | ||
| 5708 | <property name="border">5</property> | ||
| 5709 | <property name="flag">wxEXPAND</property> | ||
| 5710 | <property name="proportion">1</property> | ||
| 5711 | <object class="spacer" expanded="1"> | ||
| 5712 | <property name="height">0</property> | ||
| 5713 | <property name="permission">protected</property> | ||
| 5714 | <property name="width">0</property> | ||
| 5715 | </object> | ||
| 5716 | </object> | ||
| 5717 | <object class="sizeritem" expanded="1"> | ||
| 5718 | <property name="border">5</property> | ||
| 5719 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 5720 | <property name="proportion">0</property> | ||
| 5721 | <object class="wxTextCtrl" expanded="1"> | ||
| 5722 | <property name="bg"></property> | ||
| 5723 | <property name="context_help"></property> | ||
| 5724 | <property name="enabled">1</property> | ||
| 5725 | <property name="fg"></property> | ||
| 5726 | <property name="font"></property> | ||
| 5727 | <property name="hidden">0</property> | ||
| 5728 | <property name="id">wxID_ANY</property> | ||
| 5729 | <property name="maximum_size"></property> | ||
| 5730 | <property name="maxlength">0</property> | ||
| 5731 | <property name="minimum_size">150,-1</property> | ||
| 5732 | <property name="name">m_textCtrlLabel0</property> | ||
| 5733 | <property name="permission">protected</property> | ||
| 5734 | <property name="pos"></property> | ||
| 5735 | <property name="size"></property> | ||
| 5736 | <property name="style"></property> | ||
| 5737 | <property name="subclass"></property> | ||
| 5738 | <property name="tooltip"></property> | ||
| 5739 | <property name="value"></property> | ||
| 5740 | <property name="window_extra_style"></property> | ||
| 5741 | <property name="window_name"></property> | ||
| 5742 | <property name="window_style"></property> | ||
| 5743 | <event name="OnChar"></event> | ||
| 5744 | <event name="OnEnterWindow"></event> | ||
| 5745 | <event name="OnEraseBackground"></event> | ||
| 5746 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5747 | <event name="OnKeyUp"></event> | ||
| 5748 | <event name="OnKillFocus"></event> | ||
| 5749 | <event name="OnLeaveWindow"></event> | ||
| 5750 | <event name="OnLeftDClick"></event> | ||
| 5751 | <event name="OnLeftDown"></event> | ||
| 5752 | <event name="OnLeftUp"></event> | ||
| 5753 | <event name="OnMiddleDClick"></event> | ||
| 5754 | <event name="OnMiddleDown"></event> | ||
| 5755 | <event name="OnMiddleUp"></event> | ||
| 5756 | <event name="OnMotion"></event> | ||
| 5757 | <event name="OnMouseEvents"></event> | ||
| 5758 | <event name="OnMouseWheel"></event> | ||
| 5759 | <event name="OnPaint"></event> | ||
| 5760 | <event name="OnRightDClick"></event> | ||
| 5761 | <event name="OnRightDown"></event> | ||
| 5762 | <event name="OnRightUp"></event> | ||
| 5763 | <event name="OnSetFocus"></event> | ||
| 5764 | <event name="OnSize"></event> | ||
| 5765 | <event name="OnText"></event> | ||
| 5766 | <event name="OnTextEnter"></event> | ||
| 5767 | <event name="OnTextMaxLen"></event> | ||
| 5768 | <event name="OnTextURL"></event> | ||
| 5769 | <event name="OnUpdateUI"></event> | ||
| 5770 | </object> | ||
| 5771 | </object> | ||
| 5772 | <object class="sizeritem" expanded="1"> | ||
| 5773 | <property name="border">5</property> | ||
| 5774 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 5775 | <property name="proportion">0</property> | ||
| 5776 | <object class="wxTextCtrl" expanded="1"> | ||
| 5777 | <property name="bg"></property> | ||
| 5778 | <property name="context_help"></property> | ||
| 5779 | <property name="enabled">1</property> | ||
| 5780 | <property name="fg"></property> | ||
| 5781 | <property name="font"></property> | ||
| 5782 | <property name="hidden">0</property> | ||
| 5783 | <property name="id">wxID_ANY</property> | ||
| 5784 | <property name="maximum_size">-1,-1</property> | ||
| 5785 | <property name="maxlength">0</property> | ||
| 5786 | <property name="minimum_size">-1,-1</property> | ||
| 5787 | <property name="name">m_textCtrlField0</property> | ||
| 5788 | <property name="permission">protected</property> | ||
| 5789 | <property name="pos"></property> | ||
| 5790 | <property name="size">-1,-1</property> | ||
| 5791 | <property name="style"></property> | ||
| 5792 | <property name="subclass"></property> | ||
| 5793 | <property name="tooltip"></property> | ||
| 5794 | <property name="value"></property> | ||
| 5795 | <property name="window_extra_style"></property> | ||
| 5796 | <property name="window_name"></property> | ||
| 5797 | <property name="window_style"></property> | ||
| 5798 | <event name="OnChar"></event> | ||
| 5799 | <event name="OnEnterWindow"></event> | ||
| 5800 | <event name="OnEraseBackground"></event> | ||
| 5801 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5802 | <event name="OnKeyUp"></event> | ||
| 5803 | <event name="OnKillFocus"></event> | ||
| 5804 | <event name="OnLeaveWindow"></event> | ||
| 5805 | <event name="OnLeftDClick"></event> | ||
| 5806 | <event name="OnLeftDown"></event> | ||
| 5807 | <event name="OnLeftUp"></event> | ||
| 5808 | <event name="OnMiddleDClick"></event> | ||
| 5809 | <event name="OnMiddleDown"></event> | ||
| 5810 | <event name="OnMiddleUp"></event> | ||
| 5811 | <event name="OnMotion"></event> | ||
| 5812 | <event name="OnMouseEvents"></event> | ||
| 5813 | <event name="OnMouseWheel"></event> | ||
| 5814 | <event name="OnPaint"></event> | ||
| 5815 | <event name="OnRightDClick"></event> | ||
| 5816 | <event name="OnRightDown"></event> | ||
| 5817 | <event name="OnRightUp"></event> | ||
| 5818 | <event name="OnSetFocus"></event> | ||
| 5819 | <event name="OnSize"></event> | ||
| 5820 | <event name="OnText"></event> | ||
| 5821 | <event name="OnTextEnter"></event> | ||
| 5822 | <event name="OnTextMaxLen"></event> | ||
| 5823 | <event name="OnTextURL"></event> | ||
| 5824 | <event name="OnUpdateUI"></event> | ||
| 5825 | </object> | ||
| 5826 | </object> | ||
| 5827 | <object class="sizeritem" expanded="1"> | ||
| 5828 | <property name="border">5</property> | ||
| 5829 | <property name="flag">wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL</property> | ||
| 5830 | <property name="proportion">0</property> | ||
| 5831 | <object class="wxButton" expanded="1"> | ||
| 5832 | <property name="bg"></property> | ||
| 5833 | <property name="context_help"></property> | ||
| 5834 | <property name="default">0</property> | ||
| 5835 | <property name="enabled">1</property> | ||
| 5836 | <property name="fg"></property> | ||
| 5837 | <property name="font"></property> | ||
| 5838 | <property name="hidden">0</property> | ||
| 5839 | <property name="id">wxID_DEL0</property> | ||
| 5840 | <property name="label">Delete</property> | ||
| 5841 | <property name="maximum_size"></property> | ||
| 5842 | <property name="minimum_size">-1,-1</property> | ||
| 5843 | <property name="name">m_buttonDel0</property> | ||
| 5844 | <property name="permission">protected</property> | ||
| 5845 | <property name="pos"></property> | ||
| 5846 | <property name="size">60,20</property> | ||
| 5847 | <property name="style"></property> | ||
| 5848 | <property name="subclass"></property> | ||
| 5849 | <property name="tooltip"></property> | ||
| 5850 | <property name="window_extra_style"></property> | ||
| 5851 | <property name="window_name"></property> | ||
| 5852 | <property name="window_style"></property> | ||
| 5853 | <event name="OnButtonClick">OnButtonDel0</event> | ||
| 5854 | <event name="OnChar"></event> | ||
| 5855 | <event name="OnEnterWindow"></event> | ||
| 5856 | <event name="OnEraseBackground"></event> | ||
| 5857 | <event name="OnKeyDown"></event> | ||
| 5858 | <event name="OnKeyUp"></event> | ||
| 5859 | <event name="OnKillFocus"></event> | ||
| 5860 | <event name="OnLeaveWindow"></event> | ||
| 5861 | <event name="OnLeftDClick"></event> | ||
| 5862 | <event name="OnLeftDown"></event> | ||
| 5863 | <event name="OnLeftUp"></event> | ||
| 5864 | <event name="OnMiddleDClick"></event> | ||
| 5865 | <event name="OnMiddleDown"></event> | ||
| 5866 | <event name="OnMiddleUp"></event> | ||
| 5867 | <event name="OnMotion"></event> | ||
| 5868 | <event name="OnMouseEvents"></event> | ||
| 5869 | <event name="OnMouseWheel"></event> | ||
| 5870 | <event name="OnPaint"></event> | ||
| 5871 | <event name="OnRightDClick"></event> | ||
| 5872 | <event name="OnRightDown"></event> | ||
| 5873 | <event name="OnRightUp"></event> | ||
| 5874 | <event name="OnSetFocus"></event> | ||
| 5875 | <event name="OnSize"></event> | ||
| 5876 | <event name="OnUpdateUI"></event> | ||
| 5877 | </object> | ||
| 5878 | </object> | ||
| 5879 | <object class="sizeritem" expanded="1"> | ||
| 5880 | <property name="border">5</property> | ||
| 5881 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 5882 | <property name="proportion">0</property> | ||
| 5883 | <object class="wxTextCtrl" expanded="1"> | ||
| 5884 | <property name="bg"></property> | ||
| 5885 | <property name="context_help"></property> | ||
| 5886 | <property name="enabled">1</property> | ||
| 5887 | <property name="fg"></property> | ||
| 5888 | <property name="font"></property> | ||
| 5889 | <property name="hidden">0</property> | ||
| 5890 | <property name="id">wxID_ANY</property> | ||
| 5891 | <property name="maximum_size"></property> | ||
| 5892 | <property name="maxlength">0</property> | ||
| 5893 | <property name="minimum_size">150,-1</property> | ||
| 5894 | <property name="name">m_textCtrlLabel1</property> | ||
| 5895 | <property name="permission">protected</property> | ||
| 5896 | <property name="pos"></property> | ||
| 5897 | <property name="size"></property> | ||
| 5898 | <property name="style"></property> | ||
| 5899 | <property name="subclass"></property> | ||
| 5900 | <property name="tooltip"></property> | ||
| 5901 | <property name="value"></property> | ||
| 5902 | <property name="window_extra_style"></property> | ||
| 5903 | <property name="window_name"></property> | ||
| 5904 | <property name="window_style"></property> | ||
| 5905 | <event name="OnChar"></event> | ||
| 5906 | <event name="OnEnterWindow"></event> | ||
| 5907 | <event name="OnEraseBackground"></event> | ||
| 5908 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5909 | <event name="OnKeyUp"></event> | ||
| 5910 | <event name="OnKillFocus"></event> | ||
| 5911 | <event name="OnLeaveWindow"></event> | ||
| 5912 | <event name="OnLeftDClick"></event> | ||
| 5913 | <event name="OnLeftDown"></event> | ||
| 5914 | <event name="OnLeftUp"></event> | ||
| 5915 | <event name="OnMiddleDClick"></event> | ||
| 5916 | <event name="OnMiddleDown"></event> | ||
| 5917 | <event name="OnMiddleUp"></event> | ||
| 5918 | <event name="OnMotion"></event> | ||
| 5919 | <event name="OnMouseEvents"></event> | ||
| 5920 | <event name="OnMouseWheel"></event> | ||
| 5921 | <event name="OnPaint"></event> | ||
| 5922 | <event name="OnRightDClick"></event> | ||
| 5923 | <event name="OnRightDown"></event> | ||
| 5924 | <event name="OnRightUp"></event> | ||
| 5925 | <event name="OnSetFocus"></event> | ||
| 5926 | <event name="OnSize"></event> | ||
| 5927 | <event name="OnText"></event> | ||
| 5928 | <event name="OnTextEnter"></event> | ||
| 5929 | <event name="OnTextMaxLen"></event> | ||
| 5930 | <event name="OnTextURL"></event> | ||
| 5931 | <event name="OnUpdateUI"></event> | ||
| 5932 | </object> | ||
| 5933 | </object> | ||
| 5934 | <object class="sizeritem" expanded="1"> | ||
| 5935 | <property name="border">5</property> | ||
| 5936 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 5937 | <property name="proportion">0</property> | ||
| 5938 | <object class="wxTextCtrl" expanded="1"> | ||
| 5939 | <property name="bg"></property> | ||
| 5940 | <property name="context_help"></property> | ||
| 5941 | <property name="enabled">1</property> | ||
| 5942 | <property name="fg"></property> | ||
| 5943 | <property name="font"></property> | ||
| 5944 | <property name="hidden">0</property> | ||
| 5945 | <property name="id">wxID_ANY</property> | ||
| 5946 | <property name="maximum_size">-1,-1</property> | ||
| 5947 | <property name="maxlength">0</property> | ||
| 5948 | <property name="minimum_size">-1,-1</property> | ||
| 5949 | <property name="name">m_textCtrlField1</property> | ||
| 5950 | <property name="permission">protected</property> | ||
| 5951 | <property name="pos"></property> | ||
| 5952 | <property name="size">-1,-1</property> | ||
| 5953 | <property name="style"></property> | ||
| 5954 | <property name="subclass"></property> | ||
| 5955 | <property name="tooltip"></property> | ||
| 5956 | <property name="value"></property> | ||
| 5957 | <property name="window_extra_style"></property> | ||
| 5958 | <property name="window_name"></property> | ||
| 5959 | <property name="window_style"></property> | ||
| 5960 | <event name="OnChar"></event> | ||
| 5961 | <event name="OnEnterWindow"></event> | ||
| 5962 | <event name="OnEraseBackground"></event> | ||
| 5963 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 5964 | <event name="OnKeyUp"></event> | ||
| 5965 | <event name="OnKillFocus"></event> | ||
| 5966 | <event name="OnLeaveWindow"></event> | ||
| 5967 | <event name="OnLeftDClick"></event> | ||
| 5968 | <event name="OnLeftDown"></event> | ||
| 5969 | <event name="OnLeftUp"></event> | ||
| 5970 | <event name="OnMiddleDClick"></event> | ||
| 5971 | <event name="OnMiddleDown"></event> | ||
| 5972 | <event name="OnMiddleUp"></event> | ||
| 5973 | <event name="OnMotion"></event> | ||
| 5974 | <event name="OnMouseEvents"></event> | ||
| 5975 | <event name="OnMouseWheel"></event> | ||
| 5976 | <event name="OnPaint"></event> | ||
| 5977 | <event name="OnRightDClick"></event> | ||
| 5978 | <event name="OnRightDown"></event> | ||
| 5979 | <event name="OnRightUp"></event> | ||
| 5980 | <event name="OnSetFocus"></event> | ||
| 5981 | <event name="OnSize"></event> | ||
| 5982 | <event name="OnText"></event> | ||
| 5983 | <event name="OnTextEnter"></event> | ||
| 5984 | <event name="OnTextMaxLen"></event> | ||
| 5985 | <event name="OnTextURL"></event> | ||
| 5986 | <event name="OnUpdateUI"></event> | ||
| 5987 | </object> | ||
| 5988 | </object> | ||
| 5989 | <object class="sizeritem" expanded="1"> | ||
| 5990 | <property name="border">5</property> | ||
| 5991 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 5992 | <property name="proportion">0</property> | ||
| 5993 | <object class="wxButton" expanded="1"> | ||
| 5994 | <property name="bg"></property> | ||
| 5995 | <property name="context_help"></property> | ||
| 5996 | <property name="default">0</property> | ||
| 5997 | <property name="enabled">1</property> | ||
| 5998 | <property name="fg"></property> | ||
| 5999 | <property name="font"></property> | ||
| 6000 | <property name="hidden">0</property> | ||
| 6001 | <property name="id">wxID_DEL1</property> | ||
| 6002 | <property name="label">Delete</property> | ||
| 6003 | <property name="maximum_size"></property> | ||
| 6004 | <property name="minimum_size">-1,-1</property> | ||
| 6005 | <property name="name">m_buttonDel1</property> | ||
| 6006 | <property name="permission">protected</property> | ||
| 6007 | <property name="pos"></property> | ||
| 6008 | <property name="size">60,20</property> | ||
| 6009 | <property name="style"></property> | ||
| 6010 | <property name="subclass"></property> | ||
| 6011 | <property name="tooltip"></property> | ||
| 6012 | <property name="window_extra_style"></property> | ||
| 6013 | <property name="window_name"></property> | ||
| 6014 | <property name="window_style"></property> | ||
| 6015 | <event name="OnButtonClick">OnButtonDel1</event> | ||
| 6016 | <event name="OnChar"></event> | ||
| 6017 | <event name="OnEnterWindow"></event> | ||
| 6018 | <event name="OnEraseBackground"></event> | ||
| 6019 | <event name="OnKeyDown"></event> | ||
| 6020 | <event name="OnKeyUp"></event> | ||
| 6021 | <event name="OnKillFocus"></event> | ||
| 6022 | <event name="OnLeaveWindow"></event> | ||
| 6023 | <event name="OnLeftDClick"></event> | ||
| 6024 | <event name="OnLeftDown"></event> | ||
| 6025 | <event name="OnLeftUp"></event> | ||
| 6026 | <event name="OnMiddleDClick"></event> | ||
| 6027 | <event name="OnMiddleDown"></event> | ||
| 6028 | <event name="OnMiddleUp"></event> | ||
| 6029 | <event name="OnMotion"></event> | ||
| 6030 | <event name="OnMouseEvents"></event> | ||
| 6031 | <event name="OnMouseWheel"></event> | ||
| 6032 | <event name="OnPaint"></event> | ||
| 6033 | <event name="OnRightDClick"></event> | ||
| 6034 | <event name="OnRightDown"></event> | ||
| 6035 | <event name="OnRightUp"></event> | ||
| 6036 | <event name="OnSetFocus"></event> | ||
| 6037 | <event name="OnSize"></event> | ||
| 6038 | <event name="OnUpdateUI"></event> | ||
| 6039 | </object> | ||
| 6040 | </object> | ||
| 6041 | <object class="sizeritem" expanded="1"> | ||
| 6042 | <property name="border">5</property> | ||
| 6043 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 6044 | <property name="proportion">0</property> | ||
| 6045 | <object class="wxTextCtrl" expanded="1"> | ||
| 6046 | <property name="bg"></property> | ||
| 6047 | <property name="context_help"></property> | ||
| 6048 | <property name="enabled">1</property> | ||
| 6049 | <property name="fg"></property> | ||
| 6050 | <property name="font"></property> | ||
| 6051 | <property name="hidden">0</property> | ||
| 6052 | <property name="id">wxID_ANY</property> | ||
| 6053 | <property name="maximum_size"></property> | ||
| 6054 | <property name="maxlength">0</property> | ||
| 6055 | <property name="minimum_size">150,-1</property> | ||
| 6056 | <property name="name">m_textCtrlLabel2</property> | ||
| 6057 | <property name="permission">protected</property> | ||
| 6058 | <property name="pos"></property> | ||
| 6059 | <property name="size"></property> | ||
| 6060 | <property name="style"></property> | ||
| 6061 | <property name="subclass"></property> | ||
| 6062 | <property name="tooltip"></property> | ||
| 6063 | <property name="value"></property> | ||
| 6064 | <property name="window_extra_style"></property> | ||
| 6065 | <property name="window_name"></property> | ||
| 6066 | <property name="window_style"></property> | ||
| 6067 | <event name="OnChar"></event> | ||
| 6068 | <event name="OnEnterWindow"></event> | ||
| 6069 | <event name="OnEraseBackground"></event> | ||
| 6070 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6071 | <event name="OnKeyUp"></event> | ||
| 6072 | <event name="OnKillFocus"></event> | ||
| 6073 | <event name="OnLeaveWindow"></event> | ||
| 6074 | <event name="OnLeftDClick"></event> | ||
| 6075 | <event name="OnLeftDown"></event> | ||
| 6076 | <event name="OnLeftUp"></event> | ||
| 6077 | <event name="OnMiddleDClick"></event> | ||
| 6078 | <event name="OnMiddleDown"></event> | ||
| 6079 | <event name="OnMiddleUp"></event> | ||
| 6080 | <event name="OnMotion"></event> | ||
| 6081 | <event name="OnMouseEvents"></event> | ||
| 6082 | <event name="OnMouseWheel"></event> | ||
| 6083 | <event name="OnPaint"></event> | ||
| 6084 | <event name="OnRightDClick"></event> | ||
| 6085 | <event name="OnRightDown"></event> | ||
| 6086 | <event name="OnRightUp"></event> | ||
| 6087 | <event name="OnSetFocus"></event> | ||
| 6088 | <event name="OnSize"></event> | ||
| 6089 | <event name="OnText"></event> | ||
| 6090 | <event name="OnTextEnter"></event> | ||
| 6091 | <event name="OnTextMaxLen"></event> | ||
| 6092 | <event name="OnTextURL"></event> | ||
| 6093 | <event name="OnUpdateUI"></event> | ||
| 6094 | </object> | ||
| 6095 | </object> | ||
| 6096 | <object class="sizeritem" expanded="1"> | ||
| 6097 | <property name="border">5</property> | ||
| 6098 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 6099 | <property name="proportion">0</property> | ||
| 6100 | <object class="wxTextCtrl" expanded="1"> | ||
| 6101 | <property name="bg"></property> | ||
| 6102 | <property name="context_help"></property> | ||
| 6103 | <property name="enabled">1</property> | ||
| 6104 | <property name="fg"></property> | ||
| 6105 | <property name="font"></property> | ||
| 6106 | <property name="hidden">0</property> | ||
| 6107 | <property name="id">wxID_ANY</property> | ||
| 6108 | <property name="maximum_size">-1,-1</property> | ||
| 6109 | <property name="maxlength">0</property> | ||
| 6110 | <property name="minimum_size">-1,-1</property> | ||
| 6111 | <property name="name">m_textCtrlField2</property> | ||
| 6112 | <property name="permission">protected</property> | ||
| 6113 | <property name="pos"></property> | ||
| 6114 | <property name="size">-1,-1</property> | ||
| 6115 | <property name="style"></property> | ||
| 6116 | <property name="subclass"></property> | ||
| 6117 | <property name="tooltip"></property> | ||
| 6118 | <property name="value"></property> | ||
| 6119 | <property name="window_extra_style"></property> | ||
| 6120 | <property name="window_name"></property> | ||
| 6121 | <property name="window_style"></property> | ||
| 6122 | <event name="OnChar"></event> | ||
| 6123 | <event name="OnEnterWindow"></event> | ||
| 6124 | <event name="OnEraseBackground"></event> | ||
| 6125 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6126 | <event name="OnKeyUp"></event> | ||
| 6127 | <event name="OnKillFocus"></event> | ||
| 6128 | <event name="OnLeaveWindow"></event> | ||
| 6129 | <event name="OnLeftDClick"></event> | ||
| 6130 | <event name="OnLeftDown"></event> | ||
| 6131 | <event name="OnLeftUp"></event> | ||
| 6132 | <event name="OnMiddleDClick"></event> | ||
| 6133 | <event name="OnMiddleDown"></event> | ||
| 6134 | <event name="OnMiddleUp"></event> | ||
| 6135 | <event name="OnMotion"></event> | ||
| 6136 | <event name="OnMouseEvents"></event> | ||
| 6137 | <event name="OnMouseWheel"></event> | ||
| 6138 | <event name="OnPaint"></event> | ||
| 6139 | <event name="OnRightDClick"></event> | ||
| 6140 | <event name="OnRightDown"></event> | ||
| 6141 | <event name="OnRightUp"></event> | ||
| 6142 | <event name="OnSetFocus"></event> | ||
| 6143 | <event name="OnSize"></event> | ||
| 6144 | <event name="OnText"></event> | ||
| 6145 | <event name="OnTextEnter"></event> | ||
| 6146 | <event name="OnTextMaxLen"></event> | ||
| 6147 | <event name="OnTextURL"></event> | ||
| 6148 | <event name="OnUpdateUI"></event> | ||
| 6149 | </object> | ||
| 6150 | </object> | ||
| 6151 | <object class="sizeritem" expanded="1"> | ||
| 6152 | <property name="border">5</property> | ||
| 6153 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 6154 | <property name="proportion">0</property> | ||
| 6155 | <object class="wxButton" expanded="1"> | ||
| 6156 | <property name="bg"></property> | ||
| 6157 | <property name="context_help"></property> | ||
| 6158 | <property name="default">0</property> | ||
| 6159 | <property name="enabled">1</property> | ||
| 6160 | <property name="fg"></property> | ||
| 6161 | <property name="font"></property> | ||
| 6162 | <property name="hidden">0</property> | ||
| 6163 | <property name="id">wxID_DEL2</property> | ||
| 6164 | <property name="label">Delete</property> | ||
| 6165 | <property name="maximum_size"></property> | ||
| 6166 | <property name="minimum_size">-1,-1</property> | ||
| 6167 | <property name="name">m_buttonDel2</property> | ||
| 6168 | <property name="permission">protected</property> | ||
| 6169 | <property name="pos"></property> | ||
| 6170 | <property name="size">60,20</property> | ||
| 6171 | <property name="style"></property> | ||
| 6172 | <property name="subclass"></property> | ||
| 6173 | <property name="tooltip"></property> | ||
| 6174 | <property name="window_extra_style"></property> | ||
| 6175 | <property name="window_name"></property> | ||
| 6176 | <property name="window_style"></property> | ||
| 6177 | <event name="OnButtonClick">OnButtonDel2</event> | ||
| 6178 | <event name="OnChar"></event> | ||
| 6179 | <event name="OnEnterWindow"></event> | ||
| 6180 | <event name="OnEraseBackground"></event> | ||
| 6181 | <event name="OnKeyDown"></event> | ||
| 6182 | <event name="OnKeyUp"></event> | ||
| 6183 | <event name="OnKillFocus"></event> | ||
| 6184 | <event name="OnLeaveWindow"></event> | ||
| 6185 | <event name="OnLeftDClick"></event> | ||
| 6186 | <event name="OnLeftDown"></event> | ||
| 6187 | <event name="OnLeftUp"></event> | ||
| 6188 | <event name="OnMiddleDClick"></event> | ||
| 6189 | <event name="OnMiddleDown"></event> | ||
| 6190 | <event name="OnMiddleUp"></event> | ||
| 6191 | <event name="OnMotion"></event> | ||
| 6192 | <event name="OnMouseEvents"></event> | ||
| 6193 | <event name="OnMouseWheel"></event> | ||
| 6194 | <event name="OnPaint"></event> | ||
| 6195 | <event name="OnRightDClick"></event> | ||
| 6196 | <event name="OnRightDown"></event> | ||
| 6197 | <event name="OnRightUp"></event> | ||
| 6198 | <event name="OnSetFocus"></event> | ||
| 6199 | <event name="OnSize"></event> | ||
| 6200 | <event name="OnUpdateUI"></event> | ||
| 6201 | </object> | ||
| 6202 | </object> | ||
| 6203 | <object class="sizeritem" expanded="1"> | ||
| 6204 | <property name="border">5</property> | ||
| 6205 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 6206 | <property name="proportion">0</property> | ||
| 6207 | <object class="wxTextCtrl" expanded="1"> | ||
| 6208 | <property name="bg"></property> | ||
| 6209 | <property name="context_help"></property> | ||
| 6210 | <property name="enabled">1</property> | ||
| 6211 | <property name="fg"></property> | ||
| 6212 | <property name="font"></property> | ||
| 6213 | <property name="hidden">0</property> | ||
| 6214 | <property name="id">wxID_ANY</property> | ||
| 6215 | <property name="maximum_size"></property> | ||
| 6216 | <property name="maxlength">0</property> | ||
| 6217 | <property name="minimum_size">150,-1</property> | ||
| 6218 | <property name="name">m_textCtrlLabel3</property> | ||
| 6219 | <property name="permission">protected</property> | ||
| 6220 | <property name="pos"></property> | ||
| 6221 | <property name="size"></property> | ||
| 6222 | <property name="style"></property> | ||
| 6223 | <property name="subclass"></property> | ||
| 6224 | <property name="tooltip"></property> | ||
| 6225 | <property name="value"></property> | ||
| 6226 | <property name="window_extra_style"></property> | ||
| 6227 | <property name="window_name"></property> | ||
| 6228 | <property name="window_style"></property> | ||
| 6229 | <event name="OnChar"></event> | ||
| 6230 | <event name="OnEnterWindow"></event> | ||
| 6231 | <event name="OnEraseBackground"></event> | ||
| 6232 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6233 | <event name="OnKeyUp"></event> | ||
| 6234 | <event name="OnKillFocus"></event> | ||
| 6235 | <event name="OnLeaveWindow"></event> | ||
| 6236 | <event name="OnLeftDClick"></event> | ||
| 6237 | <event name="OnLeftDown"></event> | ||
| 6238 | <event name="OnLeftUp"></event> | ||
| 6239 | <event name="OnMiddleDClick"></event> | ||
| 6240 | <event name="OnMiddleDown"></event> | ||
| 6241 | <event name="OnMiddleUp"></event> | ||
| 6242 | <event name="OnMotion"></event> | ||
| 6243 | <event name="OnMouseEvents"></event> | ||
| 6244 | <event name="OnMouseWheel"></event> | ||
| 6245 | <event name="OnPaint"></event> | ||
| 6246 | <event name="OnRightDClick"></event> | ||
| 6247 | <event name="OnRightDown"></event> | ||
| 6248 | <event name="OnRightUp"></event> | ||
| 6249 | <event name="OnSetFocus"></event> | ||
| 6250 | <event name="OnSize"></event> | ||
| 6251 | <event name="OnText"></event> | ||
| 6252 | <event name="OnTextEnter"></event> | ||
| 6253 | <event name="OnTextMaxLen"></event> | ||
| 6254 | <event name="OnTextURL"></event> | ||
| 6255 | <event name="OnUpdateUI"></event> | ||
| 6256 | </object> | ||
| 6257 | </object> | ||
| 6258 | <object class="sizeritem" expanded="1"> | ||
| 6259 | <property name="border">5</property> | ||
| 6260 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 6261 | <property name="proportion">0</property> | ||
| 6262 | <object class="wxTextCtrl" expanded="1"> | ||
| 6263 | <property name="bg"></property> | ||
| 6264 | <property name="context_help"></property> | ||
| 6265 | <property name="enabled">1</property> | ||
| 6266 | <property name="fg"></property> | ||
| 6267 | <property name="font"></property> | ||
| 6268 | <property name="hidden">0</property> | ||
| 6269 | <property name="id">wxID_ANY</property> | ||
| 6270 | <property name="maximum_size">-1,-1</property> | ||
| 6271 | <property name="maxlength">0</property> | ||
| 6272 | <property name="minimum_size">-1,-1</property> | ||
| 6273 | <property name="name">m_textCtrlField3</property> | ||
| 6274 | <property name="permission">protected</property> | ||
| 6275 | <property name="pos"></property> | ||
| 6276 | <property name="size">-1,-1</property> | ||
| 6277 | <property name="style"></property> | ||
| 6278 | <property name="subclass"></property> | ||
| 6279 | <property name="tooltip"></property> | ||
| 6280 | <property name="value"></property> | ||
| 6281 | <property name="window_extra_style"></property> | ||
| 6282 | <property name="window_name"></property> | ||
| 6283 | <property name="window_style"></property> | ||
| 6284 | <event name="OnChar"></event> | ||
| 6285 | <event name="OnEnterWindow"></event> | ||
| 6286 | <event name="OnEraseBackground"></event> | ||
| 6287 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6288 | <event name="OnKeyUp"></event> | ||
| 6289 | <event name="OnKillFocus"></event> | ||
| 6290 | <event name="OnLeaveWindow"></event> | ||
| 6291 | <event name="OnLeftDClick"></event> | ||
| 6292 | <event name="OnLeftDown"></event> | ||
| 6293 | <event name="OnLeftUp"></event> | ||
| 6294 | <event name="OnMiddleDClick"></event> | ||
| 6295 | <event name="OnMiddleDown"></event> | ||
| 6296 | <event name="OnMiddleUp"></event> | ||
| 6297 | <event name="OnMotion"></event> | ||
| 6298 | <event name="OnMouseEvents"></event> | ||
| 6299 | <event name="OnMouseWheel"></event> | ||
| 6300 | <event name="OnPaint"></event> | ||
| 6301 | <event name="OnRightDClick"></event> | ||
| 6302 | <event name="OnRightDown"></event> | ||
| 6303 | <event name="OnRightUp"></event> | ||
| 6304 | <event name="OnSetFocus"></event> | ||
| 6305 | <event name="OnSize"></event> | ||
| 6306 | <event name="OnText"></event> | ||
| 6307 | <event name="OnTextEnter"></event> | ||
| 6308 | <event name="OnTextMaxLen"></event> | ||
| 6309 | <event name="OnTextURL"></event> | ||
| 6310 | <event name="OnUpdateUI"></event> | ||
| 6311 | </object> | ||
| 6312 | </object> | ||
| 6313 | <object class="sizeritem" expanded="1"> | ||
| 6314 | <property name="border">5</property> | ||
| 6315 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 6316 | <property name="proportion">0</property> | ||
| 6317 | <object class="wxButton" expanded="1"> | ||
| 6318 | <property name="bg"></property> | ||
| 6319 | <property name="context_help"></property> | ||
| 6320 | <property name="default">0</property> | ||
| 6321 | <property name="enabled">1</property> | ||
| 6322 | <property name="fg"></property> | ||
| 6323 | <property name="font"></property> | ||
| 6324 | <property name="hidden">0</property> | ||
| 6325 | <property name="id">wxID_DEL3</property> | ||
| 6326 | <property name="label">Delete</property> | ||
| 6327 | <property name="maximum_size"></property> | ||
| 6328 | <property name="minimum_size">-1,-1</property> | ||
| 6329 | <property name="name">m_buttonDel3</property> | ||
| 6330 | <property name="permission">protected</property> | ||
| 6331 | <property name="pos"></property> | ||
| 6332 | <property name="size">60,20</property> | ||
| 6333 | <property name="style"></property> | ||
| 6334 | <property name="subclass"></property> | ||
| 6335 | <property name="tooltip"></property> | ||
| 6336 | <property name="window_extra_style"></property> | ||
| 6337 | <property name="window_name"></property> | ||
| 6338 | <property name="window_style"></property> | ||
| 6339 | <event name="OnButtonClick">OnButtonDel3</event> | ||
| 6340 | <event name="OnChar"></event> | ||
| 6341 | <event name="OnEnterWindow"></event> | ||
| 6342 | <event name="OnEraseBackground"></event> | ||
| 6343 | <event name="OnKeyDown"></event> | ||
| 6344 | <event name="OnKeyUp"></event> | ||
| 6345 | <event name="OnKillFocus"></event> | ||
| 6346 | <event name="OnLeaveWindow"></event> | ||
| 6347 | <event name="OnLeftDClick"></event> | ||
| 6348 | <event name="OnLeftDown"></event> | ||
| 6349 | <event name="OnLeftUp"></event> | ||
| 6350 | <event name="OnMiddleDClick"></event> | ||
| 6351 | <event name="OnMiddleDown"></event> | ||
| 6352 | <event name="OnMiddleUp"></event> | ||
| 6353 | <event name="OnMotion"></event> | ||
| 6354 | <event name="OnMouseEvents"></event> | ||
| 6355 | <event name="OnMouseWheel"></event> | ||
| 6356 | <event name="OnPaint"></event> | ||
| 6357 | <event name="OnRightDClick"></event> | ||
| 6358 | <event name="OnRightDown"></event> | ||
| 6359 | <event name="OnRightUp"></event> | ||
| 6360 | <event name="OnSetFocus"></event> | ||
| 6361 | <event name="OnSize"></event> | ||
| 6362 | <event name="OnUpdateUI"></event> | ||
| 6363 | </object> | ||
| 6364 | </object> | ||
| 6365 | <object class="sizeritem" expanded="1"> | ||
| 6366 | <property name="border">5</property> | ||
| 6367 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 6368 | <property name="proportion">0</property> | ||
| 6369 | <object class="wxTextCtrl" expanded="1"> | ||
| 6370 | <property name="bg"></property> | ||
| 6371 | <property name="context_help"></property> | ||
| 6372 | <property name="enabled">1</property> | ||
| 6373 | <property name="fg"></property> | ||
| 6374 | <property name="font"></property> | ||
| 6375 | <property name="hidden">0</property> | ||
| 6376 | <property name="id">wxID_ANY</property> | ||
| 6377 | <property name="maximum_size"></property> | ||
| 6378 | <property name="maxlength">0</property> | ||
| 6379 | <property name="minimum_size">150,-1</property> | ||
| 6380 | <property name="name">m_textCtrlLabel4</property> | ||
| 6381 | <property name="permission">protected</property> | ||
| 6382 | <property name="pos"></property> | ||
| 6383 | <property name="size"></property> | ||
| 6384 | <property name="style"></property> | ||
| 6385 | <property name="subclass"></property> | ||
| 6386 | <property name="tooltip"></property> | ||
| 6387 | <property name="value"></property> | ||
| 6388 | <property name="window_extra_style"></property> | ||
| 6389 | <property name="window_name"></property> | ||
| 6390 | <property name="window_style"></property> | ||
| 6391 | <event name="OnChar"></event> | ||
| 6392 | <event name="OnEnterWindow"></event> | ||
| 6393 | <event name="OnEraseBackground"></event> | ||
| 6394 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6395 | <event name="OnKeyUp"></event> | ||
| 6396 | <event name="OnKillFocus"></event> | ||
| 6397 | <event name="OnLeaveWindow"></event> | ||
| 6398 | <event name="OnLeftDClick"></event> | ||
| 6399 | <event name="OnLeftDown"></event> | ||
| 6400 | <event name="OnLeftUp"></event> | ||
| 6401 | <event name="OnMiddleDClick"></event> | ||
| 6402 | <event name="OnMiddleDown"></event> | ||
| 6403 | <event name="OnMiddleUp"></event> | ||
| 6404 | <event name="OnMotion"></event> | ||
| 6405 | <event name="OnMouseEvents"></event> | ||
| 6406 | <event name="OnMouseWheel"></event> | ||
| 6407 | <event name="OnPaint"></event> | ||
| 6408 | <event name="OnRightDClick"></event> | ||
| 6409 | <event name="OnRightDown"></event> | ||
| 6410 | <event name="OnRightUp"></event> | ||
| 6411 | <event name="OnSetFocus"></event> | ||
| 6412 | <event name="OnSize"></event> | ||
| 6413 | <event name="OnText"></event> | ||
| 6414 | <event name="OnTextEnter"></event> | ||
| 6415 | <event name="OnTextMaxLen"></event> | ||
| 6416 | <event name="OnTextURL"></event> | ||
| 6417 | <event name="OnUpdateUI"></event> | ||
| 6418 | </object> | ||
| 6419 | </object> | ||
| 6420 | <object class="sizeritem" expanded="1"> | ||
| 6421 | <property name="border">5</property> | ||
| 6422 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 6423 | <property name="proportion">0</property> | ||
| 6424 | <object class="wxTextCtrl" expanded="1"> | ||
| 6425 | <property name="bg"></property> | ||
| 6426 | <property name="context_help"></property> | ||
| 6427 | <property name="enabled">1</property> | ||
| 6428 | <property name="fg"></property> | ||
| 6429 | <property name="font"></property> | ||
| 6430 | <property name="hidden">0</property> | ||
| 6431 | <property name="id">wxID_ANY</property> | ||
| 6432 | <property name="maximum_size">-1,-1</property> | ||
| 6433 | <property name="maxlength">0</property> | ||
| 6434 | <property name="minimum_size">-1,-1</property> | ||
| 6435 | <property name="name">m_textCtrlField4</property> | ||
| 6436 | <property name="permission">protected</property> | ||
| 6437 | <property name="pos"></property> | ||
| 6438 | <property name="size">-1,-1</property> | ||
| 6439 | <property name="style"></property> | ||
| 6440 | <property name="subclass"></property> | ||
| 6441 | <property name="tooltip"></property> | ||
| 6442 | <property name="value"></property> | ||
| 6443 | <property name="window_extra_style"></property> | ||
| 6444 | <property name="window_name"></property> | ||
| 6445 | <property name="window_style"></property> | ||
| 6446 | <event name="OnChar"></event> | ||
| 6447 | <event name="OnEnterWindow"></event> | ||
| 6448 | <event name="OnEraseBackground"></event> | ||
| 6449 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6450 | <event name="OnKeyUp"></event> | ||
| 6451 | <event name="OnKillFocus"></event> | ||
| 6452 | <event name="OnLeaveWindow"></event> | ||
| 6453 | <event name="OnLeftDClick"></event> | ||
| 6454 | <event name="OnLeftDown"></event> | ||
| 6455 | <event name="OnLeftUp"></event> | ||
| 6456 | <event name="OnMiddleDClick"></event> | ||
| 6457 | <event name="OnMiddleDown"></event> | ||
| 6458 | <event name="OnMiddleUp"></event> | ||
| 6459 | <event name="OnMotion"></event> | ||
| 6460 | <event name="OnMouseEvents"></event> | ||
| 6461 | <event name="OnMouseWheel"></event> | ||
| 6462 | <event name="OnPaint"></event> | ||
| 6463 | <event name="OnRightDClick"></event> | ||
| 6464 | <event name="OnRightDown"></event> | ||
| 6465 | <event name="OnRightUp"></event> | ||
| 6466 | <event name="OnSetFocus"></event> | ||
| 6467 | <event name="OnSize"></event> | ||
| 6468 | <event name="OnText"></event> | ||
| 6469 | <event name="OnTextEnter"></event> | ||
| 6470 | <event name="OnTextMaxLen"></event> | ||
| 6471 | <event name="OnTextURL"></event> | ||
| 6472 | <event name="OnUpdateUI"></event> | ||
| 6473 | </object> | ||
| 6474 | </object> | ||
| 6475 | <object class="sizeritem" expanded="1"> | ||
| 6476 | <property name="border">5</property> | ||
| 6477 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 6478 | <property name="proportion">0</property> | ||
| 6479 | <object class="wxButton" expanded="1"> | ||
| 6480 | <property name="bg"></property> | ||
| 6481 | <property name="context_help"></property> | ||
| 6482 | <property name="default">0</property> | ||
| 6483 | <property name="enabled">1</property> | ||
| 6484 | <property name="fg"></property> | ||
| 6485 | <property name="font"></property> | ||
| 6486 | <property name="hidden">0</property> | ||
| 6487 | <property name="id">wxID_DEL4</property> | ||
| 6488 | <property name="label">Delete</property> | ||
| 6489 | <property name="maximum_size"></property> | ||
| 6490 | <property name="minimum_size">-1,-1</property> | ||
| 6491 | <property name="name">m_buttonDel4</property> | ||
| 6492 | <property name="permission">protected</property> | ||
| 6493 | <property name="pos"></property> | ||
| 6494 | <property name="size">60,20</property> | ||
| 6495 | <property name="style"></property> | ||
| 6496 | <property name="subclass"></property> | ||
| 6497 | <property name="tooltip"></property> | ||
| 6498 | <property name="window_extra_style"></property> | ||
| 6499 | <property name="window_name"></property> | ||
| 6500 | <property name="window_style"></property> | ||
| 6501 | <event name="OnButtonClick">OnButtonDel4</event> | ||
| 6502 | <event name="OnChar"></event> | ||
| 6503 | <event name="OnEnterWindow"></event> | ||
| 6504 | <event name="OnEraseBackground"></event> | ||
| 6505 | <event name="OnKeyDown"></event> | ||
| 6506 | <event name="OnKeyUp"></event> | ||
| 6507 | <event name="OnKillFocus"></event> | ||
| 6508 | <event name="OnLeaveWindow"></event> | ||
| 6509 | <event name="OnLeftDClick"></event> | ||
| 6510 | <event name="OnLeftDown"></event> | ||
| 6511 | <event name="OnLeftUp"></event> | ||
| 6512 | <event name="OnMiddleDClick"></event> | ||
| 6513 | <event name="OnMiddleDown"></event> | ||
| 6514 | <event name="OnMiddleUp"></event> | ||
| 6515 | <event name="OnMotion"></event> | ||
| 6516 | <event name="OnMouseEvents"></event> | ||
| 6517 | <event name="OnMouseWheel"></event> | ||
| 6518 | <event name="OnPaint"></event> | ||
| 6519 | <event name="OnRightDClick"></event> | ||
| 6520 | <event name="OnRightDown"></event> | ||
| 6521 | <event name="OnRightUp"></event> | ||
| 6522 | <event name="OnSetFocus"></event> | ||
| 6523 | <event name="OnSize"></event> | ||
| 6524 | <event name="OnUpdateUI"></event> | ||
| 6525 | </object> | ||
| 6526 | </object> | ||
| 6527 | <object class="sizeritem" expanded="1"> | ||
| 6528 | <property name="border">5</property> | ||
| 6529 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 6530 | <property name="proportion">0</property> | ||
| 6531 | <object class="wxTextCtrl" expanded="1"> | ||
| 6532 | <property name="bg"></property> | ||
| 6533 | <property name="context_help"></property> | ||
| 6534 | <property name="enabled">1</property> | ||
| 6535 | <property name="fg"></property> | ||
| 6536 | <property name="font"></property> | ||
| 6537 | <property name="hidden">0</property> | ||
| 6538 | <property name="id">wxID_ANY</property> | ||
| 6539 | <property name="maximum_size"></property> | ||
| 6540 | <property name="maxlength">0</property> | ||
| 6541 | <property name="minimum_size">150,-1</property> | ||
| 6542 | <property name="name">m_textCtrlLabel5</property> | ||
| 6543 | <property name="permission">protected</property> | ||
| 6544 | <property name="pos"></property> | ||
| 6545 | <property name="size"></property> | ||
| 6546 | <property name="style"></property> | ||
| 6547 | <property name="subclass"></property> | ||
| 6548 | <property name="tooltip"></property> | ||
| 6549 | <property name="value"></property> | ||
| 6550 | <property name="window_extra_style"></property> | ||
| 6551 | <property name="window_name"></property> | ||
| 6552 | <property name="window_style"></property> | ||
| 6553 | <event name="OnChar"></event> | ||
| 6554 | <event name="OnEnterWindow"></event> | ||
| 6555 | <event name="OnEraseBackground"></event> | ||
| 6556 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6557 | <event name="OnKeyUp"></event> | ||
| 6558 | <event name="OnKillFocus"></event> | ||
| 6559 | <event name="OnLeaveWindow"></event> | ||
| 6560 | <event name="OnLeftDClick"></event> | ||
| 6561 | <event name="OnLeftDown"></event> | ||
| 6562 | <event name="OnLeftUp"></event> | ||
| 6563 | <event name="OnMiddleDClick"></event> | ||
| 6564 | <event name="OnMiddleDown"></event> | ||
| 6565 | <event name="OnMiddleUp"></event> | ||
| 6566 | <event name="OnMotion"></event> | ||
| 6567 | <event name="OnMouseEvents"></event> | ||
| 6568 | <event name="OnMouseWheel"></event> | ||
| 6569 | <event name="OnPaint"></event> | ||
| 6570 | <event name="OnRightDClick"></event> | ||
| 6571 | <event name="OnRightDown"></event> | ||
| 6572 | <event name="OnRightUp"></event> | ||
| 6573 | <event name="OnSetFocus"></event> | ||
| 6574 | <event name="OnSize"></event> | ||
| 6575 | <event name="OnText"></event> | ||
| 6576 | <event name="OnTextEnter"></event> | ||
| 6577 | <event name="OnTextMaxLen"></event> | ||
| 6578 | <event name="OnTextURL"></event> | ||
| 6579 | <event name="OnUpdateUI"></event> | ||
| 6580 | </object> | ||
| 6581 | </object> | ||
| 6582 | <object class="sizeritem" expanded="1"> | ||
| 6583 | <property name="border">5</property> | ||
| 6584 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 6585 | <property name="proportion">0</property> | ||
| 6586 | <object class="wxTextCtrl" expanded="1"> | ||
| 6587 | <property name="bg"></property> | ||
| 6588 | <property name="context_help"></property> | ||
| 6589 | <property name="enabled">1</property> | ||
| 6590 | <property name="fg"></property> | ||
| 6591 | <property name="font"></property> | ||
| 6592 | <property name="hidden">0</property> | ||
| 6593 | <property name="id">wxID_ANY</property> | ||
| 6594 | <property name="maximum_size">-1,-1</property> | ||
| 6595 | <property name="maxlength">0</property> | ||
| 6596 | <property name="minimum_size">-1,-1</property> | ||
| 6597 | <property name="name">m_textCtrlField5</property> | ||
| 6598 | <property name="permission">protected</property> | ||
| 6599 | <property name="pos"></property> | ||
| 6600 | <property name="size">-1,-1</property> | ||
| 6601 | <property name="style"></property> | ||
| 6602 | <property name="subclass"></property> | ||
| 6603 | <property name="tooltip"></property> | ||
| 6604 | <property name="value"></property> | ||
| 6605 | <property name="window_extra_style"></property> | ||
| 6606 | <property name="window_name"></property> | ||
| 6607 | <property name="window_style"></property> | ||
| 6608 | <event name="OnChar"></event> | ||
| 6609 | <event name="OnEnterWindow"></event> | ||
| 6610 | <event name="OnEraseBackground"></event> | ||
| 6611 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6612 | <event name="OnKeyUp"></event> | ||
| 6613 | <event name="OnKillFocus"></event> | ||
| 6614 | <event name="OnLeaveWindow"></event> | ||
| 6615 | <event name="OnLeftDClick"></event> | ||
| 6616 | <event name="OnLeftDown"></event> | ||
| 6617 | <event name="OnLeftUp"></event> | ||
| 6618 | <event name="OnMiddleDClick"></event> | ||
| 6619 | <event name="OnMiddleDown"></event> | ||
| 6620 | <event name="OnMiddleUp"></event> | ||
| 6621 | <event name="OnMotion"></event> | ||
| 6622 | <event name="OnMouseEvents"></event> | ||
| 6623 | <event name="OnMouseWheel"></event> | ||
| 6624 | <event name="OnPaint"></event> | ||
| 6625 | <event name="OnRightDClick"></event> | ||
| 6626 | <event name="OnRightDown"></event> | ||
| 6627 | <event name="OnRightUp"></event> | ||
| 6628 | <event name="OnSetFocus"></event> | ||
| 6629 | <event name="OnSize"></event> | ||
| 6630 | <event name="OnText"></event> | ||
| 6631 | <event name="OnTextEnter"></event> | ||
| 6632 | <event name="OnTextMaxLen"></event> | ||
| 6633 | <event name="OnTextURL"></event> | ||
| 6634 | <event name="OnUpdateUI"></event> | ||
| 6635 | </object> | ||
| 6636 | </object> | ||
| 6637 | <object class="sizeritem" expanded="1"> | ||
| 6638 | <property name="border">5</property> | ||
| 6639 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 6640 | <property name="proportion">0</property> | ||
| 6641 | <object class="wxButton" expanded="1"> | ||
| 6642 | <property name="bg"></property> | ||
| 6643 | <property name="context_help"></property> | ||
| 6644 | <property name="default">0</property> | ||
| 6645 | <property name="enabled">1</property> | ||
| 6646 | <property name="fg"></property> | ||
| 6647 | <property name="font"></property> | ||
| 6648 | <property name="hidden">0</property> | ||
| 6649 | <property name="id">wxID_DEL5</property> | ||
| 6650 | <property name="label">Delete</property> | ||
| 6651 | <property name="maximum_size"></property> | ||
| 6652 | <property name="minimum_size">-1,-1</property> | ||
| 6653 | <property name="name">m_buttonDel5</property> | ||
| 6654 | <property name="permission">protected</property> | ||
| 6655 | <property name="pos"></property> | ||
| 6656 | <property name="size">60,20</property> | ||
| 6657 | <property name="style"></property> | ||
| 6658 | <property name="subclass"></property> | ||
| 6659 | <property name="tooltip"></property> | ||
| 6660 | <property name="window_extra_style"></property> | ||
| 6661 | <property name="window_name"></property> | ||
| 6662 | <property name="window_style"></property> | ||
| 6663 | <event name="OnButtonClick">OnButtonDel5</event> | ||
| 6664 | <event name="OnChar"></event> | ||
| 6665 | <event name="OnEnterWindow"></event> | ||
| 6666 | <event name="OnEraseBackground"></event> | ||
| 6667 | <event name="OnKeyDown"></event> | ||
| 6668 | <event name="OnKeyUp"></event> | ||
| 6669 | <event name="OnKillFocus"></event> | ||
| 6670 | <event name="OnLeaveWindow"></event> | ||
| 6671 | <event name="OnLeftDClick"></event> | ||
| 6672 | <event name="OnLeftDown"></event> | ||
| 6673 | <event name="OnLeftUp"></event> | ||
| 6674 | <event name="OnMiddleDClick"></event> | ||
| 6675 | <event name="OnMiddleDown"></event> | ||
| 6676 | <event name="OnMiddleUp"></event> | ||
| 6677 | <event name="OnMotion"></event> | ||
| 6678 | <event name="OnMouseEvents"></event> | ||
| 6679 | <event name="OnMouseWheel"></event> | ||
| 6680 | <event name="OnPaint"></event> | ||
| 6681 | <event name="OnRightDClick"></event> | ||
| 6682 | <event name="OnRightDown"></event> | ||
| 6683 | <event name="OnRightUp"></event> | ||
| 6684 | <event name="OnSetFocus"></event> | ||
| 6685 | <event name="OnSize"></event> | ||
| 6686 | <event name="OnUpdateUI"></event> | ||
| 6687 | </object> | ||
| 6688 | </object> | ||
| 6689 | <object class="sizeritem" expanded="1"> | ||
| 6690 | <property name="border">5</property> | ||
| 6691 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 6692 | <property name="proportion">0</property> | ||
| 6693 | <object class="wxTextCtrl" expanded="1"> | ||
| 6694 | <property name="bg"></property> | ||
| 6695 | <property name="context_help"></property> | ||
| 6696 | <property name="enabled">1</property> | ||
| 6697 | <property name="fg"></property> | ||
| 6698 | <property name="font"></property> | ||
| 6699 | <property name="hidden">0</property> | ||
| 6700 | <property name="id">wxID_ANY</property> | ||
| 6701 | <property name="maximum_size"></property> | ||
| 6702 | <property name="maxlength">0</property> | ||
| 6703 | <property name="minimum_size">150,-1</property> | ||
| 6704 | <property name="name">m_textCtrlLabel6</property> | ||
| 6705 | <property name="permission">protected</property> | ||
| 6706 | <property name="pos"></property> | ||
| 6707 | <property name="size"></property> | ||
| 6708 | <property name="style"></property> | ||
| 6709 | <property name="subclass"></property> | ||
| 6710 | <property name="tooltip"></property> | ||
| 6711 | <property name="value"></property> | ||
| 6712 | <property name="window_extra_style"></property> | ||
| 6713 | <property name="window_name"></property> | ||
| 6714 | <property name="window_style"></property> | ||
| 6715 | <event name="OnChar"></event> | ||
| 6716 | <event name="OnEnterWindow"></event> | ||
| 6717 | <event name="OnEraseBackground"></event> | ||
| 6718 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6719 | <event name="OnKeyUp"></event> | ||
| 6720 | <event name="OnKillFocus"></event> | ||
| 6721 | <event name="OnLeaveWindow"></event> | ||
| 6722 | <event name="OnLeftDClick"></event> | ||
| 6723 | <event name="OnLeftDown"></event> | ||
| 6724 | <event name="OnLeftUp"></event> | ||
| 6725 | <event name="OnMiddleDClick"></event> | ||
| 6726 | <event name="OnMiddleDown"></event> | ||
| 6727 | <event name="OnMiddleUp"></event> | ||
| 6728 | <event name="OnMotion"></event> | ||
| 6729 | <event name="OnMouseEvents"></event> | ||
| 6730 | <event name="OnMouseWheel"></event> | ||
| 6731 | <event name="OnPaint"></event> | ||
| 6732 | <event name="OnRightDClick"></event> | ||
| 6733 | <event name="OnRightDown"></event> | ||
| 6734 | <event name="OnRightUp"></event> | ||
| 6735 | <event name="OnSetFocus"></event> | ||
| 6736 | <event name="OnSize"></event> | ||
| 6737 | <event name="OnText"></event> | ||
| 6738 | <event name="OnTextEnter"></event> | ||
| 6739 | <event name="OnTextMaxLen"></event> | ||
| 6740 | <event name="OnTextURL"></event> | ||
| 6741 | <event name="OnUpdateUI"></event> | ||
| 6742 | </object> | ||
| 6743 | </object> | ||
| 6744 | <object class="sizeritem" expanded="1"> | ||
| 6745 | <property name="border">5</property> | ||
| 6746 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 6747 | <property name="proportion">0</property> | ||
| 6748 | <object class="wxTextCtrl" expanded="1"> | ||
| 6749 | <property name="bg"></property> | ||
| 6750 | <property name="context_help"></property> | ||
| 6751 | <property name="enabled">1</property> | ||
| 6752 | <property name="fg"></property> | ||
| 6753 | <property name="font"></property> | ||
| 6754 | <property name="hidden">0</property> | ||
| 6755 | <property name="id">wxID_ANY</property> | ||
| 6756 | <property name="maximum_size">-1,-1</property> | ||
| 6757 | <property name="maxlength">0</property> | ||
| 6758 | <property name="minimum_size">-1,-1</property> | ||
| 6759 | <property name="name">m_textCtrlField6</property> | ||
| 6760 | <property name="permission">protected</property> | ||
| 6761 | <property name="pos"></property> | ||
| 6762 | <property name="size">-1,-1</property> | ||
| 6763 | <property name="style"></property> | ||
| 6764 | <property name="subclass"></property> | ||
| 6765 | <property name="tooltip"></property> | ||
| 6766 | <property name="value"></property> | ||
| 6767 | <property name="window_extra_style"></property> | ||
| 6768 | <property name="window_name"></property> | ||
| 6769 | <property name="window_style"></property> | ||
| 6770 | <event name="OnChar"></event> | ||
| 6771 | <event name="OnEnterWindow"></event> | ||
| 6772 | <event name="OnEraseBackground"></event> | ||
| 6773 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6774 | <event name="OnKeyUp"></event> | ||
| 6775 | <event name="OnKillFocus"></event> | ||
| 6776 | <event name="OnLeaveWindow"></event> | ||
| 6777 | <event name="OnLeftDClick"></event> | ||
| 6778 | <event name="OnLeftDown"></event> | ||
| 6779 | <event name="OnLeftUp"></event> | ||
| 6780 | <event name="OnMiddleDClick"></event> | ||
| 6781 | <event name="OnMiddleDown"></event> | ||
| 6782 | <event name="OnMiddleUp"></event> | ||
| 6783 | <event name="OnMotion"></event> | ||
| 6784 | <event name="OnMouseEvents"></event> | ||
| 6785 | <event name="OnMouseWheel"></event> | ||
| 6786 | <event name="OnPaint"></event> | ||
| 6787 | <event name="OnRightDClick"></event> | ||
| 6788 | <event name="OnRightDown"></event> | ||
| 6789 | <event name="OnRightUp"></event> | ||
| 6790 | <event name="OnSetFocus"></event> | ||
| 6791 | <event name="OnSize"></event> | ||
| 6792 | <event name="OnText"></event> | ||
| 6793 | <event name="OnTextEnter"></event> | ||
| 6794 | <event name="OnTextMaxLen"></event> | ||
| 6795 | <event name="OnTextURL"></event> | ||
| 6796 | <event name="OnUpdateUI"></event> | ||
| 6797 | </object> | ||
| 6798 | </object> | ||
| 6799 | <object class="sizeritem" expanded="1"> | ||
| 6800 | <property name="border">5</property> | ||
| 6801 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 6802 | <property name="proportion">0</property> | ||
| 6803 | <object class="wxButton" expanded="1"> | ||
| 6804 | <property name="bg"></property> | ||
| 6805 | <property name="context_help"></property> | ||
| 6806 | <property name="default">0</property> | ||
| 6807 | <property name="enabled">1</property> | ||
| 6808 | <property name="fg"></property> | ||
| 6809 | <property name="font"></property> | ||
| 6810 | <property name="hidden">0</property> | ||
| 6811 | <property name="id">wxID_DEL6</property> | ||
| 6812 | <property name="label">Delete</property> | ||
| 6813 | <property name="maximum_size"></property> | ||
| 6814 | <property name="minimum_size">-1,-1</property> | ||
| 6815 | <property name="name">m_buttonDel6</property> | ||
| 6816 | <property name="permission">protected</property> | ||
| 6817 | <property name="pos"></property> | ||
| 6818 | <property name="size">60,20</property> | ||
| 6819 | <property name="style"></property> | ||
| 6820 | <property name="subclass"></property> | ||
| 6821 | <property name="tooltip"></property> | ||
| 6822 | <property name="window_extra_style"></property> | ||
| 6823 | <property name="window_name"></property> | ||
| 6824 | <property name="window_style"></property> | ||
| 6825 | <event name="OnButtonClick">OnButtonDel6</event> | ||
| 6826 | <event name="OnChar"></event> | ||
| 6827 | <event name="OnEnterWindow"></event> | ||
| 6828 | <event name="OnEraseBackground"></event> | ||
| 6829 | <event name="OnKeyDown"></event> | ||
| 6830 | <event name="OnKeyUp"></event> | ||
| 6831 | <event name="OnKillFocus"></event> | ||
| 6832 | <event name="OnLeaveWindow"></event> | ||
| 6833 | <event name="OnLeftDClick"></event> | ||
| 6834 | <event name="OnLeftDown"></event> | ||
| 6835 | <event name="OnLeftUp"></event> | ||
| 6836 | <event name="OnMiddleDClick"></event> | ||
| 6837 | <event name="OnMiddleDown"></event> | ||
| 6838 | <event name="OnMiddleUp"></event> | ||
| 6839 | <event name="OnMotion"></event> | ||
| 6840 | <event name="OnMouseEvents"></event> | ||
| 6841 | <event name="OnMouseWheel"></event> | ||
| 6842 | <event name="OnPaint"></event> | ||
| 6843 | <event name="OnRightDClick"></event> | ||
| 6844 | <event name="OnRightDown"></event> | ||
| 6845 | <event name="OnRightUp"></event> | ||
| 6846 | <event name="OnSetFocus"></event> | ||
| 6847 | <event name="OnSize"></event> | ||
| 6848 | <event name="OnUpdateUI"></event> | ||
| 6849 | </object> | ||
| 6850 | </object> | ||
| 6851 | <object class="sizeritem" expanded="1"> | ||
| 6852 | <property name="border">5</property> | ||
| 6853 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 6854 | <property name="proportion">0</property> | ||
| 6855 | <object class="wxTextCtrl" expanded="1"> | ||
| 6856 | <property name="bg"></property> | ||
| 6857 | <property name="context_help"></property> | ||
| 6858 | <property name="enabled">1</property> | ||
| 6859 | <property name="fg"></property> | ||
| 6860 | <property name="font"></property> | ||
| 6861 | <property name="hidden">0</property> | ||
| 6862 | <property name="id">wxID_ANY</property> | ||
| 6863 | <property name="maximum_size"></property> | ||
| 6864 | <property name="maxlength">0</property> | ||
| 6865 | <property name="minimum_size">150,-1</property> | ||
| 6866 | <property name="name">m_textCtrlLabel7</property> | ||
| 6867 | <property name="permission">protected</property> | ||
| 6868 | <property name="pos"></property> | ||
| 6869 | <property name="size"></property> | ||
| 6870 | <property name="style"></property> | ||
| 6871 | <property name="subclass"></property> | ||
| 6872 | <property name="tooltip"></property> | ||
| 6873 | <property name="value"></property> | ||
| 6874 | <property name="window_extra_style"></property> | ||
| 6875 | <property name="window_name"></property> | ||
| 6876 | <property name="window_style"></property> | ||
| 6877 | <event name="OnChar"></event> | ||
| 6878 | <event name="OnEnterWindow"></event> | ||
| 6879 | <event name="OnEraseBackground"></event> | ||
| 6880 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6881 | <event name="OnKeyUp"></event> | ||
| 6882 | <event name="OnKillFocus"></event> | ||
| 6883 | <event name="OnLeaveWindow"></event> | ||
| 6884 | <event name="OnLeftDClick"></event> | ||
| 6885 | <event name="OnLeftDown"></event> | ||
| 6886 | <event name="OnLeftUp"></event> | ||
| 6887 | <event name="OnMiddleDClick"></event> | ||
| 6888 | <event name="OnMiddleDown"></event> | ||
| 6889 | <event name="OnMiddleUp"></event> | ||
| 6890 | <event name="OnMotion"></event> | ||
| 6891 | <event name="OnMouseEvents"></event> | ||
| 6892 | <event name="OnMouseWheel"></event> | ||
| 6893 | <event name="OnPaint"></event> | ||
| 6894 | <event name="OnRightDClick"></event> | ||
| 6895 | <event name="OnRightDown"></event> | ||
| 6896 | <event name="OnRightUp"></event> | ||
| 6897 | <event name="OnSetFocus"></event> | ||
| 6898 | <event name="OnSize"></event> | ||
| 6899 | <event name="OnText"></event> | ||
| 6900 | <event name="OnTextEnter"></event> | ||
| 6901 | <event name="OnTextMaxLen"></event> | ||
| 6902 | <event name="OnTextURL"></event> | ||
| 6903 | <event name="OnUpdateUI"></event> | ||
| 6904 | </object> | ||
| 6905 | </object> | ||
| 6906 | <object class="sizeritem" expanded="1"> | ||
| 6907 | <property name="border">5</property> | ||
| 6908 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 6909 | <property name="proportion">0</property> | ||
| 6910 | <object class="wxTextCtrl" expanded="1"> | ||
| 6911 | <property name="bg"></property> | ||
| 6912 | <property name="context_help"></property> | ||
| 6913 | <property name="enabled">1</property> | ||
| 6914 | <property name="fg"></property> | ||
| 6915 | <property name="font"></property> | ||
| 6916 | <property name="hidden">0</property> | ||
| 6917 | <property name="id">wxID_ANY</property> | ||
| 6918 | <property name="maximum_size">-1,-1</property> | ||
| 6919 | <property name="maxlength">0</property> | ||
| 6920 | <property name="minimum_size">-1,-1</property> | ||
| 6921 | <property name="name">m_textCtrlField7</property> | ||
| 6922 | <property name="permission">protected</property> | ||
| 6923 | <property name="pos"></property> | ||
| 6924 | <property name="size">-1,-1</property> | ||
| 6925 | <property name="style"></property> | ||
| 6926 | <property name="subclass"></property> | ||
| 6927 | <property name="tooltip"></property> | ||
| 6928 | <property name="value"></property> | ||
| 6929 | <property name="window_extra_style"></property> | ||
| 6930 | <property name="window_name"></property> | ||
| 6931 | <property name="window_style"></property> | ||
| 6932 | <event name="OnChar"></event> | ||
| 6933 | <event name="OnEnterWindow"></event> | ||
| 6934 | <event name="OnEraseBackground"></event> | ||
| 6935 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 6936 | <event name="OnKeyUp"></event> | ||
| 6937 | <event name="OnKillFocus"></event> | ||
| 6938 | <event name="OnLeaveWindow"></event> | ||
| 6939 | <event name="OnLeftDClick"></event> | ||
| 6940 | <event name="OnLeftDown"></event> | ||
| 6941 | <event name="OnLeftUp"></event> | ||
| 6942 | <event name="OnMiddleDClick"></event> | ||
| 6943 | <event name="OnMiddleDown"></event> | ||
| 6944 | <event name="OnMiddleUp"></event> | ||
| 6945 | <event name="OnMotion"></event> | ||
| 6946 | <event name="OnMouseEvents"></event> | ||
| 6947 | <event name="OnMouseWheel"></event> | ||
| 6948 | <event name="OnPaint"></event> | ||
| 6949 | <event name="OnRightDClick"></event> | ||
| 6950 | <event name="OnRightDown"></event> | ||
| 6951 | <event name="OnRightUp"></event> | ||
| 6952 | <event name="OnSetFocus"></event> | ||
| 6953 | <event name="OnSize"></event> | ||
| 6954 | <event name="OnText"></event> | ||
| 6955 | <event name="OnTextEnter"></event> | ||
| 6956 | <event name="OnTextMaxLen"></event> | ||
| 6957 | <event name="OnTextURL"></event> | ||
| 6958 | <event name="OnUpdateUI"></event> | ||
| 6959 | </object> | ||
| 6960 | </object> | ||
| 6961 | <object class="sizeritem" expanded="1"> | ||
| 6962 | <property name="border">5</property> | ||
| 6963 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 6964 | <property name="proportion">0</property> | ||
| 6965 | <object class="wxButton" expanded="1"> | ||
| 6966 | <property name="bg"></property> | ||
| 6967 | <property name="context_help"></property> | ||
| 6968 | <property name="default">0</property> | ||
| 6969 | <property name="enabled">1</property> | ||
| 6970 | <property name="fg"></property> | ||
| 6971 | <property name="font"></property> | ||
| 6972 | <property name="hidden">0</property> | ||
| 6973 | <property name="id">wxID_DEL7</property> | ||
| 6974 | <property name="label">Delete</property> | ||
| 6975 | <property name="maximum_size"></property> | ||
| 6976 | <property name="minimum_size">-1,-1</property> | ||
| 6977 | <property name="name">m_buttonDel7</property> | ||
| 6978 | <property name="permission">protected</property> | ||
| 6979 | <property name="pos"></property> | ||
| 6980 | <property name="size">60,20</property> | ||
| 6981 | <property name="style"></property> | ||
| 6982 | <property name="subclass"></property> | ||
| 6983 | <property name="tooltip"></property> | ||
| 6984 | <property name="window_extra_style"></property> | ||
| 6985 | <property name="window_name"></property> | ||
| 6986 | <property name="window_style"></property> | ||
| 6987 | <event name="OnButtonClick">OnButtonDel7</event> | ||
| 6988 | <event name="OnChar"></event> | ||
| 6989 | <event name="OnEnterWindow"></event> | ||
| 6990 | <event name="OnEraseBackground"></event> | ||
| 6991 | <event name="OnKeyDown"></event> | ||
| 6992 | <event name="OnKeyUp"></event> | ||
| 6993 | <event name="OnKillFocus"></event> | ||
| 6994 | <event name="OnLeaveWindow"></event> | ||
| 6995 | <event name="OnLeftDClick"></event> | ||
| 6996 | <event name="OnLeftDown"></event> | ||
| 6997 | <event name="OnLeftUp"></event> | ||
| 6998 | <event name="OnMiddleDClick"></event> | ||
| 6999 | <event name="OnMiddleDown"></event> | ||
| 7000 | <event name="OnMiddleUp"></event> | ||
| 7001 | <event name="OnMotion"></event> | ||
| 7002 | <event name="OnMouseEvents"></event> | ||
| 7003 | <event name="OnMouseWheel"></event> | ||
| 7004 | <event name="OnPaint"></event> | ||
| 7005 | <event name="OnRightDClick"></event> | ||
| 7006 | <event name="OnRightDown"></event> | ||
| 7007 | <event name="OnRightUp"></event> | ||
| 7008 | <event name="OnSetFocus"></event> | ||
| 7009 | <event name="OnSize"></event> | ||
| 7010 | <event name="OnUpdateUI"></event> | ||
| 7011 | </object> | ||
| 7012 | </object> | ||
| 7013 | <object class="sizeritem" expanded="1"> | ||
| 7014 | <property name="border">5</property> | ||
| 7015 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7016 | <property name="proportion">0</property> | ||
| 7017 | <object class="wxTextCtrl" expanded="1"> | ||
| 7018 | <property name="bg"></property> | ||
| 7019 | <property name="context_help"></property> | ||
| 7020 | <property name="enabled">1</property> | ||
| 7021 | <property name="fg"></property> | ||
| 7022 | <property name="font"></property> | ||
| 7023 | <property name="hidden">0</property> | ||
| 7024 | <property name="id">wxID_ANY</property> | ||
| 7025 | <property name="maximum_size"></property> | ||
| 7026 | <property name="maxlength">0</property> | ||
| 7027 | <property name="minimum_size">150,-1</property> | ||
| 7028 | <property name="name">m_textCtrlLabel8</property> | ||
| 7029 | <property name="permission">protected</property> | ||
| 7030 | <property name="pos"></property> | ||
| 7031 | <property name="size"></property> | ||
| 7032 | <property name="style"></property> | ||
| 7033 | <property name="subclass"></property> | ||
| 7034 | <property name="tooltip"></property> | ||
| 7035 | <property name="value"></property> | ||
| 7036 | <property name="window_extra_style"></property> | ||
| 7037 | <property name="window_name"></property> | ||
| 7038 | <property name="window_style"></property> | ||
| 7039 | <event name="OnChar"></event> | ||
| 7040 | <event name="OnEnterWindow"></event> | ||
| 7041 | <event name="OnEraseBackground"></event> | ||
| 7042 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7043 | <event name="OnKeyUp"></event> | ||
| 7044 | <event name="OnKillFocus"></event> | ||
| 7045 | <event name="OnLeaveWindow"></event> | ||
| 7046 | <event name="OnLeftDClick"></event> | ||
| 7047 | <event name="OnLeftDown"></event> | ||
| 7048 | <event name="OnLeftUp"></event> | ||
| 7049 | <event name="OnMiddleDClick"></event> | ||
| 7050 | <event name="OnMiddleDown"></event> | ||
| 7051 | <event name="OnMiddleUp"></event> | ||
| 7052 | <event name="OnMotion"></event> | ||
| 7053 | <event name="OnMouseEvents"></event> | ||
| 7054 | <event name="OnMouseWheel"></event> | ||
| 7055 | <event name="OnPaint"></event> | ||
| 7056 | <event name="OnRightDClick"></event> | ||
| 7057 | <event name="OnRightDown"></event> | ||
| 7058 | <event name="OnRightUp"></event> | ||
| 7059 | <event name="OnSetFocus"></event> | ||
| 7060 | <event name="OnSize"></event> | ||
| 7061 | <event name="OnText"></event> | ||
| 7062 | <event name="OnTextEnter"></event> | ||
| 7063 | <event name="OnTextMaxLen"></event> | ||
| 7064 | <event name="OnTextURL"></event> | ||
| 7065 | <event name="OnUpdateUI"></event> | ||
| 7066 | </object> | ||
| 7067 | </object> | ||
| 7068 | <object class="sizeritem" expanded="1"> | ||
| 7069 | <property name="border">5</property> | ||
| 7070 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 7071 | <property name="proportion">0</property> | ||
| 7072 | <object class="wxTextCtrl" expanded="1"> | ||
| 7073 | <property name="bg"></property> | ||
| 7074 | <property name="context_help"></property> | ||
| 7075 | <property name="enabled">1</property> | ||
| 7076 | <property name="fg"></property> | ||
| 7077 | <property name="font"></property> | ||
| 7078 | <property name="hidden">0</property> | ||
| 7079 | <property name="id">wxID_ANY</property> | ||
| 7080 | <property name="maximum_size">-1,-1</property> | ||
| 7081 | <property name="maxlength">0</property> | ||
| 7082 | <property name="minimum_size">-1,-1</property> | ||
| 7083 | <property name="name">m_textCtrlField8</property> | ||
| 7084 | <property name="permission">protected</property> | ||
| 7085 | <property name="pos"></property> | ||
| 7086 | <property name="size">-1,-1</property> | ||
| 7087 | <property name="style"></property> | ||
| 7088 | <property name="subclass"></property> | ||
| 7089 | <property name="tooltip"></property> | ||
| 7090 | <property name="value"></property> | ||
| 7091 | <property name="window_extra_style"></property> | ||
| 7092 | <property name="window_name"></property> | ||
| 7093 | <property name="window_style"></property> | ||
| 7094 | <event name="OnChar"></event> | ||
| 7095 | <event name="OnEnterWindow"></event> | ||
| 7096 | <event name="OnEraseBackground"></event> | ||
| 7097 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7098 | <event name="OnKeyUp"></event> | ||
| 7099 | <event name="OnKillFocus"></event> | ||
| 7100 | <event name="OnLeaveWindow"></event> | ||
| 7101 | <event name="OnLeftDClick"></event> | ||
| 7102 | <event name="OnLeftDown"></event> | ||
| 7103 | <event name="OnLeftUp"></event> | ||
| 7104 | <event name="OnMiddleDClick"></event> | ||
| 7105 | <event name="OnMiddleDown"></event> | ||
| 7106 | <event name="OnMiddleUp"></event> | ||
| 7107 | <event name="OnMotion"></event> | ||
| 7108 | <event name="OnMouseEvents"></event> | ||
| 7109 | <event name="OnMouseWheel"></event> | ||
| 7110 | <event name="OnPaint"></event> | ||
| 7111 | <event name="OnRightDClick"></event> | ||
| 7112 | <event name="OnRightDown"></event> | ||
| 7113 | <event name="OnRightUp"></event> | ||
| 7114 | <event name="OnSetFocus"></event> | ||
| 7115 | <event name="OnSize"></event> | ||
| 7116 | <event name="OnText"></event> | ||
| 7117 | <event name="OnTextEnter"></event> | ||
| 7118 | <event name="OnTextMaxLen"></event> | ||
| 7119 | <event name="OnTextURL"></event> | ||
| 7120 | <event name="OnUpdateUI"></event> | ||
| 7121 | </object> | ||
| 7122 | </object> | ||
| 7123 | <object class="sizeritem" expanded="1"> | ||
| 7124 | <property name="border">5</property> | ||
| 7125 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 7126 | <property name="proportion">0</property> | ||
| 7127 | <object class="wxButton" expanded="1"> | ||
| 7128 | <property name="bg"></property> | ||
| 7129 | <property name="context_help"></property> | ||
| 7130 | <property name="default">0</property> | ||
| 7131 | <property name="enabled">1</property> | ||
| 7132 | <property name="fg"></property> | ||
| 7133 | <property name="font"></property> | ||
| 7134 | <property name="hidden">0</property> | ||
| 7135 | <property name="id">wxID_DEL8</property> | ||
| 7136 | <property name="label">Delete</property> | ||
| 7137 | <property name="maximum_size"></property> | ||
| 7138 | <property name="minimum_size">-1,-1</property> | ||
| 7139 | <property name="name">m_buttonDel8</property> | ||
| 7140 | <property name="permission">protected</property> | ||
| 7141 | <property name="pos"></property> | ||
| 7142 | <property name="size">60,20</property> | ||
| 7143 | <property name="style"></property> | ||
| 7144 | <property name="subclass"></property> | ||
| 7145 | <property name="tooltip"></property> | ||
| 7146 | <property name="window_extra_style"></property> | ||
| 7147 | <property name="window_name"></property> | ||
| 7148 | <property name="window_style"></property> | ||
| 7149 | <event name="OnButtonClick">OnButtonDel8</event> | ||
| 7150 | <event name="OnChar"></event> | ||
| 7151 | <event name="OnEnterWindow"></event> | ||
| 7152 | <event name="OnEraseBackground"></event> | ||
| 7153 | <event name="OnKeyDown"></event> | ||
| 7154 | <event name="OnKeyUp"></event> | ||
| 7155 | <event name="OnKillFocus"></event> | ||
| 7156 | <event name="OnLeaveWindow"></event> | ||
| 7157 | <event name="OnLeftDClick"></event> | ||
| 7158 | <event name="OnLeftDown"></event> | ||
| 7159 | <event name="OnLeftUp"></event> | ||
| 7160 | <event name="OnMiddleDClick"></event> | ||
| 7161 | <event name="OnMiddleDown"></event> | ||
| 7162 | <event name="OnMiddleUp"></event> | ||
| 7163 | <event name="OnMotion"></event> | ||
| 7164 | <event name="OnMouseEvents"></event> | ||
| 7165 | <event name="OnMouseWheel"></event> | ||
| 7166 | <event name="OnPaint"></event> | ||
| 7167 | <event name="OnRightDClick"></event> | ||
| 7168 | <event name="OnRightDown"></event> | ||
| 7169 | <event name="OnRightUp"></event> | ||
| 7170 | <event name="OnSetFocus"></event> | ||
| 7171 | <event name="OnSize"></event> | ||
| 7172 | <event name="OnUpdateUI"></event> | ||
| 7173 | </object> | ||
| 7174 | </object> | ||
| 7175 | <object class="sizeritem" expanded="1"> | ||
| 7176 | <property name="border">5</property> | ||
| 7177 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7178 | <property name="proportion">0</property> | ||
| 7179 | <object class="wxTextCtrl" expanded="1"> | ||
| 7180 | <property name="bg"></property> | ||
| 7181 | <property name="context_help"></property> | ||
| 7182 | <property name="enabled">1</property> | ||
| 7183 | <property name="fg"></property> | ||
| 7184 | <property name="font"></property> | ||
| 7185 | <property name="hidden">0</property> | ||
| 7186 | <property name="id">wxID_ANY</property> | ||
| 7187 | <property name="maximum_size"></property> | ||
| 7188 | <property name="maxlength">0</property> | ||
| 7189 | <property name="minimum_size">150,-1</property> | ||
| 7190 | <property name="name">m_textCtrlLabel9</property> | ||
| 7191 | <property name="permission">protected</property> | ||
| 7192 | <property name="pos"></property> | ||
| 7193 | <property name="size"></property> | ||
| 7194 | <property name="style"></property> | ||
| 7195 | <property name="subclass"></property> | ||
| 7196 | <property name="tooltip"></property> | ||
| 7197 | <property name="value"></property> | ||
| 7198 | <property name="window_extra_style"></property> | ||
| 7199 | <property name="window_name"></property> | ||
| 7200 | <property name="window_style"></property> | ||
| 7201 | <event name="OnChar"></event> | ||
| 7202 | <event name="OnEnterWindow"></event> | ||
| 7203 | <event name="OnEraseBackground"></event> | ||
| 7204 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7205 | <event name="OnKeyUp"></event> | ||
| 7206 | <event name="OnKillFocus"></event> | ||
| 7207 | <event name="OnLeaveWindow"></event> | ||
| 7208 | <event name="OnLeftDClick"></event> | ||
| 7209 | <event name="OnLeftDown"></event> | ||
| 7210 | <event name="OnLeftUp"></event> | ||
| 7211 | <event name="OnMiddleDClick"></event> | ||
| 7212 | <event name="OnMiddleDown"></event> | ||
| 7213 | <event name="OnMiddleUp"></event> | ||
| 7214 | <event name="OnMotion"></event> | ||
| 7215 | <event name="OnMouseEvents"></event> | ||
| 7216 | <event name="OnMouseWheel"></event> | ||
| 7217 | <event name="OnPaint"></event> | ||
| 7218 | <event name="OnRightDClick"></event> | ||
| 7219 | <event name="OnRightDown"></event> | ||
| 7220 | <event name="OnRightUp"></event> | ||
| 7221 | <event name="OnSetFocus"></event> | ||
| 7222 | <event name="OnSize"></event> | ||
| 7223 | <event name="OnText"></event> | ||
| 7224 | <event name="OnTextEnter"></event> | ||
| 7225 | <event name="OnTextMaxLen"></event> | ||
| 7226 | <event name="OnTextURL"></event> | ||
| 7227 | <event name="OnUpdateUI"></event> | ||
| 7228 | </object> | ||
| 7229 | </object> | ||
| 7230 | <object class="sizeritem" expanded="1"> | ||
| 7231 | <property name="border">5</property> | ||
| 7232 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 7233 | <property name="proportion">0</property> | ||
| 7234 | <object class="wxTextCtrl" expanded="1"> | ||
| 7235 | <property name="bg"></property> | ||
| 7236 | <property name="context_help"></property> | ||
| 7237 | <property name="enabled">1</property> | ||
| 7238 | <property name="fg"></property> | ||
| 7239 | <property name="font"></property> | ||
| 7240 | <property name="hidden">0</property> | ||
| 7241 | <property name="id">wxID_ANY</property> | ||
| 7242 | <property name="maximum_size">-1,-1</property> | ||
| 7243 | <property name="maxlength">0</property> | ||
| 7244 | <property name="minimum_size">-1,-1</property> | ||
| 7245 | <property name="name">m_textCtrlField9</property> | ||
| 7246 | <property name="permission">protected</property> | ||
| 7247 | <property name="pos"></property> | ||
| 7248 | <property name="size">-1,-1</property> | ||
| 7249 | <property name="style"></property> | ||
| 7250 | <property name="subclass"></property> | ||
| 7251 | <property name="tooltip"></property> | ||
| 7252 | <property name="value"></property> | ||
| 7253 | <property name="window_extra_style"></property> | ||
| 7254 | <property name="window_name"></property> | ||
| 7255 | <property name="window_style"></property> | ||
| 7256 | <event name="OnChar"></event> | ||
| 7257 | <event name="OnEnterWindow"></event> | ||
| 7258 | <event name="OnEraseBackground"></event> | ||
| 7259 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7260 | <event name="OnKeyUp"></event> | ||
| 7261 | <event name="OnKillFocus"></event> | ||
| 7262 | <event name="OnLeaveWindow"></event> | ||
| 7263 | <event name="OnLeftDClick"></event> | ||
| 7264 | <event name="OnLeftDown"></event> | ||
| 7265 | <event name="OnLeftUp"></event> | ||
| 7266 | <event name="OnMiddleDClick"></event> | ||
| 7267 | <event name="OnMiddleDown"></event> | ||
| 7268 | <event name="OnMiddleUp"></event> | ||
| 7269 | <event name="OnMotion"></event> | ||
| 7270 | <event name="OnMouseEvents"></event> | ||
| 7271 | <event name="OnMouseWheel"></event> | ||
| 7272 | <event name="OnPaint"></event> | ||
| 7273 | <event name="OnRightDClick"></event> | ||
| 7274 | <event name="OnRightDown"></event> | ||
| 7275 | <event name="OnRightUp"></event> | ||
| 7276 | <event name="OnSetFocus"></event> | ||
| 7277 | <event name="OnSize"></event> | ||
| 7278 | <event name="OnText"></event> | ||
| 7279 | <event name="OnTextEnter"></event> | ||
| 7280 | <event name="OnTextMaxLen"></event> | ||
| 7281 | <event name="OnTextURL"></event> | ||
| 7282 | <event name="OnUpdateUI"></event> | ||
| 7283 | </object> | ||
| 7284 | </object> | ||
| 7285 | <object class="sizeritem" expanded="1"> | ||
| 7286 | <property name="border">5</property> | ||
| 7287 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 7288 | <property name="proportion">0</property> | ||
| 7289 | <object class="wxButton" expanded="1"> | ||
| 7290 | <property name="bg"></property> | ||
| 7291 | <property name="context_help"></property> | ||
| 7292 | <property name="default">0</property> | ||
| 7293 | <property name="enabled">1</property> | ||
| 7294 | <property name="fg"></property> | ||
| 7295 | <property name="font"></property> | ||
| 7296 | <property name="hidden">0</property> | ||
| 7297 | <property name="id">wxID_DEL9</property> | ||
| 7298 | <property name="label">Delete</property> | ||
| 7299 | <property name="maximum_size"></property> | ||
| 7300 | <property name="minimum_size">-1,-1</property> | ||
| 7301 | <property name="name">m_buttonDel9</property> | ||
| 7302 | <property name="permission">protected</property> | ||
| 7303 | <property name="pos"></property> | ||
| 7304 | <property name="size">60,20</property> | ||
| 7305 | <property name="style"></property> | ||
| 7306 | <property name="subclass"></property> | ||
| 7307 | <property name="tooltip"></property> | ||
| 7308 | <property name="window_extra_style"></property> | ||
| 7309 | <property name="window_name"></property> | ||
| 7310 | <property name="window_style"></property> | ||
| 7311 | <event name="OnButtonClick">OnButtonDel9</event> | ||
| 7312 | <event name="OnChar"></event> | ||
| 7313 | <event name="OnEnterWindow"></event> | ||
| 7314 | <event name="OnEraseBackground"></event> | ||
| 7315 | <event name="OnKeyDown"></event> | ||
| 7316 | <event name="OnKeyUp"></event> | ||
| 7317 | <event name="OnKillFocus"></event> | ||
| 7318 | <event name="OnLeaveWindow"></event> | ||
| 7319 | <event name="OnLeftDClick"></event> | ||
| 7320 | <event name="OnLeftDown"></event> | ||
| 7321 | <event name="OnLeftUp"></event> | ||
| 7322 | <event name="OnMiddleDClick"></event> | ||
| 7323 | <event name="OnMiddleDown"></event> | ||
| 7324 | <event name="OnMiddleUp"></event> | ||
| 7325 | <event name="OnMotion"></event> | ||
| 7326 | <event name="OnMouseEvents"></event> | ||
| 7327 | <event name="OnMouseWheel"></event> | ||
| 7328 | <event name="OnPaint"></event> | ||
| 7329 | <event name="OnRightDClick"></event> | ||
| 7330 | <event name="OnRightDown"></event> | ||
| 7331 | <event name="OnRightUp"></event> | ||
| 7332 | <event name="OnSetFocus"></event> | ||
| 7333 | <event name="OnSize"></event> | ||
| 7334 | <event name="OnUpdateUI"></event> | ||
| 7335 | </object> | ||
| 7336 | </object> | ||
| 7337 | <object class="sizeritem" expanded="1"> | ||
| 7338 | <property name="border">5</property> | ||
| 7339 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7340 | <property name="proportion">0</property> | ||
| 7341 | <object class="wxTextCtrl" expanded="1"> | ||
| 7342 | <property name="bg"></property> | ||
| 7343 | <property name="context_help"></property> | ||
| 7344 | <property name="enabled">1</property> | ||
| 7345 | <property name="fg"></property> | ||
| 7346 | <property name="font"></property> | ||
| 7347 | <property name="hidden">0</property> | ||
| 7348 | <property name="id">wxID_ANY</property> | ||
| 7349 | <property name="maximum_size"></property> | ||
| 7350 | <property name="maxlength">0</property> | ||
| 7351 | <property name="minimum_size">150,-1</property> | ||
| 7352 | <property name="name">m_textCtrlLabel10</property> | ||
| 7353 | <property name="permission">protected</property> | ||
| 7354 | <property name="pos"></property> | ||
| 7355 | <property name="size"></property> | ||
| 7356 | <property name="style"></property> | ||
| 7357 | <property name="subclass"></property> | ||
| 7358 | <property name="tooltip"></property> | ||
| 7359 | <property name="value"></property> | ||
| 7360 | <property name="window_extra_style"></property> | ||
| 7361 | <property name="window_name"></property> | ||
| 7362 | <property name="window_style"></property> | ||
| 7363 | <event name="OnChar"></event> | ||
| 7364 | <event name="OnEnterWindow"></event> | ||
| 7365 | <event name="OnEraseBackground"></event> | ||
| 7366 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7367 | <event name="OnKeyUp"></event> | ||
| 7368 | <event name="OnKillFocus"></event> | ||
| 7369 | <event name="OnLeaveWindow"></event> | ||
| 7370 | <event name="OnLeftDClick"></event> | ||
| 7371 | <event name="OnLeftDown"></event> | ||
| 7372 | <event name="OnLeftUp"></event> | ||
| 7373 | <event name="OnMiddleDClick"></event> | ||
| 7374 | <event name="OnMiddleDown"></event> | ||
| 7375 | <event name="OnMiddleUp"></event> | ||
| 7376 | <event name="OnMotion"></event> | ||
| 7377 | <event name="OnMouseEvents"></event> | ||
| 7378 | <event name="OnMouseWheel"></event> | ||
| 7379 | <event name="OnPaint"></event> | ||
| 7380 | <event name="OnRightDClick"></event> | ||
| 7381 | <event name="OnRightDown"></event> | ||
| 7382 | <event name="OnRightUp"></event> | ||
| 7383 | <event name="OnSetFocus"></event> | ||
| 7384 | <event name="OnSize"></event> | ||
| 7385 | <event name="OnText"></event> | ||
| 7386 | <event name="OnTextEnter"></event> | ||
| 7387 | <event name="OnTextMaxLen"></event> | ||
| 7388 | <event name="OnTextURL"></event> | ||
| 7389 | <event name="OnUpdateUI"></event> | ||
| 7390 | </object> | ||
| 7391 | </object> | ||
| 7392 | <object class="sizeritem" expanded="1"> | ||
| 7393 | <property name="border">5</property> | ||
| 7394 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 7395 | <property name="proportion">0</property> | ||
| 7396 | <object class="wxTextCtrl" expanded="1"> | ||
| 7397 | <property name="bg"></property> | ||
| 7398 | <property name="context_help"></property> | ||
| 7399 | <property name="enabled">1</property> | ||
| 7400 | <property name="fg"></property> | ||
| 7401 | <property name="font"></property> | ||
| 7402 | <property name="hidden">0</property> | ||
| 7403 | <property name="id">wxID_ANY</property> | ||
| 7404 | <property name="maximum_size">-1,-1</property> | ||
| 7405 | <property name="maxlength">0</property> | ||
| 7406 | <property name="minimum_size">-1,-1</property> | ||
| 7407 | <property name="name">m_textCtrlField10</property> | ||
| 7408 | <property name="permission">protected</property> | ||
| 7409 | <property name="pos"></property> | ||
| 7410 | <property name="size">-1,-1</property> | ||
| 7411 | <property name="style"></property> | ||
| 7412 | <property name="subclass"></property> | ||
| 7413 | <property name="tooltip"></property> | ||
| 7414 | <property name="value"></property> | ||
| 7415 | <property name="window_extra_style"></property> | ||
| 7416 | <property name="window_name"></property> | ||
| 7417 | <property name="window_style"></property> | ||
| 7418 | <event name="OnChar"></event> | ||
| 7419 | <event name="OnEnterWindow"></event> | ||
| 7420 | <event name="OnEraseBackground"></event> | ||
| 7421 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7422 | <event name="OnKeyUp"></event> | ||
| 7423 | <event name="OnKillFocus"></event> | ||
| 7424 | <event name="OnLeaveWindow"></event> | ||
| 7425 | <event name="OnLeftDClick"></event> | ||
| 7426 | <event name="OnLeftDown"></event> | ||
| 7427 | <event name="OnLeftUp"></event> | ||
| 7428 | <event name="OnMiddleDClick"></event> | ||
| 7429 | <event name="OnMiddleDown"></event> | ||
| 7430 | <event name="OnMiddleUp"></event> | ||
| 7431 | <event name="OnMotion"></event> | ||
| 7432 | <event name="OnMouseEvents"></event> | ||
| 7433 | <event name="OnMouseWheel"></event> | ||
| 7434 | <event name="OnPaint"></event> | ||
| 7435 | <event name="OnRightDClick"></event> | ||
| 7436 | <event name="OnRightDown"></event> | ||
| 7437 | <event name="OnRightUp"></event> | ||
| 7438 | <event name="OnSetFocus"></event> | ||
| 7439 | <event name="OnSize"></event> | ||
| 7440 | <event name="OnText"></event> | ||
| 7441 | <event name="OnTextEnter"></event> | ||
| 7442 | <event name="OnTextMaxLen"></event> | ||
| 7443 | <event name="OnTextURL"></event> | ||
| 7444 | <event name="OnUpdateUI"></event> | ||
| 7445 | </object> | ||
| 7446 | </object> | ||
| 7447 | <object class="sizeritem" expanded="1"> | ||
| 7448 | <property name="border">5</property> | ||
| 7449 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 7450 | <property name="proportion">0</property> | ||
| 7451 | <object class="wxButton" expanded="1"> | ||
| 7452 | <property name="bg"></property> | ||
| 7453 | <property name="context_help"></property> | ||
| 7454 | <property name="default">0</property> | ||
| 7455 | <property name="enabled">1</property> | ||
| 7456 | <property name="fg"></property> | ||
| 7457 | <property name="font"></property> | ||
| 7458 | <property name="hidden">0</property> | ||
| 7459 | <property name="id">wxID_DEL10</property> | ||
| 7460 | <property name="label">Delete</property> | ||
| 7461 | <property name="maximum_size"></property> | ||
| 7462 | <property name="minimum_size">-1,-1</property> | ||
| 7463 | <property name="name">m_buttonDel10</property> | ||
| 7464 | <property name="permission">protected</property> | ||
| 7465 | <property name="pos"></property> | ||
| 7466 | <property name="size">60,20</property> | ||
| 7467 | <property name="style"></property> | ||
| 7468 | <property name="subclass"></property> | ||
| 7469 | <property name="tooltip"></property> | ||
| 7470 | <property name="window_extra_style"></property> | ||
| 7471 | <property name="window_name"></property> | ||
| 7472 | <property name="window_style"></property> | ||
| 7473 | <event name="OnButtonClick">OnButtonDel10</event> | ||
| 7474 | <event name="OnChar"></event> | ||
| 7475 | <event name="OnEnterWindow"></event> | ||
| 7476 | <event name="OnEraseBackground"></event> | ||
| 7477 | <event name="OnKeyDown"></event> | ||
| 7478 | <event name="OnKeyUp"></event> | ||
| 7479 | <event name="OnKillFocus"></event> | ||
| 7480 | <event name="OnLeaveWindow"></event> | ||
| 7481 | <event name="OnLeftDClick"></event> | ||
| 7482 | <event name="OnLeftDown"></event> | ||
| 7483 | <event name="OnLeftUp"></event> | ||
| 7484 | <event name="OnMiddleDClick"></event> | ||
| 7485 | <event name="OnMiddleDown"></event> | ||
| 7486 | <event name="OnMiddleUp"></event> | ||
| 7487 | <event name="OnMotion"></event> | ||
| 7488 | <event name="OnMouseEvents"></event> | ||
| 7489 | <event name="OnMouseWheel"></event> | ||
| 7490 | <event name="OnPaint"></event> | ||
| 7491 | <event name="OnRightDClick"></event> | ||
| 7492 | <event name="OnRightDown"></event> | ||
| 7493 | <event name="OnRightUp"></event> | ||
| 7494 | <event name="OnSetFocus"></event> | ||
| 7495 | <event name="OnSize"></event> | ||
| 7496 | <event name="OnUpdateUI"></event> | ||
| 7497 | </object> | ||
| 7498 | </object> | ||
| 7499 | <object class="sizeritem" expanded="1"> | ||
| 7500 | <property name="border">5</property> | ||
| 7501 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7502 | <property name="proportion">0</property> | ||
| 7503 | <object class="wxTextCtrl" expanded="1"> | ||
| 7504 | <property name="bg"></property> | ||
| 7505 | <property name="context_help"></property> | ||
| 7506 | <property name="enabled">1</property> | ||
| 7507 | <property name="fg"></property> | ||
| 7508 | <property name="font"></property> | ||
| 7509 | <property name="hidden">0</property> | ||
| 7510 | <property name="id">wxID_ANY</property> | ||
| 7511 | <property name="maximum_size"></property> | ||
| 7512 | <property name="maxlength">0</property> | ||
| 7513 | <property name="minimum_size">150,-1</property> | ||
| 7514 | <property name="name">m_textCtrlLabel11</property> | ||
| 7515 | <property name="permission">protected</property> | ||
| 7516 | <property name="pos"></property> | ||
| 7517 | <property name="size"></property> | ||
| 7518 | <property name="style"></property> | ||
| 7519 | <property name="subclass"></property> | ||
| 7520 | <property name="tooltip"></property> | ||
| 7521 | <property name="value"></property> | ||
| 7522 | <property name="window_extra_style"></property> | ||
| 7523 | <property name="window_name"></property> | ||
| 7524 | <property name="window_style"></property> | ||
| 7525 | <event name="OnChar"></event> | ||
| 7526 | <event name="OnEnterWindow"></event> | ||
| 7527 | <event name="OnEraseBackground"></event> | ||
| 7528 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7529 | <event name="OnKeyUp"></event> | ||
| 7530 | <event name="OnKillFocus"></event> | ||
| 7531 | <event name="OnLeaveWindow"></event> | ||
| 7532 | <event name="OnLeftDClick"></event> | ||
| 7533 | <event name="OnLeftDown"></event> | ||
| 7534 | <event name="OnLeftUp"></event> | ||
| 7535 | <event name="OnMiddleDClick"></event> | ||
| 7536 | <event name="OnMiddleDown"></event> | ||
| 7537 | <event name="OnMiddleUp"></event> | ||
| 7538 | <event name="OnMotion"></event> | ||
| 7539 | <event name="OnMouseEvents"></event> | ||
| 7540 | <event name="OnMouseWheel"></event> | ||
| 7541 | <event name="OnPaint"></event> | ||
| 7542 | <event name="OnRightDClick"></event> | ||
| 7543 | <event name="OnRightDown"></event> | ||
| 7544 | <event name="OnRightUp"></event> | ||
| 7545 | <event name="OnSetFocus"></event> | ||
| 7546 | <event name="OnSize"></event> | ||
| 7547 | <event name="OnText"></event> | ||
| 7548 | <event name="OnTextEnter"></event> | ||
| 7549 | <event name="OnTextMaxLen"></event> | ||
| 7550 | <event name="OnTextURL"></event> | ||
| 7551 | <event name="OnUpdateUI"></event> | ||
| 7552 | </object> | ||
| 7553 | </object> | ||
| 7554 | <object class="sizeritem" expanded="1"> | ||
| 7555 | <property name="border">5</property> | ||
| 7556 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 7557 | <property name="proportion">0</property> | ||
| 7558 | <object class="wxTextCtrl" expanded="1"> | ||
| 7559 | <property name="bg"></property> | ||
| 7560 | <property name="context_help"></property> | ||
| 7561 | <property name="enabled">1</property> | ||
| 7562 | <property name="fg"></property> | ||
| 7563 | <property name="font"></property> | ||
| 7564 | <property name="hidden">0</property> | ||
| 7565 | <property name="id">wxID_ANY</property> | ||
| 7566 | <property name="maximum_size">-1,-1</property> | ||
| 7567 | <property name="maxlength">0</property> | ||
| 7568 | <property name="minimum_size">-1,-1</property> | ||
| 7569 | <property name="name">m_textCtrlField11</property> | ||
| 7570 | <property name="permission">protected</property> | ||
| 7571 | <property name="pos"></property> | ||
| 7572 | <property name="size">-1,-1</property> | ||
| 7573 | <property name="style"></property> | ||
| 7574 | <property name="subclass"></property> | ||
| 7575 | <property name="tooltip"></property> | ||
| 7576 | <property name="value"></property> | ||
| 7577 | <property name="window_extra_style"></property> | ||
| 7578 | <property name="window_name"></property> | ||
| 7579 | <property name="window_style"></property> | ||
| 7580 | <event name="OnChar"></event> | ||
| 7581 | <event name="OnEnterWindow"></event> | ||
| 7582 | <event name="OnEraseBackground"></event> | ||
| 7583 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7584 | <event name="OnKeyUp"></event> | ||
| 7585 | <event name="OnKillFocus"></event> | ||
| 7586 | <event name="OnLeaveWindow"></event> | ||
| 7587 | <event name="OnLeftDClick"></event> | ||
| 7588 | <event name="OnLeftDown"></event> | ||
| 7589 | <event name="OnLeftUp"></event> | ||
| 7590 | <event name="OnMiddleDClick"></event> | ||
| 7591 | <event name="OnMiddleDown"></event> | ||
| 7592 | <event name="OnMiddleUp"></event> | ||
| 7593 | <event name="OnMotion"></event> | ||
| 7594 | <event name="OnMouseEvents"></event> | ||
| 7595 | <event name="OnMouseWheel"></event> | ||
| 7596 | <event name="OnPaint"></event> | ||
| 7597 | <event name="OnRightDClick"></event> | ||
| 7598 | <event name="OnRightDown"></event> | ||
| 7599 | <event name="OnRightUp"></event> | ||
| 7600 | <event name="OnSetFocus"></event> | ||
| 7601 | <event name="OnSize"></event> | ||
| 7602 | <event name="OnText"></event> | ||
| 7603 | <event name="OnTextEnter"></event> | ||
| 7604 | <event name="OnTextMaxLen"></event> | ||
| 7605 | <event name="OnTextURL"></event> | ||
| 7606 | <event name="OnUpdateUI"></event> | ||
| 7607 | </object> | ||
| 7608 | </object> | ||
| 7609 | <object class="sizeritem" expanded="1"> | ||
| 7610 | <property name="border">5</property> | ||
| 7611 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 7612 | <property name="proportion">0</property> | ||
| 7613 | <object class="wxButton" expanded="1"> | ||
| 7614 | <property name="bg"></property> | ||
| 7615 | <property name="context_help"></property> | ||
| 7616 | <property name="default">0</property> | ||
| 7617 | <property name="enabled">1</property> | ||
| 7618 | <property name="fg"></property> | ||
| 7619 | <property name="font"></property> | ||
| 7620 | <property name="hidden">0</property> | ||
| 7621 | <property name="id">wxID_DEL11</property> | ||
| 7622 | <property name="label">Delete</property> | ||
| 7623 | <property name="maximum_size"></property> | ||
| 7624 | <property name="minimum_size">-1,-1</property> | ||
| 7625 | <property name="name">m_buttonDel11</property> | ||
| 7626 | <property name="permission">protected</property> | ||
| 7627 | <property name="pos"></property> | ||
| 7628 | <property name="size">60,20</property> | ||
| 7629 | <property name="style"></property> | ||
| 7630 | <property name="subclass"></property> | ||
| 7631 | <property name="tooltip"></property> | ||
| 7632 | <property name="window_extra_style"></property> | ||
| 7633 | <property name="window_name"></property> | ||
| 7634 | <property name="window_style"></property> | ||
| 7635 | <event name="OnButtonClick">OnButtonDel11</event> | ||
| 7636 | <event name="OnChar"></event> | ||
| 7637 | <event name="OnEnterWindow"></event> | ||
| 7638 | <event name="OnEraseBackground"></event> | ||
| 7639 | <event name="OnKeyDown"></event> | ||
| 7640 | <event name="OnKeyUp"></event> | ||
| 7641 | <event name="OnKillFocus"></event> | ||
| 7642 | <event name="OnLeaveWindow"></event> | ||
| 7643 | <event name="OnLeftDClick"></event> | ||
| 7644 | <event name="OnLeftDown"></event> | ||
| 7645 | <event name="OnLeftUp"></event> | ||
| 7646 | <event name="OnMiddleDClick"></event> | ||
| 7647 | <event name="OnMiddleDown"></event> | ||
| 7648 | <event name="OnMiddleUp"></event> | ||
| 7649 | <event name="OnMotion"></event> | ||
| 7650 | <event name="OnMouseEvents"></event> | ||
| 7651 | <event name="OnMouseWheel"></event> | ||
| 7652 | <event name="OnPaint"></event> | ||
| 7653 | <event name="OnRightDClick"></event> | ||
| 7654 | <event name="OnRightDown"></event> | ||
| 7655 | <event name="OnRightUp"></event> | ||
| 7656 | <event name="OnSetFocus"></event> | ||
| 7657 | <event name="OnSize"></event> | ||
| 7658 | <event name="OnUpdateUI"></event> | ||
| 7659 | </object> | ||
| 7660 | </object> | ||
| 7661 | <object class="sizeritem" expanded="1"> | ||
| 7662 | <property name="border">5</property> | ||
| 7663 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7664 | <property name="proportion">0</property> | ||
| 7665 | <object class="wxTextCtrl" expanded="1"> | ||
| 7666 | <property name="bg"></property> | ||
| 7667 | <property name="context_help"></property> | ||
| 7668 | <property name="enabled">1</property> | ||
| 7669 | <property name="fg"></property> | ||
| 7670 | <property name="font"></property> | ||
| 7671 | <property name="hidden">0</property> | ||
| 7672 | <property name="id">wxID_ANY</property> | ||
| 7673 | <property name="maximum_size"></property> | ||
| 7674 | <property name="maxlength">0</property> | ||
| 7675 | <property name="minimum_size">150,-1</property> | ||
| 7676 | <property name="name">m_textCtrlLabel12</property> | ||
| 7677 | <property name="permission">protected</property> | ||
| 7678 | <property name="pos"></property> | ||
| 7679 | <property name="size"></property> | ||
| 7680 | <property name="style"></property> | ||
| 7681 | <property name="subclass"></property> | ||
| 7682 | <property name="tooltip"></property> | ||
| 7683 | <property name="value"></property> | ||
| 7684 | <property name="window_extra_style"></property> | ||
| 7685 | <property name="window_name"></property> | ||
| 7686 | <property name="window_style"></property> | ||
| 7687 | <event name="OnChar"></event> | ||
| 7688 | <event name="OnEnterWindow"></event> | ||
| 7689 | <event name="OnEraseBackground"></event> | ||
| 7690 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7691 | <event name="OnKeyUp"></event> | ||
| 7692 | <event name="OnKillFocus"></event> | ||
| 7693 | <event name="OnLeaveWindow"></event> | ||
| 7694 | <event name="OnLeftDClick"></event> | ||
| 7695 | <event name="OnLeftDown"></event> | ||
| 7696 | <event name="OnLeftUp"></event> | ||
| 7697 | <event name="OnMiddleDClick"></event> | ||
| 7698 | <event name="OnMiddleDown"></event> | ||
| 7699 | <event name="OnMiddleUp"></event> | ||
| 7700 | <event name="OnMotion"></event> | ||
| 7701 | <event name="OnMouseEvents"></event> | ||
| 7702 | <event name="OnMouseWheel"></event> | ||
| 7703 | <event name="OnPaint"></event> | ||
| 7704 | <event name="OnRightDClick"></event> | ||
| 7705 | <event name="OnRightDown"></event> | ||
| 7706 | <event name="OnRightUp"></event> | ||
| 7707 | <event name="OnSetFocus"></event> | ||
| 7708 | <event name="OnSize"></event> | ||
| 7709 | <event name="OnText"></event> | ||
| 7710 | <event name="OnTextEnter"></event> | ||
| 7711 | <event name="OnTextMaxLen"></event> | ||
| 7712 | <event name="OnTextURL"></event> | ||
| 7713 | <event name="OnUpdateUI"></event> | ||
| 7714 | </object> | ||
| 7715 | </object> | ||
| 7716 | <object class="sizeritem" expanded="1"> | ||
| 7717 | <property name="border">5</property> | ||
| 7718 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 7719 | <property name="proportion">0</property> | ||
| 7720 | <object class="wxTextCtrl" expanded="1"> | ||
| 7721 | <property name="bg"></property> | ||
| 7722 | <property name="context_help"></property> | ||
| 7723 | <property name="enabled">1</property> | ||
| 7724 | <property name="fg"></property> | ||
| 7725 | <property name="font"></property> | ||
| 7726 | <property name="hidden">0</property> | ||
| 7727 | <property name="id">wxID_ANY</property> | ||
| 7728 | <property name="maximum_size">-1,-1</property> | ||
| 7729 | <property name="maxlength">0</property> | ||
| 7730 | <property name="minimum_size">-1,-1</property> | ||
| 7731 | <property name="name">m_textCtrlField12</property> | ||
| 7732 | <property name="permission">protected</property> | ||
| 7733 | <property name="pos"></property> | ||
| 7734 | <property name="size">-1,-1</property> | ||
| 7735 | <property name="style"></property> | ||
| 7736 | <property name="subclass"></property> | ||
| 7737 | <property name="tooltip"></property> | ||
| 7738 | <property name="value"></property> | ||
| 7739 | <property name="window_extra_style"></property> | ||
| 7740 | <property name="window_name"></property> | ||
| 7741 | <property name="window_style"></property> | ||
| 7742 | <event name="OnChar"></event> | ||
| 7743 | <event name="OnEnterWindow"></event> | ||
| 7744 | <event name="OnEraseBackground"></event> | ||
| 7745 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7746 | <event name="OnKeyUp"></event> | ||
| 7747 | <event name="OnKillFocus"></event> | ||
| 7748 | <event name="OnLeaveWindow"></event> | ||
| 7749 | <event name="OnLeftDClick"></event> | ||
| 7750 | <event name="OnLeftDown"></event> | ||
| 7751 | <event name="OnLeftUp"></event> | ||
| 7752 | <event name="OnMiddleDClick"></event> | ||
| 7753 | <event name="OnMiddleDown"></event> | ||
| 7754 | <event name="OnMiddleUp"></event> | ||
| 7755 | <event name="OnMotion"></event> | ||
| 7756 | <event name="OnMouseEvents"></event> | ||
| 7757 | <event name="OnMouseWheel"></event> | ||
| 7758 | <event name="OnPaint"></event> | ||
| 7759 | <event name="OnRightDClick"></event> | ||
| 7760 | <event name="OnRightDown"></event> | ||
| 7761 | <event name="OnRightUp"></event> | ||
| 7762 | <event name="OnSetFocus"></event> | ||
| 7763 | <event name="OnSize"></event> | ||
| 7764 | <event name="OnText"></event> | ||
| 7765 | <event name="OnTextEnter"></event> | ||
| 7766 | <event name="OnTextMaxLen"></event> | ||
| 7767 | <event name="OnTextURL"></event> | ||
| 7768 | <event name="OnUpdateUI"></event> | ||
| 7769 | </object> | ||
| 7770 | </object> | ||
| 7771 | <object class="sizeritem" expanded="1"> | ||
| 7772 | <property name="border">5</property> | ||
| 7773 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 7774 | <property name="proportion">0</property> | ||
| 7775 | <object class="wxButton" expanded="1"> | ||
| 7776 | <property name="bg"></property> | ||
| 7777 | <property name="context_help"></property> | ||
| 7778 | <property name="default">0</property> | ||
| 7779 | <property name="enabled">1</property> | ||
| 7780 | <property name="fg"></property> | ||
| 7781 | <property name="font"></property> | ||
| 7782 | <property name="hidden">0</property> | ||
| 7783 | <property name="id">wxID_DEL12</property> | ||
| 7784 | <property name="label">Delete</property> | ||
| 7785 | <property name="maximum_size"></property> | ||
| 7786 | <property name="minimum_size">-1,-1</property> | ||
| 7787 | <property name="name">m_buttonDel12</property> | ||
| 7788 | <property name="permission">protected</property> | ||
| 7789 | <property name="pos"></property> | ||
| 7790 | <property name="size">60,20</property> | ||
| 7791 | <property name="style"></property> | ||
| 7792 | <property name="subclass"></property> | ||
| 7793 | <property name="tooltip"></property> | ||
| 7794 | <property name="window_extra_style"></property> | ||
| 7795 | <property name="window_name"></property> | ||
| 7796 | <property name="window_style"></property> | ||
| 7797 | <event name="OnButtonClick">OnButtonDel12</event> | ||
| 7798 | <event name="OnChar"></event> | ||
| 7799 | <event name="OnEnterWindow"></event> | ||
| 7800 | <event name="OnEraseBackground"></event> | ||
| 7801 | <event name="OnKeyDown"></event> | ||
| 7802 | <event name="OnKeyUp"></event> | ||
| 7803 | <event name="OnKillFocus"></event> | ||
| 7804 | <event name="OnLeaveWindow"></event> | ||
| 7805 | <event name="OnLeftDClick"></event> | ||
| 7806 | <event name="OnLeftDown"></event> | ||
| 7807 | <event name="OnLeftUp"></event> | ||
| 7808 | <event name="OnMiddleDClick"></event> | ||
| 7809 | <event name="OnMiddleDown"></event> | ||
| 7810 | <event name="OnMiddleUp"></event> | ||
| 7811 | <event name="OnMotion"></event> | ||
| 7812 | <event name="OnMouseEvents"></event> | ||
| 7813 | <event name="OnMouseWheel"></event> | ||
| 7814 | <event name="OnPaint"></event> | ||
| 7815 | <event name="OnRightDClick"></event> | ||
| 7816 | <event name="OnRightDown"></event> | ||
| 7817 | <event name="OnRightUp"></event> | ||
| 7818 | <event name="OnSetFocus"></event> | ||
| 7819 | <event name="OnSize"></event> | ||
| 7820 | <event name="OnUpdateUI"></event> | ||
| 7821 | </object> | ||
| 7822 | </object> | ||
| 7823 | <object class="sizeritem" expanded="1"> | ||
| 7824 | <property name="border">5</property> | ||
| 7825 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7826 | <property name="proportion">0</property> | ||
| 7827 | <object class="wxTextCtrl" expanded="1"> | ||
| 7828 | <property name="bg"></property> | ||
| 7829 | <property name="context_help"></property> | ||
| 7830 | <property name="enabled">1</property> | ||
| 7831 | <property name="fg"></property> | ||
| 7832 | <property name="font"></property> | ||
| 7833 | <property name="hidden">0</property> | ||
| 7834 | <property name="id">wxID_ANY</property> | ||
| 7835 | <property name="maximum_size"></property> | ||
| 7836 | <property name="maxlength">0</property> | ||
| 7837 | <property name="minimum_size">150,-1</property> | ||
| 7838 | <property name="name">m_textCtrlLabel13</property> | ||
| 7839 | <property name="permission">protected</property> | ||
| 7840 | <property name="pos"></property> | ||
| 7841 | <property name="size"></property> | ||
| 7842 | <property name="style"></property> | ||
| 7843 | <property name="subclass"></property> | ||
| 7844 | <property name="tooltip"></property> | ||
| 7845 | <property name="value"></property> | ||
| 7846 | <property name="window_extra_style"></property> | ||
| 7847 | <property name="window_name"></property> | ||
| 7848 | <property name="window_style"></property> | ||
| 7849 | <event name="OnChar"></event> | ||
| 7850 | <event name="OnEnterWindow"></event> | ||
| 7851 | <event name="OnEraseBackground"></event> | ||
| 7852 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7853 | <event name="OnKeyUp"></event> | ||
| 7854 | <event name="OnKillFocus"></event> | ||
| 7855 | <event name="OnLeaveWindow"></event> | ||
| 7856 | <event name="OnLeftDClick"></event> | ||
| 7857 | <event name="OnLeftDown"></event> | ||
| 7858 | <event name="OnLeftUp"></event> | ||
| 7859 | <event name="OnMiddleDClick"></event> | ||
| 7860 | <event name="OnMiddleDown"></event> | ||
| 7861 | <event name="OnMiddleUp"></event> | ||
| 7862 | <event name="OnMotion"></event> | ||
| 7863 | <event name="OnMouseEvents"></event> | ||
| 7864 | <event name="OnMouseWheel"></event> | ||
| 7865 | <event name="OnPaint"></event> | ||
| 7866 | <event name="OnRightDClick"></event> | ||
| 7867 | <event name="OnRightDown"></event> | ||
| 7868 | <event name="OnRightUp"></event> | ||
| 7869 | <event name="OnSetFocus"></event> | ||
| 7870 | <event name="OnSize"></event> | ||
| 7871 | <event name="OnText"></event> | ||
| 7872 | <event name="OnTextEnter"></event> | ||
| 7873 | <event name="OnTextMaxLen"></event> | ||
| 7874 | <event name="OnTextURL"></event> | ||
| 7875 | <event name="OnUpdateUI"></event> | ||
| 7876 | </object> | ||
| 7877 | </object> | ||
| 7878 | <object class="sizeritem" expanded="1"> | ||
| 7879 | <property name="border">5</property> | ||
| 7880 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 7881 | <property name="proportion">0</property> | ||
| 7882 | <object class="wxTextCtrl" expanded="1"> | ||
| 7883 | <property name="bg"></property> | ||
| 7884 | <property name="context_help"></property> | ||
| 7885 | <property name="enabled">1</property> | ||
| 7886 | <property name="fg"></property> | ||
| 7887 | <property name="font"></property> | ||
| 7888 | <property name="hidden">0</property> | ||
| 7889 | <property name="id">wxID_ANY</property> | ||
| 7890 | <property name="maximum_size">-1,-1</property> | ||
| 7891 | <property name="maxlength">0</property> | ||
| 7892 | <property name="minimum_size">-1,-1</property> | ||
| 7893 | <property name="name">m_textCtrlField13</property> | ||
| 7894 | <property name="permission">protected</property> | ||
| 7895 | <property name="pos"></property> | ||
| 7896 | <property name="size">-1,-1</property> | ||
| 7897 | <property name="style"></property> | ||
| 7898 | <property name="subclass"></property> | ||
| 7899 | <property name="tooltip"></property> | ||
| 7900 | <property name="value"></property> | ||
| 7901 | <property name="window_extra_style"></property> | ||
| 7902 | <property name="window_name"></property> | ||
| 7903 | <property name="window_style"></property> | ||
| 7904 | <event name="OnChar"></event> | ||
| 7905 | <event name="OnEnterWindow"></event> | ||
| 7906 | <event name="OnEraseBackground"></event> | ||
| 7907 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 7908 | <event name="OnKeyUp"></event> | ||
| 7909 | <event name="OnKillFocus"></event> | ||
| 7910 | <event name="OnLeaveWindow"></event> | ||
| 7911 | <event name="OnLeftDClick"></event> | ||
| 7912 | <event name="OnLeftDown"></event> | ||
| 7913 | <event name="OnLeftUp"></event> | ||
| 7914 | <event name="OnMiddleDClick"></event> | ||
| 7915 | <event name="OnMiddleDown"></event> | ||
| 7916 | <event name="OnMiddleUp"></event> | ||
| 7917 | <event name="OnMotion"></event> | ||
| 7918 | <event name="OnMouseEvents"></event> | ||
| 7919 | <event name="OnMouseWheel"></event> | ||
| 7920 | <event name="OnPaint"></event> | ||
| 7921 | <event name="OnRightDClick"></event> | ||
| 7922 | <event name="OnRightDown"></event> | ||
| 7923 | <event name="OnRightUp"></event> | ||
| 7924 | <event name="OnSetFocus"></event> | ||
| 7925 | <event name="OnSize"></event> | ||
| 7926 | <event name="OnText"></event> | ||
| 7927 | <event name="OnTextEnter"></event> | ||
| 7928 | <event name="OnTextMaxLen"></event> | ||
| 7929 | <event name="OnTextURL"></event> | ||
| 7930 | <event name="OnUpdateUI"></event> | ||
| 7931 | </object> | ||
| 7932 | </object> | ||
| 7933 | <object class="sizeritem" expanded="1"> | ||
| 7934 | <property name="border">5</property> | ||
| 7935 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 7936 | <property name="proportion">0</property> | ||
| 7937 | <object class="wxButton" expanded="1"> | ||
| 7938 | <property name="bg"></property> | ||
| 7939 | <property name="context_help"></property> | ||
| 7940 | <property name="default">0</property> | ||
| 7941 | <property name="enabled">1</property> | ||
| 7942 | <property name="fg"></property> | ||
| 7943 | <property name="font"></property> | ||
| 7944 | <property name="hidden">0</property> | ||
| 7945 | <property name="id">wxID_DEL13</property> | ||
| 7946 | <property name="label">Delete</property> | ||
| 7947 | <property name="maximum_size"></property> | ||
| 7948 | <property name="minimum_size">-1,-1</property> | ||
| 7949 | <property name="name">m_buttonDel13</property> | ||
| 7950 | <property name="permission">protected</property> | ||
| 7951 | <property name="pos"></property> | ||
| 7952 | <property name="size">60,20</property> | ||
| 7953 | <property name="style"></property> | ||
| 7954 | <property name="subclass"></property> | ||
| 7955 | <property name="tooltip"></property> | ||
| 7956 | <property name="window_extra_style"></property> | ||
| 7957 | <property name="window_name"></property> | ||
| 7958 | <property name="window_style"></property> | ||
| 7959 | <event name="OnButtonClick">OnButtonDel13</event> | ||
| 7960 | <event name="OnChar"></event> | ||
| 7961 | <event name="OnEnterWindow"></event> | ||
| 7962 | <event name="OnEraseBackground"></event> | ||
| 7963 | <event name="OnKeyDown"></event> | ||
| 7964 | <event name="OnKeyUp"></event> | ||
| 7965 | <event name="OnKillFocus"></event> | ||
| 7966 | <event name="OnLeaveWindow"></event> | ||
| 7967 | <event name="OnLeftDClick"></event> | ||
| 7968 | <event name="OnLeftDown"></event> | ||
| 7969 | <event name="OnLeftUp"></event> | ||
| 7970 | <event name="OnMiddleDClick"></event> | ||
| 7971 | <event name="OnMiddleDown"></event> | ||
| 7972 | <event name="OnMiddleUp"></event> | ||
| 7973 | <event name="OnMotion"></event> | ||
| 7974 | <event name="OnMouseEvents"></event> | ||
| 7975 | <event name="OnMouseWheel"></event> | ||
| 7976 | <event name="OnPaint"></event> | ||
| 7977 | <event name="OnRightDClick"></event> | ||
| 7978 | <event name="OnRightDown"></event> | ||
| 7979 | <event name="OnRightUp"></event> | ||
| 7980 | <event name="OnSetFocus"></event> | ||
| 7981 | <event name="OnSize"></event> | ||
| 7982 | <event name="OnUpdateUI"></event> | ||
| 7983 | </object> | ||
| 7984 | </object> | ||
| 7985 | <object class="sizeritem" expanded="1"> | ||
| 7986 | <property name="border">5</property> | ||
| 7987 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 7988 | <property name="proportion">0</property> | ||
| 7989 | <object class="wxTextCtrl" expanded="1"> | ||
| 7990 | <property name="bg"></property> | ||
| 7991 | <property name="context_help"></property> | ||
| 7992 | <property name="enabled">1</property> | ||
| 7993 | <property name="fg"></property> | ||
| 7994 | <property name="font"></property> | ||
| 7995 | <property name="hidden">0</property> | ||
| 7996 | <property name="id">wxID_ANY</property> | ||
| 7997 | <property name="maximum_size"></property> | ||
| 7998 | <property name="maxlength">0</property> | ||
| 7999 | <property name="minimum_size">150,-1</property> | ||
| 8000 | <property name="name">m_textCtrlLabel14</property> | ||
| 8001 | <property name="permission">protected</property> | ||
| 8002 | <property name="pos"></property> | ||
| 8003 | <property name="size"></property> | ||
| 8004 | <property name="style"></property> | ||
| 8005 | <property name="subclass"></property> | ||
| 8006 | <property name="tooltip"></property> | ||
| 8007 | <property name="value"></property> | ||
| 8008 | <property name="window_extra_style"></property> | ||
| 8009 | <property name="window_name"></property> | ||
| 8010 | <property name="window_style"></property> | ||
| 8011 | <event name="OnChar"></event> | ||
| 8012 | <event name="OnEnterWindow"></event> | ||
| 8013 | <event name="OnEraseBackground"></event> | ||
| 8014 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8015 | <event name="OnKeyUp"></event> | ||
| 8016 | <event name="OnKillFocus"></event> | ||
| 8017 | <event name="OnLeaveWindow"></event> | ||
| 8018 | <event name="OnLeftDClick"></event> | ||
| 8019 | <event name="OnLeftDown"></event> | ||
| 8020 | <event name="OnLeftUp"></event> | ||
| 8021 | <event name="OnMiddleDClick"></event> | ||
| 8022 | <event name="OnMiddleDown"></event> | ||
| 8023 | <event name="OnMiddleUp"></event> | ||
| 8024 | <event name="OnMotion"></event> | ||
| 8025 | <event name="OnMouseEvents"></event> | ||
| 8026 | <event name="OnMouseWheel"></event> | ||
| 8027 | <event name="OnPaint"></event> | ||
| 8028 | <event name="OnRightDClick"></event> | ||
| 8029 | <event name="OnRightDown"></event> | ||
| 8030 | <event name="OnRightUp"></event> | ||
| 8031 | <event name="OnSetFocus"></event> | ||
| 8032 | <event name="OnSize"></event> | ||
| 8033 | <event name="OnText"></event> | ||
| 8034 | <event name="OnTextEnter"></event> | ||
| 8035 | <event name="OnTextMaxLen"></event> | ||
| 8036 | <event name="OnTextURL"></event> | ||
| 8037 | <event name="OnUpdateUI"></event> | ||
| 8038 | </object> | ||
| 8039 | </object> | ||
| 8040 | <object class="sizeritem" expanded="1"> | ||
| 8041 | <property name="border">5</property> | ||
| 8042 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 8043 | <property name="proportion">0</property> | ||
| 8044 | <object class="wxTextCtrl" expanded="1"> | ||
| 8045 | <property name="bg"></property> | ||
| 8046 | <property name="context_help"></property> | ||
| 8047 | <property name="enabled">1</property> | ||
| 8048 | <property name="fg"></property> | ||
| 8049 | <property name="font"></property> | ||
| 8050 | <property name="hidden">0</property> | ||
| 8051 | <property name="id">wxID_ANY</property> | ||
| 8052 | <property name="maximum_size">-1,-1</property> | ||
| 8053 | <property name="maxlength">0</property> | ||
| 8054 | <property name="minimum_size">-1,-1</property> | ||
| 8055 | <property name="name">m_textCtrlField14</property> | ||
| 8056 | <property name="permission">protected</property> | ||
| 8057 | <property name="pos"></property> | ||
| 8058 | <property name="size">-1,-1</property> | ||
| 8059 | <property name="style"></property> | ||
| 8060 | <property name="subclass"></property> | ||
| 8061 | <property name="tooltip"></property> | ||
| 8062 | <property name="value"></property> | ||
| 8063 | <property name="window_extra_style"></property> | ||
| 8064 | <property name="window_name"></property> | ||
| 8065 | <property name="window_style"></property> | ||
| 8066 | <event name="OnChar"></event> | ||
| 8067 | <event name="OnEnterWindow"></event> | ||
| 8068 | <event name="OnEraseBackground"></event> | ||
| 8069 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8070 | <event name="OnKeyUp"></event> | ||
| 8071 | <event name="OnKillFocus"></event> | ||
| 8072 | <event name="OnLeaveWindow"></event> | ||
| 8073 | <event name="OnLeftDClick"></event> | ||
| 8074 | <event name="OnLeftDown"></event> | ||
| 8075 | <event name="OnLeftUp"></event> | ||
| 8076 | <event name="OnMiddleDClick"></event> | ||
| 8077 | <event name="OnMiddleDown"></event> | ||
| 8078 | <event name="OnMiddleUp"></event> | ||
| 8079 | <event name="OnMotion"></event> | ||
| 8080 | <event name="OnMouseEvents"></event> | ||
| 8081 | <event name="OnMouseWheel"></event> | ||
| 8082 | <event name="OnPaint"></event> | ||
| 8083 | <event name="OnRightDClick"></event> | ||
| 8084 | <event name="OnRightDown"></event> | ||
| 8085 | <event name="OnRightUp"></event> | ||
| 8086 | <event name="OnSetFocus"></event> | ||
| 8087 | <event name="OnSize"></event> | ||
| 8088 | <event name="OnText"></event> | ||
| 8089 | <event name="OnTextEnter"></event> | ||
| 8090 | <event name="OnTextMaxLen"></event> | ||
| 8091 | <event name="OnTextURL"></event> | ||
| 8092 | <event name="OnUpdateUI"></event> | ||
| 8093 | </object> | ||
| 8094 | </object> | ||
| 8095 | <object class="sizeritem" expanded="1"> | ||
| 8096 | <property name="border">5</property> | ||
| 8097 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 8098 | <property name="proportion">0</property> | ||
| 8099 | <object class="wxButton" expanded="1"> | ||
| 8100 | <property name="bg"></property> | ||
| 8101 | <property name="context_help"></property> | ||
| 8102 | <property name="default">0</property> | ||
| 8103 | <property name="enabled">1</property> | ||
| 8104 | <property name="fg"></property> | ||
| 8105 | <property name="font"></property> | ||
| 8106 | <property name="hidden">0</property> | ||
| 8107 | <property name="id">wxID_DEL14</property> | ||
| 8108 | <property name="label">Delete</property> | ||
| 8109 | <property name="maximum_size"></property> | ||
| 8110 | <property name="minimum_size">-1,-1</property> | ||
| 8111 | <property name="name">m_buttonDel14</property> | ||
| 8112 | <property name="permission">protected</property> | ||
| 8113 | <property name="pos"></property> | ||
| 8114 | <property name="size">60,20</property> | ||
| 8115 | <property name="style"></property> | ||
| 8116 | <property name="subclass"></property> | ||
| 8117 | <property name="tooltip"></property> | ||
| 8118 | <property name="window_extra_style"></property> | ||
| 8119 | <property name="window_name"></property> | ||
| 8120 | <property name="window_style"></property> | ||
| 8121 | <event name="OnButtonClick">OnButtonDel14</event> | ||
| 8122 | <event name="OnChar"></event> | ||
| 8123 | <event name="OnEnterWindow"></event> | ||
| 8124 | <event name="OnEraseBackground"></event> | ||
| 8125 | <event name="OnKeyDown"></event> | ||
| 8126 | <event name="OnKeyUp"></event> | ||
| 8127 | <event name="OnKillFocus"></event> | ||
| 8128 | <event name="OnLeaveWindow"></event> | ||
| 8129 | <event name="OnLeftDClick"></event> | ||
| 8130 | <event name="OnLeftDown"></event> | ||
| 8131 | <event name="OnLeftUp"></event> | ||
| 8132 | <event name="OnMiddleDClick"></event> | ||
| 8133 | <event name="OnMiddleDown"></event> | ||
| 8134 | <event name="OnMiddleUp"></event> | ||
| 8135 | <event name="OnMotion"></event> | ||
| 8136 | <event name="OnMouseEvents"></event> | ||
| 8137 | <event name="OnMouseWheel"></event> | ||
| 8138 | <event name="OnPaint"></event> | ||
| 8139 | <event name="OnRightDClick"></event> | ||
| 8140 | <event name="OnRightDown"></event> | ||
| 8141 | <event name="OnRightUp"></event> | ||
| 8142 | <event name="OnSetFocus"></event> | ||
| 8143 | <event name="OnSize"></event> | ||
| 8144 | <event name="OnUpdateUI"></event> | ||
| 8145 | </object> | ||
| 8146 | </object> | ||
| 8147 | <object class="sizeritem" expanded="1"> | ||
| 8148 | <property name="border">5</property> | ||
| 8149 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 8150 | <property name="proportion">0</property> | ||
| 8151 | <object class="wxTextCtrl" expanded="1"> | ||
| 8152 | <property name="bg"></property> | ||
| 8153 | <property name="context_help"></property> | ||
| 8154 | <property name="enabled">1</property> | ||
| 8155 | <property name="fg"></property> | ||
| 8156 | <property name="font"></property> | ||
| 8157 | <property name="hidden">0</property> | ||
| 8158 | <property name="id">wxID_ANY</property> | ||
| 8159 | <property name="maximum_size"></property> | ||
| 8160 | <property name="maxlength">0</property> | ||
| 8161 | <property name="minimum_size">150,-1</property> | ||
| 8162 | <property name="name">m_textCtrlLabel15</property> | ||
| 8163 | <property name="permission">protected</property> | ||
| 8164 | <property name="pos"></property> | ||
| 8165 | <property name="size"></property> | ||
| 8166 | <property name="style"></property> | ||
| 8167 | <property name="subclass"></property> | ||
| 8168 | <property name="tooltip"></property> | ||
| 8169 | <property name="value"></property> | ||
| 8170 | <property name="window_extra_style"></property> | ||
| 8171 | <property name="window_name"></property> | ||
| 8172 | <property name="window_style"></property> | ||
| 8173 | <event name="OnChar"></event> | ||
| 8174 | <event name="OnEnterWindow"></event> | ||
| 8175 | <event name="OnEraseBackground"></event> | ||
| 8176 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8177 | <event name="OnKeyUp"></event> | ||
| 8178 | <event name="OnKillFocus"></event> | ||
| 8179 | <event name="OnLeaveWindow"></event> | ||
| 8180 | <event name="OnLeftDClick"></event> | ||
| 8181 | <event name="OnLeftDown"></event> | ||
| 8182 | <event name="OnLeftUp"></event> | ||
| 8183 | <event name="OnMiddleDClick"></event> | ||
| 8184 | <event name="OnMiddleDown"></event> | ||
| 8185 | <event name="OnMiddleUp"></event> | ||
| 8186 | <event name="OnMotion"></event> | ||
| 8187 | <event name="OnMouseEvents"></event> | ||
| 8188 | <event name="OnMouseWheel"></event> | ||
| 8189 | <event name="OnPaint"></event> | ||
| 8190 | <event name="OnRightDClick"></event> | ||
| 8191 | <event name="OnRightDown"></event> | ||
| 8192 | <event name="OnRightUp"></event> | ||
| 8193 | <event name="OnSetFocus"></event> | ||
| 8194 | <event name="OnSize"></event> | ||
| 8195 | <event name="OnText"></event> | ||
| 8196 | <event name="OnTextEnter"></event> | ||
| 8197 | <event name="OnTextMaxLen"></event> | ||
| 8198 | <event name="OnTextURL"></event> | ||
| 8199 | <event name="OnUpdateUI"></event> | ||
| 8200 | </object> | ||
| 8201 | </object> | ||
| 8202 | <object class="sizeritem" expanded="1"> | ||
| 8203 | <property name="border">5</property> | ||
| 8204 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 8205 | <property name="proportion">0</property> | ||
| 8206 | <object class="wxTextCtrl" expanded="1"> | ||
| 8207 | <property name="bg"></property> | ||
| 8208 | <property name="context_help"></property> | ||
| 8209 | <property name="enabled">1</property> | ||
| 8210 | <property name="fg"></property> | ||
| 8211 | <property name="font"></property> | ||
| 8212 | <property name="hidden">0</property> | ||
| 8213 | <property name="id">wxID_ANY</property> | ||
| 8214 | <property name="maximum_size">-1,-1</property> | ||
| 8215 | <property name="maxlength">0</property> | ||
| 8216 | <property name="minimum_size">-1,-1</property> | ||
| 8217 | <property name="name">m_textCtrlField15</property> | ||
| 8218 | <property name="permission">protected</property> | ||
| 8219 | <property name="pos"></property> | ||
| 8220 | <property name="size">-1,-1</property> | ||
| 8221 | <property name="style"></property> | ||
| 8222 | <property name="subclass"></property> | ||
| 8223 | <property name="tooltip"></property> | ||
| 8224 | <property name="value"></property> | ||
| 8225 | <property name="window_extra_style"></property> | ||
| 8226 | <property name="window_name"></property> | ||
| 8227 | <property name="window_style"></property> | ||
| 8228 | <event name="OnChar"></event> | ||
| 8229 | <event name="OnEnterWindow"></event> | ||
| 8230 | <event name="OnEraseBackground"></event> | ||
| 8231 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8232 | <event name="OnKeyUp"></event> | ||
| 8233 | <event name="OnKillFocus"></event> | ||
| 8234 | <event name="OnLeaveWindow"></event> | ||
| 8235 | <event name="OnLeftDClick"></event> | ||
| 8236 | <event name="OnLeftDown"></event> | ||
| 8237 | <event name="OnLeftUp"></event> | ||
| 8238 | <event name="OnMiddleDClick"></event> | ||
| 8239 | <event name="OnMiddleDown"></event> | ||
| 8240 | <event name="OnMiddleUp"></event> | ||
| 8241 | <event name="OnMotion"></event> | ||
| 8242 | <event name="OnMouseEvents"></event> | ||
| 8243 | <event name="OnMouseWheel"></event> | ||
| 8244 | <event name="OnPaint"></event> | ||
| 8245 | <event name="OnRightDClick"></event> | ||
| 8246 | <event name="OnRightDown"></event> | ||
| 8247 | <event name="OnRightUp"></event> | ||
| 8248 | <event name="OnSetFocus"></event> | ||
| 8249 | <event name="OnSize"></event> | ||
| 8250 | <event name="OnText"></event> | ||
| 8251 | <event name="OnTextEnter"></event> | ||
| 8252 | <event name="OnTextMaxLen"></event> | ||
| 8253 | <event name="OnTextURL"></event> | ||
| 8254 | <event name="OnUpdateUI"></event> | ||
| 8255 | </object> | ||
| 8256 | </object> | ||
| 8257 | <object class="sizeritem" expanded="1"> | ||
| 8258 | <property name="border">5</property> | ||
| 8259 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 8260 | <property name="proportion">0</property> | ||
| 8261 | <object class="wxButton" expanded="1"> | ||
| 8262 | <property name="bg"></property> | ||
| 8263 | <property name="context_help"></property> | ||
| 8264 | <property name="default">0</property> | ||
| 8265 | <property name="enabled">1</property> | ||
| 8266 | <property name="fg"></property> | ||
| 8267 | <property name="font"></property> | ||
| 8268 | <property name="hidden">0</property> | ||
| 8269 | <property name="id">wxID_DEL15</property> | ||
| 8270 | <property name="label">Delete</property> | ||
| 8271 | <property name="maximum_size"></property> | ||
| 8272 | <property name="minimum_size">-1,-1</property> | ||
| 8273 | <property name="name">m_buttonDel15</property> | ||
| 8274 | <property name="permission">protected</property> | ||
| 8275 | <property name="pos"></property> | ||
| 8276 | <property name="size">60,20</property> | ||
| 8277 | <property name="style"></property> | ||
| 8278 | <property name="subclass"></property> | ||
| 8279 | <property name="tooltip"></property> | ||
| 8280 | <property name="window_extra_style"></property> | ||
| 8281 | <property name="window_name"></property> | ||
| 8282 | <property name="window_style"></property> | ||
| 8283 | <event name="OnButtonClick">OnButtonDel15</event> | ||
| 8284 | <event name="OnChar"></event> | ||
| 8285 | <event name="OnEnterWindow"></event> | ||
| 8286 | <event name="OnEraseBackground"></event> | ||
| 8287 | <event name="OnKeyDown"></event> | ||
| 8288 | <event name="OnKeyUp"></event> | ||
| 8289 | <event name="OnKillFocus"></event> | ||
| 8290 | <event name="OnLeaveWindow"></event> | ||
| 8291 | <event name="OnLeftDClick"></event> | ||
| 8292 | <event name="OnLeftDown"></event> | ||
| 8293 | <event name="OnLeftUp"></event> | ||
| 8294 | <event name="OnMiddleDClick"></event> | ||
| 8295 | <event name="OnMiddleDown"></event> | ||
| 8296 | <event name="OnMiddleUp"></event> | ||
| 8297 | <event name="OnMotion"></event> | ||
| 8298 | <event name="OnMouseEvents"></event> | ||
| 8299 | <event name="OnMouseWheel"></event> | ||
| 8300 | <event name="OnPaint"></event> | ||
| 8301 | <event name="OnRightDClick"></event> | ||
| 8302 | <event name="OnRightDown"></event> | ||
| 8303 | <event name="OnRightUp"></event> | ||
| 8304 | <event name="OnSetFocus"></event> | ||
| 8305 | <event name="OnSize"></event> | ||
| 8306 | <event name="OnUpdateUI"></event> | ||
| 8307 | </object> | ||
| 8308 | </object> | ||
| 8309 | <object class="sizeritem" expanded="1"> | ||
| 8310 | <property name="border">5</property> | ||
| 8311 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 8312 | <property name="proportion">0</property> | ||
| 8313 | <object class="wxTextCtrl" expanded="1"> | ||
| 8314 | <property name="bg"></property> | ||
| 8315 | <property name="context_help"></property> | ||
| 8316 | <property name="enabled">1</property> | ||
| 8317 | <property name="fg"></property> | ||
| 8318 | <property name="font"></property> | ||
| 8319 | <property name="hidden">0</property> | ||
| 8320 | <property name="id">wxID_ANY</property> | ||
| 8321 | <property name="maximum_size"></property> | ||
| 8322 | <property name="maxlength">0</property> | ||
| 8323 | <property name="minimum_size">150,-1</property> | ||
| 8324 | <property name="name">m_textCtrlLabel16</property> | ||
| 8325 | <property name="permission">protected</property> | ||
| 8326 | <property name="pos"></property> | ||
| 8327 | <property name="size"></property> | ||
| 8328 | <property name="style"></property> | ||
| 8329 | <property name="subclass"></property> | ||
| 8330 | <property name="tooltip"></property> | ||
| 8331 | <property name="value"></property> | ||
| 8332 | <property name="window_extra_style"></property> | ||
| 8333 | <property name="window_name"></property> | ||
| 8334 | <property name="window_style"></property> | ||
| 8335 | <event name="OnChar"></event> | ||
| 8336 | <event name="OnEnterWindow"></event> | ||
| 8337 | <event name="OnEraseBackground"></event> | ||
| 8338 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8339 | <event name="OnKeyUp"></event> | ||
| 8340 | <event name="OnKillFocus"></event> | ||
| 8341 | <event name="OnLeaveWindow"></event> | ||
| 8342 | <event name="OnLeftDClick"></event> | ||
| 8343 | <event name="OnLeftDown"></event> | ||
| 8344 | <event name="OnLeftUp"></event> | ||
| 8345 | <event name="OnMiddleDClick"></event> | ||
| 8346 | <event name="OnMiddleDown"></event> | ||
| 8347 | <event name="OnMiddleUp"></event> | ||
| 8348 | <event name="OnMotion"></event> | ||
| 8349 | <event name="OnMouseEvents"></event> | ||
| 8350 | <event name="OnMouseWheel"></event> | ||
| 8351 | <event name="OnPaint"></event> | ||
| 8352 | <event name="OnRightDClick"></event> | ||
| 8353 | <event name="OnRightDown"></event> | ||
| 8354 | <event name="OnRightUp"></event> | ||
| 8355 | <event name="OnSetFocus"></event> | ||
| 8356 | <event name="OnSize"></event> | ||
| 8357 | <event name="OnText"></event> | ||
| 8358 | <event name="OnTextEnter"></event> | ||
| 8359 | <event name="OnTextMaxLen"></event> | ||
| 8360 | <event name="OnTextURL"></event> | ||
| 8361 | <event name="OnUpdateUI"></event> | ||
| 8362 | </object> | ||
| 8363 | </object> | ||
| 8364 | <object class="sizeritem" expanded="1"> | ||
| 8365 | <property name="border">5</property> | ||
| 8366 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 8367 | <property name="proportion">0</property> | ||
| 8368 | <object class="wxTextCtrl" expanded="1"> | ||
| 8369 | <property name="bg"></property> | ||
| 8370 | <property name="context_help"></property> | ||
| 8371 | <property name="enabled">1</property> | ||
| 8372 | <property name="fg"></property> | ||
| 8373 | <property name="font"></property> | ||
| 8374 | <property name="hidden">0</property> | ||
| 8375 | <property name="id">wxID_ANY</property> | ||
| 8376 | <property name="maximum_size">-1,-1</property> | ||
| 8377 | <property name="maxlength">0</property> | ||
| 8378 | <property name="minimum_size">-1,-1</property> | ||
| 8379 | <property name="name">m_textCtrlField16</property> | ||
| 8380 | <property name="permission">protected</property> | ||
| 8381 | <property name="pos"></property> | ||
| 8382 | <property name="size">-1,-1</property> | ||
| 8383 | <property name="style"></property> | ||
| 8384 | <property name="subclass"></property> | ||
| 8385 | <property name="tooltip"></property> | ||
| 8386 | <property name="value"></property> | ||
| 8387 | <property name="window_extra_style"></property> | ||
| 8388 | <property name="window_name"></property> | ||
| 8389 | <property name="window_style"></property> | ||
| 8390 | <event name="OnChar"></event> | ||
| 8391 | <event name="OnEnterWindow"></event> | ||
| 8392 | <event name="OnEraseBackground"></event> | ||
| 8393 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8394 | <event name="OnKeyUp"></event> | ||
| 8395 | <event name="OnKillFocus"></event> | ||
| 8396 | <event name="OnLeaveWindow"></event> | ||
| 8397 | <event name="OnLeftDClick"></event> | ||
| 8398 | <event name="OnLeftDown"></event> | ||
| 8399 | <event name="OnLeftUp"></event> | ||
| 8400 | <event name="OnMiddleDClick"></event> | ||
| 8401 | <event name="OnMiddleDown"></event> | ||
| 8402 | <event name="OnMiddleUp"></event> | ||
| 8403 | <event name="OnMotion"></event> | ||
| 8404 | <event name="OnMouseEvents"></event> | ||
| 8405 | <event name="OnMouseWheel"></event> | ||
| 8406 | <event name="OnPaint"></event> | ||
| 8407 | <event name="OnRightDClick"></event> | ||
| 8408 | <event name="OnRightDown"></event> | ||
| 8409 | <event name="OnRightUp"></event> | ||
| 8410 | <event name="OnSetFocus"></event> | ||
| 8411 | <event name="OnSize"></event> | ||
| 8412 | <event name="OnText"></event> | ||
| 8413 | <event name="OnTextEnter"></event> | ||
| 8414 | <event name="OnTextMaxLen"></event> | ||
| 8415 | <event name="OnTextURL"></event> | ||
| 8416 | <event name="OnUpdateUI"></event> | ||
| 8417 | </object> | ||
| 8418 | </object> | ||
| 8419 | <object class="sizeritem" expanded="1"> | ||
| 8420 | <property name="border">5</property> | ||
| 8421 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 8422 | <property name="proportion">0</property> | ||
| 8423 | <object class="wxButton" expanded="1"> | ||
| 8424 | <property name="bg"></property> | ||
| 8425 | <property name="context_help"></property> | ||
| 8426 | <property name="default">0</property> | ||
| 8427 | <property name="enabled">1</property> | ||
| 8428 | <property name="fg"></property> | ||
| 8429 | <property name="font"></property> | ||
| 8430 | <property name="hidden">0</property> | ||
| 8431 | <property name="id">wxID_DEL16</property> | ||
| 8432 | <property name="label">Delete</property> | ||
| 8433 | <property name="maximum_size"></property> | ||
| 8434 | <property name="minimum_size">-1,-1</property> | ||
| 8435 | <property name="name">m_buttonDel16</property> | ||
| 8436 | <property name="permission">protected</property> | ||
| 8437 | <property name="pos"></property> | ||
| 8438 | <property name="size">60,20</property> | ||
| 8439 | <property name="style"></property> | ||
| 8440 | <property name="subclass"></property> | ||
| 8441 | <property name="tooltip"></property> | ||
| 8442 | <property name="window_extra_style"></property> | ||
| 8443 | <property name="window_name"></property> | ||
| 8444 | <property name="window_style"></property> | ||
| 8445 | <event name="OnButtonClick">OnButtonDel16</event> | ||
| 8446 | <event name="OnChar"></event> | ||
| 8447 | <event name="OnEnterWindow"></event> | ||
| 8448 | <event name="OnEraseBackground"></event> | ||
| 8449 | <event name="OnKeyDown"></event> | ||
| 8450 | <event name="OnKeyUp"></event> | ||
| 8451 | <event name="OnKillFocus"></event> | ||
| 8452 | <event name="OnLeaveWindow"></event> | ||
| 8453 | <event name="OnLeftDClick"></event> | ||
| 8454 | <event name="OnLeftDown"></event> | ||
| 8455 | <event name="OnLeftUp"></event> | ||
| 8456 | <event name="OnMiddleDClick"></event> | ||
| 8457 | <event name="OnMiddleDown"></event> | ||
| 8458 | <event name="OnMiddleUp"></event> | ||
| 8459 | <event name="OnMotion"></event> | ||
| 8460 | <event name="OnMouseEvents"></event> | ||
| 8461 | <event name="OnMouseWheel"></event> | ||
| 8462 | <event name="OnPaint"></event> | ||
| 8463 | <event name="OnRightDClick"></event> | ||
| 8464 | <event name="OnRightDown"></event> | ||
| 8465 | <event name="OnRightUp"></event> | ||
| 8466 | <event name="OnSetFocus"></event> | ||
| 8467 | <event name="OnSize"></event> | ||
| 8468 | <event name="OnUpdateUI"></event> | ||
| 8469 | </object> | ||
| 8470 | </object> | ||
| 8471 | <object class="sizeritem" expanded="1"> | ||
| 8472 | <property name="border">5</property> | ||
| 8473 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 8474 | <property name="proportion">0</property> | ||
| 8475 | <object class="wxTextCtrl" expanded="1"> | ||
| 8476 | <property name="bg"></property> | ||
| 8477 | <property name="context_help"></property> | ||
| 8478 | <property name="enabled">1</property> | ||
| 8479 | <property name="fg"></property> | ||
| 8480 | <property name="font"></property> | ||
| 8481 | <property name="hidden">0</property> | ||
| 8482 | <property name="id">wxID_ANY</property> | ||
| 8483 | <property name="maximum_size"></property> | ||
| 8484 | <property name="maxlength">0</property> | ||
| 8485 | <property name="minimum_size">150,-1</property> | ||
| 8486 | <property name="name">m_textCtrlLabel17</property> | ||
| 8487 | <property name="permission">protected</property> | ||
| 8488 | <property name="pos"></property> | ||
| 8489 | <property name="size"></property> | ||
| 8490 | <property name="style"></property> | ||
| 8491 | <property name="subclass"></property> | ||
| 8492 | <property name="tooltip"></property> | ||
| 8493 | <property name="value"></property> | ||
| 8494 | <property name="window_extra_style"></property> | ||
| 8495 | <property name="window_name"></property> | ||
| 8496 | <property name="window_style"></property> | ||
| 8497 | <event name="OnChar"></event> | ||
| 8498 | <event name="OnEnterWindow"></event> | ||
| 8499 | <event name="OnEraseBackground"></event> | ||
| 8500 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8501 | <event name="OnKeyUp"></event> | ||
| 8502 | <event name="OnKillFocus"></event> | ||
| 8503 | <event name="OnLeaveWindow"></event> | ||
| 8504 | <event name="OnLeftDClick"></event> | ||
| 8505 | <event name="OnLeftDown"></event> | ||
| 8506 | <event name="OnLeftUp"></event> | ||
| 8507 | <event name="OnMiddleDClick"></event> | ||
| 8508 | <event name="OnMiddleDown"></event> | ||
| 8509 | <event name="OnMiddleUp"></event> | ||
| 8510 | <event name="OnMotion"></event> | ||
| 8511 | <event name="OnMouseEvents"></event> | ||
| 8512 | <event name="OnMouseWheel"></event> | ||
| 8513 | <event name="OnPaint"></event> | ||
| 8514 | <event name="OnRightDClick"></event> | ||
| 8515 | <event name="OnRightDown"></event> | ||
| 8516 | <event name="OnRightUp"></event> | ||
| 8517 | <event name="OnSetFocus"></event> | ||
| 8518 | <event name="OnSize"></event> | ||
| 8519 | <event name="OnText"></event> | ||
| 8520 | <event name="OnTextEnter"></event> | ||
| 8521 | <event name="OnTextMaxLen"></event> | ||
| 8522 | <event name="OnTextURL"></event> | ||
| 8523 | <event name="OnUpdateUI"></event> | ||
| 8524 | </object> | ||
| 8525 | </object> | ||
| 8526 | <object class="sizeritem" expanded="1"> | ||
| 8527 | <property name="border">5</property> | ||
| 8528 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 8529 | <property name="proportion">0</property> | ||
| 8530 | <object class="wxTextCtrl" expanded="1"> | ||
| 8531 | <property name="bg"></property> | ||
| 8532 | <property name="context_help"></property> | ||
| 8533 | <property name="enabled">1</property> | ||
| 8534 | <property name="fg"></property> | ||
| 8535 | <property name="font"></property> | ||
| 8536 | <property name="hidden">0</property> | ||
| 8537 | <property name="id">wxID_ANY</property> | ||
| 8538 | <property name="maximum_size">-1,-1</property> | ||
| 8539 | <property name="maxlength">0</property> | ||
| 8540 | <property name="minimum_size">-1,-1</property> | ||
| 8541 | <property name="name">m_textCtrlField17</property> | ||
| 8542 | <property name="permission">protected</property> | ||
| 8543 | <property name="pos"></property> | ||
| 8544 | <property name="size">-1,-1</property> | ||
| 8545 | <property name="style"></property> | ||
| 8546 | <property name="subclass"></property> | ||
| 8547 | <property name="tooltip"></property> | ||
| 8548 | <property name="value"></property> | ||
| 8549 | <property name="window_extra_style"></property> | ||
| 8550 | <property name="window_name"></property> | ||
| 8551 | <property name="window_style"></property> | ||
| 8552 | <event name="OnChar"></event> | ||
| 8553 | <event name="OnEnterWindow"></event> | ||
| 8554 | <event name="OnEraseBackground"></event> | ||
| 8555 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8556 | <event name="OnKeyUp"></event> | ||
| 8557 | <event name="OnKillFocus"></event> | ||
| 8558 | <event name="OnLeaveWindow"></event> | ||
| 8559 | <event name="OnLeftDClick"></event> | ||
| 8560 | <event name="OnLeftDown"></event> | ||
| 8561 | <event name="OnLeftUp"></event> | ||
| 8562 | <event name="OnMiddleDClick"></event> | ||
| 8563 | <event name="OnMiddleDown"></event> | ||
| 8564 | <event name="OnMiddleUp"></event> | ||
| 8565 | <event name="OnMotion"></event> | ||
| 8566 | <event name="OnMouseEvents"></event> | ||
| 8567 | <event name="OnMouseWheel"></event> | ||
| 8568 | <event name="OnPaint"></event> | ||
| 8569 | <event name="OnRightDClick"></event> | ||
| 8570 | <event name="OnRightDown"></event> | ||
| 8571 | <event name="OnRightUp"></event> | ||
| 8572 | <event name="OnSetFocus"></event> | ||
| 8573 | <event name="OnSize"></event> | ||
| 8574 | <event name="OnText"></event> | ||
| 8575 | <event name="OnTextEnter"></event> | ||
| 8576 | <event name="OnTextMaxLen"></event> | ||
| 8577 | <event name="OnTextURL"></event> | ||
| 8578 | <event name="OnUpdateUI"></event> | ||
| 8579 | </object> | ||
| 8580 | </object> | ||
| 8581 | <object class="sizeritem" expanded="1"> | ||
| 8582 | <property name="border">5</property> | ||
| 8583 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 8584 | <property name="proportion">0</property> | ||
| 8585 | <object class="wxButton" expanded="1"> | ||
| 8586 | <property name="bg"></property> | ||
| 8587 | <property name="context_help"></property> | ||
| 8588 | <property name="default">0</property> | ||
| 8589 | <property name="enabled">1</property> | ||
| 8590 | <property name="fg"></property> | ||
| 8591 | <property name="font"></property> | ||
| 8592 | <property name="hidden">0</property> | ||
| 8593 | <property name="id">wxID_DEL17</property> | ||
| 8594 | <property name="label">Delete</property> | ||
| 8595 | <property name="maximum_size"></property> | ||
| 8596 | <property name="minimum_size">-1,-1</property> | ||
| 8597 | <property name="name">m_buttonDel17</property> | ||
| 8598 | <property name="permission">protected</property> | ||
| 8599 | <property name="pos"></property> | ||
| 8600 | <property name="size">60,20</property> | ||
| 8601 | <property name="style"></property> | ||
| 8602 | <property name="subclass"></property> | ||
| 8603 | <property name="tooltip"></property> | ||
| 8604 | <property name="window_extra_style"></property> | ||
| 8605 | <property name="window_name"></property> | ||
| 8606 | <property name="window_style"></property> | ||
| 8607 | <event name="OnButtonClick">OnButtonDel17</event> | ||
| 8608 | <event name="OnChar"></event> | ||
| 8609 | <event name="OnEnterWindow"></event> | ||
| 8610 | <event name="OnEraseBackground"></event> | ||
| 8611 | <event name="OnKeyDown"></event> | ||
| 8612 | <event name="OnKeyUp"></event> | ||
| 8613 | <event name="OnKillFocus"></event> | ||
| 8614 | <event name="OnLeaveWindow"></event> | ||
| 8615 | <event name="OnLeftDClick"></event> | ||
| 8616 | <event name="OnLeftDown"></event> | ||
| 8617 | <event name="OnLeftUp"></event> | ||
| 8618 | <event name="OnMiddleDClick"></event> | ||
| 8619 | <event name="OnMiddleDown"></event> | ||
| 8620 | <event name="OnMiddleUp"></event> | ||
| 8621 | <event name="OnMotion"></event> | ||
| 8622 | <event name="OnMouseEvents"></event> | ||
| 8623 | <event name="OnMouseWheel"></event> | ||
| 8624 | <event name="OnPaint"></event> | ||
| 8625 | <event name="OnRightDClick"></event> | ||
| 8626 | <event name="OnRightDown"></event> | ||
| 8627 | <event name="OnRightUp"></event> | ||
| 8628 | <event name="OnSetFocus"></event> | ||
| 8629 | <event name="OnSize"></event> | ||
| 8630 | <event name="OnUpdateUI"></event> | ||
| 8631 | </object> | ||
| 8632 | </object> | ||
| 8633 | <object class="sizeritem" expanded="1"> | ||
| 8634 | <property name="border">5</property> | ||
| 8635 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 8636 | <property name="proportion">0</property> | ||
| 8637 | <object class="wxTextCtrl" expanded="1"> | ||
| 8638 | <property name="bg"></property> | ||
| 8639 | <property name="context_help"></property> | ||
| 8640 | <property name="enabled">1</property> | ||
| 8641 | <property name="fg"></property> | ||
| 8642 | <property name="font"></property> | ||
| 8643 | <property name="hidden">0</property> | ||
| 8644 | <property name="id">wxID_ANY</property> | ||
| 8645 | <property name="maximum_size"></property> | ||
| 8646 | <property name="maxlength">0</property> | ||
| 8647 | <property name="minimum_size">150,-1</property> | ||
| 8648 | <property name="name">m_textCtrlLabel18</property> | ||
| 8649 | <property name="permission">protected</property> | ||
| 8650 | <property name="pos"></property> | ||
| 8651 | <property name="size"></property> | ||
| 8652 | <property name="style"></property> | ||
| 8653 | <property name="subclass"></property> | ||
| 8654 | <property name="tooltip"></property> | ||
| 8655 | <property name="value"></property> | ||
| 8656 | <property name="window_extra_style"></property> | ||
| 8657 | <property name="window_name"></property> | ||
| 8658 | <property name="window_style"></property> | ||
| 8659 | <event name="OnChar"></event> | ||
| 8660 | <event name="OnEnterWindow"></event> | ||
| 8661 | <event name="OnEraseBackground"></event> | ||
| 8662 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8663 | <event name="OnKeyUp"></event> | ||
| 8664 | <event name="OnKillFocus"></event> | ||
| 8665 | <event name="OnLeaveWindow"></event> | ||
| 8666 | <event name="OnLeftDClick"></event> | ||
| 8667 | <event name="OnLeftDown"></event> | ||
| 8668 | <event name="OnLeftUp"></event> | ||
| 8669 | <event name="OnMiddleDClick"></event> | ||
| 8670 | <event name="OnMiddleDown"></event> | ||
| 8671 | <event name="OnMiddleUp"></event> | ||
| 8672 | <event name="OnMotion"></event> | ||
| 8673 | <event name="OnMouseEvents"></event> | ||
| 8674 | <event name="OnMouseWheel"></event> | ||
| 8675 | <event name="OnPaint"></event> | ||
| 8676 | <event name="OnRightDClick"></event> | ||
| 8677 | <event name="OnRightDown"></event> | ||
| 8678 | <event name="OnRightUp"></event> | ||
| 8679 | <event name="OnSetFocus"></event> | ||
| 8680 | <event name="OnSize"></event> | ||
| 8681 | <event name="OnText"></event> | ||
| 8682 | <event name="OnTextEnter"></event> | ||
| 8683 | <event name="OnTextMaxLen"></event> | ||
| 8684 | <event name="OnTextURL"></event> | ||
| 8685 | <event name="OnUpdateUI"></event> | ||
| 8686 | </object> | ||
| 8687 | </object> | ||
| 8688 | <object class="sizeritem" expanded="1"> | ||
| 8689 | <property name="border">5</property> | ||
| 8690 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 8691 | <property name="proportion">0</property> | ||
| 8692 | <object class="wxTextCtrl" expanded="1"> | ||
| 8693 | <property name="bg"></property> | ||
| 8694 | <property name="context_help"></property> | ||
| 8695 | <property name="enabled">1</property> | ||
| 8696 | <property name="fg"></property> | ||
| 8697 | <property name="font"></property> | ||
| 8698 | <property name="hidden">0</property> | ||
| 8699 | <property name="id">wxID_ANY</property> | ||
| 8700 | <property name="maximum_size">-1,-1</property> | ||
| 8701 | <property name="maxlength">0</property> | ||
| 8702 | <property name="minimum_size">-1,-1</property> | ||
| 8703 | <property name="name">m_textCtrlField18</property> | ||
| 8704 | <property name="permission">protected</property> | ||
| 8705 | <property name="pos"></property> | ||
| 8706 | <property name="size">-1,-1</property> | ||
| 8707 | <property name="style"></property> | ||
| 8708 | <property name="subclass"></property> | ||
| 8709 | <property name="tooltip"></property> | ||
| 8710 | <property name="value"></property> | ||
| 8711 | <property name="window_extra_style"></property> | ||
| 8712 | <property name="window_name"></property> | ||
| 8713 | <property name="window_style"></property> | ||
| 8714 | <event name="OnChar"></event> | ||
| 8715 | <event name="OnEnterWindow"></event> | ||
| 8716 | <event name="OnEraseBackground"></event> | ||
| 8717 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8718 | <event name="OnKeyUp"></event> | ||
| 8719 | <event name="OnKillFocus"></event> | ||
| 8720 | <event name="OnLeaveWindow"></event> | ||
| 8721 | <event name="OnLeftDClick"></event> | ||
| 8722 | <event name="OnLeftDown"></event> | ||
| 8723 | <event name="OnLeftUp"></event> | ||
| 8724 | <event name="OnMiddleDClick"></event> | ||
| 8725 | <event name="OnMiddleDown"></event> | ||
| 8726 | <event name="OnMiddleUp"></event> | ||
| 8727 | <event name="OnMotion"></event> | ||
| 8728 | <event name="OnMouseEvents"></event> | ||
| 8729 | <event name="OnMouseWheel"></event> | ||
| 8730 | <event name="OnPaint"></event> | ||
| 8731 | <event name="OnRightDClick"></event> | ||
| 8732 | <event name="OnRightDown"></event> | ||
| 8733 | <event name="OnRightUp"></event> | ||
| 8734 | <event name="OnSetFocus"></event> | ||
| 8735 | <event name="OnSize"></event> | ||
| 8736 | <event name="OnText"></event> | ||
| 8737 | <event name="OnTextEnter"></event> | ||
| 8738 | <event name="OnTextMaxLen"></event> | ||
| 8739 | <event name="OnTextURL"></event> | ||
| 8740 | <event name="OnUpdateUI"></event> | ||
| 8741 | </object> | ||
| 8742 | </object> | ||
| 8743 | <object class="sizeritem" expanded="1"> | ||
| 8744 | <property name="border">5</property> | ||
| 8745 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 8746 | <property name="proportion">0</property> | ||
| 8747 | <object class="wxButton" expanded="1"> | ||
| 8748 | <property name="bg"></property> | ||
| 8749 | <property name="context_help"></property> | ||
| 8750 | <property name="default">0</property> | ||
| 8751 | <property name="enabled">1</property> | ||
| 8752 | <property name="fg"></property> | ||
| 8753 | <property name="font"></property> | ||
| 8754 | <property name="hidden">0</property> | ||
| 8755 | <property name="id">wxID_DEL18</property> | ||
| 8756 | <property name="label">Delete</property> | ||
| 8757 | <property name="maximum_size"></property> | ||
| 8758 | <property name="minimum_size">-1,-1</property> | ||
| 8759 | <property name="name">m_buttonDel18</property> | ||
| 8760 | <property name="permission">protected</property> | ||
| 8761 | <property name="pos"></property> | ||
| 8762 | <property name="size">60,20</property> | ||
| 8763 | <property name="style"></property> | ||
| 8764 | <property name="subclass"></property> | ||
| 8765 | <property name="tooltip"></property> | ||
| 8766 | <property name="window_extra_style"></property> | ||
| 8767 | <property name="window_name"></property> | ||
| 8768 | <property name="window_style"></property> | ||
| 8769 | <event name="OnButtonClick">OnButtonDel18</event> | ||
| 8770 | <event name="OnChar"></event> | ||
| 8771 | <event name="OnEnterWindow"></event> | ||
| 8772 | <event name="OnEraseBackground"></event> | ||
| 8773 | <event name="OnKeyDown"></event> | ||
| 8774 | <event name="OnKeyUp"></event> | ||
| 8775 | <event name="OnKillFocus"></event> | ||
| 8776 | <event name="OnLeaveWindow"></event> | ||
| 8777 | <event name="OnLeftDClick"></event> | ||
| 8778 | <event name="OnLeftDown"></event> | ||
| 8779 | <event name="OnLeftUp"></event> | ||
| 8780 | <event name="OnMiddleDClick"></event> | ||
| 8781 | <event name="OnMiddleDown"></event> | ||
| 8782 | <event name="OnMiddleUp"></event> | ||
| 8783 | <event name="OnMotion"></event> | ||
| 8784 | <event name="OnMouseEvents"></event> | ||
| 8785 | <event name="OnMouseWheel"></event> | ||
| 8786 | <event name="OnPaint"></event> | ||
| 8787 | <event name="OnRightDClick"></event> | ||
| 8788 | <event name="OnRightDown"></event> | ||
| 8789 | <event name="OnRightUp"></event> | ||
| 8790 | <event name="OnSetFocus"></event> | ||
| 8791 | <event name="OnSize"></event> | ||
| 8792 | <event name="OnUpdateUI"></event> | ||
| 8793 | </object> | ||
| 8794 | </object> | ||
| 8795 | <object class="sizeritem" expanded="1"> | ||
| 8796 | <property name="border">5</property> | ||
| 8797 | <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property> | ||
| 8798 | <property name="proportion">0</property> | ||
| 8799 | <object class="wxTextCtrl" expanded="1"> | ||
| 8800 | <property name="bg"></property> | ||
| 8801 | <property name="context_help"></property> | ||
| 8802 | <property name="enabled">1</property> | ||
| 8803 | <property name="fg"></property> | ||
| 8804 | <property name="font"></property> | ||
| 8805 | <property name="hidden">0</property> | ||
| 8806 | <property name="id">wxID_ANY</property> | ||
| 8807 | <property name="maximum_size"></property> | ||
| 8808 | <property name="maxlength">0</property> | ||
| 8809 | <property name="minimum_size">150,-1</property> | ||
| 8810 | <property name="name">m_textCtrlLabel19</property> | ||
| 8811 | <property name="permission">protected</property> | ||
| 8812 | <property name="pos"></property> | ||
| 8813 | <property name="size"></property> | ||
| 8814 | <property name="style"></property> | ||
| 8815 | <property name="subclass"></property> | ||
| 8816 | <property name="tooltip"></property> | ||
| 8817 | <property name="value"></property> | ||
| 8818 | <property name="window_extra_style"></property> | ||
| 8819 | <property name="window_name"></property> | ||
| 8820 | <property name="window_style"></property> | ||
| 8821 | <event name="OnChar"></event> | ||
| 8822 | <event name="OnEnterWindow"></event> | ||
| 8823 | <event name="OnEraseBackground"></event> | ||
| 8824 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8825 | <event name="OnKeyUp"></event> | ||
| 8826 | <event name="OnKillFocus"></event> | ||
| 8827 | <event name="OnLeaveWindow"></event> | ||
| 8828 | <event name="OnLeftDClick"></event> | ||
| 8829 | <event name="OnLeftDown"></event> | ||
| 8830 | <event name="OnLeftUp"></event> | ||
| 8831 | <event name="OnMiddleDClick"></event> | ||
| 8832 | <event name="OnMiddleDown"></event> | ||
| 8833 | <event name="OnMiddleUp"></event> | ||
| 8834 | <event name="OnMotion"></event> | ||
| 8835 | <event name="OnMouseEvents"></event> | ||
| 8836 | <event name="OnMouseWheel"></event> | ||
| 8837 | <event name="OnPaint"></event> | ||
| 8838 | <event name="OnRightDClick"></event> | ||
| 8839 | <event name="OnRightDown"></event> | ||
| 8840 | <event name="OnRightUp"></event> | ||
| 8841 | <event name="OnSetFocus"></event> | ||
| 8842 | <event name="OnSize"></event> | ||
| 8843 | <event name="OnText"></event> | ||
| 8844 | <event name="OnTextEnter"></event> | ||
| 8845 | <event name="OnTextMaxLen"></event> | ||
| 8846 | <event name="OnTextURL"></event> | ||
| 8847 | <event name="OnUpdateUI"></event> | ||
| 8848 | </object> | ||
| 8849 | </object> | ||
| 8850 | <object class="sizeritem" expanded="1"> | ||
| 8851 | <property name="border">5</property> | ||
| 8852 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL</property> | ||
| 8853 | <property name="proportion">0</property> | ||
| 8854 | <object class="wxTextCtrl" expanded="1"> | ||
| 8855 | <property name="bg"></property> | ||
| 8856 | <property name="context_help"></property> | ||
| 8857 | <property name="enabled">1</property> | ||
| 8858 | <property name="fg"></property> | ||
| 8859 | <property name="font"></property> | ||
| 8860 | <property name="hidden">0</property> | ||
| 8861 | <property name="id">wxID_ANY</property> | ||
| 8862 | <property name="maximum_size">-1,-1</property> | ||
| 8863 | <property name="maxlength">0</property> | ||
| 8864 | <property name="minimum_size">-1,-1</property> | ||
| 8865 | <property name="name">m_textCtrlField19</property> | ||
| 8866 | <property name="permission">protected</property> | ||
| 8867 | <property name="pos"></property> | ||
| 8868 | <property name="size">-1,-1</property> | ||
| 8869 | <property name="style"></property> | ||
| 8870 | <property name="subclass"></property> | ||
| 8871 | <property name="tooltip"></property> | ||
| 8872 | <property name="value"></property> | ||
| 8873 | <property name="window_extra_style"></property> | ||
| 8874 | <property name="window_name"></property> | ||
| 8875 | <property name="window_style"></property> | ||
| 8876 | <event name="OnChar"></event> | ||
| 8877 | <event name="OnEnterWindow"></event> | ||
| 8878 | <event name="OnEraseBackground"></event> | ||
| 8879 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 8880 | <event name="OnKeyUp"></event> | ||
| 8881 | <event name="OnKillFocus"></event> | ||
| 8882 | <event name="OnLeaveWindow"></event> | ||
| 8883 | <event name="OnLeftDClick"></event> | ||
| 8884 | <event name="OnLeftDown"></event> | ||
| 8885 | <event name="OnLeftUp"></event> | ||
| 8886 | <event name="OnMiddleDClick"></event> | ||
| 8887 | <event name="OnMiddleDown"></event> | ||
| 8888 | <event name="OnMiddleUp"></event> | ||
| 8889 | <event name="OnMotion"></event> | ||
| 8890 | <event name="OnMouseEvents"></event> | ||
| 8891 | <event name="OnMouseWheel"></event> | ||
| 8892 | <event name="OnPaint"></event> | ||
| 8893 | <event name="OnRightDClick"></event> | ||
| 8894 | <event name="OnRightDown"></event> | ||
| 8895 | <event name="OnRightUp"></event> | ||
| 8896 | <event name="OnSetFocus"></event> | ||
| 8897 | <event name="OnSize"></event> | ||
| 8898 | <event name="OnText"></event> | ||
| 8899 | <event name="OnTextEnter"></event> | ||
| 8900 | <event name="OnTextMaxLen"></event> | ||
| 8901 | <event name="OnTextURL"></event> | ||
| 8902 | <event name="OnUpdateUI"></event> | ||
| 8903 | </object> | ||
| 8904 | </object> | ||
| 8905 | <object class="sizeritem" expanded="1"> | ||
| 8906 | <property name="border">5</property> | ||
| 8907 | <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT</property> | ||
| 8908 | <property name="proportion">0</property> | ||
| 8909 | <object class="wxButton" expanded="1"> | ||
| 8910 | <property name="bg"></property> | ||
| 8911 | <property name="context_help"></property> | ||
| 8912 | <property name="default">0</property> | ||
| 8913 | <property name="enabled">1</property> | ||
| 8914 | <property name="fg"></property> | ||
| 8915 | <property name="font"></property> | ||
| 8916 | <property name="hidden">0</property> | ||
| 8917 | <property name="id">wxID_DEL19</property> | ||
| 8918 | <property name="label">Delete</property> | ||
| 8919 | <property name="maximum_size"></property> | ||
| 8920 | <property name="minimum_size">-1,-1</property> | ||
| 8921 | <property name="name">m_buttonDel19</property> | ||
| 8922 | <property name="permission">protected</property> | ||
| 8923 | <property name="pos"></property> | ||
| 8924 | <property name="size">60,20</property> | ||
| 8925 | <property name="style"></property> | ||
| 8926 | <property name="subclass"></property> | ||
| 8927 | <property name="tooltip"></property> | ||
| 8928 | <property name="window_extra_style"></property> | ||
| 8929 | <property name="window_name"></property> | ||
| 8930 | <property name="window_style"></property> | ||
| 8931 | <event name="OnButtonClick">OnButtonDel19</event> | ||
| 8932 | <event name="OnChar"></event> | ||
| 8933 | <event name="OnEnterWindow"></event> | ||
| 8934 | <event name="OnEraseBackground"></event> | ||
| 8935 | <event name="OnKeyDown"></event> | ||
| 8936 | <event name="OnKeyUp"></event> | ||
| 8937 | <event name="OnKillFocus"></event> | ||
| 8938 | <event name="OnLeaveWindow"></event> | ||
| 8939 | <event name="OnLeftDClick"></event> | ||
| 8940 | <event name="OnLeftDown"></event> | ||
| 8941 | <event name="OnLeftUp"></event> | ||
| 8942 | <event name="OnMiddleDClick"></event> | ||
| 8943 | <event name="OnMiddleDown"></event> | ||
| 8944 | <event name="OnMiddleUp"></event> | ||
| 8945 | <event name="OnMotion"></event> | ||
| 8946 | <event name="OnMouseEvents"></event> | ||
| 8947 | <event name="OnMouseWheel"></event> | ||
| 8948 | <event name="OnPaint"></event> | ||
| 8949 | <event name="OnRightDClick"></event> | ||
| 8950 | <event name="OnRightDown"></event> | ||
| 8951 | <event name="OnRightUp"></event> | ||
| 8952 | <event name="OnSetFocus"></event> | ||
| 8953 | <event name="OnSize"></event> | ||
| 8954 | <event name="OnUpdateUI"></event> | ||
| 8955 | </object> | ||
| 8956 | </object> | ||
| 8957 | </object> | ||
| 8958 | </object> | ||
| 8959 | <object class="sizeritem" expanded="1"> | ||
| 8960 | <property name="border">5</property> | ||
| 8961 | <property name="flag">wxALIGN_CENTER_HORIZONTAL</property> | ||
| 8962 | <property name="proportion">0</property> | ||
| 8963 | <object class="wxBoxSizer" expanded="1"> | ||
| 8964 | <property name="minimum_size"></property> | ||
| 8965 | <property name="name">bSizer25</property> | ||
| 8966 | <property name="orient">wxHORIZONTAL</property> | ||
| 8967 | <property name="permission">none</property> | ||
| 8968 | <object class="sizeritem" expanded="1"> | ||
| 8969 | <property name="border">5</property> | ||
| 8970 | <property name="flag">wxALL</property> | ||
| 8971 | <property name="proportion">0</property> | ||
| 8972 | <object class="wxButton" expanded="1"> | ||
| 8973 | <property name="bg"></property> | ||
| 8974 | <property name="context_help"></property> | ||
| 8975 | <property name="default">0</property> | ||
| 8976 | <property name="enabled">1</property> | ||
| 8977 | <property name="fg"></property> | ||
| 8978 | <property name="font"></property> | ||
| 8979 | <property name="hidden">0</property> | ||
| 8980 | <property name="id">wxID_ANY</property> | ||
| 8981 | <property name="label">&Add Field</property> | ||
| 8982 | <property name="maximum_size"></property> | ||
| 8983 | <property name="minimum_size"></property> | ||
| 8984 | <property name="name">m_buttonAddField</property> | ||
| 8985 | <property name="permission">protected</property> | ||
| 8986 | <property name="pos"></property> | ||
| 8987 | <property name="size"></property> | ||
| 8988 | <property name="style"></property> | ||
| 8989 | <property name="subclass"></property> | ||
| 8990 | <property name="tooltip"></property> | ||
| 8991 | <property name="window_extra_style"></property> | ||
| 8992 | <property name="window_name"></property> | ||
| 8993 | <property name="window_style"></property> | ||
| 8994 | <event name="OnButtonClick">OnButtonAddField</event> | ||
| 8995 | <event name="OnChar"></event> | ||
| 8996 | <event name="OnEnterWindow"></event> | ||
| 8997 | <event name="OnEraseBackground"></event> | ||
| 8998 | <event name="OnKeyDown"></event> | ||
| 8999 | <event name="OnKeyUp"></event> | ||
| 9000 | <event name="OnKillFocus"></event> | ||
| 9001 | <event name="OnLeaveWindow"></event> | ||
| 9002 | <event name="OnLeftDClick"></event> | ||
| 9003 | <event name="OnLeftDown"></event> | ||
| 9004 | <event name="OnLeftUp"></event> | ||
| 9005 | <event name="OnMiddleDClick"></event> | ||
| 9006 | <event name="OnMiddleDown"></event> | ||
| 9007 | <event name="OnMiddleUp"></event> | ||
| 9008 | <event name="OnMotion"></event> | ||
| 9009 | <event name="OnMouseEvents"></event> | ||
| 9010 | <event name="OnMouseWheel"></event> | ||
| 9011 | <event name="OnPaint"></event> | ||
| 9012 | <event name="OnRightDClick"></event> | ||
| 9013 | <event name="OnRightDown"></event> | ||
| 9014 | <event name="OnRightUp"></event> | ||
| 9015 | <event name="OnSetFocus"></event> | ||
| 9016 | <event name="OnSize"></event> | ||
| 9017 | <event name="OnUpdateUI"></event> | ||
| 9018 | </object> | ||
| 9019 | </object> | ||
| 9020 | </object> | ||
| 9021 | </object> | ||
| 9022 | </object> | ||
| 9023 | </object> | ||
| 9024 | </object> | ||
| 9025 | <object class="sizeritem" expanded="1"> | ||
| 9026 | <property name="border">5</property> | ||
| 9027 | <property name="flag">wxALIGN_RIGHT</property> | ||
| 9028 | <property name="proportion">0</property> | ||
| 9029 | <object class="wxBoxSizer" expanded="1"> | ||
| 9030 | <property name="minimum_size"></property> | ||
| 9031 | <property name="name">bSizer26</property> | ||
| 9032 | <property name="orient">wxHORIZONTAL</property> | ||
| 9033 | <property name="permission">none</property> | ||
| 9034 | <object class="sizeritem" expanded="1"> | ||
| 9035 | <property name="border">5</property> | ||
| 9036 | <property name="flag">wxALL</property> | ||
| 9037 | <property name="proportion">0</property> | ||
| 9038 | <object class="wxButton" expanded="1"> | ||
| 9039 | <property name="bg"></property> | ||
| 9040 | <property name="context_help"></property> | ||
| 9041 | <property name="default">0</property> | ||
| 9042 | <property name="enabled">1</property> | ||
| 9043 | <property name="fg"></property> | ||
| 9044 | <property name="font"></property> | ||
| 9045 | <property name="hidden">0</property> | ||
| 9046 | <property name="id">wxID_BUTTONSEND</property> | ||
| 9047 | <property name="label">&Send</property> | ||
| 9048 | <property name="maximum_size"></property> | ||
| 9049 | <property name="minimum_size">85,25</property> | ||
| 9050 | <property name="name">m_buttonOK</property> | ||
| 9051 | <property name="permission">protected</property> | ||
| 9052 | <property name="pos"></property> | ||
| 9053 | <property name="size"></property> | ||
| 9054 | <property name="style"></property> | ||
| 9055 | <property name="subclass"></property> | ||
| 9056 | <property name="tooltip"></property> | ||
| 9057 | <property name="window_extra_style"></property> | ||
| 9058 | <property name="window_name"></property> | ||
| 9059 | <property name="window_style"></property> | ||
| 9060 | <event name="OnButtonClick">OnButtonSend</event> | ||
| 9061 | <event name="OnChar"></event> | ||
| 9062 | <event name="OnEnterWindow"></event> | ||
| 9063 | <event name="OnEraseBackground"></event> | ||
| 9064 | <event name="OnKeyDown"></event> | ||
| 9065 | <event name="OnKeyUp"></event> | ||
| 9066 | <event name="OnKillFocus"></event> | ||
| 9067 | <event name="OnLeaveWindow"></event> | ||
| 9068 | <event name="OnLeftDClick"></event> | ||
| 9069 | <event name="OnLeftDown"></event> | ||
| 9070 | <event name="OnLeftUp"></event> | ||
| 9071 | <event name="OnMiddleDClick"></event> | ||
| 9072 | <event name="OnMiddleDown"></event> | ||
| 9073 | <event name="OnMiddleUp"></event> | ||
| 9074 | <event name="OnMotion"></event> | ||
| 9075 | <event name="OnMouseEvents"></event> | ||
| 9076 | <event name="OnMouseWheel"></event> | ||
| 9077 | <event name="OnPaint"></event> | ||
| 9078 | <event name="OnRightDClick"></event> | ||
| 9079 | <event name="OnRightDown"></event> | ||
| 9080 | <event name="OnRightUp"></event> | ||
| 9081 | <event name="OnSetFocus"></event> | ||
| 9082 | <event name="OnSize"></event> | ||
| 9083 | <event name="OnUpdateUI"></event> | ||
| 9084 | </object> | ||
| 9085 | </object> | ||
| 9086 | <object class="sizeritem" expanded="1"> | ||
| 9087 | <property name="border">5</property> | ||
| 9088 | <property name="flag">wxALL</property> | ||
| 9089 | <property name="proportion">0</property> | ||
| 9090 | <object class="wxButton" expanded="1"> | ||
| 9091 | <property name="bg"></property> | ||
| 9092 | <property name="context_help"></property> | ||
| 9093 | <property name="default">0</property> | ||
| 9094 | <property name="enabled">1</property> | ||
| 9095 | <property name="fg"></property> | ||
| 9096 | <property name="font"></property> | ||
| 9097 | <property name="hidden">0</property> | ||
| 9098 | <property name="id">wxID_BUTTONPREVIEW</property> | ||
| 9099 | <property name="label">&Preview</property> | ||
| 9100 | <property name="maximum_size"></property> | ||
| 9101 | <property name="minimum_size">85,25</property> | ||
| 9102 | <property name="name">m_buttonPreview</property> | ||
| 9103 | <property name="permission">protected</property> | ||
| 9104 | <property name="pos"></property> | ||
| 9105 | <property name="size"></property> | ||
| 9106 | <property name="style"></property> | ||
| 9107 | <property name="subclass"></property> | ||
| 9108 | <property name="tooltip"></property> | ||
| 9109 | <property name="window_extra_style"></property> | ||
| 9110 | <property name="window_name"></property> | ||
| 9111 | <property name="window_style"></property> | ||
| 9112 | <event name="OnButtonClick">OnButtonPreview</event> | ||
| 9113 | <event name="OnChar"></event> | ||
| 9114 | <event name="OnEnterWindow"></event> | ||
| 9115 | <event name="OnEraseBackground"></event> | ||
| 9116 | <event name="OnKeyDown"></event> | ||
| 9117 | <event name="OnKeyUp"></event> | ||
| 9118 | <event name="OnKillFocus"></event> | ||
| 9119 | <event name="OnLeaveWindow"></event> | ||
| 9120 | <event name="OnLeftDClick"></event> | ||
| 9121 | <event name="OnLeftDown"></event> | ||
| 9122 | <event name="OnLeftUp"></event> | ||
| 9123 | <event name="OnMiddleDClick"></event> | ||
| 9124 | <event name="OnMiddleDown"></event> | ||
| 9125 | <event name="OnMiddleUp"></event> | ||
| 9126 | <event name="OnMotion"></event> | ||
| 9127 | <event name="OnMouseEvents"></event> | ||
| 9128 | <event name="OnMouseWheel"></event> | ||
| 9129 | <event name="OnPaint"></event> | ||
| 9130 | <event name="OnRightDClick"></event> | ||
| 9131 | <event name="OnRightDown"></event> | ||
| 9132 | <event name="OnRightUp"></event> | ||
| 9133 | <event name="OnSetFocus"></event> | ||
| 9134 | <event name="OnSize"></event> | ||
| 9135 | <event name="OnUpdateUI"></event> | ||
| 9136 | </object> | ||
| 9137 | </object> | ||
| 9138 | <object class="sizeritem" expanded="1"> | ||
| 9139 | <property name="border">5</property> | ||
| 9140 | <property name="flag">wxALL</property> | ||
| 9141 | <property name="proportion">0</property> | ||
| 9142 | <object class="wxButton" expanded="1"> | ||
| 9143 | <property name="bg"></property> | ||
| 9144 | <property name="context_help"></property> | ||
| 9145 | <property name="default">0</property> | ||
| 9146 | <property name="enabled">1</property> | ||
| 9147 | <property name="fg"></property> | ||
| 9148 | <property name="font"></property> | ||
| 9149 | <property name="hidden">0</property> | ||
| 9150 | <property name="id">wxID_CANCEL</property> | ||
| 9151 | <property name="label">Cancel</property> | ||
| 9152 | <property name="maximum_size"></property> | ||
| 9153 | <property name="minimum_size">85,25</property> | ||
| 9154 | <property name="name">m_buttonCancel</property> | ||
| 9155 | <property name="permission">protected</property> | ||
| 9156 | <property name="pos"></property> | ||
| 9157 | <property name="size"></property> | ||
| 9158 | <property name="style"></property> | ||
| 9159 | <property name="subclass"></property> | ||
| 9160 | <property name="tooltip"></property> | ||
| 9161 | <property name="window_extra_style"></property> | ||
| 9162 | <property name="window_name"></property> | ||
| 9163 | <property name="window_style"></property> | ||
| 9164 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 9165 | <event name="OnChar"></event> | ||
| 9166 | <event name="OnEnterWindow"></event> | ||
| 9167 | <event name="OnEraseBackground"></event> | ||
| 9168 | <event name="OnKeyDown"></event> | ||
| 9169 | <event name="OnKeyUp"></event> | ||
| 9170 | <event name="OnKillFocus"></event> | ||
| 9171 | <event name="OnLeaveWindow"></event> | ||
| 9172 | <event name="OnLeftDClick"></event> | ||
| 9173 | <event name="OnLeftDown"></event> | ||
| 9174 | <event name="OnLeftUp"></event> | ||
| 9175 | <event name="OnMiddleDClick"></event> | ||
| 9176 | <event name="OnMiddleDown"></event> | ||
| 9177 | <event name="OnMiddleUp"></event> | ||
| 9178 | <event name="OnMotion"></event> | ||
| 9179 | <event name="OnMouseEvents"></event> | ||
| 9180 | <event name="OnMouseWheel"></event> | ||
| 9181 | <event name="OnPaint"></event> | ||
| 9182 | <event name="OnRightDClick"></event> | ||
| 9183 | <event name="OnRightDown"></event> | ||
| 9184 | <event name="OnRightUp"></event> | ||
| 9185 | <event name="OnSetFocus"></event> | ||
| 9186 | <event name="OnSize"></event> | ||
| 9187 | <event name="OnUpdateUI"></event> | ||
| 9188 | </object> | ||
| 9189 | </object> | ||
| 9190 | </object> | ||
| 9191 | </object> | ||
| 9192 | </object> | ||
| 9193 | </object> | ||
| 9194 | <object class="Frame" expanded="0"> | ||
| 9195 | <property name="bg">wxSYS_COLOUR_MENU</property> | ||
| 9196 | <property name="center"></property> | ||
| 9197 | <property name="context_help"></property> | ||
| 9198 | <property name="enabled">1</property> | ||
| 9199 | <property name="extra_style"></property> | ||
| 9200 | <property name="fg"></property> | ||
| 9201 | <property name="font"></property> | ||
| 9202 | <property name="hidden">0</property> | ||
| 9203 | <property name="id">wxID_ANY</property> | ||
| 9204 | <property name="maximum_size"></property> | ||
| 9205 | <property name="minimum_size"></property> | ||
| 9206 | <property name="name">CViewProductDialogBase</property> | ||
| 9207 | <property name="pos"></property> | ||
| 9208 | <property name="size">630,520</property> | ||
| 9209 | <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property> | ||
| 9210 | <property name="subclass"></property> | ||
| 9211 | <property name="title">Order Form</property> | ||
| 9212 | <property name="tooltip"></property> | ||
| 9213 | <property name="window_extra_style"></property> | ||
| 9214 | <property name="window_name"></property> | ||
| 9215 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 9216 | <property name="xrc_skip_sizer">1</property> | ||
| 9217 | <event name="OnActivate"></event> | ||
| 9218 | <event name="OnActivateApp"></event> | ||
| 9219 | <event name="OnChar"></event> | ||
| 9220 | <event name="OnClose"></event> | ||
| 9221 | <event name="OnEnterWindow"></event> | ||
| 9222 | <event name="OnEraseBackground"></event> | ||
| 9223 | <event name="OnHibernate"></event> | ||
| 9224 | <event name="OnIconize"></event> | ||
| 9225 | <event name="OnIdle"></event> | ||
| 9226 | <event name="OnKeyDown"></event> | ||
| 9227 | <event name="OnKeyUp"></event> | ||
| 9228 | <event name="OnKillFocus"></event> | ||
| 9229 | <event name="OnLeaveWindow"></event> | ||
| 9230 | <event name="OnLeftDClick"></event> | ||
| 9231 | <event name="OnLeftDown"></event> | ||
| 9232 | <event name="OnLeftUp"></event> | ||
| 9233 | <event name="OnMiddleDClick"></event> | ||
| 9234 | <event name="OnMiddleDown"></event> | ||
| 9235 | <event name="OnMiddleUp"></event> | ||
| 9236 | <event name="OnMotion"></event> | ||
| 9237 | <event name="OnMouseEvents"></event> | ||
| 9238 | <event name="OnMouseWheel"></event> | ||
| 9239 | <event name="OnPaint"></event> | ||
| 9240 | <event name="OnRightDClick"></event> | ||
| 9241 | <event name="OnRightDown"></event> | ||
| 9242 | <event name="OnRightUp"></event> | ||
| 9243 | <event name="OnSetFocus"></event> | ||
| 9244 | <event name="OnSize"></event> | ||
| 9245 | <event name="OnUpdateUI"></event> | ||
| 9246 | <object class="wxBoxSizer" expanded="1"> | ||
| 9247 | <property name="minimum_size"></property> | ||
| 9248 | <property name="name">bSizer20</property> | ||
| 9249 | <property name="orient">wxVERTICAL</property> | ||
| 9250 | <property name="permission">none</property> | ||
| 9251 | <object class="sizeritem" expanded="1"> | ||
| 9252 | <property name="border">5</property> | ||
| 9253 | <property name="flag">wxEXPAND</property> | ||
| 9254 | <property name="proportion">1</property> | ||
| 9255 | <object class="wxBoxSizer" expanded="1"> | ||
| 9256 | <property name="minimum_size"></property> | ||
| 9257 | <property name="name">bSizer116</property> | ||
| 9258 | <property name="orient">wxHORIZONTAL</property> | ||
| 9259 | <property name="permission">none</property> | ||
| 9260 | <object class="sizeritem" expanded="1"> | ||
| 9261 | <property name="border">5</property> | ||
| 9262 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 9263 | <property name="proportion">1</property> | ||
| 9264 | <object class="wxHtmlWindow" expanded="1"> | ||
| 9265 | <property name="bg"></property> | ||
| 9266 | <property name="context_help"></property> | ||
| 9267 | <property name="enabled">1</property> | ||
| 9268 | <property name="fg"></property> | ||
| 9269 | <property name="font"></property> | ||
| 9270 | <property name="hidden">1</property> | ||
| 9271 | <property name="id">wxID_ANY</property> | ||
| 9272 | <property name="maximum_size"></property> | ||
| 9273 | <property name="minimum_size"></property> | ||
| 9274 | <property name="name">m_htmlWinReviews</property> | ||
| 9275 | <property name="permission">protected</property> | ||
| 9276 | <property name="pos"></property> | ||
| 9277 | <property name="size"></property> | ||
| 9278 | <property name="style">wxHW_SCROLLBAR_AUTO</property> | ||
| 9279 | <property name="subclass"></property> | ||
| 9280 | <property name="tooltip"></property> | ||
| 9281 | <property name="window_extra_style"></property> | ||
| 9282 | <property name="window_name"></property> | ||
| 9283 | <property name="window_style"></property> | ||
| 9284 | <event name="OnChar"></event> | ||
| 9285 | <event name="OnEnterWindow"></event> | ||
| 9286 | <event name="OnEraseBackground"></event> | ||
| 9287 | <event name="OnHtmlCellClicked"></event> | ||
| 9288 | <event name="OnHtmlCellHover"></event> | ||
| 9289 | <event name="OnHtmlLinkClicked"></event> | ||
| 9290 | <event name="OnKeyDown"></event> | ||
| 9291 | <event name="OnKeyUp"></event> | ||
| 9292 | <event name="OnKillFocus"></event> | ||
| 9293 | <event name="OnLeaveWindow"></event> | ||
| 9294 | <event name="OnLeftDClick"></event> | ||
| 9295 | <event name="OnLeftDown"></event> | ||
| 9296 | <event name="OnLeftUp"></event> | ||
| 9297 | <event name="OnMiddleDClick"></event> | ||
| 9298 | <event name="OnMiddleDown"></event> | ||
| 9299 | <event name="OnMiddleUp"></event> | ||
| 9300 | <event name="OnMotion"></event> | ||
| 9301 | <event name="OnMouseEvents"></event> | ||
| 9302 | <event name="OnMouseWheel"></event> | ||
| 9303 | <event name="OnPaint"></event> | ||
| 9304 | <event name="OnRightDClick"></event> | ||
| 9305 | <event name="OnRightDown"></event> | ||
| 9306 | <event name="OnRightUp"></event> | ||
| 9307 | <event name="OnSetFocus"></event> | ||
| 9308 | <event name="OnSize"></event> | ||
| 9309 | <event name="OnUpdateUI"></event> | ||
| 9310 | </object> | ||
| 9311 | </object> | ||
| 9312 | <object class="sizeritem" expanded="1"> | ||
| 9313 | <property name="border">5</property> | ||
| 9314 | <property name="flag">wxEXPAND|wxALL</property> | ||
| 9315 | <property name="proportion">1</property> | ||
| 9316 | <object class="wxScrolledWindow" expanded="1"> | ||
| 9317 | <property name="bg">wxSYS_COLOUR_WINDOW</property> | ||
| 9318 | <property name="context_help"></property> | ||
| 9319 | <property name="enabled">1</property> | ||
| 9320 | <property name="fg"></property> | ||
| 9321 | <property name="font"></property> | ||
| 9322 | <property name="hidden">0</property> | ||
| 9323 | <property name="id">wxID_ANY</property> | ||
| 9324 | <property name="maximum_size"></property> | ||
| 9325 | <property name="minimum_size"></property> | ||
| 9326 | <property name="name">m_scrolledWindow</property> | ||
| 9327 | <property name="permission">protected</property> | ||
| 9328 | <property name="pos"></property> | ||
| 9329 | <property name="scroll_rate_x">5</property> | ||
| 9330 | <property name="scroll_rate_y">5</property> | ||
| 9331 | <property name="size"></property> | ||
| 9332 | <property name="subclass"></property> | ||
| 9333 | <property name="tooltip"></property> | ||
| 9334 | <property name="window_extra_style"></property> | ||
| 9335 | <property name="window_name"></property> | ||
| 9336 | <property name="window_style">wxHSCROLL|wxTAB_TRAVERSAL|wxVSCROLL</property> | ||
| 9337 | <event name="OnChar"></event> | ||
| 9338 | <event name="OnEnterWindow"></event> | ||
| 9339 | <event name="OnEraseBackground"></event> | ||
| 9340 | <event name="OnKeyDown"></event> | ||
| 9341 | <event name="OnKeyUp"></event> | ||
| 9342 | <event name="OnKillFocus"></event> | ||
| 9343 | <event name="OnLeaveWindow"></event> | ||
| 9344 | <event name="OnLeftDClick"></event> | ||
| 9345 | <event name="OnLeftDown"></event> | ||
| 9346 | <event name="OnLeftUp"></event> | ||
| 9347 | <event name="OnMiddleDClick"></event> | ||
| 9348 | <event name="OnMiddleDown"></event> | ||
| 9349 | <event name="OnMiddleUp"></event> | ||
| 9350 | <event name="OnMotion"></event> | ||
| 9351 | <event name="OnMouseEvents"></event> | ||
| 9352 | <event name="OnMouseWheel"></event> | ||
| 9353 | <event name="OnPaint"></event> | ||
| 9354 | <event name="OnRightDClick"></event> | ||
| 9355 | <event name="OnRightDown"></event> | ||
| 9356 | <event name="OnRightUp"></event> | ||
| 9357 | <event name="OnSetFocus"></event> | ||
| 9358 | <event name="OnSize"></event> | ||
| 9359 | <event name="OnUpdateUI"></event> | ||
| 9360 | <object class="wxBoxSizer" expanded="1"> | ||
| 9361 | <property name="minimum_size"></property> | ||
| 9362 | <property name="name">bSizer21</property> | ||
| 9363 | <property name="orient">wxVERTICAL</property> | ||
| 9364 | <property name="permission">none</property> | ||
| 9365 | <object class="sizeritem" expanded="1"> | ||
| 9366 | <property name="border">5</property> | ||
| 9367 | <property name="flag">wxEXPAND</property> | ||
| 9368 | <property name="proportion">0</property> | ||
| 9369 | <object class="wxRichTextCtrl" expanded="1"> | ||
| 9370 | <property name="bg"></property> | ||
| 9371 | <property name="context_help"></property> | ||
| 9372 | <property name="enabled">1</property> | ||
| 9373 | <property name="fg"></property> | ||
| 9374 | <property name="font"></property> | ||
| 9375 | <property name="hidden">0</property> | ||
| 9376 | <property name="id">wxID_ANY</property> | ||
| 9377 | <property name="maximum_size"></property> | ||
| 9378 | <property name="minimum_size">-1,-1</property> | ||
| 9379 | <property name="name">m_richTextHeading</property> | ||
| 9380 | <property name="permission">protected</property> | ||
| 9381 | <property name="pos"></property> | ||
| 9382 | <property name="size">-1,50</property> | ||
| 9383 | <property name="style">wxTE_READONLY</property> | ||
| 9384 | <property name="subclass"></property> | ||
| 9385 | <property name="tooltip"></property> | ||
| 9386 | <property name="window_extra_style"></property> | ||
| 9387 | <property name="window_name"></property> | ||
| 9388 | <property name="window_style">wxNO_BORDER</property> | ||
| 9389 | <event name="OnChar"></event> | ||
| 9390 | <event name="OnEnterWindow"></event> | ||
| 9391 | <event name="OnEraseBackground"></event> | ||
| 9392 | <event name="OnKeyDown"></event> | ||
| 9393 | <event name="OnKeyUp"></event> | ||
| 9394 | <event name="OnKillFocus"></event> | ||
| 9395 | <event name="OnLeaveWindow"></event> | ||
| 9396 | <event name="OnLeftDClick"></event> | ||
| 9397 | <event name="OnLeftDown"></event> | ||
| 9398 | <event name="OnLeftUp"></event> | ||
| 9399 | <event name="OnMiddleDClick"></event> | ||
| 9400 | <event name="OnMiddleDown"></event> | ||
| 9401 | <event name="OnMiddleUp"></event> | ||
| 9402 | <event name="OnMotion"></event> | ||
| 9403 | <event name="OnMouseEvents"></event> | ||
| 9404 | <event name="OnMouseWheel"></event> | ||
| 9405 | <event name="OnPaint"></event> | ||
| 9406 | <event name="OnRichTextCharacter"></event> | ||
| 9407 | <event name="OnRichTextContentDeleted"></event> | ||
| 9408 | <event name="OnRichTextContentInserted"></event> | ||
| 9409 | <event name="OnRichTextDelete"></event> | ||
| 9410 | <event name="OnRichTextReturn"></event> | ||
| 9411 | <event name="OnRichTextStyleChanged"></event> | ||
| 9412 | <event name="OnRichTextStyleSheetChanged"></event> | ||
| 9413 | <event name="OnRichTextStyleSheetReplaced"></event> | ||
| 9414 | <event name="OnRichTextStyleSheetReplacing"></event> | ||
| 9415 | <event name="OnRightDClick"></event> | ||
| 9416 | <event name="OnRightDown"></event> | ||
| 9417 | <event name="OnRightUp"></event> | ||
| 9418 | <event name="OnSetFocus"></event> | ||
| 9419 | <event name="OnSize"></event> | ||
| 9420 | <event name="OnText"></event> | ||
| 9421 | <event name="OnTextEnter"></event> | ||
| 9422 | <event name="OnTextMaxLen"></event> | ||
| 9423 | <event name="OnTextURL"></event> | ||
| 9424 | <event name="OnUpdateUI"></event> | ||
| 9425 | </object> | ||
| 9426 | </object> | ||
| 9427 | <object class="sizeritem" expanded="1"> | ||
| 9428 | <property name="border">5</property> | ||
| 9429 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 9430 | <property name="proportion">0</property> | ||
| 9431 | <object class="wxStaticText" expanded="1"> | ||
| 9432 | <property name="bg"></property> | ||
| 9433 | <property name="context_help"></property> | ||
| 9434 | <property name="enabled">1</property> | ||
| 9435 | <property name="fg"></property> | ||
| 9436 | <property name="font"></property> | ||
| 9437 | <property name="hidden">0</property> | ||
| 9438 | <property name="id">wxID_ANY</property> | ||
| 9439 | <property name="label">Order Form instructions here
multiple lines
1
2
3
4
5
6</property> | ||
| 9440 | <property name="maximum_size"></property> | ||
| 9441 | <property name="minimum_size"></property> | ||
| 9442 | <property name="name">m_staticTextInstructions</property> | ||
| 9443 | <property name="permission">protected</property> | ||
| 9444 | <property name="pos"></property> | ||
| 9445 | <property name="size"></property> | ||
| 9446 | <property name="style"></property> | ||
| 9447 | <property name="subclass"></property> | ||
| 9448 | <property name="tooltip"></property> | ||
| 9449 | <property name="window_extra_style"></property> | ||
| 9450 | <property name="window_name"></property> | ||
| 9451 | <property name="window_style"></property> | ||
| 9452 | <property name="wrap">-1</property> | ||
| 9453 | <event name="OnChar"></event> | ||
| 9454 | <event name="OnEnterWindow"></event> | ||
| 9455 | <event name="OnEraseBackground"></event> | ||
| 9456 | <event name="OnKeyDown"></event> | ||
| 9457 | <event name="OnKeyUp"></event> | ||
| 9458 | <event name="OnKillFocus"></event> | ||
| 9459 | <event name="OnLeaveWindow"></event> | ||
| 9460 | <event name="OnLeftDClick"></event> | ||
| 9461 | <event name="OnLeftDown"></event> | ||
| 9462 | <event name="OnLeftUp"></event> | ||
| 9463 | <event name="OnMiddleDClick"></event> | ||
| 9464 | <event name="OnMiddleDown"></event> | ||
| 9465 | <event name="OnMiddleUp"></event> | ||
| 9466 | <event name="OnMotion"></event> | ||
| 9467 | <event name="OnMouseEvents"></event> | ||
| 9468 | <event name="OnMouseWheel"></event> | ||
| 9469 | <event name="OnPaint"></event> | ||
| 9470 | <event name="OnRightDClick"></event> | ||
| 9471 | <event name="OnRightDown"></event> | ||
| 9472 | <event name="OnRightUp"></event> | ||
| 9473 | <event name="OnSetFocus"></event> | ||
| 9474 | <event name="OnSize"></event> | ||
| 9475 | <event name="OnUpdateUI"></event> | ||
| 9476 | </object> | ||
| 9477 | </object> | ||
| 9478 | <object class="sizeritem" expanded="1"> | ||
| 9479 | <property name="border">5</property> | ||
| 9480 | <property name="flag">wxALIGN_CENTER_HORIZONTAL</property> | ||
| 9481 | <property name="proportion">0</property> | ||
| 9482 | <object class="wxBoxSizer" expanded="1"> | ||
| 9483 | <property name="minimum_size"></property> | ||
| 9484 | <property name="name">bSizer25</property> | ||
| 9485 | <property name="orient">wxHORIZONTAL</property> | ||
| 9486 | <property name="permission">none</property> | ||
| 9487 | <object class="sizeritem" expanded="1"> | ||
| 9488 | <property name="border">5</property> | ||
| 9489 | <property name="flag">wxALL</property> | ||
| 9490 | <property name="proportion">0</property> | ||
| 9491 | <object class="wxButton" expanded="1"> | ||
| 9492 | <property name="bg"></property> | ||
| 9493 | <property name="context_help"></property> | ||
| 9494 | <property name="default">0</property> | ||
| 9495 | <property name="enabled">1</property> | ||
| 9496 | <property name="fg"></property> | ||
| 9497 | <property name="font"></property> | ||
| 9498 | <property name="hidden">0</property> | ||
| 9499 | <property name="id">wxID_BUTTONSAMPLE</property> | ||
| 9500 | <property name="label">&Submit</property> | ||
| 9501 | <property name="maximum_size"></property> | ||
| 9502 | <property name="minimum_size">-1,-1</property> | ||
| 9503 | <property name="name">m_buttonSubmitForm</property> | ||
| 9504 | <property name="permission">protected</property> | ||
| 9505 | <property name="pos"></property> | ||
| 9506 | <property name="size"></property> | ||
| 9507 | <property name="style"></property> | ||
| 9508 | <property name="subclass"></property> | ||
| 9509 | <property name="tooltip"></property> | ||
| 9510 | <property name="window_extra_style"></property> | ||
| 9511 | <property name="window_name"></property> | ||
| 9512 | <property name="window_style"></property> | ||
| 9513 | <event name="OnButtonClick">OnButtonSubmitForm</event> | ||
| 9514 | <event name="OnChar"></event> | ||
| 9515 | <event name="OnEnterWindow"></event> | ||
| 9516 | <event name="OnEraseBackground"></event> | ||
| 9517 | <event name="OnKeyDown"></event> | ||
| 9518 | <event name="OnKeyUp"></event> | ||
| 9519 | <event name="OnKillFocus"></event> | ||
| 9520 | <event name="OnLeaveWindow"></event> | ||
| 9521 | <event name="OnLeftDClick"></event> | ||
| 9522 | <event name="OnLeftDown"></event> | ||
| 9523 | <event name="OnLeftUp"></event> | ||
| 9524 | <event name="OnMiddleDClick"></event> | ||
| 9525 | <event name="OnMiddleDown"></event> | ||
| 9526 | <event name="OnMiddleUp"></event> | ||
| 9527 | <event name="OnMotion"></event> | ||
| 9528 | <event name="OnMouseEvents"></event> | ||
| 9529 | <event name="OnMouseWheel"></event> | ||
| 9530 | <event name="OnPaint"></event> | ||
| 9531 | <event name="OnRightDClick"></event> | ||
| 9532 | <event name="OnRightDown"></event> | ||
| 9533 | <event name="OnRightUp"></event> | ||
| 9534 | <event name="OnSetFocus"></event> | ||
| 9535 | <event name="OnSize"></event> | ||
| 9536 | <event name="OnUpdateUI"></event> | ||
| 9537 | </object> | ||
| 9538 | </object> | ||
| 9539 | <object class="sizeritem" expanded="1"> | ||
| 9540 | <property name="border">5</property> | ||
| 9541 | <property name="flag">wxALL</property> | ||
| 9542 | <property name="proportion">0</property> | ||
| 9543 | <object class="wxButton" expanded="1"> | ||
| 9544 | <property name="bg"></property> | ||
| 9545 | <property name="context_help"></property> | ||
| 9546 | <property name="default">0</property> | ||
| 9547 | <property name="enabled">1</property> | ||
| 9548 | <property name="fg"></property> | ||
| 9549 | <property name="font"></property> | ||
| 9550 | <property name="hidden">0</property> | ||
| 9551 | <property name="id">wxID_CANCEL2</property> | ||
| 9552 | <property name="label">Cancel</property> | ||
| 9553 | <property name="maximum_size"></property> | ||
| 9554 | <property name="minimum_size"></property> | ||
| 9555 | <property name="name">m_buttonCancelForm</property> | ||
| 9556 | <property name="permission">protected</property> | ||
| 9557 | <property name="pos"></property> | ||
| 9558 | <property name="size"></property> | ||
| 9559 | <property name="style"></property> | ||
| 9560 | <property name="subclass"></property> | ||
| 9561 | <property name="tooltip"></property> | ||
| 9562 | <property name="window_extra_style"></property> | ||
| 9563 | <property name="window_name"></property> | ||
| 9564 | <property name="window_style"></property> | ||
| 9565 | <event name="OnButtonClick">OnButtonCancelForm</event> | ||
| 9566 | <event name="OnChar"></event> | ||
| 9567 | <event name="OnEnterWindow"></event> | ||
| 9568 | <event name="OnEraseBackground"></event> | ||
| 9569 | <event name="OnKeyDown"></event> | ||
| 9570 | <event name="OnKeyUp"></event> | ||
| 9571 | <event name="OnKillFocus"></event> | ||
| 9572 | <event name="OnLeaveWindow"></event> | ||
| 9573 | <event name="OnLeftDClick"></event> | ||
| 9574 | <event name="OnLeftDown"></event> | ||
| 9575 | <event name="OnLeftUp"></event> | ||
| 9576 | <event name="OnMiddleDClick"></event> | ||
| 9577 | <event name="OnMiddleDown"></event> | ||
| 9578 | <event name="OnMiddleUp"></event> | ||
| 9579 | <event name="OnMotion"></event> | ||
| 9580 | <event name="OnMouseEvents"></event> | ||
| 9581 | <event name="OnMouseWheel"></event> | ||
| 9582 | <event name="OnPaint"></event> | ||
| 9583 | <event name="OnRightDClick"></event> | ||
| 9584 | <event name="OnRightDown"></event> | ||
| 9585 | <event name="OnRightUp"></event> | ||
| 9586 | <event name="OnSetFocus"></event> | ||
| 9587 | <event name="OnSize"></event> | ||
| 9588 | <event name="OnUpdateUI"></event> | ||
| 9589 | </object> | ||
| 9590 | </object> | ||
| 9591 | </object> | ||
| 9592 | </object> | ||
| 9593 | </object> | ||
| 9594 | </object> | ||
| 9595 | </object> | ||
| 9596 | </object> | ||
| 9597 | </object> | ||
| 9598 | <object class="sizeritem" expanded="1"> | ||
| 9599 | <property name="border">5</property> | ||
| 9600 | <property name="flag">wxALIGN_RIGHT</property> | ||
| 9601 | <property name="proportion">0</property> | ||
| 9602 | <object class="wxBoxSizer" expanded="1"> | ||
| 9603 | <property name="minimum_size"></property> | ||
| 9604 | <property name="name">bSizer26</property> | ||
| 9605 | <property name="orient">wxHORIZONTAL</property> | ||
| 9606 | <property name="permission">none</property> | ||
| 9607 | <object class="sizeritem" expanded="1"> | ||
| 9608 | <property name="border">5</property> | ||
| 9609 | <property name="flag">wxALL</property> | ||
| 9610 | <property name="proportion">0</property> | ||
| 9611 | <object class="wxButton" expanded="1"> | ||
| 9612 | <property name="bg"></property> | ||
| 9613 | <property name="context_help"></property> | ||
| 9614 | <property name="default">0</property> | ||
| 9615 | <property name="enabled">0</property> | ||
| 9616 | <property name="fg"></property> | ||
| 9617 | <property name="font"></property> | ||
| 9618 | <property name="hidden">0</property> | ||
| 9619 | <property name="id">wxID_BUTTONBACK</property> | ||
| 9620 | <property name="label">< &Back </property> | ||
| 9621 | <property name="maximum_size"></property> | ||
| 9622 | <property name="minimum_size">85,25</property> | ||
| 9623 | <property name="name">m_buttonBack</property> | ||
| 9624 | <property name="permission">protected</property> | ||
| 9625 | <property name="pos"></property> | ||
| 9626 | <property name="size"></property> | ||
| 9627 | <property name="style"></property> | ||
| 9628 | <property name="subclass"></property> | ||
| 9629 | <property name="tooltip"></property> | ||
| 9630 | <property name="window_extra_style"></property> | ||
| 9631 | <property name="window_name"></property> | ||
| 9632 | <property name="window_style"></property> | ||
| 9633 | <event name="OnButtonClick">OnButtonBack</event> | ||
| 9634 | <event name="OnChar"></event> | ||
| 9635 | <event name="OnEnterWindow"></event> | ||
| 9636 | <event name="OnEraseBackground"></event> | ||
| 9637 | <event name="OnKeyDown"></event> | ||
| 9638 | <event name="OnKeyUp"></event> | ||
| 9639 | <event name="OnKillFocus"></event> | ||
| 9640 | <event name="OnLeaveWindow"></event> | ||
| 9641 | <event name="OnLeftDClick"></event> | ||
| 9642 | <event name="OnLeftDown"></event> | ||
| 9643 | <event name="OnLeftUp"></event> | ||
| 9644 | <event name="OnMiddleDClick"></event> | ||
| 9645 | <event name="OnMiddleDown"></event> | ||
| 9646 | <event name="OnMiddleUp"></event> | ||
| 9647 | <event name="OnMotion"></event> | ||
| 9648 | <event name="OnMouseEvents"></event> | ||
| 9649 | <event name="OnMouseWheel"></event> | ||
| 9650 | <event name="OnPaint"></event> | ||
| 9651 | <event name="OnRightDClick"></event> | ||
| 9652 | <event name="OnRightDown"></event> | ||
| 9653 | <event name="OnRightUp"></event> | ||
| 9654 | <event name="OnSetFocus"></event> | ||
| 9655 | <event name="OnSize"></event> | ||
| 9656 | <event name="OnUpdateUI"></event> | ||
| 9657 | </object> | ||
| 9658 | </object> | ||
| 9659 | <object class="sizeritem" expanded="1"> | ||
| 9660 | <property name="border">5</property> | ||
| 9661 | <property name="flag">wxALL</property> | ||
| 9662 | <property name="proportion">0</property> | ||
| 9663 | <object class="wxButton" expanded="1"> | ||
| 9664 | <property name="bg"></property> | ||
| 9665 | <property name="context_help"></property> | ||
| 9666 | <property name="default">0</property> | ||
| 9667 | <property name="enabled">1</property> | ||
| 9668 | <property name="fg"></property> | ||
| 9669 | <property name="font"></property> | ||
| 9670 | <property name="hidden">0</property> | ||
| 9671 | <property name="id">wxID_BUTTONNEXT</property> | ||
| 9672 | <property name="label"> &Next ></property> | ||
| 9673 | <property name="maximum_size"></property> | ||
| 9674 | <property name="minimum_size">85,25</property> | ||
| 9675 | <property name="name">m_buttonNext</property> | ||
| 9676 | <property name="permission">protected</property> | ||
| 9677 | <property name="pos"></property> | ||
| 9678 | <property name="size"></property> | ||
| 9679 | <property name="style"></property> | ||
| 9680 | <property name="subclass"></property> | ||
| 9681 | <property name="tooltip"></property> | ||
| 9682 | <property name="window_extra_style"></property> | ||
| 9683 | <property name="window_name"></property> | ||
| 9684 | <property name="window_style"></property> | ||
| 9685 | <event name="OnButtonClick">OnButtonNext</event> | ||
| 9686 | <event name="OnChar"></event> | ||
| 9687 | <event name="OnEnterWindow"></event> | ||
| 9688 | <event name="OnEraseBackground"></event> | ||
| 9689 | <event name="OnKeyDown"></event> | ||
| 9690 | <event name="OnKeyUp"></event> | ||
| 9691 | <event name="OnKillFocus"></event> | ||
| 9692 | <event name="OnLeaveWindow"></event> | ||
| 9693 | <event name="OnLeftDClick"></event> | ||
| 9694 | <event name="OnLeftDown"></event> | ||
| 9695 | <event name="OnLeftUp"></event> | ||
| 9696 | <event name="OnMiddleDClick"></event> | ||
| 9697 | <event name="OnMiddleDown"></event> | ||
| 9698 | <event name="OnMiddleUp"></event> | ||
| 9699 | <event name="OnMotion"></event> | ||
| 9700 | <event name="OnMouseEvents"></event> | ||
| 9701 | <event name="OnMouseWheel"></event> | ||
| 9702 | <event name="OnPaint"></event> | ||
| 9703 | <event name="OnRightDClick"></event> | ||
| 9704 | <event name="OnRightDown"></event> | ||
| 9705 | <event name="OnRightUp"></event> | ||
| 9706 | <event name="OnSetFocus"></event> | ||
| 9707 | <event name="OnSize"></event> | ||
| 9708 | <event name="OnUpdateUI"></event> | ||
| 9709 | </object> | ||
| 9710 | </object> | ||
| 9711 | <object class="sizeritem" expanded="1"> | ||
| 9712 | <property name="border">5</property> | ||
| 9713 | <property name="flag">wxALL</property> | ||
| 9714 | <property name="proportion">0</property> | ||
| 9715 | <object class="wxButton" expanded="1"> | ||
| 9716 | <property name="bg"></property> | ||
| 9717 | <property name="context_help"></property> | ||
| 9718 | <property name="default">0</property> | ||
| 9719 | <property name="enabled">1</property> | ||
| 9720 | <property name="fg"></property> | ||
| 9721 | <property name="font"></property> | ||
| 9722 | <property name="hidden">0</property> | ||
| 9723 | <property name="id">wxID_CANCEL</property> | ||
| 9724 | <property name="label">Cancel</property> | ||
| 9725 | <property name="maximum_size"></property> | ||
| 9726 | <property name="minimum_size">85,25</property> | ||
| 9727 | <property name="name">m_buttonCancel</property> | ||
| 9728 | <property name="permission">protected</property> | ||
| 9729 | <property name="pos"></property> | ||
| 9730 | <property name="size"></property> | ||
| 9731 | <property name="style"></property> | ||
| 9732 | <property name="subclass"></property> | ||
| 9733 | <property name="tooltip"></property> | ||
| 9734 | <property name="window_extra_style"></property> | ||
| 9735 | <property name="window_name"></property> | ||
| 9736 | <property name="window_style"></property> | ||
| 9737 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 9738 | <event name="OnChar"></event> | ||
| 9739 | <event name="OnEnterWindow"></event> | ||
| 9740 | <event name="OnEraseBackground"></event> | ||
| 9741 | <event name="OnKeyDown"></event> | ||
| 9742 | <event name="OnKeyUp"></event> | ||
| 9743 | <event name="OnKillFocus"></event> | ||
| 9744 | <event name="OnLeaveWindow"></event> | ||
| 9745 | <event name="OnLeftDClick"></event> | ||
| 9746 | <event name="OnLeftDown"></event> | ||
| 9747 | <event name="OnLeftUp"></event> | ||
| 9748 | <event name="OnMiddleDClick"></event> | ||
| 9749 | <event name="OnMiddleDown"></event> | ||
| 9750 | <event name="OnMiddleUp"></event> | ||
| 9751 | <event name="OnMotion"></event> | ||
| 9752 | <event name="OnMouseEvents"></event> | ||
| 9753 | <event name="OnMouseWheel"></event> | ||
| 9754 | <event name="OnPaint"></event> | ||
| 9755 | <event name="OnRightDClick"></event> | ||
| 9756 | <event name="OnRightDown"></event> | ||
| 9757 | <event name="OnRightUp"></event> | ||
| 9758 | <event name="OnSetFocus"></event> | ||
| 9759 | <event name="OnSize"></event> | ||
| 9760 | <event name="OnUpdateUI"></event> | ||
| 9761 | </object> | ||
| 9762 | </object> | ||
| 9763 | </object> | ||
| 9764 | </object> | ||
| 9765 | </object> | ||
| 9766 | </object> | ||
| 9767 | <object class="Frame" expanded="0"> | ||
| 9768 | <property name="bg">wxSYS_COLOUR_MENU</property> | ||
| 9769 | <property name="center"></property> | ||
| 9770 | <property name="context_help"></property> | ||
| 9771 | <property name="enabled">1</property> | ||
| 9772 | <property name="extra_style"></property> | ||
| 9773 | <property name="fg"></property> | ||
| 9774 | <property name="font"></property> | ||
| 9775 | <property name="hidden">0</property> | ||
| 9776 | <property name="id">wxID_ANY</property> | ||
| 9777 | <property name="maximum_size"></property> | ||
| 9778 | <property name="minimum_size"></property> | ||
| 9779 | <property name="name">CViewOrderDialogBase</property> | ||
| 9780 | <property name="pos"></property> | ||
| 9781 | <property name="size">630,520</property> | ||
| 9782 | <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property> | ||
| 9783 | <property name="subclass"></property> | ||
| 9784 | <property name="title">View Order</property> | ||
| 9785 | <property name="tooltip"></property> | ||
| 9786 | <property name="window_extra_style"></property> | ||
| 9787 | <property name="window_name"></property> | ||
| 9788 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 9789 | <property name="xrc_skip_sizer">1</property> | ||
| 9790 | <event name="OnActivate"></event> | ||
| 9791 | <event name="OnActivateApp"></event> | ||
| 9792 | <event name="OnChar"></event> | ||
| 9793 | <event name="OnClose"></event> | ||
| 9794 | <event name="OnEnterWindow"></event> | ||
| 9795 | <event name="OnEraseBackground"></event> | ||
| 9796 | <event name="OnHibernate"></event> | ||
| 9797 | <event name="OnIconize"></event> | ||
| 9798 | <event name="OnIdle"></event> | ||
| 9799 | <event name="OnKeyDown"></event> | ||
| 9800 | <event name="OnKeyUp"></event> | ||
| 9801 | <event name="OnKillFocus"></event> | ||
| 9802 | <event name="OnLeaveWindow"></event> | ||
| 9803 | <event name="OnLeftDClick"></event> | ||
| 9804 | <event name="OnLeftDown"></event> | ||
| 9805 | <event name="OnLeftUp"></event> | ||
| 9806 | <event name="OnMiddleDClick"></event> | ||
| 9807 | <event name="OnMiddleDown"></event> | ||
| 9808 | <event name="OnMiddleUp"></event> | ||
| 9809 | <event name="OnMotion"></event> | ||
| 9810 | <event name="OnMouseEvents"></event> | ||
| 9811 | <event name="OnMouseWheel"></event> | ||
| 9812 | <event name="OnPaint"></event> | ||
| 9813 | <event name="OnRightDClick"></event> | ||
| 9814 | <event name="OnRightDown"></event> | ||
| 9815 | <event name="OnRightUp"></event> | ||
| 9816 | <event name="OnSetFocus"></event> | ||
| 9817 | <event name="OnSize"></event> | ||
| 9818 | <event name="OnUpdateUI"></event> | ||
| 9819 | <object class="wxBoxSizer" expanded="1"> | ||
| 9820 | <property name="minimum_size"></property> | ||
| 9821 | <property name="name">bSizer20</property> | ||
| 9822 | <property name="orient">wxVERTICAL</property> | ||
| 9823 | <property name="permission">none</property> | ||
| 9824 | <object class="sizeritem" expanded="1"> | ||
| 9825 | <property name="border">5</property> | ||
| 9826 | <property name="flag">wxEXPAND</property> | ||
| 9827 | <property name="proportion">1</property> | ||
| 9828 | <object class="wxBoxSizer" expanded="1"> | ||
| 9829 | <property name="minimum_size"></property> | ||
| 9830 | <property name="name">bSizer116</property> | ||
| 9831 | <property name="orient">wxHORIZONTAL</property> | ||
| 9832 | <property name="permission">none</property> | ||
| 9833 | <object class="sizeritem" expanded="1"> | ||
| 9834 | <property name="border">5</property> | ||
| 9835 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 9836 | <property name="proportion">1</property> | ||
| 9837 | <object class="wxHtmlWindow" expanded="1"> | ||
| 9838 | <property name="bg"></property> | ||
| 9839 | <property name="context_help"></property> | ||
| 9840 | <property name="enabled">1</property> | ||
| 9841 | <property name="fg"></property> | ||
| 9842 | <property name="font"></property> | ||
| 9843 | <property name="hidden">0</property> | ||
| 9844 | <property name="id">wxID_ANY</property> | ||
| 9845 | <property name="maximum_size"></property> | ||
| 9846 | <property name="minimum_size"></property> | ||
| 9847 | <property name="name">m_htmlWin</property> | ||
| 9848 | <property name="permission">protected</property> | ||
| 9849 | <property name="pos"></property> | ||
| 9850 | <property name="size"></property> | ||
| 9851 | <property name="style">wxHW_SCROLLBAR_AUTO</property> | ||
| 9852 | <property name="subclass"></property> | ||
| 9853 | <property name="tooltip"></property> | ||
| 9854 | <property name="window_extra_style"></property> | ||
| 9855 | <property name="window_name"></property> | ||
| 9856 | <property name="window_style"></property> | ||
| 9857 | <event name="OnChar"></event> | ||
| 9858 | <event name="OnEnterWindow"></event> | ||
| 9859 | <event name="OnEraseBackground"></event> | ||
| 9860 | <event name="OnHtmlCellClicked"></event> | ||
| 9861 | <event name="OnHtmlCellHover"></event> | ||
| 9862 | <event name="OnHtmlLinkClicked"></event> | ||
| 9863 | <event name="OnKeyDown"></event> | ||
| 9864 | <event name="OnKeyUp"></event> | ||
| 9865 | <event name="OnKillFocus"></event> | ||
| 9866 | <event name="OnLeaveWindow"></event> | ||
| 9867 | <event name="OnLeftDClick"></event> | ||
| 9868 | <event name="OnLeftDown"></event> | ||
| 9869 | <event name="OnLeftUp"></event> | ||
| 9870 | <event name="OnMiddleDClick"></event> | ||
| 9871 | <event name="OnMiddleDown"></event> | ||
| 9872 | <event name="OnMiddleUp"></event> | ||
| 9873 | <event name="OnMotion"></event> | ||
| 9874 | <event name="OnMouseEvents"></event> | ||
| 9875 | <event name="OnMouseWheel"></event> | ||
| 9876 | <event name="OnPaint"></event> | ||
| 9877 | <event name="OnRightDClick"></event> | ||
| 9878 | <event name="OnRightDown"></event> | ||
| 9879 | <event name="OnRightUp"></event> | ||
| 9880 | <event name="OnSetFocus"></event> | ||
| 9881 | <event name="OnSize"></event> | ||
| 9882 | <event name="OnUpdateUI"></event> | ||
| 9883 | </object> | ||
| 9884 | </object> | ||
| 9885 | </object> | ||
| 9886 | </object> | ||
| 9887 | <object class="sizeritem" expanded="1"> | ||
| 9888 | <property name="border">5</property> | ||
| 9889 | <property name="flag">wxALIGN_RIGHT</property> | ||
| 9890 | <property name="proportion">0</property> | ||
| 9891 | <object class="wxBoxSizer" expanded="1"> | ||
| 9892 | <property name="minimum_size"></property> | ||
| 9893 | <property name="name">bSizer26</property> | ||
| 9894 | <property name="orient">wxHORIZONTAL</property> | ||
| 9895 | <property name="permission">none</property> | ||
| 9896 | <object class="sizeritem" expanded="1"> | ||
| 9897 | <property name="border">5</property> | ||
| 9898 | <property name="flag">wxALL</property> | ||
| 9899 | <property name="proportion">0</property> | ||
| 9900 | <object class="wxButton" expanded="1"> | ||
| 9901 | <property name="bg"></property> | ||
| 9902 | <property name="context_help"></property> | ||
| 9903 | <property name="default">0</property> | ||
| 9904 | <property name="enabled">1</property> | ||
| 9905 | <property name="fg"></property> | ||
| 9906 | <property name="font"></property> | ||
| 9907 | <property name="hidden">0</property> | ||
| 9908 | <property name="id">wxID_OK</property> | ||
| 9909 | <property name="label">OK</property> | ||
| 9910 | <property name="maximum_size"></property> | ||
| 9911 | <property name="minimum_size">85,25</property> | ||
| 9912 | <property name="name">m_buttonOK</property> | ||
| 9913 | <property name="permission">protected</property> | ||
| 9914 | <property name="pos"></property> | ||
| 9915 | <property name="size"></property> | ||
| 9916 | <property name="style"></property> | ||
| 9917 | <property name="subclass"></property> | ||
| 9918 | <property name="tooltip"></property> | ||
| 9919 | <property name="window_extra_style"></property> | ||
| 9920 | <property name="window_name"></property> | ||
| 9921 | <property name="window_style"></property> | ||
| 9922 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 9923 | <event name="OnChar"></event> | ||
| 9924 | <event name="OnEnterWindow"></event> | ||
| 9925 | <event name="OnEraseBackground"></event> | ||
| 9926 | <event name="OnKeyDown"></event> | ||
| 9927 | <event name="OnKeyUp"></event> | ||
| 9928 | <event name="OnKillFocus"></event> | ||
| 9929 | <event name="OnLeaveWindow"></event> | ||
| 9930 | <event name="OnLeftDClick"></event> | ||
| 9931 | <event name="OnLeftDown"></event> | ||
| 9932 | <event name="OnLeftUp"></event> | ||
| 9933 | <event name="OnMiddleDClick"></event> | ||
| 9934 | <event name="OnMiddleDown"></event> | ||
| 9935 | <event name="OnMiddleUp"></event> | ||
| 9936 | <event name="OnMotion"></event> | ||
| 9937 | <event name="OnMouseEvents"></event> | ||
| 9938 | <event name="OnMouseWheel"></event> | ||
| 9939 | <event name="OnPaint"></event> | ||
| 9940 | <event name="OnRightDClick"></event> | ||
| 9941 | <event name="OnRightDown"></event> | ||
| 9942 | <event name="OnRightUp"></event> | ||
| 9943 | <event name="OnSetFocus"></event> | ||
| 9944 | <event name="OnSize"></event> | ||
| 9945 | <event name="OnUpdateUI"></event> | ||
| 9946 | </object> | ||
| 9947 | </object> | ||
| 9948 | </object> | ||
| 9949 | </object> | ||
| 9950 | </object> | ||
| 9951 | </object> | ||
| 9952 | <object class="Frame" expanded="0"> | ||
| 9953 | <property name="bg">wxSYS_COLOUR_MENU</property> | ||
| 9954 | <property name="center"></property> | ||
| 9955 | <property name="context_help"></property> | ||
| 9956 | <property name="enabled">1</property> | ||
| 9957 | <property name="extra_style"></property> | ||
| 9958 | <property name="fg"></property> | ||
| 9959 | <property name="font"></property> | ||
| 9960 | <property name="hidden">0</property> | ||
| 9961 | <property name="id">wxID_ANY</property> | ||
| 9962 | <property name="maximum_size"></property> | ||
| 9963 | <property name="minimum_size"></property> | ||
| 9964 | <property name="name">CEditReviewDialogBase</property> | ||
| 9965 | <property name="pos"></property> | ||
| 9966 | <property name="size">630,440</property> | ||
| 9967 | <property name="style">wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER</property> | ||
| 9968 | <property name="subclass"></property> | ||
| 9969 | <property name="title">Enter Review</property> | ||
| 9970 | <property name="tooltip"></property> | ||
| 9971 | <property name="window_extra_style"></property> | ||
| 9972 | <property name="window_name"></property> | ||
| 9973 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 9974 | <property name="xrc_skip_sizer">1</property> | ||
| 9975 | <event name="OnActivate"></event> | ||
| 9976 | <event name="OnActivateApp"></event> | ||
| 9977 | <event name="OnChar"></event> | ||
| 9978 | <event name="OnClose"></event> | ||
| 9979 | <event name="OnEnterWindow"></event> | ||
| 9980 | <event name="OnEraseBackground"></event> | ||
| 9981 | <event name="OnHibernate"></event> | ||
| 9982 | <event name="OnIconize"></event> | ||
| 9983 | <event name="OnIdle"></event> | ||
| 9984 | <event name="OnKeyDown"></event> | ||
| 9985 | <event name="OnKeyUp"></event> | ||
| 9986 | <event name="OnKillFocus"></event> | ||
| 9987 | <event name="OnLeaveWindow"></event> | ||
| 9988 | <event name="OnLeftDClick"></event> | ||
| 9989 | <event name="OnLeftDown"></event> | ||
| 9990 | <event name="OnLeftUp"></event> | ||
| 9991 | <event name="OnMiddleDClick"></event> | ||
| 9992 | <event name="OnMiddleDown"></event> | ||
| 9993 | <event name="OnMiddleUp"></event> | ||
| 9994 | <event name="OnMotion"></event> | ||
| 9995 | <event name="OnMouseEvents"></event> | ||
| 9996 | <event name="OnMouseWheel"></event> | ||
| 9997 | <event name="OnPaint"></event> | ||
| 9998 | <event name="OnRightDClick"></event> | ||
| 9999 | <event name="OnRightDown"></event> | ||
| 10000 | <event name="OnRightUp"></event> | ||
| 10001 | <event name="OnSetFocus"></event> | ||
| 10002 | <event name="OnSize"></event> | ||
| 10003 | <event name="OnUpdateUI"></event> | ||
| 10004 | <object class="wxBoxSizer" expanded="1"> | ||
| 10005 | <property name="minimum_size"></property> | ||
| 10006 | <property name="name">bSizer112</property> | ||
| 10007 | <property name="orient">wxVERTICAL</property> | ||
| 10008 | <property name="permission">none</property> | ||
| 10009 | <object class="sizeritem" expanded="1"> | ||
| 10010 | <property name="border">5</property> | ||
| 10011 | <property name="flag"></property> | ||
| 10012 | <property name="proportion">0</property> | ||
| 10013 | <object class="spacer" expanded="1"> | ||
| 10014 | <property name="height">3</property> | ||
| 10015 | <property name="permission">protected</property> | ||
| 10016 | <property name="width">0</property> | ||
| 10017 | </object> | ||
| 10018 | </object> | ||
| 10019 | <object class="sizeritem" expanded="1"> | ||
| 10020 | <property name="border">5</property> | ||
| 10021 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 10022 | <property name="proportion">0</property> | ||
| 10023 | <object class="wxStaticText" expanded="1"> | ||
| 10024 | <property name="bg"></property> | ||
| 10025 | <property name="context_help"></property> | ||
| 10026 | <property name="enabled">1</property> | ||
| 10027 | <property name="fg"></property> | ||
| 10028 | <property name="font"></property> | ||
| 10029 | <property name="hidden">0</property> | ||
| 10030 | <property name="id">wxID_ANY</property> | ||
| 10031 | <property name="label"></property> | ||
| 10032 | <property name="maximum_size"></property> | ||
| 10033 | <property name="minimum_size"></property> | ||
| 10034 | <property name="name">m_staticTextSeller</property> | ||
| 10035 | <property name="permission">protected</property> | ||
| 10036 | <property name="pos"></property> | ||
| 10037 | <property name="size"></property> | ||
| 10038 | <property name="style"></property> | ||
| 10039 | <property name="subclass"></property> | ||
| 10040 | <property name="tooltip"></property> | ||
| 10041 | <property name="window_extra_style"></property> | ||
| 10042 | <property name="window_name"></property> | ||
| 10043 | <property name="window_style"></property> | ||
| 10044 | <property name="wrap">-1</property> | ||
| 10045 | <event name="OnChar"></event> | ||
| 10046 | <event name="OnEnterWindow"></event> | ||
| 10047 | <event name="OnEraseBackground"></event> | ||
| 10048 | <event name="OnKeyDown"></event> | ||
| 10049 | <event name="OnKeyUp"></event> | ||
| 10050 | <event name="OnKillFocus"></event> | ||
| 10051 | <event name="OnLeaveWindow"></event> | ||
| 10052 | <event name="OnLeftDClick"></event> | ||
| 10053 | <event name="OnLeftDown"></event> | ||
| 10054 | <event name="OnLeftUp"></event> | ||
| 10055 | <event name="OnMiddleDClick"></event> | ||
| 10056 | <event name="OnMiddleDown"></event> | ||
| 10057 | <event name="OnMiddleUp"></event> | ||
| 10058 | <event name="OnMotion"></event> | ||
| 10059 | <event name="OnMouseEvents"></event> | ||
| 10060 | <event name="OnMouseWheel"></event> | ||
| 10061 | <event name="OnPaint"></event> | ||
| 10062 | <event name="OnRightDClick"></event> | ||
| 10063 | <event name="OnRightDown"></event> | ||
| 10064 | <event name="OnRightUp"></event> | ||
| 10065 | <event name="OnSetFocus"></event> | ||
| 10066 | <event name="OnSize"></event> | ||
| 10067 | <event name="OnUpdateUI"></event> | ||
| 10068 | </object> | ||
| 10069 | </object> | ||
| 10070 | <object class="sizeritem" expanded="1"> | ||
| 10071 | <property name="border">5</property> | ||
| 10072 | <property name="flag"></property> | ||
| 10073 | <property name="proportion">0</property> | ||
| 10074 | <object class="spacer" expanded="1"> | ||
| 10075 | <property name="height">3</property> | ||
| 10076 | <property name="permission">protected</property> | ||
| 10077 | <property name="width">0</property> | ||
| 10078 | </object> | ||
| 10079 | </object> | ||
| 10080 | <object class="sizeritem" expanded="1"> | ||
| 10081 | <property name="border">5</property> | ||
| 10082 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 10083 | <property name="proportion">0</property> | ||
| 10084 | <object class="wxStaticText" expanded="1"> | ||
| 10085 | <property name="bg"></property> | ||
| 10086 | <property name="context_help"></property> | ||
| 10087 | <property name="enabled">1</property> | ||
| 10088 | <property name="fg"></property> | ||
| 10089 | <property name="font"></property> | ||
| 10090 | <property name="hidden">0</property> | ||
| 10091 | <property name="id">wxID_ANY</property> | ||
| 10092 | <property name="label">Rating</property> | ||
| 10093 | <property name="maximum_size"></property> | ||
| 10094 | <property name="minimum_size"></property> | ||
| 10095 | <property name="name">m_staticText110</property> | ||
| 10096 | <property name="permission">protected</property> | ||
| 10097 | <property name="pos"></property> | ||
| 10098 | <property name="size"></property> | ||
| 10099 | <property name="style"></property> | ||
| 10100 | <property name="subclass"></property> | ||
| 10101 | <property name="tooltip"></property> | ||
| 10102 | <property name="window_extra_style"></property> | ||
| 10103 | <property name="window_name"></property> | ||
| 10104 | <property name="window_style"></property> | ||
| 10105 | <property name="wrap">-1</property> | ||
| 10106 | <event name="OnChar"></event> | ||
| 10107 | <event name="OnEnterWindow"></event> | ||
| 10108 | <event name="OnEraseBackground"></event> | ||
| 10109 | <event name="OnKeyDown"></event> | ||
| 10110 | <event name="OnKeyUp"></event> | ||
| 10111 | <event name="OnKillFocus"></event> | ||
| 10112 | <event name="OnLeaveWindow"></event> | ||
| 10113 | <event name="OnLeftDClick"></event> | ||
| 10114 | <event name="OnLeftDown"></event> | ||
| 10115 | <event name="OnLeftUp"></event> | ||
| 10116 | <event name="OnMiddleDClick"></event> | ||
| 10117 | <event name="OnMiddleDown"></event> | ||
| 10118 | <event name="OnMiddleUp"></event> | ||
| 10119 | <event name="OnMotion"></event> | ||
| 10120 | <event name="OnMouseEvents"></event> | ||
| 10121 | <event name="OnMouseWheel"></event> | ||
| 10122 | <event name="OnPaint"></event> | ||
| 10123 | <event name="OnRightDClick"></event> | ||
| 10124 | <event name="OnRightDown"></event> | ||
| 10125 | <event name="OnRightUp"></event> | ||
| 10126 | <event name="OnSetFocus"></event> | ||
| 10127 | <event name="OnSize"></event> | ||
| 10128 | <event name="OnUpdateUI"></event> | ||
| 10129 | </object> | ||
| 10130 | </object> | ||
| 10131 | <object class="sizeritem" expanded="1"> | ||
| 10132 | <property name="border">5</property> | ||
| 10133 | <property name="flag">wxALL</property> | ||
| 10134 | <property name="proportion">0</property> | ||
| 10135 | <object class="wxChoice" expanded="1"> | ||
| 10136 | <property name="bg"></property> | ||
| 10137 | <property name="choices">" 1 star" " 2 stars" " 3 stars" " 4 stars" " 5 stars"</property> | ||
| 10138 | <property name="context_help"></property> | ||
| 10139 | <property name="enabled">1</property> | ||
| 10140 | <property name="fg"></property> | ||
| 10141 | <property name="font"></property> | ||
| 10142 | <property name="hidden">0</property> | ||
| 10143 | <property name="id">wxID_ANY</property> | ||
| 10144 | <property name="maximum_size"></property> | ||
| 10145 | <property name="minimum_size"></property> | ||
| 10146 | <property name="name">m_choiceStars</property> | ||
| 10147 | <property name="permission">protected</property> | ||
| 10148 | <property name="pos"></property> | ||
| 10149 | <property name="selection">0</property> | ||
| 10150 | <property name="size"></property> | ||
| 10151 | <property name="subclass"></property> | ||
| 10152 | <property name="tooltip"></property> | ||
| 10153 | <property name="window_extra_style"></property> | ||
| 10154 | <property name="window_name"></property> | ||
| 10155 | <property name="window_style"></property> | ||
| 10156 | <event name="OnChar"></event> | ||
| 10157 | <event name="OnChoice"></event> | ||
| 10158 | <event name="OnEnterWindow"></event> | ||
| 10159 | <event name="OnEraseBackground"></event> | ||
| 10160 | <event name="OnKeyDown"></event> | ||
| 10161 | <event name="OnKeyUp"></event> | ||
| 10162 | <event name="OnKillFocus"></event> | ||
| 10163 | <event name="OnLeaveWindow"></event> | ||
| 10164 | <event name="OnLeftDClick"></event> | ||
| 10165 | <event name="OnLeftDown"></event> | ||
| 10166 | <event name="OnLeftUp"></event> | ||
| 10167 | <event name="OnMiddleDClick"></event> | ||
| 10168 | <event name="OnMiddleDown"></event> | ||
| 10169 | <event name="OnMiddleUp"></event> | ||
| 10170 | <event name="OnMotion"></event> | ||
| 10171 | <event name="OnMouseEvents"></event> | ||
| 10172 | <event name="OnMouseWheel"></event> | ||
| 10173 | <event name="OnPaint"></event> | ||
| 10174 | <event name="OnRightDClick"></event> | ||
| 10175 | <event name="OnRightDown"></event> | ||
| 10176 | <event name="OnRightUp"></event> | ||
| 10177 | <event name="OnSetFocus"></event> | ||
| 10178 | <event name="OnSize"></event> | ||
| 10179 | <event name="OnUpdateUI"></event> | ||
| 10180 | </object> | ||
| 10181 | </object> | ||
| 10182 | <object class="sizeritem" expanded="1"> | ||
| 10183 | <property name="border">5</property> | ||
| 10184 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 10185 | <property name="proportion">0</property> | ||
| 10186 | <object class="wxStaticText" expanded="1"> | ||
| 10187 | <property name="bg"></property> | ||
| 10188 | <property name="context_help"></property> | ||
| 10189 | <property name="enabled">1</property> | ||
| 10190 | <property name="fg"></property> | ||
| 10191 | <property name="font"></property> | ||
| 10192 | <property name="hidden">0</property> | ||
| 10193 | <property name="id">wxID_ANY</property> | ||
| 10194 | <property name="label">Review</property> | ||
| 10195 | <property name="maximum_size"></property> | ||
| 10196 | <property name="minimum_size"></property> | ||
| 10197 | <property name="name">m_staticText43</property> | ||
| 10198 | <property name="permission">protected</property> | ||
| 10199 | <property name="pos"></property> | ||
| 10200 | <property name="size"></property> | ||
| 10201 | <property name="style"></property> | ||
| 10202 | <property name="subclass"></property> | ||
| 10203 | <property name="tooltip"></property> | ||
| 10204 | <property name="window_extra_style"></property> | ||
| 10205 | <property name="window_name"></property> | ||
| 10206 | <property name="window_style"></property> | ||
| 10207 | <property name="wrap">-1</property> | ||
| 10208 | <event name="OnChar"></event> | ||
| 10209 | <event name="OnEnterWindow"></event> | ||
| 10210 | <event name="OnEraseBackground"></event> | ||
| 10211 | <event name="OnKeyDown"></event> | ||
| 10212 | <event name="OnKeyUp"></event> | ||
| 10213 | <event name="OnKillFocus"></event> | ||
| 10214 | <event name="OnLeaveWindow"></event> | ||
| 10215 | <event name="OnLeftDClick"></event> | ||
| 10216 | <event name="OnLeftDown"></event> | ||
| 10217 | <event name="OnLeftUp"></event> | ||
| 10218 | <event name="OnMiddleDClick"></event> | ||
| 10219 | <event name="OnMiddleDown"></event> | ||
| 10220 | <event name="OnMiddleUp"></event> | ||
| 10221 | <event name="OnMotion"></event> | ||
| 10222 | <event name="OnMouseEvents"></event> | ||
| 10223 | <event name="OnMouseWheel"></event> | ||
| 10224 | <event name="OnPaint"></event> | ||
| 10225 | <event name="OnRightDClick"></event> | ||
| 10226 | <event name="OnRightDown"></event> | ||
| 10227 | <event name="OnRightUp"></event> | ||
| 10228 | <event name="OnSetFocus"></event> | ||
| 10229 | <event name="OnSize"></event> | ||
| 10230 | <event name="OnUpdateUI"></event> | ||
| 10231 | </object> | ||
| 10232 | </object> | ||
| 10233 | <object class="sizeritem" expanded="1"> | ||
| 10234 | <property name="border">5</property> | ||
| 10235 | <property name="flag">wxALL|wxEXPAND</property> | ||
| 10236 | <property name="proportion">1</property> | ||
| 10237 | <object class="wxTextCtrl" expanded="1"> | ||
| 10238 | <property name="bg"></property> | ||
| 10239 | <property name="context_help"></property> | ||
| 10240 | <property name="enabled">1</property> | ||
| 10241 | <property name="fg"></property> | ||
| 10242 | <property name="font"></property> | ||
| 10243 | <property name="hidden">0</property> | ||
| 10244 | <property name="id">wxID_ANY</property> | ||
| 10245 | <property name="maximum_size"></property> | ||
| 10246 | <property name="maxlength">0</property> | ||
| 10247 | <property name="minimum_size"></property> | ||
| 10248 | <property name="name">m_textCtrlReview</property> | ||
| 10249 | <property name="permission">protected</property> | ||
| 10250 | <property name="pos"></property> | ||
| 10251 | <property name="size"></property> | ||
| 10252 | <property name="style">wxTE_MULTILINE</property> | ||
| 10253 | <property name="subclass"></property> | ||
| 10254 | <property name="tooltip"></property> | ||
| 10255 | <property name="value"></property> | ||
| 10256 | <property name="window_extra_style"></property> | ||
| 10257 | <property name="window_name"></property> | ||
| 10258 | <property name="window_style"></property> | ||
| 10259 | <event name="OnChar"></event> | ||
| 10260 | <event name="OnEnterWindow"></event> | ||
| 10261 | <event name="OnEraseBackground"></event> | ||
| 10262 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 10263 | <event name="OnKeyUp"></event> | ||
| 10264 | <event name="OnKillFocus"></event> | ||
| 10265 | <event name="OnLeaveWindow"></event> | ||
| 10266 | <event name="OnLeftDClick"></event> | ||
| 10267 | <event name="OnLeftDown"></event> | ||
| 10268 | <event name="OnLeftUp"></event> | ||
| 10269 | <event name="OnMiddleDClick"></event> | ||
| 10270 | <event name="OnMiddleDown"></event> | ||
| 10271 | <event name="OnMiddleUp"></event> | ||
| 10272 | <event name="OnMotion"></event> | ||
| 10273 | <event name="OnMouseEvents"></event> | ||
| 10274 | <event name="OnMouseWheel"></event> | ||
| 10275 | <event name="OnPaint"></event> | ||
| 10276 | <event name="OnRightDClick"></event> | ||
| 10277 | <event name="OnRightDown"></event> | ||
| 10278 | <event name="OnRightUp"></event> | ||
| 10279 | <event name="OnSetFocus"></event> | ||
| 10280 | <event name="OnSize"></event> | ||
| 10281 | <event name="OnText"></event> | ||
| 10282 | <event name="OnTextEnter"></event> | ||
| 10283 | <event name="OnTextMaxLen"></event> | ||
| 10284 | <event name="OnTextURL"></event> | ||
| 10285 | <event name="OnUpdateUI"></event> | ||
| 10286 | </object> | ||
| 10287 | </object> | ||
| 10288 | <object class="sizeritem" expanded="1"> | ||
| 10289 | <property name="border">5</property> | ||
| 10290 | <property name="flag">wxALIGN_RIGHT</property> | ||
| 10291 | <property name="proportion">0</property> | ||
| 10292 | <object class="wxBoxSizer" expanded="1"> | ||
| 10293 | <property name="minimum_size"></property> | ||
| 10294 | <property name="name">bSizer113</property> | ||
| 10295 | <property name="orient">wxHORIZONTAL</property> | ||
| 10296 | <property name="permission">none</property> | ||
| 10297 | <object class="sizeritem" expanded="1"> | ||
| 10298 | <property name="border">5</property> | ||
| 10299 | <property name="flag">wxALL</property> | ||
| 10300 | <property name="proportion">0</property> | ||
| 10301 | <object class="wxButton" expanded="1"> | ||
| 10302 | <property name="bg"></property> | ||
| 10303 | <property name="context_help"></property> | ||
| 10304 | <property name="default">0</property> | ||
| 10305 | <property name="enabled">1</property> | ||
| 10306 | <property name="fg"></property> | ||
| 10307 | <property name="font"></property> | ||
| 10308 | <property name="hidden">0</property> | ||
| 10309 | <property name="id">wxID_SUBMIT</property> | ||
| 10310 | <property name="label">&Submit</property> | ||
| 10311 | <property name="maximum_size"></property> | ||
| 10312 | <property name="minimum_size">85,25</property> | ||
| 10313 | <property name="name">m_buttonSubmit</property> | ||
| 10314 | <property name="permission">protected</property> | ||
| 10315 | <property name="pos"></property> | ||
| 10316 | <property name="size"></property> | ||
| 10317 | <property name="style"></property> | ||
| 10318 | <property name="subclass"></property> | ||
| 10319 | <property name="tooltip"></property> | ||
| 10320 | <property name="window_extra_style"></property> | ||
| 10321 | <property name="window_name"></property> | ||
| 10322 | <property name="window_style"></property> | ||
| 10323 | <event name="OnButtonClick">OnButtonSubmit</event> | ||
| 10324 | <event name="OnChar"></event> | ||
| 10325 | <event name="OnEnterWindow"></event> | ||
| 10326 | <event name="OnEraseBackground"></event> | ||
| 10327 | <event name="OnKeyDown"></event> | ||
| 10328 | <event name="OnKeyUp"></event> | ||
| 10329 | <event name="OnKillFocus"></event> | ||
| 10330 | <event name="OnLeaveWindow"></event> | ||
| 10331 | <event name="OnLeftDClick"></event> | ||
| 10332 | <event name="OnLeftDown"></event> | ||
| 10333 | <event name="OnLeftUp"></event> | ||
| 10334 | <event name="OnMiddleDClick"></event> | ||
| 10335 | <event name="OnMiddleDown"></event> | ||
| 10336 | <event name="OnMiddleUp"></event> | ||
| 10337 | <event name="OnMotion"></event> | ||
| 10338 | <event name="OnMouseEvents"></event> | ||
| 10339 | <event name="OnMouseWheel"></event> | ||
| 10340 | <event name="OnPaint"></event> | ||
| 10341 | <event name="OnRightDClick"></event> | ||
| 10342 | <event name="OnRightDown"></event> | ||
| 10343 | <event name="OnRightUp"></event> | ||
| 10344 | <event name="OnSetFocus"></event> | ||
| 10345 | <event name="OnSize"></event> | ||
| 10346 | <event name="OnUpdateUI"></event> | ||
| 10347 | </object> | ||
| 10348 | </object> | ||
| 10349 | <object class="sizeritem" expanded="1"> | ||
| 10350 | <property name="border">5</property> | ||
| 10351 | <property name="flag">wxALL</property> | ||
| 10352 | <property name="proportion">0</property> | ||
| 10353 | <object class="wxButton" expanded="1"> | ||
| 10354 | <property name="bg"></property> | ||
| 10355 | <property name="context_help"></property> | ||
| 10356 | <property name="default">0</property> | ||
| 10357 | <property name="enabled">1</property> | ||
| 10358 | <property name="fg"></property> | ||
| 10359 | <property name="font"></property> | ||
| 10360 | <property name="hidden">0</property> | ||
| 10361 | <property name="id">wxID_CANCEL</property> | ||
| 10362 | <property name="label">Cancel</property> | ||
| 10363 | <property name="maximum_size"></property> | ||
| 10364 | <property name="minimum_size">85,25</property> | ||
| 10365 | <property name="name">m_buttonCancel</property> | ||
| 10366 | <property name="permission">protected</property> | ||
| 10367 | <property name="pos"></property> | ||
| 10368 | <property name="size"></property> | ||
| 10369 | <property name="style"></property> | ||
| 10370 | <property name="subclass"></property> | ||
| 10371 | <property name="tooltip"></property> | ||
| 10372 | <property name="window_extra_style"></property> | ||
| 10373 | <property name="window_name"></property> | ||
| 10374 | <property name="window_style"></property> | ||
| 10375 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 10376 | <event name="OnChar"></event> | ||
| 10377 | <event name="OnEnterWindow"></event> | ||
| 10378 | <event name="OnEraseBackground"></event> | ||
| 10379 | <event name="OnKeyDown"></event> | ||
| 10380 | <event name="OnKeyUp"></event> | ||
| 10381 | <event name="OnKillFocus"></event> | ||
| 10382 | <event name="OnLeaveWindow"></event> | ||
| 10383 | <event name="OnLeftDClick"></event> | ||
| 10384 | <event name="OnLeftDown"></event> | ||
| 10385 | <event name="OnLeftUp"></event> | ||
| 10386 | <event name="OnMiddleDClick"></event> | ||
| 10387 | <event name="OnMiddleDown"></event> | ||
| 10388 | <event name="OnMiddleUp"></event> | ||
| 10389 | <event name="OnMotion"></event> | ||
| 10390 | <event name="OnMouseEvents"></event> | ||
| 10391 | <event name="OnMouseWheel"></event> | ||
| 10392 | <event name="OnPaint"></event> | ||
| 10393 | <event name="OnRightDClick"></event> | ||
| 10394 | <event name="OnRightDown"></event> | ||
| 10395 | <event name="OnRightUp"></event> | ||
| 10396 | <event name="OnSetFocus"></event> | ||
| 10397 | <event name="OnSize"></event> | ||
| 10398 | <event name="OnUpdateUI"></event> | ||
| 10399 | </object> | ||
| 10400 | </object> | ||
| 10401 | </object> | ||
| 10402 | </object> | ||
| 10403 | </object> | ||
| 10404 | </object> | ||
| 10405 | <object class="Frame" expanded="0"> | ||
| 10406 | <property name="bg">wxSYS_COLOUR_BTNFACE</property> | ||
| 10407 | <property name="center"></property> | ||
| 10408 | <property name="context_help"></property> | ||
| 10409 | <property name="enabled">1</property> | ||
| 10410 | <property name="extra_style"></property> | ||
| 10411 | <property name="fg"></property> | ||
| 10412 | <property name="font"></property> | ||
| 10413 | <property name="hidden">0</property> | ||
| 10414 | <property name="id">wxID_ANY</property> | ||
| 10415 | <property name="maximum_size"></property> | ||
| 10416 | <property name="minimum_size"></property> | ||
| 10417 | <property name="name">CPokerLobbyDialogBase</property> | ||
| 10418 | <property name="pos"></property> | ||
| 10419 | <property name="size">586,457</property> | ||
| 10420 | <property name="style">wxDEFAULT_FRAME_STYLE</property> | ||
| 10421 | <property name="subclass"></property> | ||
| 10422 | <property name="title">Poker Lobby</property> | ||
| 10423 | <property name="tooltip"></property> | ||
| 10424 | <property name="window_extra_style"></property> | ||
| 10425 | <property name="window_name"></property> | ||
| 10426 | <property name="window_style">wxTAB_TRAVERSAL</property> | ||
| 10427 | <property name="xrc_skip_sizer">1</property> | ||
| 10428 | <event name="OnActivate"></event> | ||
| 10429 | <event name="OnActivateApp"></event> | ||
| 10430 | <event name="OnChar"></event> | ||
| 10431 | <event name="OnClose"></event> | ||
| 10432 | <event name="OnEnterWindow"></event> | ||
| 10433 | <event name="OnEraseBackground"></event> | ||
| 10434 | <event name="OnHibernate"></event> | ||
| 10435 | <event name="OnIconize"></event> | ||
| 10436 | <event name="OnIdle"></event> | ||
| 10437 | <event name="OnKeyDown"></event> | ||
| 10438 | <event name="OnKeyUp"></event> | ||
| 10439 | <event name="OnKillFocus"></event> | ||
| 10440 | <event name="OnLeaveWindow"></event> | ||
| 10441 | <event name="OnLeftDClick"></event> | ||
| 10442 | <event name="OnLeftDown"></event> | ||
| 10443 | <event name="OnLeftUp"></event> | ||
| 10444 | <event name="OnMiddleDClick"></event> | ||
| 10445 | <event name="OnMiddleDown"></event> | ||
| 10446 | <event name="OnMiddleUp"></event> | ||
| 10447 | <event name="OnMotion"></event> | ||
| 10448 | <event name="OnMouseEvents"></event> | ||
| 10449 | <event name="OnMouseWheel"></event> | ||
| 10450 | <event name="OnPaint"></event> | ||
| 10451 | <event name="OnRightDClick"></event> | ||
| 10452 | <event name="OnRightDown"></event> | ||
| 10453 | <event name="OnRightUp"></event> | ||
| 10454 | <event name="OnSetFocus"></event> | ||
| 10455 | <event name="OnSize"></event> | ||
| 10456 | <event name="OnUpdateUI"></event> | ||
| 10457 | <object class="wxBoxSizer" expanded="1"> | ||
| 10458 | <property name="minimum_size"></property> | ||
| 10459 | <property name="name">bSizer156</property> | ||
| 10460 | <property name="orient">wxHORIZONTAL</property> | ||
| 10461 | <property name="permission">none</property> | ||
| 10462 | <object class="sizeritem" expanded="1"> | ||
| 10463 | <property name="border">5</property> | ||
| 10464 | <property name="flag">wxEXPAND|wxTOP|wxBOTTOM|wxLEFT</property> | ||
| 10465 | <property name="proportion">0</property> | ||
| 10466 | <object class="wxTreeCtrl" expanded="1"> | ||
| 10467 | <property name="bg"></property> | ||
| 10468 | <property name="context_help"></property> | ||
| 10469 | <property name="enabled">1</property> | ||
| 10470 | <property name="fg"></property> | ||
| 10471 | <property name="font"></property> | ||
| 10472 | <property name="hidden">0</property> | ||
| 10473 | <property name="id">wxID_ANY</property> | ||
| 10474 | <property name="maximum_size"></property> | ||
| 10475 | <property name="minimum_size">130,-1</property> | ||
| 10476 | <property name="name">m_treeCtrl</property> | ||
| 10477 | <property name="permission">protected</property> | ||
| 10478 | <property name="pos"></property> | ||
| 10479 | <property name="size"></property> | ||
| 10480 | <property name="style">wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT|wxTR_LINES_AT_ROOT</property> | ||
| 10481 | <property name="subclass"></property> | ||
| 10482 | <property name="tooltip"></property> | ||
| 10483 | <property name="window_extra_style"></property> | ||
| 10484 | <property name="window_name"></property> | ||
| 10485 | <property name="window_style"></property> | ||
| 10486 | <event name="OnChar"></event> | ||
| 10487 | <event name="OnEnterWindow"></event> | ||
| 10488 | <event name="OnEraseBackground"></event> | ||
| 10489 | <event name="OnKeyDown"></event> | ||
| 10490 | <event name="OnKeyUp"></event> | ||
| 10491 | <event name="OnKillFocus"></event> | ||
| 10492 | <event name="OnLeaveWindow"></event> | ||
| 10493 | <event name="OnLeftDClick"></event> | ||
| 10494 | <event name="OnLeftDown"></event> | ||
| 10495 | <event name="OnLeftUp"></event> | ||
| 10496 | <event name="OnMiddleDClick"></event> | ||
| 10497 | <event name="OnMiddleDown"></event> | ||
| 10498 | <event name="OnMiddleUp"></event> | ||
| 10499 | <event name="OnMotion"></event> | ||
| 10500 | <event name="OnMouseEvents"></event> | ||
| 10501 | <event name="OnMouseWheel"></event> | ||
| 10502 | <event name="OnPaint"></event> | ||
| 10503 | <event name="OnRightDClick"></event> | ||
| 10504 | <event name="OnRightDown"></event> | ||
| 10505 | <event name="OnRightUp"></event> | ||
| 10506 | <event name="OnSetFocus"></event> | ||
| 10507 | <event name="OnSize"></event> | ||
| 10508 | <event name="OnTreeBeginDrag"></event> | ||
| 10509 | <event name="OnTreeBeginLabelEdit"></event> | ||
| 10510 | <event name="OnTreeBeginRDrag"></event> | ||
| 10511 | <event name="OnTreeDeleteItem"></event> | ||
| 10512 | <event name="OnTreeEndDrag"></event> | ||
| 10513 | <event name="OnTreeEndLabelEdit"></event> | ||
| 10514 | <event name="OnTreeGetInfo"></event> | ||
| 10515 | <event name="OnTreeItemActivated"></event> | ||
| 10516 | <event name="OnTreeItemCollapsed"></event> | ||
| 10517 | <event name="OnTreeItemCollapsing"></event> | ||
| 10518 | <event name="OnTreeItemExpanded"></event> | ||
| 10519 | <event name="OnTreeItemExpanding"></event> | ||
| 10520 | <event name="OnTreeItemGetTooltip"></event> | ||
| 10521 | <event name="OnTreeItemMenu"></event> | ||
| 10522 | <event name="OnTreeItemMiddleClick"></event> | ||
| 10523 | <event name="OnTreeItemRightClick"></event> | ||
| 10524 | <event name="OnTreeKeyDown"></event> | ||
| 10525 | <event name="OnTreeSelChanged">OnTreeSelChanged</event> | ||
| 10526 | <event name="OnTreeSelChanging"></event> | ||
| 10527 | <event name="OnTreeSetInfo"></event> | ||
| 10528 | <event name="OnTreeStateImageClick"></event> | ||
| 10529 | <event name="OnUpdateUI"></event> | ||
| 10530 | </object> | ||
| 10531 | </object> | ||
| 10532 | <object class="sizeritem" expanded="1"> | ||
| 10533 | <property name="border">5</property> | ||
| 10534 | <property name="flag">wxEXPAND</property> | ||
| 10535 | <property name="proportion">1</property> | ||
| 10536 | <object class="wxBoxSizer" expanded="1"> | ||
| 10537 | <property name="minimum_size"></property> | ||
| 10538 | <property name="name">bSizer172</property> | ||
| 10539 | <property name="orient">wxVERTICAL</property> | ||
| 10540 | <property name="permission">none</property> | ||
| 10541 | <object class="sizeritem" expanded="1"> | ||
| 10542 | <property name="border">5</property> | ||
| 10543 | <property name="flag">wxEXPAND|wxALL</property> | ||
| 10544 | <property name="proportion">1</property> | ||
| 10545 | <object class="wxListCtrl" expanded="1"> | ||
| 10546 | <property name="bg"></property> | ||
| 10547 | <property name="context_help"></property> | ||
| 10548 | <property name="enabled">1</property> | ||
| 10549 | <property name="fg"></property> | ||
| 10550 | <property name="font"></property> | ||
| 10551 | <property name="hidden">0</property> | ||
| 10552 | <property name="id">wxID_ANY</property> | ||
| 10553 | <property name="maximum_size"></property> | ||
| 10554 | <property name="minimum_size"></property> | ||
| 10555 | <property name="name">m_listCtrl</property> | ||
| 10556 | <property name="permission">protected</property> | ||
| 10557 | <property name="pos"></property> | ||
| 10558 | <property name="size"></property> | ||
| 10559 | <property name="style">wxLC_NO_SORT_HEADER|wxLC_REPORT</property> | ||
| 10560 | <property name="subclass"></property> | ||
| 10561 | <property name="tooltip"></property> | ||
| 10562 | <property name="window_extra_style"></property> | ||
| 10563 | <property name="window_name"></property> | ||
| 10564 | <property name="window_style"></property> | ||
| 10565 | <event name="OnChar"></event> | ||
| 10566 | <event name="OnEnterWindow"></event> | ||
| 10567 | <event name="OnEraseBackground"></event> | ||
| 10568 | <event name="OnKeyDown"></event> | ||
| 10569 | <event name="OnKeyUp"></event> | ||
| 10570 | <event name="OnKillFocus"></event> | ||
| 10571 | <event name="OnLeaveWindow"></event> | ||
| 10572 | <event name="OnLeftDClick"></event> | ||
| 10573 | <event name="OnLeftDown"></event> | ||
| 10574 | <event name="OnLeftUp"></event> | ||
| 10575 | <event name="OnListBeginDrag"></event> | ||
| 10576 | <event name="OnListBeginLabelEdit"></event> | ||
| 10577 | <event name="OnListBeginRDrag"></event> | ||
| 10578 | <event name="OnListCacheHint"></event> | ||
| 10579 | <event name="OnListColBeginDrag"></event> | ||
| 10580 | <event name="OnListColClick"></event> | ||
| 10581 | <event name="OnListColDragging"></event> | ||
| 10582 | <event name="OnListColEndDrag"></event> | ||
| 10583 | <event name="OnListColRightClick"></event> | ||
| 10584 | <event name="OnListDeleteAllItems"></event> | ||
| 10585 | <event name="OnListDeleteItem"></event> | ||
| 10586 | <event name="OnListEndLabelEdit"></event> | ||
| 10587 | <event name="OnListInsertItem"></event> | ||
| 10588 | <event name="OnListItemActivated">OnListItemActivated</event> | ||
| 10589 | <event name="OnListItemDeselected"></event> | ||
| 10590 | <event name="OnListItemFocused"></event> | ||
| 10591 | <event name="OnListItemMiddleClick"></event> | ||
| 10592 | <event name="OnListItemRightClick"></event> | ||
| 10593 | <event name="OnListItemSelected">OnListItemSelected</event> | ||
| 10594 | <event name="OnListKeyDown"></event> | ||
| 10595 | <event name="OnMiddleDClick"></event> | ||
| 10596 | <event name="OnMiddleDown"></event> | ||
| 10597 | <event name="OnMiddleUp"></event> | ||
| 10598 | <event name="OnMotion"></event> | ||
| 10599 | <event name="OnMouseEvents"></event> | ||
| 10600 | <event name="OnMouseWheel"></event> | ||
| 10601 | <event name="OnPaint"></event> | ||
| 10602 | <event name="OnRightDClick"></event> | ||
| 10603 | <event name="OnRightDown"></event> | ||
| 10604 | <event name="OnRightUp"></event> | ||
| 10605 | <event name="OnSetFocus"></event> | ||
| 10606 | <event name="OnSize"></event> | ||
| 10607 | <event name="OnUpdateUI"></event> | ||
| 10608 | </object> | ||
| 10609 | </object> | ||
| 10610 | <object class="sizeritem" expanded="1"> | ||
| 10611 | <property name="border">5</property> | ||
| 10612 | <property name="flag">wxALL</property> | ||
| 10613 | <property name="proportion">0</property> | ||
| 10614 | <object class="wxButton" expanded="1"> | ||
| 10615 | <property name="bg"></property> | ||
| 10616 | <property name="context_help"></property> | ||
| 10617 | <property name="default">0</property> | ||
| 10618 | <property name="enabled">1</property> | ||
| 10619 | <property name="fg"></property> | ||
| 10620 | <property name="font"></property> | ||
| 10621 | <property name="hidden">0</property> | ||
| 10622 | <property name="id">wxID_OPENNEWTABLE</property> | ||
| 10623 | <property name="label">&Open New Table</property> | ||
| 10624 | <property name="maximum_size"></property> | ||
| 10625 | <property name="minimum_size"></property> | ||
| 10626 | <property name="name">m_buttonNewTable</property> | ||
| 10627 | <property name="permission">protected</property> | ||
| 10628 | <property name="pos"></property> | ||
| 10629 | <property name="size"></property> | ||
| 10630 | <property name="style"></property> | ||
| 10631 | <property name="subclass"></property> | ||
| 10632 | <property name="tooltip"></property> | ||
| 10633 | <property name="window_extra_style"></property> | ||
| 10634 | <property name="window_name"></property> | ||
| 10635 | <property name="window_style"></property> | ||
| 10636 | <event name="OnButtonClick">OnButtonNewTable</event> | ||
| 10637 | <event name="OnChar"></event> | ||
| 10638 | <event name="OnEnterWindow"></event> | ||
| 10639 | <event name="OnEraseBackground"></event> | ||
| 10640 | <event name="OnKeyDown"></event> | ||
| 10641 | <event name="OnKeyUp"></event> | ||
| 10642 | <event name="OnKillFocus"></event> | ||
| 10643 | <event name="OnLeaveWindow"></event> | ||
| 10644 | <event name="OnLeftDClick"></event> | ||
| 10645 | <event name="OnLeftDown"></event> | ||
| 10646 | <event name="OnLeftUp"></event> | ||
| 10647 | <event name="OnMiddleDClick"></event> | ||
| 10648 | <event name="OnMiddleDown"></event> | ||
| 10649 | <event name="OnMiddleUp"></event> | ||
| 10650 | <event name="OnMotion"></event> | ||
| 10651 | <event name="OnMouseEvents"></event> | ||
| 10652 | <event name="OnMouseWheel"></event> | ||
| 10653 | <event name="OnPaint"></event> | ||
| 10654 | <event name="OnRightDClick"></event> | ||
| 10655 | <event name="OnRightDown"></event> | ||
| 10656 | <event name="OnRightUp"></event> | ||
| 10657 | <event name="OnSetFocus"></event> | ||
| 10658 | <event name="OnSize"></event> | ||
| 10659 | <event name="OnUpdateUI"></event> | ||
| 10660 | </object> | ||
| 10661 | </object> | ||
| 10662 | </object> | ||
| 10663 | </object> | ||
| 10664 | </object> | ||
| 10665 | </object> | ||
| 10666 | <object class="Frame" expanded="0"> | ||
| 10667 | <property name="bg"></property> | ||
| 10668 | <property name="center"></property> | ||
| 10669 | <property name="context_help"></property> | ||
| 10670 | <property name="enabled">1</property> | ||
| 10671 | <property name="extra_style"></property> | ||
| 10672 | <property name="fg"></property> | ||
| 10673 | <property name="font"></property> | ||
| 10674 | <property name="hidden">0</property> | ||
| 10675 | <property name="id">wxID_ANY</property> | ||
| 10676 | <property name="maximum_size"></property> | ||
| 10677 | <property name="minimum_size"></property> | ||
| 10678 | <property name="name">CPokerDialogBase</property> | ||
| 10679 | <property name="pos"></property> | ||
| 10680 | <property name="size">806,550</property> | ||
| 10681 | <property name="style">wxDEFAULT_FRAME_STYLE|wxFRAME_NO_TASKBAR</property> | ||
| 10682 | <property name="subclass"></property> | ||
| 10683 | <property name="title">Poker</property> | ||
| 10684 | <property name="tooltip"></property> | ||
| 10685 | <property name="window_extra_style"></property> | ||
| 10686 | <property name="window_name"></property> | ||
| 10687 | <property name="window_style">wxFULL_REPAINT_ON_RESIZE|wxTAB_TRAVERSAL</property> | ||
| 10688 | <property name="xrc_skip_sizer">1</property> | ||
| 10689 | <event name="OnActivate"></event> | ||
| 10690 | <event name="OnActivateApp"></event> | ||
| 10691 | <event name="OnChar"></event> | ||
| 10692 | <event name="OnClose">OnClose</event> | ||
| 10693 | <event name="OnEnterWindow"></event> | ||
| 10694 | <event name="OnEraseBackground"></event> | ||
| 10695 | <event name="OnHibernate"></event> | ||
| 10696 | <event name="OnIconize"></event> | ||
| 10697 | <event name="OnIdle"></event> | ||
| 10698 | <event name="OnKeyDown"></event> | ||
| 10699 | <event name="OnKeyUp"></event> | ||
| 10700 | <event name="OnKillFocus"></event> | ||
| 10701 | <event name="OnLeaveWindow"></event> | ||
| 10702 | <event name="OnLeftDClick"></event> | ||
| 10703 | <event name="OnLeftDown"></event> | ||
| 10704 | <event name="OnLeftUp"></event> | ||
| 10705 | <event name="OnMiddleDClick"></event> | ||
| 10706 | <event name="OnMiddleDown"></event> | ||
| 10707 | <event name="OnMiddleUp"></event> | ||
| 10708 | <event name="OnMotion"></event> | ||
| 10709 | <event name="OnMouseEvents">OnMouseEvents</event> | ||
| 10710 | <event name="OnMouseWheel"></event> | ||
| 10711 | <event name="OnPaint">OnPaint</event> | ||
| 10712 | <event name="OnRightDClick"></event> | ||
| 10713 | <event name="OnRightDown"></event> | ||
| 10714 | <event name="OnRightUp"></event> | ||
| 10715 | <event name="OnSetFocus"></event> | ||
| 10716 | <event name="OnSize">OnSize</event> | ||
| 10717 | <event name="OnUpdateUI"></event> | ||
| 10718 | <object class="wxBoxSizer" expanded="1"> | ||
| 10719 | <property name="minimum_size"></property> | ||
| 10720 | <property name="name">bSizer174</property> | ||
| 10721 | <property name="orient">wxVERTICAL</property> | ||
| 10722 | <property name="permission">none</property> | ||
| 10723 | <object class="sizeritem" expanded="1"> | ||
| 10724 | <property name="border">5</property> | ||
| 10725 | <property name="flag">wxALL</property> | ||
| 10726 | <property name="proportion">0</property> | ||
| 10727 | <object class="wxCheckBox" expanded="1"> | ||
| 10728 | <property name="bg"></property> | ||
| 10729 | <property name="checked">0</property> | ||
| 10730 | <property name="context_help"></property> | ||
| 10731 | <property name="enabled">1</property> | ||
| 10732 | <property name="fg"></property> | ||
| 10733 | <property name="font"></property> | ||
| 10734 | <property name="hidden">0</property> | ||
| 10735 | <property name="id">wxID_ANY</property> | ||
| 10736 | <property name="label">Deal Me Out</property> | ||
| 10737 | <property name="maximum_size"></property> | ||
| 10738 | <property name="minimum_size"></property> | ||
| 10739 | <property name="name">m_checkSitOut</property> | ||
| 10740 | <property name="permission">public</property> | ||
| 10741 | <property name="pos"></property> | ||
| 10742 | <property name="size"></property> | ||
| 10743 | <property name="style"></property> | ||
| 10744 | <property name="subclass"></property> | ||
| 10745 | <property name="tooltip"></property> | ||
| 10746 | <property name="window_extra_style"></property> | ||
| 10747 | <property name="window_name"></property> | ||
| 10748 | <property name="window_style"></property> | ||
| 10749 | <event name="OnChar"></event> | ||
| 10750 | <event name="OnCheckBox">OnCheckSitOut</event> | ||
| 10751 | <event name="OnEnterWindow"></event> | ||
| 10752 | <event name="OnEraseBackground"></event> | ||
| 10753 | <event name="OnKeyDown"></event> | ||
| 10754 | <event name="OnKeyUp"></event> | ||
| 10755 | <event name="OnKillFocus"></event> | ||
| 10756 | <event name="OnLeaveWindow"></event> | ||
| 10757 | <event name="OnLeftDClick"></event> | ||
| 10758 | <event name="OnLeftDown"></event> | ||
| 10759 | <event name="OnLeftUp"></event> | ||
| 10760 | <event name="OnMiddleDClick"></event> | ||
| 10761 | <event name="OnMiddleDown"></event> | ||
| 10762 | <event name="OnMiddleUp"></event> | ||
| 10763 | <event name="OnMotion"></event> | ||
| 10764 | <event name="OnMouseEvents"></event> | ||
| 10765 | <event name="OnMouseWheel"></event> | ||
| 10766 | <event name="OnPaint"></event> | ||
| 10767 | <event name="OnRightDClick"></event> | ||
| 10768 | <event name="OnRightDown"></event> | ||
| 10769 | <event name="OnRightUp"></event> | ||
| 10770 | <event name="OnSetFocus"></event> | ||
| 10771 | <event name="OnSize"></event> | ||
| 10772 | <event name="OnUpdateUI"></event> | ||
| 10773 | </object> | ||
| 10774 | </object> | ||
| 10775 | <object class="sizeritem" expanded="1"> | ||
| 10776 | <property name="border">5</property> | ||
| 10777 | <property name="flag">wxALL</property> | ||
| 10778 | <property name="proportion">0</property> | ||
| 10779 | <object class="wxButton" expanded="1"> | ||
| 10780 | <property name="bg"></property> | ||
| 10781 | <property name="context_help"></property> | ||
| 10782 | <property name="default">0</property> | ||
| 10783 | <property name="enabled">1</property> | ||
| 10784 | <property name="fg"></property> | ||
| 10785 | <property name="font"></property> | ||
| 10786 | <property name="hidden">0</property> | ||
| 10787 | <property name="id">wxID_DEALHAND</property> | ||
| 10788 | <property name="label">&Deal Hand</property> | ||
| 10789 | <property name="maximum_size"></property> | ||
| 10790 | <property name="minimum_size"></property> | ||
| 10791 | <property name="name">m_buttonDealHand</property> | ||
| 10792 | <property name="permission">protected</property> | ||
| 10793 | <property name="pos"></property> | ||
| 10794 | <property name="size">150,25</property> | ||
| 10795 | <property name="style"></property> | ||
| 10796 | <property name="subclass"></property> | ||
| 10797 | <property name="tooltip"></property> | ||
| 10798 | <property name="window_extra_style"></property> | ||
| 10799 | <property name="window_name"></property> | ||
| 10800 | <property name="window_style"></property> | ||
| 10801 | <event name="OnButtonClick">OnButtonDealHand</event> | ||
| 10802 | <event name="OnChar"></event> | ||
| 10803 | <event name="OnEnterWindow"></event> | ||
| 10804 | <event name="OnEraseBackground"></event> | ||
| 10805 | <event name="OnKeyDown"></event> | ||
| 10806 | <event name="OnKeyUp"></event> | ||
| 10807 | <event name="OnKillFocus"></event> | ||
| 10808 | <event name="OnLeaveWindow"></event> | ||
| 10809 | <event name="OnLeftDClick"></event> | ||
| 10810 | <event name="OnLeftDown"></event> | ||
| 10811 | <event name="OnLeftUp"></event> | ||
| 10812 | <event name="OnMiddleDClick"></event> | ||
| 10813 | <event name="OnMiddleDown"></event> | ||
| 10814 | <event name="OnMiddleUp"></event> | ||
| 10815 | <event name="OnMotion"></event> | ||
| 10816 | <event name="OnMouseEvents"></event> | ||
| 10817 | <event name="OnMouseWheel"></event> | ||
| 10818 | <event name="OnPaint"></event> | ||
| 10819 | <event name="OnRightDClick"></event> | ||
| 10820 | <event name="OnRightDown"></event> | ||
| 10821 | <event name="OnRightUp"></event> | ||
| 10822 | <event name="OnSetFocus"></event> | ||
| 10823 | <event name="OnSize"></event> | ||
| 10824 | <event name="OnUpdateUI"></event> | ||
| 10825 | </object> | ||
| 10826 | </object> | ||
| 10827 | <object class="sizeritem" expanded="1"> | ||
| 10828 | <property name="border">5</property> | ||
| 10829 | <property name="flag">wxALL</property> | ||
| 10830 | <property name="proportion">0</property> | ||
| 10831 | <object class="wxButton" expanded="1"> | ||
| 10832 | <property name="bg"></property> | ||
| 10833 | <property name="context_help"></property> | ||
| 10834 | <property name="default">0</property> | ||
| 10835 | <property name="enabled">1</property> | ||
| 10836 | <property name="fg"></property> | ||
| 10837 | <property name="font"></property> | ||
| 10838 | <property name="hidden">0</property> | ||
| 10839 | <property name="id">wxID_FOLD</property> | ||
| 10840 | <property name="label">&Fold</property> | ||
| 10841 | <property name="maximum_size"></property> | ||
| 10842 | <property name="minimum_size"></property> | ||
| 10843 | <property name="name">m_buttonFold</property> | ||
| 10844 | <property name="permission">protected</property> | ||
| 10845 | <property name="pos"></property> | ||
| 10846 | <property name="size">80,25</property> | ||
| 10847 | <property name="style"></property> | ||
| 10848 | <property name="subclass"></property> | ||
| 10849 | <property name="tooltip"></property> | ||
| 10850 | <property name="window_extra_style"></property> | ||
| 10851 | <property name="window_name"></property> | ||
| 10852 | <property name="window_style"></property> | ||
| 10853 | <event name="OnButtonClick">OnButtonFold</event> | ||
| 10854 | <event name="OnChar"></event> | ||
| 10855 | <event name="OnEnterWindow"></event> | ||
| 10856 | <event name="OnEraseBackground"></event> | ||
| 10857 | <event name="OnKeyDown"></event> | ||
| 10858 | <event name="OnKeyUp"></event> | ||
| 10859 | <event name="OnKillFocus"></event> | ||
| 10860 | <event name="OnLeaveWindow"></event> | ||
| 10861 | <event name="OnLeftDClick"></event> | ||
| 10862 | <event name="OnLeftDown"></event> | ||
| 10863 | <event name="OnLeftUp"></event> | ||
| 10864 | <event name="OnMiddleDClick"></event> | ||
| 10865 | <event name="OnMiddleDown"></event> | ||
| 10866 | <event name="OnMiddleUp"></event> | ||
| 10867 | <event name="OnMotion"></event> | ||
| 10868 | <event name="OnMouseEvents"></event> | ||
| 10869 | <event name="OnMouseWheel"></event> | ||
| 10870 | <event name="OnPaint"></event> | ||
| 10871 | <event name="OnRightDClick"></event> | ||
| 10872 | <event name="OnRightDown"></event> | ||
| 10873 | <event name="OnRightUp"></event> | ||
| 10874 | <event name="OnSetFocus"></event> | ||
| 10875 | <event name="OnSize"></event> | ||
| 10876 | <event name="OnUpdateUI"></event> | ||
| 10877 | </object> | ||
| 10878 | </object> | ||
| 10879 | <object class="sizeritem" expanded="1"> | ||
| 10880 | <property name="border">5</property> | ||
| 10881 | <property name="flag">wxALL</property> | ||
| 10882 | <property name="proportion">0</property> | ||
| 10883 | <object class="wxButton" expanded="1"> | ||
| 10884 | <property name="bg"></property> | ||
| 10885 | <property name="context_help"></property> | ||
| 10886 | <property name="default">0</property> | ||
| 10887 | <property name="enabled">1</property> | ||
| 10888 | <property name="fg"></property> | ||
| 10889 | <property name="font"></property> | ||
| 10890 | <property name="hidden">0</property> | ||
| 10891 | <property name="id">wxID_CALL</property> | ||
| 10892 | <property name="label">&Call</property> | ||
| 10893 | <property name="maximum_size"></property> | ||
| 10894 | <property name="minimum_size"></property> | ||
| 10895 | <property name="name">m_buttonCall</property> | ||
| 10896 | <property name="permission">protected</property> | ||
| 10897 | <property name="pos"></property> | ||
| 10898 | <property name="size">80,25</property> | ||
| 10899 | <property name="style"></property> | ||
| 10900 | <property name="subclass"></property> | ||
| 10901 | <property name="tooltip"></property> | ||
| 10902 | <property name="window_extra_style"></property> | ||
| 10903 | <property name="window_name"></property> | ||
| 10904 | <property name="window_style"></property> | ||
| 10905 | <event name="OnButtonClick">OnButtonCall</event> | ||
| 10906 | <event name="OnChar"></event> | ||
| 10907 | <event name="OnEnterWindow"></event> | ||
| 10908 | <event name="OnEraseBackground"></event> | ||
| 10909 | <event name="OnKeyDown"></event> | ||
| 10910 | <event name="OnKeyUp"></event> | ||
| 10911 | <event name="OnKillFocus"></event> | ||
| 10912 | <event name="OnLeaveWindow"></event> | ||
| 10913 | <event name="OnLeftDClick"></event> | ||
| 10914 | <event name="OnLeftDown"></event> | ||
| 10915 | <event name="OnLeftUp"></event> | ||
| 10916 | <event name="OnMiddleDClick"></event> | ||
| 10917 | <event name="OnMiddleDown"></event> | ||
| 10918 | <event name="OnMiddleUp"></event> | ||
| 10919 | <event name="OnMotion"></event> | ||
| 10920 | <event name="OnMouseEvents"></event> | ||
| 10921 | <event name="OnMouseWheel"></event> | ||
| 10922 | <event name="OnPaint"></event> | ||
| 10923 | <event name="OnRightDClick"></event> | ||
| 10924 | <event name="OnRightDown"></event> | ||
| 10925 | <event name="OnRightUp"></event> | ||
| 10926 | <event name="OnSetFocus"></event> | ||
| 10927 | <event name="OnSize"></event> | ||
| 10928 | <event name="OnUpdateUI"></event> | ||
| 10929 | </object> | ||
| 10930 | </object> | ||
| 10931 | <object class="sizeritem" expanded="1"> | ||
| 10932 | <property name="border">5</property> | ||
| 10933 | <property name="flag">wxALL</property> | ||
| 10934 | <property name="proportion">0</property> | ||
| 10935 | <object class="wxButton" expanded="1"> | ||
| 10936 | <property name="bg"></property> | ||
| 10937 | <property name="context_help"></property> | ||
| 10938 | <property name="default">0</property> | ||
| 10939 | <property name="enabled">1</property> | ||
| 10940 | <property name="fg"></property> | ||
| 10941 | <property name="font"></property> | ||
| 10942 | <property name="hidden">0</property> | ||
| 10943 | <property name="id">wxID_RAISE</property> | ||
| 10944 | <property name="label">&Raise</property> | ||
| 10945 | <property name="maximum_size"></property> | ||
| 10946 | <property name="minimum_size"></property> | ||
| 10947 | <property name="name">m_buttonRaise</property> | ||
| 10948 | <property name="permission">protected</property> | ||
| 10949 | <property name="pos"></property> | ||
| 10950 | <property name="size">80,25</property> | ||
| 10951 | <property name="style"></property> | ||
| 10952 | <property name="subclass"></property> | ||
| 10953 | <property name="tooltip"></property> | ||
| 10954 | <property name="window_extra_style"></property> | ||
| 10955 | <property name="window_name"></property> | ||
| 10956 | <property name="window_style"></property> | ||
| 10957 | <event name="OnButtonClick">OnButtonRaise</event> | ||
| 10958 | <event name="OnChar"></event> | ||
| 10959 | <event name="OnEnterWindow"></event> | ||
| 10960 | <event name="OnEraseBackground"></event> | ||
| 10961 | <event name="OnKeyDown"></event> | ||
| 10962 | <event name="OnKeyUp"></event> | ||
| 10963 | <event name="OnKillFocus"></event> | ||
| 10964 | <event name="OnLeaveWindow"></event> | ||
| 10965 | <event name="OnLeftDClick"></event> | ||
| 10966 | <event name="OnLeftDown"></event> | ||
| 10967 | <event name="OnLeftUp"></event> | ||
| 10968 | <event name="OnMiddleDClick"></event> | ||
| 10969 | <event name="OnMiddleDown"></event> | ||
| 10970 | <event name="OnMiddleUp"></event> | ||
| 10971 | <event name="OnMotion"></event> | ||
| 10972 | <event name="OnMouseEvents"></event> | ||
| 10973 | <event name="OnMouseWheel"></event> | ||
| 10974 | <event name="OnPaint"></event> | ||
| 10975 | <event name="OnRightDClick"></event> | ||
| 10976 | <event name="OnRightDown"></event> | ||
| 10977 | <event name="OnRightUp"></event> | ||
| 10978 | <event name="OnSetFocus"></event> | ||
| 10979 | <event name="OnSize"></event> | ||
| 10980 | <event name="OnUpdateUI"></event> | ||
| 10981 | </object> | ||
| 10982 | </object> | ||
| 10983 | <object class="sizeritem" expanded="1"> | ||
| 10984 | <property name="border">5</property> | ||
| 10985 | <property name="flag">wxALL</property> | ||
| 10986 | <property name="proportion">0</property> | ||
| 10987 | <object class="wxButton" expanded="1"> | ||
| 10988 | <property name="bg"></property> | ||
| 10989 | <property name="context_help"></property> | ||
| 10990 | <property name="default">0</property> | ||
| 10991 | <property name="enabled">1</property> | ||
| 10992 | <property name="fg"></property> | ||
| 10993 | <property name="font"></property> | ||
| 10994 | <property name="hidden">0</property> | ||
| 10995 | <property name="id">wxID_LEAVETABLE</property> | ||
| 10996 | <property name="label">&Leave Table</property> | ||
| 10997 | <property name="maximum_size"></property> | ||
| 10998 | <property name="minimum_size"></property> | ||
| 10999 | <property name="name">m_buttonLeaveTable</property> | ||
| 11000 | <property name="permission">protected</property> | ||
| 11001 | <property name="pos"></property> | ||
| 11002 | <property name="size">90,25</property> | ||
| 11003 | <property name="style"></property> | ||
| 11004 | <property name="subclass"></property> | ||
| 11005 | <property name="tooltip"></property> | ||
| 11006 | <property name="window_extra_style"></property> | ||
| 11007 | <property name="window_name"></property> | ||
| 11008 | <property name="window_style"></property> | ||
| 11009 | <event name="OnButtonClick">OnButtonLeaveTable</event> | ||
| 11010 | <event name="OnChar"></event> | ||
| 11011 | <event name="OnEnterWindow"></event> | ||
| 11012 | <event name="OnEraseBackground"></event> | ||
| 11013 | <event name="OnKeyDown"></event> | ||
| 11014 | <event name="OnKeyUp"></event> | ||
| 11015 | <event name="OnKillFocus"></event> | ||
| 11016 | <event name="OnLeaveWindow"></event> | ||
| 11017 | <event name="OnLeftDClick"></event> | ||
| 11018 | <event name="OnLeftDown"></event> | ||
| 11019 | <event name="OnLeftUp"></event> | ||
| 11020 | <event name="OnMiddleDClick"></event> | ||
| 11021 | <event name="OnMiddleDown"></event> | ||
| 11022 | <event name="OnMiddleUp"></event> | ||
| 11023 | <event name="OnMotion"></event> | ||
| 11024 | <event name="OnMouseEvents"></event> | ||
| 11025 | <event name="OnMouseWheel"></event> | ||
| 11026 | <event name="OnPaint"></event> | ||
| 11027 | <event name="OnRightDClick"></event> | ||
| 11028 | <event name="OnRightDown"></event> | ||
| 11029 | <event name="OnRightUp"></event> | ||
| 11030 | <event name="OnSetFocus"></event> | ||
| 11031 | <event name="OnSize"></event> | ||
| 11032 | <event name="OnUpdateUI"></event> | ||
| 11033 | </object> | ||
| 11034 | </object> | ||
| 11035 | <object class="sizeritem" expanded="1"> | ||
| 11036 | <property name="border">5</property> | ||
| 11037 | <property name="flag">wxALL</property> | ||
| 11038 | <property name="proportion">0</property> | ||
| 11039 | <object class="wxTextCtrl" expanded="1"> | ||
| 11040 | <property name="bg"></property> | ||
| 11041 | <property name="context_help"></property> | ||
| 11042 | <property name="enabled">1</property> | ||
| 11043 | <property name="fg"></property> | ||
| 11044 | <property name="font"></property> | ||
| 11045 | <property name="hidden">0</property> | ||
| 11046 | <property name="id">wxID_DITCHPLAYER</property> | ||
| 11047 | <property name="maximum_size"></property> | ||
| 11048 | <property name="maxlength">0</property> | ||
| 11049 | <property name="minimum_size"></property> | ||
| 11050 | <property name="name">m_textDitchPlayer</property> | ||
| 11051 | <property name="permission">protected</property> | ||
| 11052 | <property name="pos"></property> | ||
| 11053 | <property name="size">45,-1</property> | ||
| 11054 | <property name="style">wxTE_PROCESS_ENTER</property> | ||
| 11055 | <property name="subclass"></property> | ||
| 11056 | <property name="tooltip"></property> | ||
| 11057 | <property name="value"></property> | ||
| 11058 | <property name="window_extra_style"></property> | ||
| 11059 | <property name="window_name"></property> | ||
| 11060 | <property name="window_style"></property> | ||
| 11061 | <event name="OnChar"></event> | ||
| 11062 | <event name="OnEnterWindow"></event> | ||
| 11063 | <event name="OnEraseBackground"></event> | ||
| 11064 | <event name="OnKeyDown"></event> | ||
| 11065 | <event name="OnKeyUp"></event> | ||
| 11066 | <event name="OnKillFocus"></event> | ||
| 11067 | <event name="OnLeaveWindow"></event> | ||
| 11068 | <event name="OnLeftDClick"></event> | ||
| 11069 | <event name="OnLeftDown"></event> | ||
| 11070 | <event name="OnLeftUp"></event> | ||
| 11071 | <event name="OnMiddleDClick"></event> | ||
| 11072 | <event name="OnMiddleDown"></event> | ||
| 11073 | <event name="OnMiddleUp"></event> | ||
| 11074 | <event name="OnMotion"></event> | ||
| 11075 | <event name="OnMouseEvents"></event> | ||
| 11076 | <event name="OnMouseWheel"></event> | ||
| 11077 | <event name="OnPaint"></event> | ||
| 11078 | <event name="OnRightDClick"></event> | ||
| 11079 | <event name="OnRightDown"></event> | ||
| 11080 | <event name="OnRightUp"></event> | ||
| 11081 | <event name="OnSetFocus"></event> | ||
| 11082 | <event name="OnSize"></event> | ||
| 11083 | <event name="OnText"></event> | ||
| 11084 | <event name="OnTextEnter">OnDitchPlayer</event> | ||
| 11085 | <event name="OnTextMaxLen"></event> | ||
| 11086 | <event name="OnTextURL"></event> | ||
| 11087 | <event name="OnUpdateUI"></event> | ||
| 11088 | </object> | ||
| 11089 | </object> | ||
| 11090 | <object class="sizeritem" expanded="1"> | ||
| 11091 | <property name="border">5</property> | ||
| 11092 | <property name="flag">wxALL</property> | ||
| 11093 | <property name="proportion">0</property> | ||
| 11094 | <object class="wxCheckBox" expanded="1"> | ||
| 11095 | <property name="bg"></property> | ||
| 11096 | <property name="checked">0</property> | ||
| 11097 | <property name="context_help"></property> | ||
| 11098 | <property name="enabled">1</property> | ||
| 11099 | <property name="fg"></property> | ||
| 11100 | <property name="font"></property> | ||
| 11101 | <property name="hidden">0</property> | ||
| 11102 | <property name="id">wxID_ANY</property> | ||
| 11103 | <property name="label">FOLD</property> | ||
| 11104 | <property name="maximum_size"></property> | ||
| 11105 | <property name="minimum_size"></property> | ||
| 11106 | <property name="name">m_checkPreFold</property> | ||
| 11107 | <property name="permission">public</property> | ||
| 11108 | <property name="pos"></property> | ||
| 11109 | <property name="size">100,-1</property> | ||
| 11110 | <property name="style"></property> | ||
| 11111 | <property name="subclass"></property> | ||
| 11112 | <property name="tooltip"></property> | ||
| 11113 | <property name="window_extra_style"></property> | ||
| 11114 | <property name="window_name"></property> | ||
| 11115 | <property name="window_style"></property> | ||
| 11116 | <event name="OnChar"></event> | ||
| 11117 | <event name="OnCheckBox">OnCheckPreFold</event> | ||
| 11118 | <event name="OnEnterWindow"></event> | ||
| 11119 | <event name="OnEraseBackground"></event> | ||
| 11120 | <event name="OnKeyDown"></event> | ||
| 11121 | <event name="OnKeyUp"></event> | ||
| 11122 | <event name="OnKillFocus"></event> | ||
| 11123 | <event name="OnLeaveWindow"></event> | ||
| 11124 | <event name="OnLeftDClick"></event> | ||
| 11125 | <event name="OnLeftDown"></event> | ||
| 11126 | <event name="OnLeftUp"></event> | ||
| 11127 | <event name="OnMiddleDClick"></event> | ||
| 11128 | <event name="OnMiddleDown"></event> | ||
| 11129 | <event name="OnMiddleUp"></event> | ||
| 11130 | <event name="OnMotion"></event> | ||
| 11131 | <event name="OnMouseEvents"></event> | ||
| 11132 | <event name="OnMouseWheel"></event> | ||
| 11133 | <event name="OnPaint"></event> | ||
| 11134 | <event name="OnRightDClick"></event> | ||
| 11135 | <event name="OnRightDown"></event> | ||
| 11136 | <event name="OnRightUp"></event> | ||
| 11137 | <event name="OnSetFocus"></event> | ||
| 11138 | <event name="OnSize"></event> | ||
| 11139 | <event name="OnUpdateUI"></event> | ||
| 11140 | </object> | ||
| 11141 | </object> | ||
| 11142 | <object class="sizeritem" expanded="1"> | ||
| 11143 | <property name="border">5</property> | ||
| 11144 | <property name="flag">wxALL</property> | ||
| 11145 | <property name="proportion">0</property> | ||
| 11146 | <object class="wxCheckBox" expanded="1"> | ||
| 11147 | <property name="bg"></property> | ||
| 11148 | <property name="checked">0</property> | ||
| 11149 | <property name="context_help"></property> | ||
| 11150 | <property name="enabled">1</property> | ||
| 11151 | <property name="fg"></property> | ||
| 11152 | <property name="font"></property> | ||
| 11153 | <property name="hidden">0</property> | ||
| 11154 | <property name="id">wxID_ANY</property> | ||
| 11155 | <property name="label">CALL</property> | ||
| 11156 | <property name="maximum_size"></property> | ||
| 11157 | <property name="minimum_size"></property> | ||
| 11158 | <property name="name">m_checkPreCall</property> | ||
| 11159 | <property name="permission">public</property> | ||
| 11160 | <property name="pos"></property> | ||
| 11161 | <property name="size">100,-1</property> | ||
| 11162 | <property name="style"></property> | ||
| 11163 | <property name="subclass"></property> | ||
| 11164 | <property name="tooltip"></property> | ||
| 11165 | <property name="window_extra_style"></property> | ||
| 11166 | <property name="window_name"></property> | ||
| 11167 | <property name="window_style"></property> | ||
| 11168 | <event name="OnChar"></event> | ||
| 11169 | <event name="OnCheckBox">OnCheckPreCall</event> | ||
| 11170 | <event name="OnEnterWindow"></event> | ||
| 11171 | <event name="OnEraseBackground"></event> | ||
| 11172 | <event name="OnKeyDown"></event> | ||
| 11173 | <event name="OnKeyUp"></event> | ||
| 11174 | <event name="OnKillFocus"></event> | ||
| 11175 | <event name="OnLeaveWindow"></event> | ||
| 11176 | <event name="OnLeftDClick"></event> | ||
| 11177 | <event name="OnLeftDown"></event> | ||
| 11178 | <event name="OnLeftUp"></event> | ||
| 11179 | <event name="OnMiddleDClick"></event> | ||
| 11180 | <event name="OnMiddleDown"></event> | ||
| 11181 | <event name="OnMiddleUp"></event> | ||
| 11182 | <event name="OnMotion"></event> | ||
| 11183 | <event name="OnMouseEvents"></event> | ||
| 11184 | <event name="OnMouseWheel"></event> | ||
| 11185 | <event name="OnPaint"></event> | ||
| 11186 | <event name="OnRightDClick"></event> | ||
| 11187 | <event name="OnRightDown"></event> | ||
| 11188 | <event name="OnRightUp"></event> | ||
| 11189 | <event name="OnSetFocus"></event> | ||
| 11190 | <event name="OnSize"></event> | ||
| 11191 | <event name="OnUpdateUI"></event> | ||
| 11192 | </object> | ||
| 11193 | </object> | ||
| 11194 | <object class="sizeritem" expanded="1"> | ||
| 11195 | <property name="border">5</property> | ||
| 11196 | <property name="flag">wxALL</property> | ||
| 11197 | <property name="proportion">0</property> | ||
| 11198 | <object class="wxCheckBox" expanded="1"> | ||
| 11199 | <property name="bg"></property> | ||
| 11200 | <property name="checked">0</property> | ||
| 11201 | <property name="context_help"></property> | ||
| 11202 | <property name="enabled">1</property> | ||
| 11203 | <property name="fg"></property> | ||
| 11204 | <property name="font"></property> | ||
| 11205 | <property name="hidden">0</property> | ||
| 11206 | <property name="id">wxID_ANY</property> | ||
| 11207 | <property name="label">CALL ANY</property> | ||
| 11208 | <property name="maximum_size"></property> | ||
| 11209 | <property name="minimum_size"></property> | ||
| 11210 | <property name="name">m_checkPreCallAny</property> | ||
| 11211 | <property name="permission">public</property> | ||
| 11212 | <property name="pos"></property> | ||
| 11213 | <property name="size">100,-1</property> | ||
| 11214 | <property name="style"></property> | ||
| 11215 | <property name="subclass"></property> | ||
| 11216 | <property name="tooltip"></property> | ||
| 11217 | <property name="window_extra_style"></property> | ||
| 11218 | <property name="window_name"></property> | ||
| 11219 | <property name="window_style"></property> | ||
| 11220 | <event name="OnChar"></event> | ||
| 11221 | <event name="OnCheckBox">OnCheckPreCallAny</event> | ||
| 11222 | <event name="OnEnterWindow"></event> | ||
| 11223 | <event name="OnEraseBackground"></event> | ||
| 11224 | <event name="OnKeyDown"></event> | ||
| 11225 | <event name="OnKeyUp"></event> | ||
| 11226 | <event name="OnKillFocus"></event> | ||
| 11227 | <event name="OnLeaveWindow"></event> | ||
| 11228 | <event name="OnLeftDClick"></event> | ||
| 11229 | <event name="OnLeftDown"></event> | ||
| 11230 | <event name="OnLeftUp"></event> | ||
| 11231 | <event name="OnMiddleDClick"></event> | ||
| 11232 | <event name="OnMiddleDown"></event> | ||
| 11233 | <event name="OnMiddleUp"></event> | ||
| 11234 | <event name="OnMotion"></event> | ||
| 11235 | <event name="OnMouseEvents"></event> | ||
| 11236 | <event name="OnMouseWheel"></event> | ||
| 11237 | <event name="OnPaint"></event> | ||
| 11238 | <event name="OnRightDClick"></event> | ||
| 11239 | <event name="OnRightDown"></event> | ||
| 11240 | <event name="OnRightUp"></event> | ||
| 11241 | <event name="OnSetFocus"></event> | ||
| 11242 | <event name="OnSize"></event> | ||
| 11243 | <event name="OnUpdateUI"></event> | ||
| 11244 | </object> | ||
| 11245 | </object> | ||
| 11246 | <object class="sizeritem" expanded="1"> | ||
| 11247 | <property name="border">5</property> | ||
| 11248 | <property name="flag">wxALL</property> | ||
| 11249 | <property name="proportion">0</property> | ||
| 11250 | <object class="wxCheckBox" expanded="1"> | ||
| 11251 | <property name="bg"></property> | ||
| 11252 | <property name="checked">0</property> | ||
| 11253 | <property name="context_help"></property> | ||
| 11254 | <property name="enabled">1</property> | ||
| 11255 | <property name="fg"></property> | ||
| 11256 | <property name="font"></property> | ||
| 11257 | <property name="hidden">0</property> | ||
| 11258 | <property name="id">wxID_ANY</property> | ||
| 11259 | <property name="label">RAISE</property> | ||
| 11260 | <property name="maximum_size"></property> | ||
| 11261 | <property name="minimum_size"></property> | ||
| 11262 | <property name="name">m_checkPreRaise</property> | ||
| 11263 | <property name="permission">public</property> | ||
| 11264 | <property name="pos"></property> | ||
| 11265 | <property name="size">100,-1</property> | ||
| 11266 | <property name="style"></property> | ||
| 11267 | <property name="subclass"></property> | ||
| 11268 | <property name="tooltip"></property> | ||
| 11269 | <property name="window_extra_style"></property> | ||
| 11270 | <property name="window_name"></property> | ||
| 11271 | <property name="window_style"></property> | ||
| 11272 | <event name="OnChar"></event> | ||
| 11273 | <event name="OnCheckBox">OnCheckPreRaise</event> | ||
| 11274 | <event name="OnEnterWindow"></event> | ||
| 11275 | <event name="OnEraseBackground"></event> | ||
| 11276 | <event name="OnKeyDown"></event> | ||
| 11277 | <event name="OnKeyUp"></event> | ||
| 11278 | <event name="OnKillFocus"></event> | ||
| 11279 | <event name="OnLeaveWindow"></event> | ||
| 11280 | <event name="OnLeftDClick"></event> | ||
| 11281 | <event name="OnLeftDown"></event> | ||
| 11282 | <event name="OnLeftUp"></event> | ||
| 11283 | <event name="OnMiddleDClick"></event> | ||
| 11284 | <event name="OnMiddleDown"></event> | ||
| 11285 | <event name="OnMiddleUp"></event> | ||
| 11286 | <event name="OnMotion"></event> | ||
| 11287 | <event name="OnMouseEvents"></event> | ||
| 11288 | <event name="OnMouseWheel"></event> | ||
| 11289 | <event name="OnPaint"></event> | ||
| 11290 | <event name="OnRightDClick"></event> | ||
| 11291 | <event name="OnRightDown"></event> | ||
| 11292 | <event name="OnRightUp"></event> | ||
| 11293 | <event name="OnSetFocus"></event> | ||
| 11294 | <event name="OnSize"></event> | ||
| 11295 | <event name="OnUpdateUI"></event> | ||
| 11296 | </object> | ||
| 11297 | </object> | ||
| 11298 | <object class="sizeritem" expanded="1"> | ||
| 11299 | <property name="border">5</property> | ||
| 11300 | <property name="flag">wxALL</property> | ||
| 11301 | <property name="proportion">0</property> | ||
| 11302 | <object class="wxCheckBox" expanded="1"> | ||
| 11303 | <property name="bg"></property> | ||
| 11304 | <property name="checked">0</property> | ||
| 11305 | <property name="context_help"></property> | ||
| 11306 | <property name="enabled">1</property> | ||
| 11307 | <property name="fg"></property> | ||
| 11308 | <property name="font"></property> | ||
| 11309 | <property name="hidden">0</property> | ||
| 11310 | <property name="id">wxID_ANY</property> | ||
| 11311 | <property name="label">RAISE ANY</property> | ||
| 11312 | <property name="maximum_size"></property> | ||
| 11313 | <property name="minimum_size"></property> | ||
| 11314 | <property name="name">m_checkPreRaiseAny</property> | ||
| 11315 | <property name="permission">public</property> | ||
| 11316 | <property name="pos"></property> | ||
| 11317 | <property name="size">100,-1</property> | ||
| 11318 | <property name="style"></property> | ||
| 11319 | <property name="subclass"></property> | ||
| 11320 | <property name="tooltip"></property> | ||
| 11321 | <property name="window_extra_style"></property> | ||
| 11322 | <property name="window_name"></property> | ||
| 11323 | <property name="window_style"></property> | ||
| 11324 | <event name="OnChar"></event> | ||
| 11325 | <event name="OnCheckBox">OnCheckPreRaiseAny</event> | ||
| 11326 | <event name="OnEnterWindow"></event> | ||
| 11327 | <event name="OnEraseBackground"></event> | ||
| 11328 | <event name="OnKeyDown"></event> | ||
| 11329 | <event name="OnKeyUp"></event> | ||
| 11330 | <event name="OnKillFocus"></event> | ||
| 11331 | <event name="OnLeaveWindow"></event> | ||
| 11332 | <event name="OnLeftDClick"></event> | ||
| 11333 | <event name="OnLeftDown"></event> | ||
| 11334 | <event name="OnLeftUp"></event> | ||
| 11335 | <event name="OnMiddleDClick"></event> | ||
| 11336 | <event name="OnMiddleDown"></event> | ||
| 11337 | <event name="OnMiddleUp"></event> | ||
| 11338 | <event name="OnMotion"></event> | ||
| 11339 | <event name="OnMouseEvents"></event> | ||
| 11340 | <event name="OnMouseWheel"></event> | ||
| 11341 | <event name="OnPaint"></event> | ||
| 11342 | <event name="OnRightDClick"></event> | ||
| 11343 | <event name="OnRightDown"></event> | ||
| 11344 | <event name="OnRightUp"></event> | ||
| 11345 | <event name="OnSetFocus"></event> | ||
| 11346 | <event name="OnSize"></event> | ||
| 11347 | <event name="OnUpdateUI"></event> | ||
| 11348 | </object> | ||
| 11349 | </object> | ||
| 11350 | </object> | ||
| 11351 | <object class="wxStatusBar" expanded="1"> | ||
| 11352 | <property name="bg"></property> | ||
| 11353 | <property name="context_help"></property> | ||
| 11354 | <property name="enabled">1</property> | ||
| 11355 | <property name="fg"></property> | ||
| 11356 | <property name="fields">1</property> | ||
| 11357 | <property name="font"></property> | ||
| 11358 | <property name="hidden">0</property> | ||
| 11359 | <property name="id">wxID_ANY</property> | ||
| 11360 | <property name="maximum_size"></property> | ||
| 11361 | <property name="minimum_size"></property> | ||
| 11362 | <property name="name">m_statusBar</property> | ||
| 11363 | <property name="permission">public</property> | ||
| 11364 | <property name="pos"></property> | ||
| 11365 | <property name="size"></property> | ||
| 11366 | <property name="style">wxST_SIZEGRIP</property> | ||
| 11367 | <property name="subclass"></property> | ||
| 11368 | <property name="tooltip"></property> | ||
| 11369 | <property name="window_extra_style"></property> | ||
| 11370 | <property name="window_name"></property> | ||
| 11371 | <property name="window_style"></property> | ||
| 11372 | <event name="OnChar"></event> | ||
| 11373 | <event name="OnEnterWindow"></event> | ||
| 11374 | <event name="OnEraseBackground"></event> | ||
| 11375 | <event name="OnKeyDown"></event> | ||
| 11376 | <event name="OnKeyUp"></event> | ||
| 11377 | <event name="OnKillFocus"></event> | ||
| 11378 | <event name="OnLeaveWindow"></event> | ||
| 11379 | <event name="OnLeftDClick"></event> | ||
| 11380 | <event name="OnLeftDown"></event> | ||
| 11381 | <event name="OnLeftUp"></event> | ||
| 11382 | <event name="OnMiddleDClick"></event> | ||
| 11383 | <event name="OnMiddleDown"></event> | ||
| 11384 | <event name="OnMiddleUp"></event> | ||
| 11385 | <event name="OnMotion"></event> | ||
| 11386 | <event name="OnMouseEvents"></event> | ||
| 11387 | <event name="OnMouseWheel"></event> | ||
| 11388 | <event name="OnPaint"></event> | ||
| 11389 | <event name="OnRightDClick"></event> | ||
| 11390 | <event name="OnRightDown"></event> | ||
| 11391 | <event name="OnRightUp"></event> | ||
| 11392 | <event name="OnSetFocus"></event> | ||
| 11393 | <event name="OnSize"></event> | ||
| 11394 | <event name="OnUpdateUI"></event> | ||
| 11395 | </object> | ||
| 11396 | </object> | ||
| 11397 | <object class="Dialog" expanded="0"> | ||
| 11398 | <property name="bg"></property> | ||
| 11399 | <property name="center"></property> | ||
| 11400 | <property name="context_help"></property> | ||
| 11401 | <property name="enabled">1</property> | ||
| 11402 | <property name="extra_style"></property> | ||
| 11403 | <property name="fg"></property> | ||
| 11404 | <property name="font"></property> | ||
| 11405 | <property name="hidden">0</property> | ||
| 11406 | <property name="id">wxID_ANY</property> | ||
| 11407 | <property name="maximum_size"></property> | ||
| 11408 | <property name="minimum_size"></property> | ||
| 11409 | <property name="name">CGetTextFromUserDialogBase</property> | ||
| 11410 | <property name="pos"></property> | ||
| 11411 | <property name="size">403,138</property> | ||
| 11412 | <property name="style">wxDEFAULT_DIALOG_STYLE</property> | ||
| 11413 | <property name="subclass"></property> | ||
| 11414 | <property name="title"></property> | ||
| 11415 | <property name="tooltip"></property> | ||
| 11416 | <property name="window_extra_style"></property> | ||
| 11417 | <property name="window_name"></property> | ||
| 11418 | <property name="window_style"></property> | ||
| 11419 | <event name="OnActivate"></event> | ||
| 11420 | <event name="OnActivateApp"></event> | ||
| 11421 | <event name="OnChar"></event> | ||
| 11422 | <event name="OnClose">OnClose</event> | ||
| 11423 | <event name="OnEnterWindow"></event> | ||
| 11424 | <event name="OnEraseBackground"></event> | ||
| 11425 | <event name="OnHibernate"></event> | ||
| 11426 | <event name="OnIconize"></event> | ||
| 11427 | <event name="OnIdle"></event> | ||
| 11428 | <event name="OnInitDialog"></event> | ||
| 11429 | <event name="OnKeyDown"></event> | ||
| 11430 | <event name="OnKeyUp"></event> | ||
| 11431 | <event name="OnKillFocus"></event> | ||
| 11432 | <event name="OnLeaveWindow"></event> | ||
| 11433 | <event name="OnLeftDClick"></event> | ||
| 11434 | <event name="OnLeftDown"></event> | ||
| 11435 | <event name="OnLeftUp"></event> | ||
| 11436 | <event name="OnMiddleDClick"></event> | ||
| 11437 | <event name="OnMiddleDown"></event> | ||
| 11438 | <event name="OnMiddleUp"></event> | ||
| 11439 | <event name="OnMotion"></event> | ||
| 11440 | <event name="OnMouseEvents"></event> | ||
| 11441 | <event name="OnMouseWheel"></event> | ||
| 11442 | <event name="OnPaint"></event> | ||
| 11443 | <event name="OnRightDClick"></event> | ||
| 11444 | <event name="OnRightDown"></event> | ||
| 11445 | <event name="OnRightUp"></event> | ||
| 11446 | <event name="OnSetFocus"></event> | ||
| 11447 | <event name="OnSize"></event> | ||
| 11448 | <event name="OnUpdateUI"></event> | ||
| 11449 | <object class="wxBoxSizer" expanded="1"> | ||
| 11450 | <property name="minimum_size"></property> | ||
| 11451 | <property name="name">bSizer79</property> | ||
| 11452 | <property name="orient">wxVERTICAL</property> | ||
| 11453 | <property name="permission">none</property> | ||
| 11454 | <object class="sizeritem" expanded="1"> | ||
| 11455 | <property name="border">10</property> | ||
| 11456 | <property name="flag">wxEXPAND|wxALL</property> | ||
| 11457 | <property name="proportion">1</property> | ||
| 11458 | <object class="wxBoxSizer" expanded="1"> | ||
| 11459 | <property name="minimum_size"></property> | ||
| 11460 | <property name="name">bSizer81</property> | ||
| 11461 | <property name="orient">wxVERTICAL</property> | ||
| 11462 | <property name="permission">none</property> | ||
| 11463 | <object class="sizeritem" expanded="1"> | ||
| 11464 | <property name="border">5</property> | ||
| 11465 | <property name="flag">wxEXPAND</property> | ||
| 11466 | <property name="proportion">1</property> | ||
| 11467 | <object class="spacer" expanded="1"> | ||
| 11468 | <property name="height">0</property> | ||
| 11469 | <property name="permission">protected</property> | ||
| 11470 | <property name="width">0</property> | ||
| 11471 | </object> | ||
| 11472 | </object> | ||
| 11473 | <object class="sizeritem" expanded="1"> | ||
| 11474 | <property name="border">5</property> | ||
| 11475 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 11476 | <property name="proportion">0</property> | ||
| 11477 | <object class="wxStaticText" expanded="1"> | ||
| 11478 | <property name="bg"></property> | ||
| 11479 | <property name="context_help"></property> | ||
| 11480 | <property name="enabled">1</property> | ||
| 11481 | <property name="fg"></property> | ||
| 11482 | <property name="font"></property> | ||
| 11483 | <property name="hidden">0</property> | ||
| 11484 | <property name="id">wxID_ANY</property> | ||
| 11485 | <property name="label"></property> | ||
| 11486 | <property name="maximum_size"></property> | ||
| 11487 | <property name="minimum_size"></property> | ||
| 11488 | <property name="name">m_staticTextMessage1</property> | ||
| 11489 | <property name="permission">protected</property> | ||
| 11490 | <property name="pos"></property> | ||
| 11491 | <property name="size"></property> | ||
| 11492 | <property name="style"></property> | ||
| 11493 | <property name="subclass"></property> | ||
| 11494 | <property name="tooltip"></property> | ||
| 11495 | <property name="window_extra_style"></property> | ||
| 11496 | <property name="window_name"></property> | ||
| 11497 | <property name="window_style"></property> | ||
| 11498 | <property name="wrap">-1</property> | ||
| 11499 | <event name="OnChar"></event> | ||
| 11500 | <event name="OnEnterWindow"></event> | ||
| 11501 | <event name="OnEraseBackground"></event> | ||
| 11502 | <event name="OnKeyDown"></event> | ||
| 11503 | <event name="OnKeyUp"></event> | ||
| 11504 | <event name="OnKillFocus"></event> | ||
| 11505 | <event name="OnLeaveWindow"></event> | ||
| 11506 | <event name="OnLeftDClick"></event> | ||
| 11507 | <event name="OnLeftDown"></event> | ||
| 11508 | <event name="OnLeftUp"></event> | ||
| 11509 | <event name="OnMiddleDClick"></event> | ||
| 11510 | <event name="OnMiddleDown"></event> | ||
| 11511 | <event name="OnMiddleUp"></event> | ||
| 11512 | <event name="OnMotion"></event> | ||
| 11513 | <event name="OnMouseEvents"></event> | ||
| 11514 | <event name="OnMouseWheel"></event> | ||
| 11515 | <event name="OnPaint"></event> | ||
| 11516 | <event name="OnRightDClick"></event> | ||
| 11517 | <event name="OnRightDown"></event> | ||
| 11518 | <event name="OnRightUp"></event> | ||
| 11519 | <event name="OnSetFocus"></event> | ||
| 11520 | <event name="OnSize"></event> | ||
| 11521 | <event name="OnUpdateUI"></event> | ||
| 11522 | </object> | ||
| 11523 | </object> | ||
| 11524 | <object class="sizeritem" expanded="1"> | ||
| 11525 | <property name="border">5</property> | ||
| 11526 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property> | ||
| 11527 | <property name="proportion">0</property> | ||
| 11528 | <object class="wxTextCtrl" expanded="1"> | ||
| 11529 | <property name="bg"></property> | ||
| 11530 | <property name="context_help"></property> | ||
| 11531 | <property name="enabled">1</property> | ||
| 11532 | <property name="fg"></property> | ||
| 11533 | <property name="font"></property> | ||
| 11534 | <property name="hidden">0</property> | ||
| 11535 | <property name="id">wxID_TEXTCTRL</property> | ||
| 11536 | <property name="maximum_size"></property> | ||
| 11537 | <property name="maxlength">0</property> | ||
| 11538 | <property name="minimum_size"></property> | ||
| 11539 | <property name="name">m_textCtrl1</property> | ||
| 11540 | <property name="permission">protected</property> | ||
| 11541 | <property name="pos"></property> | ||
| 11542 | <property name="size"></property> | ||
| 11543 | <property name="style">wxTE_PROCESS_ENTER</property> | ||
| 11544 | <property name="subclass"></property> | ||
| 11545 | <property name="tooltip"></property> | ||
| 11546 | <property name="value"></property> | ||
| 11547 | <property name="window_extra_style"></property> | ||
| 11548 | <property name="window_name"></property> | ||
| 11549 | <property name="window_style"></property> | ||
| 11550 | <event name="OnChar"></event> | ||
| 11551 | <event name="OnEnterWindow"></event> | ||
| 11552 | <event name="OnEraseBackground"></event> | ||
| 11553 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 11554 | <event name="OnKeyUp"></event> | ||
| 11555 | <event name="OnKillFocus"></event> | ||
| 11556 | <event name="OnLeaveWindow"></event> | ||
| 11557 | <event name="OnLeftDClick"></event> | ||
| 11558 | <event name="OnLeftDown"></event> | ||
| 11559 | <event name="OnLeftUp"></event> | ||
| 11560 | <event name="OnMiddleDClick"></event> | ||
| 11561 | <event name="OnMiddleDown"></event> | ||
| 11562 | <event name="OnMiddleUp"></event> | ||
| 11563 | <event name="OnMotion"></event> | ||
| 11564 | <event name="OnMouseEvents"></event> | ||
| 11565 | <event name="OnMouseWheel"></event> | ||
| 11566 | <event name="OnPaint"></event> | ||
| 11567 | <event name="OnRightDClick"></event> | ||
| 11568 | <event name="OnRightDown"></event> | ||
| 11569 | <event name="OnRightUp"></event> | ||
| 11570 | <event name="OnSetFocus"></event> | ||
| 11571 | <event name="OnSize"></event> | ||
| 11572 | <event name="OnText"></event> | ||
| 11573 | <event name="OnTextEnter"></event> | ||
| 11574 | <event name="OnTextMaxLen"></event> | ||
| 11575 | <event name="OnTextURL"></event> | ||
| 11576 | <event name="OnUpdateUI"></event> | ||
| 11577 | </object> | ||
| 11578 | </object> | ||
| 11579 | <object class="sizeritem" expanded="1"> | ||
| 11580 | <property name="border">5</property> | ||
| 11581 | <property name="flag">wxTOP|wxRIGHT|wxLEFT</property> | ||
| 11582 | <property name="proportion">0</property> | ||
| 11583 | <object class="wxStaticText" expanded="1"> | ||
| 11584 | <property name="bg"></property> | ||
| 11585 | <property name="context_help"></property> | ||
| 11586 | <property name="enabled">1</property> | ||
| 11587 | <property name="fg"></property> | ||
| 11588 | <property name="font"></property> | ||
| 11589 | <property name="hidden">1</property> | ||
| 11590 | <property name="id">wxID_ANY</property> | ||
| 11591 | <property name="label"></property> | ||
| 11592 | <property name="maximum_size"></property> | ||
| 11593 | <property name="minimum_size"></property> | ||
| 11594 | <property name="name">m_staticTextMessage2</property> | ||
| 11595 | <property name="permission">protected</property> | ||
| 11596 | <property name="pos"></property> | ||
| 11597 | <property name="size"></property> | ||
| 11598 | <property name="style"></property> | ||
| 11599 | <property name="subclass"></property> | ||
| 11600 | <property name="tooltip"></property> | ||
| 11601 | <property name="window_extra_style"></property> | ||
| 11602 | <property name="window_name"></property> | ||
| 11603 | <property name="window_style"></property> | ||
| 11604 | <property name="wrap">-1</property> | ||
| 11605 | <event name="OnChar"></event> | ||
| 11606 | <event name="OnEnterWindow"></event> | ||
| 11607 | <event name="OnEraseBackground"></event> | ||
| 11608 | <event name="OnKeyDown"></event> | ||
| 11609 | <event name="OnKeyUp"></event> | ||
| 11610 | <event name="OnKillFocus"></event> | ||
| 11611 | <event name="OnLeaveWindow"></event> | ||
| 11612 | <event name="OnLeftDClick"></event> | ||
| 11613 | <event name="OnLeftDown"></event> | ||
| 11614 | <event name="OnLeftUp"></event> | ||
| 11615 | <event name="OnMiddleDClick"></event> | ||
| 11616 | <event name="OnMiddleDown"></event> | ||
| 11617 | <event name="OnMiddleUp"></event> | ||
| 11618 | <event name="OnMotion"></event> | ||
| 11619 | <event name="OnMouseEvents"></event> | ||
| 11620 | <event name="OnMouseWheel"></event> | ||
| 11621 | <event name="OnPaint"></event> | ||
| 11622 | <event name="OnRightDClick"></event> | ||
| 11623 | <event name="OnRightDown"></event> | ||
| 11624 | <event name="OnRightUp"></event> | ||
| 11625 | <event name="OnSetFocus"></event> | ||
| 11626 | <event name="OnSize"></event> | ||
| 11627 | <event name="OnUpdateUI"></event> | ||
| 11628 | </object> | ||
| 11629 | </object> | ||
| 11630 | <object class="sizeritem" expanded="1"> | ||
| 11631 | <property name="border">5</property> | ||
| 11632 | <property name="flag">wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL</property> | ||
| 11633 | <property name="proportion">0</property> | ||
| 11634 | <object class="wxTextCtrl" expanded="1"> | ||
| 11635 | <property name="bg"></property> | ||
| 11636 | <property name="context_help"></property> | ||
| 11637 | <property name="enabled">1</property> | ||
| 11638 | <property name="fg"></property> | ||
| 11639 | <property name="font"></property> | ||
| 11640 | <property name="hidden">1</property> | ||
| 11641 | <property name="id">wxID_TEXTCTRL</property> | ||
| 11642 | <property name="maximum_size"></property> | ||
| 11643 | <property name="maxlength">0</property> | ||
| 11644 | <property name="minimum_size"></property> | ||
| 11645 | <property name="name">m_textCtrl2</property> | ||
| 11646 | <property name="permission">protected</property> | ||
| 11647 | <property name="pos"></property> | ||
| 11648 | <property name="size"></property> | ||
| 11649 | <property name="style">wxTE_PROCESS_ENTER</property> | ||
| 11650 | <property name="subclass"></property> | ||
| 11651 | <property name="tooltip"></property> | ||
| 11652 | <property name="value"></property> | ||
| 11653 | <property name="window_extra_style"></property> | ||
| 11654 | <property name="window_name"></property> | ||
| 11655 | <property name="window_style"></property> | ||
| 11656 | <event name="OnChar"></event> | ||
| 11657 | <event name="OnEnterWindow"></event> | ||
| 11658 | <event name="OnEraseBackground"></event> | ||
| 11659 | <event name="OnKeyDown">OnKeyDown</event> | ||
| 11660 | <event name="OnKeyUp"></event> | ||
| 11661 | <event name="OnKillFocus"></event> | ||
| 11662 | <event name="OnLeaveWindow"></event> | ||
| 11663 | <event name="OnLeftDClick"></event> | ||
| 11664 | <event name="OnLeftDown"></event> | ||
| 11665 | <event name="OnLeftUp"></event> | ||
| 11666 | <event name="OnMiddleDClick"></event> | ||
| 11667 | <event name="OnMiddleDown"></event> | ||
| 11668 | <event name="OnMiddleUp"></event> | ||
| 11669 | <event name="OnMotion"></event> | ||
| 11670 | <event name="OnMouseEvents"></event> | ||
| 11671 | <event name="OnMouseWheel"></event> | ||
| 11672 | <event name="OnPaint"></event> | ||
| 11673 | <event name="OnRightDClick"></event> | ||
| 11674 | <event name="OnRightDown"></event> | ||
| 11675 | <event name="OnRightUp"></event> | ||
| 11676 | <event name="OnSetFocus"></event> | ||
| 11677 | <event name="OnSize"></event> | ||
| 11678 | <event name="OnText"></event> | ||
| 11679 | <event name="OnTextEnter"></event> | ||
| 11680 | <event name="OnTextMaxLen"></event> | ||
| 11681 | <event name="OnTextURL"></event> | ||
| 11682 | <event name="OnUpdateUI"></event> | ||
| 11683 | </object> | ||
| 11684 | </object> | ||
| 11685 | <object class="sizeritem" expanded="1"> | ||
| 11686 | <property name="border">5</property> | ||
| 11687 | <property name="flag">wxEXPAND</property> | ||
| 11688 | <property name="proportion">1</property> | ||
| 11689 | <object class="spacer" expanded="1"> | ||
| 11690 | <property name="height">0</property> | ||
| 11691 | <property name="permission">protected</property> | ||
| 11692 | <property name="width">0</property> | ||
| 11693 | </object> | ||
| 11694 | </object> | ||
| 11695 | </object> | ||
| 11696 | </object> | ||
| 11697 | <object class="sizeritem" expanded="1"> | ||
| 11698 | <property name="border">5</property> | ||
| 11699 | <property name="flag">wxEXPAND</property> | ||
| 11700 | <property name="proportion">0</property> | ||
| 11701 | <object class="wxBoxSizer" expanded="1"> | ||
| 11702 | <property name="minimum_size"></property> | ||
| 11703 | <property name="name">bSizer80</property> | ||
| 11704 | <property name="orient">wxHORIZONTAL</property> | ||
| 11705 | <property name="permission">none</property> | ||
| 11706 | <object class="sizeritem" expanded="1"> | ||
| 11707 | <property name="border">5</property> | ||
| 11708 | <property name="flag">wxEXPAND</property> | ||
| 11709 | <property name="proportion">1</property> | ||
| 11710 | <object class="spacer" expanded="1"> | ||
| 11711 | <property name="height">0</property> | ||
| 11712 | <property name="permission">protected</property> | ||
| 11713 | <property name="width">0</property> | ||
| 11714 | </object> | ||
| 11715 | </object> | ||
| 11716 | <object class="sizeritem" expanded="1"> | ||
| 11717 | <property name="border">5</property> | ||
| 11718 | <property name="flag">wxALL</property> | ||
| 11719 | <property name="proportion">0</property> | ||
| 11720 | <object class="wxButton" expanded="1"> | ||
| 11721 | <property name="bg"></property> | ||
| 11722 | <property name="context_help"></property> | ||
| 11723 | <property name="default">0</property> | ||
| 11724 | <property name="enabled">1</property> | ||
| 11725 | <property name="fg"></property> | ||
| 11726 | <property name="font"></property> | ||
| 11727 | <property name="hidden">0</property> | ||
| 11728 | <property name="id">wxID_OK</property> | ||
| 11729 | <property name="label">OK</property> | ||
| 11730 | <property name="maximum_size"></property> | ||
| 11731 | <property name="minimum_size">85,25</property> | ||
| 11732 | <property name="name">m_buttonOK</property> | ||
| 11733 | <property name="permission">protected</property> | ||
| 11734 | <property name="pos"></property> | ||
| 11735 | <property name="size">-1,-1</property> | ||
| 11736 | <property name="style"></property> | ||
| 11737 | <property name="subclass"></property> | ||
| 11738 | <property name="tooltip"></property> | ||
| 11739 | <property name="window_extra_style"></property> | ||
| 11740 | <property name="window_name"></property> | ||
| 11741 | <property name="window_style"></property> | ||
| 11742 | <event name="OnButtonClick">OnButtonOK</event> | ||
| 11743 | <event name="OnChar"></event> | ||
| 11744 | <event name="OnEnterWindow"></event> | ||
| 11745 | <event name="OnEraseBackground"></event> | ||
| 11746 | <event name="OnKeyDown"></event> | ||
| 11747 | <event name="OnKeyUp"></event> | ||
| 11748 | <event name="OnKillFocus"></event> | ||
| 11749 | <event name="OnLeaveWindow"></event> | ||
| 11750 | <event name="OnLeftDClick"></event> | ||
| 11751 | <event name="OnLeftDown"></event> | ||
| 11752 | <event name="OnLeftUp"></event> | ||
| 11753 | <event name="OnMiddleDClick"></event> | ||
| 11754 | <event name="OnMiddleDown"></event> | ||
| 11755 | <event name="OnMiddleUp"></event> | ||
| 11756 | <event name="OnMotion"></event> | ||
| 11757 | <event name="OnMouseEvents"></event> | ||
| 11758 | <event name="OnMouseWheel"></event> | ||
| 11759 | <event name="OnPaint"></event> | ||
| 11760 | <event name="OnRightDClick"></event> | ||
| 11761 | <event name="OnRightDown"></event> | ||
| 11762 | <event name="OnRightUp"></event> | ||
| 11763 | <event name="OnSetFocus"></event> | ||
| 11764 | <event name="OnSize"></event> | ||
| 11765 | <event name="OnUpdateUI"></event> | ||
| 11766 | </object> | ||
| 11767 | </object> | ||
| 11768 | <object class="sizeritem" expanded="1"> | ||
| 11769 | <property name="border">5</property> | ||
| 11770 | <property name="flag">wxALL</property> | ||
| 11771 | <property name="proportion">0</property> | ||
| 11772 | <object class="wxButton" expanded="1"> | ||
| 11773 | <property name="bg"></property> | ||
| 11774 | <property name="context_help"></property> | ||
| 11775 | <property name="default">0</property> | ||
| 11776 | <property name="enabled">1</property> | ||
| 11777 | <property name="fg"></property> | ||
| 11778 | <property name="font"></property> | ||
| 11779 | <property name="hidden">0</property> | ||
| 11780 | <property name="id">wxID_CANCEL</property> | ||
| 11781 | <property name="label">Cancel</property> | ||
| 11782 | <property name="maximum_size"></property> | ||
| 11783 | <property name="minimum_size">85,25</property> | ||
| 11784 | <property name="name">m_buttonCancel</property> | ||
| 11785 | <property name="permission">protected</property> | ||
| 11786 | <property name="pos"></property> | ||
| 11787 | <property name="size"></property> | ||
| 11788 | <property name="style"></property> | ||
| 11789 | <property name="subclass"></property> | ||
| 11790 | <property name="tooltip"></property> | ||
| 11791 | <property name="window_extra_style"></property> | ||
| 11792 | <property name="window_name"></property> | ||
| 11793 | <property name="window_style"></property> | ||
| 11794 | <event name="OnButtonClick">OnButtonCancel</event> | ||
| 11795 | <event name="OnChar"></event> | ||
| 11796 | <event name="OnEnterWindow"></event> | ||
| 11797 | <event name="OnEraseBackground"></event> | ||
| 11798 | <event name="OnKeyDown"></event> | ||
| 11799 | <event name="OnKeyUp"></event> | ||
| 11800 | <event name="OnKillFocus"></event> | ||
| 11801 | <event name="OnLeaveWindow"></event> | ||
| 11802 | <event name="OnLeftDClick"></event> | ||
| 11803 | <event name="OnLeftDown"></event> | ||
| 11804 | <event name="OnLeftUp"></event> | ||
| 11805 | <event name="OnMiddleDClick"></event> | ||
| 11806 | <event name="OnMiddleDown"></event> | ||
| 11807 | <event name="OnMiddleUp"></event> | ||
| 11808 | <event name="OnMotion"></event> | ||
| 11809 | <event name="OnMouseEvents"></event> | ||
| 11810 | <event name="OnMouseWheel"></event> | ||
| 11811 | <event name="OnPaint"></event> | ||
| 11812 | <event name="OnRightDClick"></event> | ||
| 11813 | <event name="OnRightDown"></event> | ||
| 11814 | <event name="OnRightUp"></event> | ||
| 11815 | <event name="OnSetFocus"></event> | ||
| 11816 | <event name="OnSize"></event> | ||
| 11817 | <event name="OnUpdateUI"></event> | ||
| 11818 | </object> | ||
| 11819 | </object> | ||
| 11820 | </object> | ||
| 11821 | </object> | ||
| 11822 | </object> | ||
| 11823 | </object> | ||
| 11824 | </object> | ||
| 11825 | </wxFormBuilder_Project> | ||
diff --git a/src/util.cpp b/src/util.cpp index 7f56530..68bd18e 100644 --- a/src/util.cpp +++ b/src/util.cpp | |||
| @@ -8,6 +8,99 @@ | |||
| 8 | 8 | ||
| 9 | bool fDebug = false; | 9 | bool fDebug = false; |
| 10 | 10 | ||
| 11 | // --------------------------------------------------------------------------- | ||
| 12 | // Categorized, burst-collapsing logging -- see the LogPrint doc comment in | ||
| 13 | // util.h for the problem this solves. | ||
| 14 | // --------------------------------------------------------------------------- | ||
| 15 | |||
| 16 | // Categories that explain the pool/worker/payout pipeline are on unconditionally: | ||
| 17 | // silence there is exactly the "worker stuck, nothing then happens" complaint | ||
| 18 | // this exists to fix, so it can't be opted out of by forgetting -debug. | ||
| 19 | // "net" and "nostr" cover the per-address connection/discovery chatter that | ||
| 20 | // used to dominate debug.log; they're gated behind fDebug like the printf() | ||
| 21 | // calls they replace, so default output stays quiet unless requested. | ||
| 22 | static bool LogCategoryDefaultOn(const char* category) | ||
| 23 | { | ||
| 24 | return strcmp(category, "pool") == 0 || | ||
| 25 | strcmp(category, "worker") == 0 || | ||
| 26 | strcmp(category, "payout") == 0; | ||
| 27 | } | ||
| 28 | |||
| 29 | bool LogAcceptsCategory(const char* category) | ||
| 30 | { | ||
| 31 | if (LogCategoryDefaultOn(category)) | ||
| 32 | return true; | ||
| 33 | return fDebug; | ||
| 34 | } | ||
| 35 | |||
| 36 | // Only collapse bursts from the exact same call site within this window; | ||
| 37 | // a different LogPrint() call (different file/line) is never merged with | ||
| 38 | // this one, so unrelated messages never get mixed into one summary. | ||
| 39 | static const int64 DEDUP_WINDOW_SECS = 3; | ||
| 40 | |||
| 41 | struct LogDedupState { | ||
| 42 | int64 windowStart; // GetTime() when the current window opened | ||
| 43 | int suppressed; // calls swallowed so far this window | ||
| 44 | std::string lastMsg; // most recent message text, for the summary line | ||
| 45 | }; | ||
| 46 | |||
| 47 | static std::map<std::string, LogDedupState> g_logDedup; | ||
| 48 | static CCriticalSection cs_logDedup; | ||
| 49 | |||
| 50 | void LogPrintDedup(const char* category, const char* file, int line, const std::string& msgIn) | ||
| 51 | { | ||
| 52 | // Call sites follow the existing printf() convention of ending their | ||
| 53 | // format string with \n; strip it here so the single \n this function | ||
| 54 | // adds below doesn't turn into a blank line. | ||
| 55 | std::string msg = msgIn; | ||
| 56 | while (!msg.empty() && (msg.back() == '\n' || msg.back() == '\r')) | ||
| 57 | msg.pop_back(); | ||
| 58 | |||
| 59 | char key[512]; | ||
| 60 | my_snprintf(key, sizeof(key), "%s|%s:%d", category, file, line); | ||
| 61 | |||
| 62 | int64 now = GetTime(); | ||
| 63 | bool fEmitNow = false; | ||
| 64 | int suppressedToFlush = 0; | ||
| 65 | std::string flushedMsg; | ||
| 66 | |||
| 67 | CRITICAL_BLOCK(cs_logDedup) | ||
| 68 | { | ||
| 69 | std::map<std::string, LogDedupState>::iterator it = g_logDedup.find(key); | ||
| 70 | if (it == g_logDedup.end()) | ||
| 71 | { | ||
| 72 | // First time this call site has fired (or its last window is long | ||
| 73 | // gone) -- print it directly and open a fresh window. | ||
| 74 | g_logDedup[key] = LogDedupState{now, 0, msg}; | ||
| 75 | fEmitNow = true; | ||
| 76 | } | ||
| 77 | else if (now - it->second.windowStart >= DEDUP_WINDOW_SECS) | ||
| 78 | { | ||
| 79 | // Window rolled over: flush what was suppressed during it (if | ||
| 80 | // anything), then start a new window with this call printed. | ||
| 81 | suppressedToFlush = it->second.suppressed; | ||
| 82 | flushedMsg = it->second.lastMsg; | ||
| 83 | it->second.windowStart = now; | ||
| 84 | it->second.suppressed = 0; | ||
| 85 | it->second.lastMsg = msg; | ||
| 86 | fEmitNow = true; | ||
| 87 | } | ||
| 88 | else | ||
| 89 | { | ||
| 90 | // Still inside the window and already printed one line for it: | ||
| 91 | // count this occurrence instead of writing another near-duplicate. | ||
| 92 | it->second.suppressed++; | ||
| 93 | it->second.lastMsg = msg; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | if (suppressedToFlush > 0) | ||
| 98 | OutputDebugStringF("[%s] (%d similar in %llds, last: %s)\n", | ||
| 99 | category, suppressedToFlush, (long long)DEDUP_WINDOW_SECS, flushedMsg.c_str()); | ||
| 100 | if (fEmitNow) | ||
| 101 | OutputDebugStringF("[%s] %s\n", category, msg.c_str()); | ||
| 102 | } | ||
| 103 | |||
| 11 | 104 | ||
| 12 | 105 | ||
| 13 | 106 | ||
| @@ -200,11 +293,16 @@ void PrintException(std::exception* pex, const char* pszThread) | |||
| 200 | snprintf(pszMessage, sizeof(pszMessage), | 293 | snprintf(pszMessage, sizeof(pszMessage), |
| 201 | "UNKNOWN EXCEPTION \n%s in %s \n", pszModule, pszThread); | 294 | "UNKNOWN EXCEPTION \n%s in %s \n", pszModule, pszThread); |
| 202 | printf("\n\n************************\n%s", pszMessage); | 295 | printf("\n\n************************\n%s", pszMessage); |
| 203 | // Suppress the dialog and rethrow during shutdown — threads unwinding on | 296 | // Do NOT rethrow here. Every caller of PrintException (via |
| 204 | // exit cause spurious "UNKNOWN EXCEPTION" popups that aren't real errors. | 297 | // CATCH_PRINT_EXCEPTION) is a thread wrapped in its own |
| 205 | // Show error in GUI via repaint signal — GUI polls g_errorMessage | 298 | // "try { ThreadFoo2() } catch(...) { log, sleep, loop again }" self-healing |
| 206 | if (!fShutdown) | 299 | // retry loop -- that's the whole point of the wrapper. Rethrowing from |
| 207 | throw; | 300 | // inside that catch block escapes the retry loop entirely (nothing above |
| 301 | // it in the thread catches it) and takes down the whole process with | ||
| 302 | // std::terminate() on the very first transient error -- a flaky relay | ||
| 303 | // connection, a malformed message, anything -- instead of letting the | ||
| 304 | // thread log it, sleep 5s, and try again like it's designed to. | ||
| 305 | // Show error in GUI via repaint signal -- GUI polls g_errorMessage | ||
| 208 | } | 306 | } |
| 209 | 307 | ||
| 210 | 308 | ||
| @@ -26,11 +26,14 @@ typedef unsigned long long uint64; | |||
| 26 | #define UEND(a) ((unsigned char*)&((&(a))[1])) | 26 | #define UEND(a) ((unsigned char*)&((&(a))[1])) |
| 27 | #define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0])) | 27 | #define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0])) |
| 28 | 28 | ||
| 29 | // Route printf to debug.log (and the console) on the GUI Windows build and on | 29 | // Route printf to debug.log (and the console on non-Windows) everywhere. |
| 30 | // the headless Linux build alike. | 30 | // (Previously gated on `defined(_WINDOWS) || !defined(_WIN32)` -- but |
| 31 | #if defined(_WINDOWS) || !defined(_WIN32) | 31 | // _WINDOWS is only ever defined by the legacy, unused makefile.vc build; |
| 32 | // the real Windows build (makefile.mingw) never defines it, so on actual | ||
| 33 | // Windows this condition was always false and debug.log was never written. | ||
| 34 | // OutputDebugStringF() is already platform-safe internally: it always | ||
| 35 | // writes debug.log, and only echoes to the console when not on Windows.) | ||
| 32 | #define printf OutputDebugStringF | 36 | #define printf OutputDebugStringF |
| 33 | #endif | ||
| 34 | 37 | ||
| 35 | #ifdef snprintf | 38 | #ifdef snprintf |
| 36 | #undef snprintf | 39 | #undef snprintf |
| @@ -70,6 +73,35 @@ inline T& REF(const T& val) | |||
| 70 | 73 | ||
| 71 | extern bool fDebug; | 74 | extern bool fDebug; |
| 72 | 75 | ||
| 76 | // --------------------------------------------------------------------------- | ||
| 77 | // Categorized, burst-collapsing logging | ||
| 78 | // | ||
| 79 | // Plain printf() (routed to OutputDebugStringF below) writes every call | ||
| 80 | // unfiltered to debug.log. That's fine for one-off events, but a loop that | ||
| 81 | // logs once per item -- once per discovered peer, once per connect attempt, | ||
| 82 | // once per share -- turns debug.log into a wall of near-identical lines that | ||
| 83 | // differ only by an address, while the line that actually explains a stuck | ||
| 84 | // flow ("Stratum: no job available for ...") scrolls off screen under the | ||
| 85 | // noise. LogPrint() is a drop-in replacement for printf() that fixes both | ||
| 86 | // problems without touching call sites' formatting: | ||
| 87 | // | ||
| 88 | // 1. Category tag: every call names the subsystem it belongs to ("pool", | ||
| 89 | // "worker", "payout", "net", "nostr", ...). LogAcceptsCategory() | ||
| 90 | // controls what's written (see util.cpp); the pool/worker/payout flow | ||
| 91 | // the person actually needs visibility into is on by default. | ||
| 92 | // 2. Burst collapse: repeated LogPrint() calls from the *same source line* | ||
| 93 | // only emit one line per DEDUP_WINDOW_SECS; if more calls land inside | ||
| 94 | // that window they're counted instead of reprinted, and the count is | ||
| 95 | // flushed as a single "(xN similar in Ws)" line the moment the window | ||
| 96 | // rolls over. A loop discovering 500 peers by address now produces a | ||
| 97 | // small, bounded number of lines instead of 500 -- log growth is capped | ||
| 98 | // by elapsed time, not by how many similar events happen to fire. | ||
| 99 | // --------------------------------------------------------------------------- | ||
| 100 | bool LogAcceptsCategory(const char* category); | ||
| 101 | void LogPrintDedup(const char* category, const char* file, int line, const std::string& msg); | ||
| 102 | #define LogPrint(category, ...) \ | ||
| 103 | do { if (LogAcceptsCategory(category)) LogPrintDedup((category), __FILE__, __LINE__, strprintf(__VA_ARGS__)); } while (0) | ||
| 104 | |||
| 73 | void RandAddSeed(bool fPerfmon=false); | 105 | void RandAddSeed(bool fPerfmon=false); |
| 74 | int my_snprintf(char* buffer, size_t limit, const char* format, ...); | 106 | int my_snprintf(char* buffer, size_t limit, const char* format, ...); |
| 75 | string strprintf(const char* format, ...); | 107 | string strprintf(const char* format, ...); |
| @@ -231,7 +263,7 @@ void PrintHex(const T pbegin, const T pend, const char* pszFormat="%s", bool fSp | |||
| 231 | 263 | ||
| 232 | 264 | ||
| 233 | 265 | ||
| 234 | // Forward declaration — defined in main.cpp | 266 | // Forward declaration -- defined in main.cpp |
| 235 | string GetAppDir(); | 267 | string GetAppDir(); |
| 236 | 268 | ||
| 237 | inline int OutputDebugStringF(const char* pszFormat, ...) | 269 | inline int OutputDebugStringF(const char* pszFormat, ...) |