379e74df9e741dfa7d7c39832726a8a44df08b2c
[WebKit-https.git] / WebCore / khtml / xbl / xbl_protohandler.cpp
1 #include "qstringlist.h"
2 #include "qstring.h"
3 #include "xbl_protohandler.h"
4
5 using DOM::DOMString;
6
7 namespace XBL {
8
9 const int XBLPrototypeHandler::shiftKey = (1<<1);
10 const int XBLPrototypeHandler::altKey = (1<<2);
11 const int XBLPrototypeHandler::ctrlKey = (1<<3);
12 const int XBLPrototypeHandler::metaKey = (1<<4);
13 const int XBLPrototypeHandler::allKeys = shiftKey | altKey | ctrlKey | metaKey;
14
15 const int XBLPrototypeHandler::bubblingPhase = 0;
16 const int XBLPrototypeHandler::capturingPhase = 1;
17 const int XBLPrototypeHandler::targetPhase = 2;
18
19 XBLPrototypeHandler::XBLPrototypeHandler(const DOMString& event,
20                                          const DOMString& phase,
21                                          const DOMString& action,
22                                          const DOMString& keycode,
23                                          const DOMString& charcode,
24                                          const DOMString& modifiers,
25                                          const DOMString& button,
26                                          const DOMString& clickcount,
27                                          const DOMString& preventdefault,
28                                          XBLPrototypeBinding* binding)
29 :m_binding(binding), m_next(0), m_eventName(event), 
30  m_phase(bubblingPhase), m_preventDefault(false), m_keyMask(0), m_misc(0), m_button(-1), m_unused(0)
31 {
32     if (event.isEmpty())
33         return;
34
35     if (phase == "capturing")
36         m_phase = capturingPhase;
37     else if (phase == "target")
38         m_phase = targetPhase;
39
40     if (!action.isEmpty())
41         m_handlerText = action;
42
43     if (!modifiers.isEmpty()) {
44         QStringList result = QStringList::split(",", modifiers.string());
45         for (QStringList::Iterator it = result.begin(); it != result.end(); ++it) {
46             QString modifier = (*it).stripWhiteSpace();
47             if (modifier == "shift")
48                 m_keyMask |= shiftKey;
49             else if (modifier == "alt")
50                 m_keyMask |= altKey;
51             else if (modifier == "control")
52                 m_keyMask |= ctrlKey;
53             else if (modifier == "meta" || modifier == "accel" || modifier == "access")
54                 m_keyMask |= metaKey; // FIXME: For Apple, accel is like meta, and access really has no equivalent.
55                                       // If/when KDE adopts this code, use the appropriate defaults for the
56                                       // platform (probably ctrl for accel and alt for access if they match Win32).
57         }
58     }
59
60     if (!charcode.isEmpty()) {
61         // Normalize the character based off case (and whether the shift key has to be down).
62         m_key = charcode;
63         if ((m_keyMask & shiftKey) != 0)
64             m_key = m_key.upper();
65         else
66             m_key = m_key.lower();
67          
68         // We have a charcode.
69         m_misc = 1;
70     }
71     else if (!keycode.isEmpty())
72         m_key = keycode;
73      
74     if (!clickcount.isEmpty())
75         m_misc = clickcount.toInt();
76     if (!button.isEmpty())
77         m_button = button.toInt();
78 }
79
80 XBLPrototypeHandler::~XBLPrototypeHandler()
81 {
82     delete m_next;
83 }
84
85 void XBLPrototypeHandler::appendData(const QString& ch)
86 {
87     m_handlerText += ch;
88 }
89
90 }