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 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 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 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 90 ScSheetEvents::ScSheetEvents() : 91 mpScriptNames(NULL) 92 { 93 } 94 95 ScSheetEvents::~ScSheetEvents() 96 { 97 Clear(); 98 } 99 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 111 ScSheetEvents::ScSheetEvents(const ScSheetEvents& rOther) : 112 mpScriptNames(NULL) 113 { 114 *this = rOther; 115 } 116 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 132 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 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