1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27 // INCLUDE ---------------------------------------------------------------
28
29 #include "sheetevents.hxx"
30 #include <com/sun/star/script/vba/VBAEventId.hpp>
31 #include <tools/debug.hxx>
32
33 // -----------------------------------------------------------------------
34
35 // static
GetEventName(sal_Int32 nEvent)36 rtl::OUString ScSheetEvents::GetEventName(sal_Int32 nEvent)
37 {
38 if (nEvent<0 || nEvent>=SC_SHEETEVENT_COUNT)
39 {
40 DBG_ERRORFILE("invalid event number");
41 return rtl::OUString();
42 }
43
44 static const sal_Char* aEventNames[] =
45 {
46 "OnFocus", // SC_SHEETEVENT_FOCUS
47 "OnUnfocus", // SC_SHEETEVENT_UNFOCUS
48 "OnSelect", // SC_SHEETEVENT_SELECT
49 "OnDoubleClick", // SC_SHEETEVENT_DOUBLECLICK
50 "OnRightClick", // SC_SHEETEVENT_RIGHTCLICK
51 "OnChange", // SC_SHEETEVENT_CHANGE
52 "OnCalculate" // SC_SHEETEVENT_CALCULATE
53 };
54 return rtl::OUString::createFromAscii(aEventNames[nEvent]);
55 }
56
57 // static
GetVbaSheetEventId(sal_Int32 nEvent)58 sal_Int32 ScSheetEvents::GetVbaSheetEventId(sal_Int32 nEvent)
59 {
60 using namespace ::com::sun::star::script::vba::VBAEventId;
61 if (nEvent<0 || nEvent>=SC_SHEETEVENT_COUNT)
62 {
63 DBG_ERRORFILE("invalid event number");
64 return NO_EVENT;
65 }
66
67 static const sal_Int32 nVbaEventIds[] =
68 {
69 WORKSHEET_ACTIVATE, // SC_SHEETEVENT_FOCUS
70 WORKSHEET_DEACTIVATE, // SC_SHEETEVENT_UNFOCUS
71 WORKSHEET_SELECTIONCHANGE, // SC_SHEETEVENT_SELECT
72 WORKSHEET_BEFOREDOUBLECLICK, // SC_SHEETEVENT_DOUBLECLICK
73 WORKSHEET_BEFORERIGHTCLICK, // SC_SHEETEVENT_RIGHTCLICK
74 WORKSHEET_CHANGE, // SC_SHEETEVENT_CHANGE
75 WORKSHEET_CALCULATE // SC_SHEETEVENT_CALCULATE
76 };
77 return nVbaEventIds[nEvent];
78 }
79
80 // static
GetVbaDocumentEventId(sal_Int32 nEvent)81 sal_Int32 ScSheetEvents::GetVbaDocumentEventId(sal_Int32 nEvent)
82 {
83 using namespace ::com::sun::star::script::vba::VBAEventId;
84 sal_Int32 nSheetEventId = GetVbaSheetEventId(nEvent);
85 return (nSheetEventId != NO_EVENT) ? (nSheetEventId + USERDEFINED_START) : NO_EVENT;
86 }
87
88 // -----------------------------------------------------------------------
89
ScSheetEvents()90 ScSheetEvents::ScSheetEvents() :
91 mpScriptNames(NULL)
92 {
93 }
94
~ScSheetEvents()95 ScSheetEvents::~ScSheetEvents()
96 {
97 Clear();
98 }
99
Clear()100 void ScSheetEvents::Clear()
101 {
102 if (mpScriptNames)
103 {
104 for (sal_Int32 nEvent=0; nEvent<SC_SHEETEVENT_COUNT; ++nEvent)
105 delete mpScriptNames[nEvent];
106 delete[] mpScriptNames;
107 mpScriptNames = NULL;
108 }
109 }
110
ScSheetEvents(const ScSheetEvents & rOther)111 ScSheetEvents::ScSheetEvents(const ScSheetEvents& rOther) :
112 mpScriptNames(NULL)
113 {
114 *this = rOther;
115 }
116
operator =(const ScSheetEvents & rOther)117 const ScSheetEvents& ScSheetEvents::operator=(const ScSheetEvents& rOther)
118 {
119 Clear();
120 if (rOther.mpScriptNames)
121 {
122 mpScriptNames = new rtl::OUString*[SC_SHEETEVENT_COUNT];
123 for (sal_Int32 nEvent=0; nEvent<SC_SHEETEVENT_COUNT; ++nEvent)
124 if (rOther.mpScriptNames[nEvent])
125 mpScriptNames[nEvent] = new rtl::OUString(*rOther.mpScriptNames[nEvent]);
126 else
127 mpScriptNames[nEvent] = NULL;
128 }
129 return *this;
130 }
131
GetScript(sal_Int32 nEvent) const132 const rtl::OUString* ScSheetEvents::GetScript(sal_Int32 nEvent) const
133 {
134 if (nEvent<0 || nEvent>=SC_SHEETEVENT_COUNT)
135 {
136 DBG_ERRORFILE("invalid event number");
137 return NULL;
138 }
139
140 if (mpScriptNames)
141 return mpScriptNames[nEvent];
142 return NULL;
143 }
144
SetScript(sal_Int32 nEvent,const rtl::OUString * pNew)145 void ScSheetEvents::SetScript(sal_Int32 nEvent, const rtl::OUString* pNew)
146 {
147 if (nEvent<0 || nEvent>=SC_SHEETEVENT_COUNT)
148 {
149 DBG_ERRORFILE("invalid event number");
150 return;
151 }
152
153 if (!mpScriptNames)
154 {
155 mpScriptNames = new rtl::OUString*[SC_SHEETEVENT_COUNT];
156 for (sal_Int32 nEventIdx=0; nEventIdx<SC_SHEETEVENT_COUNT; ++nEventIdx)
157 mpScriptNames[nEventIdx] = NULL;
158 }
159 delete mpScriptNames[nEvent];
160 if (pNew)
161 mpScriptNames[nEvent] = new rtl::OUString(*pNew);
162 else
163 mpScriptNames[nEvent] = NULL;
164 }
165
166