event.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,452 行 · 第 1/3 页
CPP
1,452 行
if (now > (sm_lastUpdate + sm_updateInterval))
{
sm_lastUpdate = now;
}
}
#endif
}
/*
* Idle events
*/
wxIdleMode wxIdleEvent::sm_idleMode = wxIDLE_PROCESS_ALL;
// Can we send an idle event?
bool wxIdleEvent::CanSend(wxWindow* win)
{
// Don't update if we've switched global updating off
// and this window doesn't support updates.
if (win &&
(GetMode() == wxIDLE_PROCESS_SPECIFIED &&
((win->GetExtraStyle() & wxWS_EX_PROCESS_IDLE) == 0)))
return false;
return true;
}
/*
* Scroll events
*/
wxScrollEvent::wxScrollEvent(wxEventType commandType,
int id,
int pos,
int orient)
: wxCommandEvent(commandType, id)
{
m_extraLong = orient;
m_commandInt = pos;
}
/*
* ScrollWin events
*/
wxScrollWinEvent::wxScrollWinEvent(wxEventType commandType,
int pos,
int orient)
{
m_eventType = commandType;
m_extraLong = orient;
m_commandInt = pos;
}
/*
* Mouse events
*
*/
wxMouseEvent::wxMouseEvent(wxEventType commandType)
{
m_eventType = commandType;
m_metaDown = false;
m_altDown = false;
m_controlDown = false;
m_shiftDown = false;
m_leftDown = false;
m_rightDown = false;
m_middleDown = false;
m_x = 0;
m_y = 0;
m_wheelRotation = 0;
m_wheelDelta = 0;
m_linesPerAction = 0;
}
void wxMouseEvent::Assign(const wxMouseEvent& event)
{
m_eventType = event.m_eventType;
m_x = event.m_x;
m_y = event.m_y;
m_leftDown = event.m_leftDown;
m_middleDown = event.m_middleDown;
m_rightDown = event.m_rightDown;
m_controlDown = event.m_controlDown;
m_shiftDown = event.m_shiftDown;
m_altDown = event.m_altDown;
m_metaDown = event.m_metaDown;
m_wheelRotation = event.m_wheelRotation;
m_wheelDelta = event.m_wheelDelta;
m_linesPerAction = event.m_linesPerAction;
}
// return true if was a button dclick event
bool wxMouseEvent::ButtonDClick(int but) const
{
switch (but)
{
default:
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDClick"));
// fall through
case wxMOUSE_BTN_ANY:
return (LeftDClick() || MiddleDClick() || RightDClick());
case wxMOUSE_BTN_LEFT:
return LeftDClick();
case wxMOUSE_BTN_MIDDLE:
return MiddleDClick();
case wxMOUSE_BTN_RIGHT:
return RightDClick();
}
}
// return true if was a button down event
bool wxMouseEvent::ButtonDown(int but) const
{
switch (but)
{
default:
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonDown"));
// fall through
case wxMOUSE_BTN_ANY:
return (LeftDown() || MiddleDown() || RightDown());
case wxMOUSE_BTN_LEFT:
return LeftDown();
case wxMOUSE_BTN_MIDDLE:
return MiddleDown();
case wxMOUSE_BTN_RIGHT:
return RightDown();
}
}
// return true if was a button up event
bool wxMouseEvent::ButtonUp(int but) const
{
switch (but)
{
default:
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonUp"));
// fall through
case wxMOUSE_BTN_ANY:
return (LeftUp() || MiddleUp() || RightUp());
case wxMOUSE_BTN_LEFT:
return LeftUp();
case wxMOUSE_BTN_MIDDLE:
return MiddleUp();
case wxMOUSE_BTN_RIGHT:
return RightUp();
}
}
// return true if the given button is currently changing state
bool wxMouseEvent::Button(int but) const
{
switch (but)
{
default:
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::Button"));
// fall through
case wxMOUSE_BTN_ANY:
return ButtonUp(wxMOUSE_BTN_ANY) ||
ButtonDown(wxMOUSE_BTN_ANY) ||
ButtonDClick(wxMOUSE_BTN_ANY);
case wxMOUSE_BTN_LEFT:
return LeftDown() || LeftUp() || LeftDClick();
case wxMOUSE_BTN_MIDDLE:
return MiddleDown() || MiddleUp() || MiddleDClick();
case wxMOUSE_BTN_RIGHT:
return RightDown() || RightUp() || RightDClick();
}
}
bool wxMouseEvent::ButtonIsDown(int but) const
{
switch (but)
{
default:
wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown"));
// fall through
case wxMOUSE_BTN_ANY:
return LeftIsDown() || MiddleIsDown() || RightIsDown();
case wxMOUSE_BTN_LEFT:
return LeftIsDown();
case wxMOUSE_BTN_MIDDLE:
return MiddleIsDown();
case wxMOUSE_BTN_RIGHT:
return RightIsDown();
}
}
int wxMouseEvent::GetButton() const
{
for ( int i = 1; i <= 3; i++ )
{
if ( Button(i) )
{
return i;
}
}
return wxMOUSE_BTN_NONE;
}
// Find the logical position of the event given the DC
wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const
{
wxPoint pt(dc.DeviceToLogicalX(m_x), dc.DeviceToLogicalY(m_y));
return pt;
}
/*
* Keyboard event
*
*/
wxKeyEvent::wxKeyEvent(wxEventType type)
{
m_eventType = type;
m_shiftDown = false;
m_controlDown = false;
m_metaDown = false;
m_altDown = false;
m_keyCode = 0;
m_scanCode = 0;
#if wxUSE_UNICODE
m_uniChar = 0;
#endif
}
wxKeyEvent::wxKeyEvent(const wxKeyEvent& evt)
: wxEvent(evt)
{
m_x = evt.m_x;
m_y = evt.m_y;
m_keyCode = evt.m_keyCode;
m_controlDown = evt.m_controlDown;
m_shiftDown = evt.m_shiftDown;
m_altDown = evt.m_altDown;
m_metaDown = evt.m_metaDown;
m_scanCode = evt.m_scanCode;
m_rawCode = evt.m_rawCode;
m_rawFlags = evt.m_rawFlags;
#if wxUSE_UNICODE
m_uniChar = evt.m_uniChar;
#endif
}
long wxKeyEvent::KeyCode() const
{
return m_keyCode;
}
wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win)
{
SetEventType(wxEVT_CREATE);
SetEventObject(win);
}
wxWindowDestroyEvent::wxWindowDestroyEvent(wxWindow *win)
{
SetEventType(wxEVT_DESTROY);
SetEventObject(win);
}
wxChildFocusEvent::wxChildFocusEvent(wxWindow *win)
: wxCommandEvent(wxEVT_CHILD_FOCUS)
{
SetEventObject(win);
}
#endif // wxUSE_GUI
#if wxUSE_BASE
// ----------------------------------------------------------------------------
// wxEventHashTable
// ----------------------------------------------------------------------------
static const int EVENT_TYPE_TABLE_INIT_SIZE = 31; // Not too big not too small...
wxEventHashTable* wxEventHashTable::sm_first = NULL;
wxEventHashTable::wxEventHashTable(const wxEventTable &table)
: m_table(table),
m_rebuildHash(true)
{
AllocEventTypeTable(EVENT_TYPE_TABLE_INIT_SIZE);
m_next = sm_first;
if (m_next)
m_next->m_previous = this;
sm_first = this;
}
wxEventHashTable::~wxEventHashTable()
{
if (m_next)
m_next->m_previous = m_previous;
if (m_previous)
m_previous->m_next = m_next;
if (sm_first == this)
sm_first = m_next;
Clear();
}
void wxEventHashTable::Clear()
{
size_t i;
for(i = 0; i < m_size; i++)
{
EventTypeTablePointer eTTnode = m_eventTypeTable[i];
if (eTTnode)
{
delete eTTnode;
}
}
// Necessary in order to not invoke the
// overloaded delete operator when statics are cleaned up
if (m_eventTypeTable)
delete[] m_eventTypeTable;
m_eventTypeTable = NULL;
m_size = 0;
}
// Clear all tables
void wxEventHashTable::ClearAll()
{
wxEventHashTable* table = sm_first;
while (table)
{
table->Clear();
table = table->m_next;
}
}
bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
{
if (m_rebuildHash)
{
InitHashTable();
m_rebuildHash = false;
}
if (!m_eventTypeTable)
return false;
// Find all entries for the given event type.
wxEventType eventType = event.GetEventType();
const EventTypeTablePointer eTTnode = m_eventTypeTable[eventType % m_size];
if (eTTnode && eTTnode->eventType == eventType)
{
// Now start the search for an event handler
// that can handle an event with the given ID.
const wxEventTableEntryPointerArray&
eventEntryTable = eTTnode->eventEntryTable;
const size_t count = eventEntryTable.GetCount();
for (size_t n = 0; n < count; n++)
{
if ( wxEvtHandler::
ProcessEventIfMatches(*eventEntryTable[n], self, event) )
{
return true;
}
}
}
return false;
}
void wxEventHashTable::InitHashTable()
{
// Loop over the event tables and all its base tables.
const wxEventTable *table = &m_table;
while (table)
{
// Retrieve all valid event handler entries
const wxEventTableEntry *entry = table->entries;
while (entry->m_fn != 0)
{
// Add the event entry in the Hash.
AddEntry(*entry);
entry++;
}
table = table->baseTable;
}
// Lets free some memory.
size_t i;
for(i = 0; i < m_size; i++)
{
EventTypeTablePointer eTTnode = m_eventTypeTable[i];
if (eTTnode)
{
eTTnode->eventEntryTable.Shrink();
}
}
}
void wxEventHashTable::AddEntry(const wxEventTableEntry &entry)
{
// This might happen 'accidentally' as the app is exiting
if (!m_eventTypeTable)
return;
EventTypeTablePointer *peTTnode = &m_eventTypeTable[entry.m_eventType % m_size];
EventTypeTablePointer eTTnode = *peTTnode;
if (eTTnode)
{
if (eTTnode->eventType != entry.m_eventType)
{
// Resize the table!
GrowEventTypeTable();
// Try again to add it.
AddEntry(entry);
return;
}
}
else
{
eTTnode = new EventTypeTable;
eTTnode->eventType = entry.m_eventType;
*peTTnode = eTTnode;
}
// Fill all hash entries between entry.m_id and entry.m_lastId...
eTTnode->eventEntryTable.Add(&entry);
}
void wxEventHashTable::AllocEventTypeTable(size_t size)
{
m_eventTypeTable = new EventTypeTablePointer[size];
memset((void *)m_eventTypeTable, 0, sizeof(EventTypeTablePointer)*size);
m_size = size;
}
void wxEventHashTable::GrowEventTypeTable()
{
size_t oldSize = m_size;
EventTypeTablePointer *oldEventTypeTable = m_eventTypeTable;
// TODO: Search the most optimal grow sequence
AllocEventTypeTable(/* GetNextPrime(oldSize) */oldSize*2+1);
for ( size_t i = 0; i < oldSize; /* */ )
{
EventTypeTablePointer eTToldNode = oldEventTypeTable[i];
if (eTToldNode)
{
EventTypeTablePointer *peTTnode = &m_eventTypeTable[eTToldNode->eventType % m_size];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?