xref: /trunk/main/sc/source/ui/view/gridwin.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "scitems.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <memory> //auto_ptr
30cdf0e10cSrcweir #include <editeng/adjitem.hxx>
31cdf0e10cSrcweir #include <svx/algitem.hxx>
32cdf0e10cSrcweir #include <svx/dbexch.hrc>
33cdf0e10cSrcweir #include <editeng/editview.hxx>
34cdf0e10cSrcweir #include <editeng/editstat.hxx>
35cdf0e10cSrcweir #include <editeng/flditem.hxx>
36cdf0e10cSrcweir #include <svx/svdetc.hxx>
37cdf0e10cSrcweir #include <editeng/editobj.hxx>
38cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
39cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
40cdf0e10cSrcweir #include <sfx2/docfile.hxx>
41cdf0e10cSrcweir #include <svl/stritem.hxx>
42cdf0e10cSrcweir #include <svtools/svlbox.hxx>
43cdf0e10cSrcweir #include <svtools/svtabbx.hxx>
44cdf0e10cSrcweir #include <svl/urlbmk.hxx>
45cdf0e10cSrcweir #include <tools/urlobj.hxx>
46cdf0e10cSrcweir #include <vcl/cursor.hxx>
47cdf0e10cSrcweir #include <vcl/sound.hxx>
48cdf0e10cSrcweir #include <vcl/graph.hxx>
49cdf0e10cSrcweir #include <vcl/hatch.hxx>
50cdf0e10cSrcweir #include <sot/formats.hxx>
51cdf0e10cSrcweir #include <sot/clsids.hxx>
52cdf0e10cSrcweir 
53cdf0e10cSrcweir #include <svx/svdview.hxx>      // fuer Command-Handler (COMMAND_INSERTTEXT)
54cdf0e10cSrcweir #include <editeng/outliner.hxx>     // fuer Command-Handler (COMMAND_INSERTTEXT)
55cdf0e10cSrcweir #include <svx/svditer.hxx>
56cdf0e10cSrcweir #include <svx/svdocapt.hxx>
57cdf0e10cSrcweir #include <svx/svdpagv.hxx>
58cdf0e10cSrcweir 
59cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
60cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
61cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotTableHeaderData.hpp>
62cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotTableResultData.hpp>
63cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotTablePositionData.hpp>
64cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotTablePositionType.hpp>
65cdf0e10cSrcweir #include <com/sun/star/sheet/MemberResultFlags.hpp>
66cdf0e10cSrcweir #include <com/sun/star/awt/KeyModifier.hpp>
67cdf0e10cSrcweir #include <com/sun/star/awt/MouseButton.hpp>
68cdf0e10cSrcweir #include <com/sun/star/script/vba/VBAEventId.hpp>
69cdf0e10cSrcweir #include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
70cdf0e10cSrcweir 
71cdf0e10cSrcweir #include "gridwin.hxx"
72cdf0e10cSrcweir #include "tabvwsh.hxx"
73cdf0e10cSrcweir #include "docsh.hxx"
74cdf0e10cSrcweir #include "viewdata.hxx"
75cdf0e10cSrcweir #include "tabview.hxx"
76cdf0e10cSrcweir #include "select.hxx"
77cdf0e10cSrcweir #include "scmod.hxx"
78cdf0e10cSrcweir #include "document.hxx"
79cdf0e10cSrcweir #include "attrib.hxx"
80cdf0e10cSrcweir #include "dbcolect.hxx"
81cdf0e10cSrcweir #include "stlpool.hxx"
82cdf0e10cSrcweir #include "printfun.hxx"
83cdf0e10cSrcweir #include "cbutton.hxx"
84cdf0e10cSrcweir #include "sc.hrc"
85cdf0e10cSrcweir #include "globstr.hrc"
86cdf0e10cSrcweir #include "editutil.hxx"
87cdf0e10cSrcweir #include "scresid.hxx"
88cdf0e10cSrcweir #include "inputhdl.hxx"
89cdf0e10cSrcweir #include "uiitems.hxx"          // Filter-Dialog - auslagern !!!
90cdf0e10cSrcweir #include "filtdlg.hxx"
91cdf0e10cSrcweir #include "impex.hxx"            // Sylk-ID fuer CB
92cdf0e10cSrcweir #include "cell.hxx"             // fuer Edit-Felder
93cdf0e10cSrcweir #include "patattr.hxx"
94cdf0e10cSrcweir #include "notemark.hxx"
95cdf0e10cSrcweir #include "rfindlst.hxx"
96cdf0e10cSrcweir #include "docpool.hxx"
97cdf0e10cSrcweir #include "output.hxx"
98cdf0e10cSrcweir #include "docfunc.hxx"
99cdf0e10cSrcweir #include "dbdocfun.hxx"
100cdf0e10cSrcweir #include "dpobject.hxx"
101cdf0e10cSrcweir #include "dpoutput.hxx"
102cdf0e10cSrcweir #include "transobj.hxx"
103cdf0e10cSrcweir #include "drwtrans.hxx"
104cdf0e10cSrcweir #include "seltrans.hxx"
105cdf0e10cSrcweir #include "sizedev.hxx"
106cdf0e10cSrcweir #include "AccessibilityHints.hxx"
107cdf0e10cSrcweir #include "dpsave.hxx"
108cdf0e10cSrcweir #include "viewuno.hxx"
109cdf0e10cSrcweir #include "compiler.hxx"
110cdf0e10cSrcweir #include "editable.hxx"
111cdf0e10cSrcweir #include "fillinfo.hxx"
112cdf0e10cSrcweir #include "scitems.hxx"
113cdf0e10cSrcweir #include "userdat.hxx"
114cdf0e10cSrcweir #include "drwlayer.hxx"
115cdf0e10cSrcweir #include "attrib.hxx"
116cdf0e10cSrcweir #include "validat.hxx"
117cdf0e10cSrcweir #include "tabprotection.hxx"
118cdf0e10cSrcweir #include "postit.hxx"
119cdf0e10cSrcweir #include "dpcontrol.hxx"
120cdf0e10cSrcweir #include "cellsuno.hxx"
121cdf0e10cSrcweir 
122cdf0e10cSrcweir #include "drawview.hxx"
123cdf0e10cSrcweir #include <svx/sdrpagewindow.hxx>
124cdf0e10cSrcweir #include <svx/sdr/overlay/overlaymanager.hxx>
125cdf0e10cSrcweir #include <vcl/svapp.hxx>
126cdf0e10cSrcweir #include <svx/sdr/overlay/overlayselection.hxx>
127cdf0e10cSrcweir 
128cdf0e10cSrcweir using namespace com::sun::star;
129cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
130cdf0e10cSrcweir using ::com::sun::star::uno::Any;
131cdf0e10cSrcweir 
132cdf0e10cSrcweir const sal_uInt8 SC_NESTEDBUTTON_NONE = 0;
133cdf0e10cSrcweir const sal_uInt8 SC_NESTEDBUTTON_DOWN = 1;
134cdf0e10cSrcweir const sal_uInt8 SC_NESTEDBUTTON_UP   = 2;
135cdf0e10cSrcweir 
136cdf0e10cSrcweir #define SC_AUTOFILTER_ALL       0
137cdf0e10cSrcweir #define SC_AUTOFILTER_TOP10     1
138cdf0e10cSrcweir #define SC_AUTOFILTER_CUSTOM    2
139*840d0e68SArrigo Marchiori #define SC_AUTOFILTER_EMPTY     3
140*840d0e68SArrigo Marchiori #define SC_AUTOFILTER_NOTEMPTY  4
141cdf0e10cSrcweir 
142cdf0e10cSrcweir //  Modi fuer die FilterListBox
143cdf0e10cSrcweir enum ScFilterBoxMode
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     SC_FILTERBOX_FILTER,
146cdf0e10cSrcweir     SC_FILTERBOX_DATASELECT,
147cdf0e10cSrcweir     SC_FILTERBOX_SCENARIO,
148cdf0e10cSrcweir     SC_FILTERBOX_PAGEFIELD
149cdf0e10cSrcweir };
150cdf0e10cSrcweir 
151cdf0e10cSrcweir extern SfxViewShell* pScActiveViewShell;            // global.cxx
152cdf0e10cSrcweir extern sal_uInt16 nScClickMouseModifier;                // global.cxx
153cdf0e10cSrcweir extern sal_uInt16 nScFillModeMouseModifier;             // global.cxx
154cdf0e10cSrcweir 
155cdf0e10cSrcweir #define SC_FILTERLISTBOX_LINES  12
156cdf0e10cSrcweir 
157cdf0e10cSrcweir // ============================================================================
158cdf0e10cSrcweir 
VisibleRange()159cdf0e10cSrcweir ScGridWindow::VisibleRange::VisibleRange() :
160cdf0e10cSrcweir     mnCol1(0), mnCol2(MAXCOL), mnRow1(0), mnRow2(MAXROW)
161cdf0e10cSrcweir {
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
isInside(SCCOL nCol,SCROW nRow) const164cdf0e10cSrcweir bool ScGridWindow::VisibleRange::isInside(SCCOL nCol, SCROW nRow) const
165cdf0e10cSrcweir {
166cdf0e10cSrcweir     return mnCol1 <= nCol && nCol <= mnCol2 && mnRow1 <= nRow && nRow <= mnRow2;
167cdf0e10cSrcweir }
168cdf0e10cSrcweir 
169cdf0e10cSrcweir // ============================================================================
170cdf0e10cSrcweir 
171cdf0e10cSrcweir class ScFilterListBox : public ListBox
172cdf0e10cSrcweir {
173cdf0e10cSrcweir private:
174cdf0e10cSrcweir     ScGridWindow*   pGridWin;
175cdf0e10cSrcweir     SCCOL           nCol;
176cdf0e10cSrcweir     SCROW           nRow;
177cdf0e10cSrcweir     sal_Bool            bButtonDown;
178cdf0e10cSrcweir     sal_Bool            bInit;
179cdf0e10cSrcweir     sal_Bool            bCancelled;
180cdf0e10cSrcweir     sal_Bool            bInSelect;
181cdf0e10cSrcweir     bool            mbListHasDates;
182cdf0e10cSrcweir     sal_uLong           nSel;
183cdf0e10cSrcweir     ScFilterBoxMode eMode;
184cdf0e10cSrcweir 
185cdf0e10cSrcweir protected:
186cdf0e10cSrcweir     virtual void    LoseFocus();
187cdf0e10cSrcweir     void            SelectHdl();
188cdf0e10cSrcweir 
189cdf0e10cSrcweir public:
190cdf0e10cSrcweir                 ScFilterListBox( Window* pParent, ScGridWindow* pGrid,
191cdf0e10cSrcweir                                  SCCOL nNewCol, SCROW nNewRow, ScFilterBoxMode eNewMode );
192cdf0e10cSrcweir                 ~ScFilterListBox();
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     virtual long    PreNotify( NotifyEvent& rNEvt );
195cdf0e10cSrcweir     virtual void    Select();
196cdf0e10cSrcweir 
GetCol() const197cdf0e10cSrcweir     SCCOL           GetCol() const          { return nCol; }
GetRow() const198cdf0e10cSrcweir     SCROW           GetRow() const          { return nRow; }
GetMode() const199cdf0e10cSrcweir     ScFilterBoxMode GetMode() const         { return eMode; }
IsDataSelect() const200cdf0e10cSrcweir     sal_Bool            IsDataSelect() const    { return (eMode == SC_FILTERBOX_DATASELECT); }
201cdf0e10cSrcweir     void            EndInit();
IsInInit() const202cdf0e10cSrcweir     sal_Bool            IsInInit() const        { return bInit; }
SetCancelled()203cdf0e10cSrcweir     void            SetCancelled()          { bCancelled = sal_True; }
IsInSelect() const204cdf0e10cSrcweir     sal_Bool            IsInSelect() const      { return bInSelect; }
SetListHasDates(bool b)205cdf0e10cSrcweir     void            SetListHasDates(bool b) { mbListHasDates = b; }
HasDates() const206cdf0e10cSrcweir     bool            HasDates() const        { return mbListHasDates; }
207cdf0e10cSrcweir };
208cdf0e10cSrcweir 
209cdf0e10cSrcweir //-------------------------------------------------------------------
210cdf0e10cSrcweir 
211cdf0e10cSrcweir //  ListBox in einem FloatingWindow (pParent)
ScFilterListBox(Window * pParent,ScGridWindow * pGrid,SCCOL nNewCol,SCROW nNewRow,ScFilterBoxMode eNewMode)212cdf0e10cSrcweir ScFilterListBox::ScFilterListBox( Window* pParent, ScGridWindow* pGrid,
213cdf0e10cSrcweir                                   SCCOL nNewCol, SCROW nNewRow, ScFilterBoxMode eNewMode ) :
214cdf0e10cSrcweir     ListBox( pParent, WB_AUTOHSCROLL ),
215cdf0e10cSrcweir     pGridWin( pGrid ),
216cdf0e10cSrcweir     nCol( nNewCol ),
217cdf0e10cSrcweir     nRow( nNewRow ),
218cdf0e10cSrcweir     bButtonDown( sal_False ),
219cdf0e10cSrcweir     bInit( sal_True ),
220cdf0e10cSrcweir     bCancelled( sal_False ),
221cdf0e10cSrcweir     bInSelect( sal_False ),
222cdf0e10cSrcweir     mbListHasDates(false),
223cdf0e10cSrcweir     nSel( 0 ),
224cdf0e10cSrcweir     eMode( eNewMode )
225cdf0e10cSrcweir {
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
~ScFilterListBox()228cdf0e10cSrcweir __EXPORT ScFilterListBox::~ScFilterListBox()
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     if (IsMouseCaptured())
231cdf0e10cSrcweir         ReleaseMouse();
232cdf0e10cSrcweir }
233cdf0e10cSrcweir 
EndInit()234cdf0e10cSrcweir void ScFilterListBox::EndInit()
235cdf0e10cSrcweir {
236cdf0e10cSrcweir     sal_uInt16 nPos = GetSelectEntryPos();
237cdf0e10cSrcweir     if ( LISTBOX_ENTRY_NOTFOUND == nPos )
238cdf0e10cSrcweir         nSel = 0;
239cdf0e10cSrcweir     else
240cdf0e10cSrcweir         nSel = nPos;
241cdf0e10cSrcweir 
242cdf0e10cSrcweir     bInit = sal_False;
243cdf0e10cSrcweir }
244cdf0e10cSrcweir 
LoseFocus()245cdf0e10cSrcweir void __EXPORT ScFilterListBox::LoseFocus()
246cdf0e10cSrcweir {
247cdf0e10cSrcweir #ifndef UNX
248cdf0e10cSrcweir     Hide();
249cdf0e10cSrcweir #endif
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
252cdf0e10cSrcweir // -----------------------------------------------------------------------
253cdf0e10cSrcweir 
PreNotify(NotifyEvent & rNEvt)254cdf0e10cSrcweir long ScFilterListBox::PreNotify( NotifyEvent& rNEvt )
255cdf0e10cSrcweir {
256cdf0e10cSrcweir     long nDone = 0;
257cdf0e10cSrcweir     if ( rNEvt.GetType() == EVENT_KEYINPUT )
258cdf0e10cSrcweir     {
259cdf0e10cSrcweir         KeyEvent aKeyEvt = *rNEvt.GetKeyEvent();
260cdf0e10cSrcweir         KeyCode aCode = aKeyEvt.GetKeyCode();
261cdf0e10cSrcweir         if ( !aCode.GetModifier() )             // ohne alle Modifiers
262cdf0e10cSrcweir         {
263cdf0e10cSrcweir             sal_uInt16 nKey = aCode.GetCode();
264cdf0e10cSrcweir             if ( nKey == KEY_RETURN )
265cdf0e10cSrcweir             {
266cdf0e10cSrcweir                 SelectHdl();                    // auswaehlen
267cdf0e10cSrcweir                 nDone = 1;
268cdf0e10cSrcweir             }
269cdf0e10cSrcweir             else if ( nKey == KEY_ESCAPE )
270cdf0e10cSrcweir             {
271cdf0e10cSrcweir                 pGridWin->ClickExtern();        // loescht die List-Box !!!
272cdf0e10cSrcweir                 nDone = 1;
273cdf0e10cSrcweir             }
274cdf0e10cSrcweir         }
275cdf0e10cSrcweir     }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     return nDone ? nDone : ListBox::PreNotify( rNEvt );
278cdf0e10cSrcweir }
279cdf0e10cSrcweir 
Select()280cdf0e10cSrcweir void __EXPORT ScFilterListBox::Select()
281cdf0e10cSrcweir {
282cdf0e10cSrcweir     ListBox::Select();
283cdf0e10cSrcweir     SelectHdl();
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
SelectHdl()286cdf0e10cSrcweir void __EXPORT ScFilterListBox::SelectHdl()
287cdf0e10cSrcweir {
288cdf0e10cSrcweir     if ( !IsTravelSelect() && !bInit && !bCancelled )
289cdf0e10cSrcweir     {
290cdf0e10cSrcweir         sal_uInt16 nPos = GetSelectEntryPos();
291cdf0e10cSrcweir         if ( LISTBOX_ENTRY_NOTFOUND != nPos )
292cdf0e10cSrcweir         {
293cdf0e10cSrcweir             nSel = nPos;
294cdf0e10cSrcweir             if (!bButtonDown)
295cdf0e10cSrcweir             {
296cdf0e10cSrcweir                 // #i81298# set bInSelect flag, so the box isn't deleted from modifications within FilterSelect
297cdf0e10cSrcweir                 bInSelect = sal_True;
298cdf0e10cSrcweir                 pGridWin->FilterSelect( nSel );
299cdf0e10cSrcweir                 bInSelect = sal_False;
300cdf0e10cSrcweir             }
301cdf0e10cSrcweir         }
302cdf0e10cSrcweir     }
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
305cdf0e10cSrcweir // ============================================================================
306cdf0e10cSrcweir 
307cdf0e10cSrcweir // use a System floating window for the above filter listbox
308cdf0e10cSrcweir class ScFilterFloatingWindow : public FloatingWindow
309cdf0e10cSrcweir {
310cdf0e10cSrcweir public:
311cdf0e10cSrcweir     ScFilterFloatingWindow( Window* pParent, WinBits nStyle = WB_STDFLOATWIN );
312cdf0e10cSrcweir     virtual ~ScFilterFloatingWindow();
313cdf0e10cSrcweir     // required for System FloatingWindows that will not process KeyInput by themselves
314cdf0e10cSrcweir     virtual Window* GetPreferredKeyInputWindow();
315cdf0e10cSrcweir };
316cdf0e10cSrcweir 
ScFilterFloatingWindow(Window * pParent,WinBits nStyle)317cdf0e10cSrcweir ScFilterFloatingWindow::ScFilterFloatingWindow( Window* pParent, WinBits nStyle ) :
318cdf0e10cSrcweir     FloatingWindow( pParent, nStyle|WB_SYSTEMWINDOW ) // make it a system floater
319cdf0e10cSrcweir     {}
320cdf0e10cSrcweir 
~ScFilterFloatingWindow()321cdf0e10cSrcweir ScFilterFloatingWindow::~ScFilterFloatingWindow()
322cdf0e10cSrcweir {
323cdf0e10cSrcweir     EndPopupMode();
324cdf0e10cSrcweir }
325cdf0e10cSrcweir 
GetPreferredKeyInputWindow()326cdf0e10cSrcweir Window* ScFilterFloatingWindow::GetPreferredKeyInputWindow()
327cdf0e10cSrcweir {
328cdf0e10cSrcweir     // redirect keyinput in the child window
329cdf0e10cSrcweir     return GetWindow(WINDOW_FIRSTCHILD) ? GetWindow(WINDOW_FIRSTCHILD)->GetPreferredKeyInputWindow() : NULL;    // will be the FilterBox
330cdf0e10cSrcweir }
331cdf0e10cSrcweir 
332cdf0e10cSrcweir // ============================================================================
333cdf0e10cSrcweir 
lcl_IsEditableMatrix(ScDocument * pDoc,const ScRange & rRange)334cdf0e10cSrcweir sal_Bool lcl_IsEditableMatrix( ScDocument* pDoc, const ScRange& rRange )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir     //  wenn es ein editierbarer Bereich ist, und rechts unten eine Matrix-Zelle
337cdf0e10cSrcweir     //  mit Origin links oben liegt, enthaelt der Bereich genau die Matrix.
338cdf0e10cSrcweir     //! Direkt die MatrixEdges Funktionen von der Column herausreichen ???
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     if ( !pDoc->IsBlockEditable( rRange.aStart.Tab(), rRange.aStart.Col(),rRange.aStart.Row(),
341cdf0e10cSrcweir                                     rRange.aEnd.Col(),rRange.aEnd.Row() ) )
342cdf0e10cSrcweir         return sal_False;
343cdf0e10cSrcweir 
344cdf0e10cSrcweir     ScAddress aPos;
345cdf0e10cSrcweir     const ScBaseCell* pCell = pDoc->GetCell( rRange.aEnd );
346cdf0e10cSrcweir     return ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA &&
347cdf0e10cSrcweir             ((ScFormulaCell*)pCell)->GetMatrixOrigin(aPos) && aPos == rRange.aStart );
348cdf0e10cSrcweir 
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
lcl_UnLockComment(ScDrawView * pView,SdrPageView * pPV,SdrModel * pDrDoc,const Point & rPos,ScViewData * pViewData)351cdf0e10cSrcweir void lcl_UnLockComment( ScDrawView* pView, SdrPageView* pPV, SdrModel* pDrDoc, const Point& rPos, ScViewData* pViewData )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir     if (!pView && !pPV && !pDrDoc && !pViewData)
354cdf0e10cSrcweir         return;
355cdf0e10cSrcweir 
356cdf0e10cSrcweir     ScDocument& rDoc = *pViewData->GetDocument();
357cdf0e10cSrcweir     ScAddress aCellPos( pViewData->GetCurX(), pViewData->GetCurY(), pViewData->GetTabNo() );
358cdf0e10cSrcweir     ScPostIt* pNote = rDoc.GetNote( aCellPos );
359cdf0e10cSrcweir     SdrObject* pObj = pNote ? pNote->GetCaption() : 0;
360cdf0e10cSrcweir     if( pObj && pObj->GetLogicRect().IsInside( rPos ) && ScDrawLayer::IsNoteCaption( pObj ) )
361cdf0e10cSrcweir     {
362cdf0e10cSrcweir         const ScProtectionAttr* pProtAttr =  static_cast< const ScProtectionAttr* > (rDoc.GetAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), ATTR_PROTECTION ) );
363cdf0e10cSrcweir         bool bProtectAttr = pProtAttr->GetProtection() || pProtAttr->GetHideCell() ;
364cdf0e10cSrcweir         bool bProtectDoc =  rDoc.IsTabProtected( aCellPos.Tab() ) || pViewData->GetSfxDocShell()->IsReadOnly() ;
365cdf0e10cSrcweir         // unlock internal layer (if not protected), will be relocked in ScDrawView::MarkListHasChanged()
366cdf0e10cSrcweir         pView->LockInternalLayer( bProtectDoc && bProtectAttr );
367cdf0e10cSrcweir     }
368cdf0e10cSrcweir }
369cdf0e10cSrcweir 
lcl_GetHyperlinkCell(ScDocument * pDoc,SCCOL & rPosX,SCROW & rPosY,SCTAB nTab,ScBaseCell * & rpCell)370cdf0e10cSrcweir sal_Bool lcl_GetHyperlinkCell(ScDocument* pDoc, SCCOL& rPosX, SCROW& rPosY, SCTAB nTab, ScBaseCell*& rpCell )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir     sal_Bool bFound = sal_False;
373cdf0e10cSrcweir     do
374cdf0e10cSrcweir     {
375cdf0e10cSrcweir         pDoc->GetCell( rPosX, rPosY, nTab, rpCell );
376cdf0e10cSrcweir         if ( !rpCell || rpCell->GetCellType() == CELLTYPE_NOTE )
377cdf0e10cSrcweir         {
378cdf0e10cSrcweir             if ( rPosX <= 0 )
379cdf0e10cSrcweir                 return sal_False;                           // alles leer bis links
380cdf0e10cSrcweir             else
381cdf0e10cSrcweir                 --rPosX;                                // weitersuchen
382cdf0e10cSrcweir         }
383cdf0e10cSrcweir                 else if ( rpCell->GetCellType() == CELLTYPE_EDIT)
384cdf0e10cSrcweir                     bFound = sal_True;
385cdf0e10cSrcweir                 else if (rpCell->GetCellType() == CELLTYPE_FORMULA &&
386cdf0e10cSrcweir                   static_cast<ScFormulaCell*>(rpCell)->IsHyperLinkCell())
387cdf0e10cSrcweir                     bFound = sal_True;
388cdf0e10cSrcweir         else
389cdf0e10cSrcweir             return sal_False;                               // andere Zelle
390cdf0e10cSrcweir     }
391cdf0e10cSrcweir     while ( !bFound );
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     return bFound;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir 
396cdf0e10cSrcweir // ---------------------------------------------------------------------------
397cdf0e10cSrcweir //  WB_DIALOGCONTROL noetig fuer UNO-Controls
ScGridWindow(Window * pParent,ScViewData * pData,ScSplitPos eWhichPos)398cdf0e10cSrcweir ScGridWindow::ScGridWindow( Window* pParent, ScViewData* pData, ScSplitPos eWhichPos )
399cdf0e10cSrcweir :           Window( pParent, WB_CLIPCHILDREN | WB_DIALOGCONTROL ),
400cdf0e10cSrcweir             DropTargetHelper( this ),
401cdf0e10cSrcweir             DragSourceHelper( this ),
402cdf0e10cSrcweir             mpOOCursors( NULL ),
403cdf0e10cSrcweir             mpOOSelection( NULL ),
404cdf0e10cSrcweir             mpOOAutoFill( NULL ),
405cdf0e10cSrcweir             mpOODragRect( NULL ),
406cdf0e10cSrcweir             mpOOHeader( NULL ),
407cdf0e10cSrcweir             mpOOShrink( NULL ),
408cdf0e10cSrcweir             mpAutoFillRect(static_cast<Rectangle*>(NULL)),
409cdf0e10cSrcweir             pViewData( pData ),
410cdf0e10cSrcweir             eWhich( eWhichPos ),
411cdf0e10cSrcweir             pNoteMarker( NULL ),
412cdf0e10cSrcweir             pFilterBox( NULL ),
413cdf0e10cSrcweir             pFilterFloat( NULL ),
414cdf0e10cSrcweir             mpDPFieldPopup(NULL),
415cdf0e10cSrcweir             mpFilterButton(NULL),
416cdf0e10cSrcweir             nCursorHideCount( 0 ),
417cdf0e10cSrcweir             bMarking( sal_False ),
418cdf0e10cSrcweir             nButtonDown( 0 ),
419cdf0e10cSrcweir             bEEMouse( sal_False ),
420cdf0e10cSrcweir             nMouseStatus( SC_GM_NONE ),
421cdf0e10cSrcweir             nNestedButtonState( SC_NESTEDBUTTON_NONE ),
422cdf0e10cSrcweir             bDPMouse( sal_False ),
423cdf0e10cSrcweir             bRFMouse( sal_False ),
424cdf0e10cSrcweir             nPagebreakMouse( SC_PD_NONE ),
425cdf0e10cSrcweir             bPagebreakDrawn( sal_False ),
426cdf0e10cSrcweir             nPageScript( 0 ),
427cdf0e10cSrcweir             bDragRect( sal_False ),
428cdf0e10cSrcweir             meDragInsertMode( INS_NONE ),
429cdf0e10cSrcweir             nCurrentPointer( 0 ),
430cdf0e10cSrcweir             bIsInScroll( sal_False ),
431cdf0e10cSrcweir             bIsInPaint( sal_False ),
432cdf0e10cSrcweir             aComboButton( this ),
433cdf0e10cSrcweir             aCurMousePos( 0,0 ),
434cdf0e10cSrcweir             nPaintCount( 0 ),
435cdf0e10cSrcweir             bNeedsRepaint( sal_False ),
436cdf0e10cSrcweir             bAutoMarkVisible( sal_False ),
437cdf0e10cSrcweir             bListValButton( sal_False )
438cdf0e10cSrcweir {
439cdf0e10cSrcweir     switch(eWhich)
440cdf0e10cSrcweir     {
441cdf0e10cSrcweir         case SC_SPLIT_TOPLEFT:
442cdf0e10cSrcweir             eHWhich = SC_SPLIT_LEFT;
443cdf0e10cSrcweir             eVWhich = SC_SPLIT_TOP;
444cdf0e10cSrcweir             break;
445cdf0e10cSrcweir         case SC_SPLIT_TOPRIGHT:
446cdf0e10cSrcweir             eHWhich = SC_SPLIT_RIGHT;
447cdf0e10cSrcweir             eVWhich = SC_SPLIT_TOP;
448cdf0e10cSrcweir             break;
449cdf0e10cSrcweir         case SC_SPLIT_BOTTOMLEFT:
450cdf0e10cSrcweir             eHWhich = SC_SPLIT_LEFT;
451cdf0e10cSrcweir             eVWhich = SC_SPLIT_BOTTOM;
452cdf0e10cSrcweir             break;
453cdf0e10cSrcweir         case SC_SPLIT_BOTTOMRIGHT:
454cdf0e10cSrcweir             eHWhich = SC_SPLIT_RIGHT;
455cdf0e10cSrcweir             eVWhich = SC_SPLIT_BOTTOM;
456cdf0e10cSrcweir             break;
457cdf0e10cSrcweir         default:
458cdf0e10cSrcweir             DBG_ERROR("GridWindow: falsche Position");
459cdf0e10cSrcweir     }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     SetBackground();
462cdf0e10cSrcweir 
463cdf0e10cSrcweir     SetMapMode(pViewData->GetLogicMode(eWhich));
464cdf0e10cSrcweir //  EnableDrop();
465cdf0e10cSrcweir     EnableChildTransparentMode();
466cdf0e10cSrcweir     SetDialogControlFlags( WINDOW_DLGCTRL_RETURN | WINDOW_DLGCTRL_WANTFOCUS );
467cdf0e10cSrcweir 
468cdf0e10cSrcweir     SetHelpId( HID_SC_WIN_GRIDWIN );
469cdf0e10cSrcweir     SetUniqueId( HID_SC_WIN_GRIDWIN );
470cdf0e10cSrcweir 
471cdf0e10cSrcweir     SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
472cdf0e10cSrcweir     EnableRTL( sal_False );
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
~ScGridWindow()475cdf0e10cSrcweir __EXPORT ScGridWindow::~ScGridWindow()
476cdf0e10cSrcweir {
477cdf0e10cSrcweir     // #114409#
478cdf0e10cSrcweir     ImpDestroyOverlayObjects();
479cdf0e10cSrcweir 
480cdf0e10cSrcweir     delete pFilterBox;
481cdf0e10cSrcweir     delete pFilterFloat;
482cdf0e10cSrcweir     delete pNoteMarker;
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
Resize(const Size &)485cdf0e10cSrcweir void __EXPORT ScGridWindow::Resize( const Size& )
486cdf0e10cSrcweir {
487cdf0e10cSrcweir     //  gar nix
488cdf0e10cSrcweir }
489cdf0e10cSrcweir 
ClickExtern()490cdf0e10cSrcweir void ScGridWindow::ClickExtern()
491cdf0e10cSrcweir {
492cdf0e10cSrcweir     do
493cdf0e10cSrcweir     {
494cdf0e10cSrcweir         // #i81298# don't delete the filter box when called from its select handler
495cdf0e10cSrcweir         // (possible through row header size update)
496cdf0e10cSrcweir         // #i84277# when initializing the filter box, a Basic error can deactivate the view
497cdf0e10cSrcweir         if ( pFilterBox && ( pFilterBox->IsInSelect() || pFilterBox->IsInInit() ) )
498cdf0e10cSrcweir         {
499cdf0e10cSrcweir             break;
500cdf0e10cSrcweir         }
501cdf0e10cSrcweir 
502cdf0e10cSrcweir         DELETEZ(pFilterBox);
503cdf0e10cSrcweir         DELETEZ(pFilterFloat);
504cdf0e10cSrcweir     }
505cdf0e10cSrcweir     while (false);
506cdf0e10cSrcweir 
507cdf0e10cSrcweir     if (mpDPFieldPopup.get())
508cdf0e10cSrcweir     {
509cdf0e10cSrcweir         mpDPFieldPopup->close(false);
510cdf0e10cSrcweir         mpDPFieldPopup.reset();
511cdf0e10cSrcweir     }
512cdf0e10cSrcweir }
513cdf0e10cSrcweir 
IMPL_LINK(ScGridWindow,PopupModeEndHdl,FloatingWindow *,EMPTYARG)514cdf0e10cSrcweir IMPL_LINK( ScGridWindow, PopupModeEndHdl, FloatingWindow*, EMPTYARG )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir     if (pFilterBox)
517cdf0e10cSrcweir         pFilterBox->SetCancelled();     // nicht mehr auswaehlen
518cdf0e10cSrcweir     GrabFocus();
519cdf0e10cSrcweir     return 0;
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
IMPL_LINK(ScGridWindow,PopupSpellingHdl,SpellCallbackInfo *,pInfo)522cdf0e10cSrcweir IMPL_LINK( ScGridWindow, PopupSpellingHdl, SpellCallbackInfo*, pInfo )
523cdf0e10cSrcweir {
524cdf0e10cSrcweir     if( pInfo->nCommand == SPELLCMD_STARTSPELLDLG )
525cdf0e10cSrcweir         pViewData->GetDispatcher().Execute( SID_SPELL_DIALOG, SFX_CALLMODE_ASYNCHRON );
526cdf0e10cSrcweir     return 0;
527cdf0e10cSrcweir }
528cdf0e10cSrcweir 
ExecPageFieldSelect(SCCOL nCol,SCROW nRow,sal_Bool bHasSelection,const String & rStr)529cdf0e10cSrcweir void ScGridWindow::ExecPageFieldSelect( SCCOL nCol, SCROW nRow, sal_Bool bHasSelection, const String& rStr )
530cdf0e10cSrcweir {
531cdf0e10cSrcweir     //! gridwin2 ?
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
534cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
535cdf0e10cSrcweir     ScDPObject* pDPObj = pDoc->GetDPAtCursor(nCol, nRow, nTab);
536cdf0e10cSrcweir     if ( pDPObj && nCol > 0 )
537cdf0e10cSrcweir     {
538cdf0e10cSrcweir         // look for the dimension header left of the drop-down arrow
539cdf0e10cSrcweir         sal_uInt16 nOrient = sheet::DataPilotFieldOrientation_HIDDEN;
540cdf0e10cSrcweir         long nField = pDPObj->GetHeaderDim( ScAddress( nCol-1, nRow, nTab ), nOrient );
541cdf0e10cSrcweir         if ( nField >= 0 && nOrient == sheet::DataPilotFieldOrientation_PAGE )
542cdf0e10cSrcweir         {
543cdf0e10cSrcweir             ScDPSaveData aSaveData( *pDPObj->GetSaveData() );
544cdf0e10cSrcweir 
545cdf0e10cSrcweir             sal_Bool bIsDataLayout;
546cdf0e10cSrcweir             String aDimName = pDPObj->GetDimName( nField, bIsDataLayout );
547cdf0e10cSrcweir             if ( !bIsDataLayout )
548cdf0e10cSrcweir             {
549cdf0e10cSrcweir                 ScDPSaveDimension* pDim = aSaveData.GetDimensionByName(aDimName);
550cdf0e10cSrcweir 
551cdf0e10cSrcweir                 if ( bHasSelection )
552cdf0e10cSrcweir                     pDim->SetCurrentPage( &rStr );
553cdf0e10cSrcweir                 else
554cdf0e10cSrcweir                     pDim->SetCurrentPage( NULL );
555cdf0e10cSrcweir 
556cdf0e10cSrcweir                 ScDPObject aNewObj( *pDPObj );
557cdf0e10cSrcweir                 aNewObj.SetSaveData( aSaveData );
558cdf0e10cSrcweir                 ScDBDocFunc aFunc( *pViewData->GetDocShell() );
559cdf0e10cSrcweir                 aFunc.DataPilotUpdate( pDPObj, &aNewObj, sal_True, sal_False );
560cdf0e10cSrcweir                 pViewData->GetView()->CursorPosChanged();       // shells may be switched
561cdf0e10cSrcweir             }
562cdf0e10cSrcweir         }
563cdf0e10cSrcweir     }
564cdf0e10cSrcweir }
565cdf0e10cSrcweir 
LaunchPageFieldMenu(SCCOL nCol,SCROW nRow)566cdf0e10cSrcweir void ScGridWindow::LaunchPageFieldMenu( SCCOL nCol, SCROW nRow )
567cdf0e10cSrcweir {
568cdf0e10cSrcweir     //! merge position/size handling with DoAutoFilterMenue
569cdf0e10cSrcweir 
570cdf0e10cSrcweir     delete pFilterBox;
571cdf0e10cSrcweir     delete pFilterFloat;
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     sal_uInt16 i;
574cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
575cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
576cdf0e10cSrcweir     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
577cdf0e10cSrcweir 
578cdf0e10cSrcweir     long nSizeX  = 0;
579cdf0e10cSrcweir     long nSizeY  = 0;
580cdf0e10cSrcweir     long nHeight = 0;
581cdf0e10cSrcweir     pViewData->GetMergeSizePixel( nCol, nRow, nSizeX, nSizeY );
582cdf0e10cSrcweir     Point aPos = pViewData->GetScrPos( nCol, nRow, eWhich );
583cdf0e10cSrcweir     if ( bLayoutRTL )
584cdf0e10cSrcweir         aPos.X() -= nSizeX;
585cdf0e10cSrcweir 
586cdf0e10cSrcweir     Rectangle aCellRect( OutputToScreenPixel(aPos), Size(nSizeX,nSizeY) );
587cdf0e10cSrcweir 
588cdf0e10cSrcweir     aPos.X() -= 1;
589cdf0e10cSrcweir     aPos.Y() += nSizeY - 1;
590cdf0e10cSrcweir 
591cdf0e10cSrcweir     pFilterFloat = new ScFilterFloatingWindow( this, WinBits(WB_BORDER) );      // not resizable etc.
592cdf0e10cSrcweir     pFilterFloat->SetPopupModeEndHdl( LINK( this, ScGridWindow, PopupModeEndHdl ) );
593cdf0e10cSrcweir     pFilterBox = new ScFilterListBox( pFilterFloat, this, nCol, nRow, SC_FILTERBOX_PAGEFIELD );
594cdf0e10cSrcweir     if ( bLayoutRTL )
595cdf0e10cSrcweir         pFilterBox->EnableMirroring();
596cdf0e10cSrcweir 
597cdf0e10cSrcweir     nSizeX += 1;
598cdf0e10cSrcweir 
599cdf0e10cSrcweir     {
600cdf0e10cSrcweir         Font    aOldFont = GetFont(); SetFont( pFilterBox->GetFont() );
601cdf0e10cSrcweir         MapMode aOldMode = GetMapMode(); SetMapMode( MAP_PIXEL );
602cdf0e10cSrcweir 
603cdf0e10cSrcweir         nHeight  = GetTextHeight();
604cdf0e10cSrcweir         nHeight *= SC_FILTERLISTBOX_LINES;
605cdf0e10cSrcweir 
606cdf0e10cSrcweir         SetMapMode( aOldMode );
607cdf0e10cSrcweir         SetFont( aOldFont );
608cdf0e10cSrcweir     }
609cdf0e10cSrcweir 
610cdf0e10cSrcweir     //  SetSize comes later
611cdf0e10cSrcweir 
612cdf0e10cSrcweir     TypedScStrCollection aStrings( 128, 128 );
613cdf0e10cSrcweir 
614cdf0e10cSrcweir     //  get list box entries and selection
615cdf0e10cSrcweir     sal_Bool bHasCurrentPage = sal_False;
616cdf0e10cSrcweir     String aCurrentPage;
617cdf0e10cSrcweir     ScDPObject* pDPObj = pDoc->GetDPAtCursor(nCol, nRow, nTab);
618cdf0e10cSrcweir     if ( pDPObj && nCol > 0 )
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir         // look for the dimension header left of the drop-down arrow
621cdf0e10cSrcweir         sal_uInt16 nOrient = sheet::DataPilotFieldOrientation_HIDDEN;
622cdf0e10cSrcweir         long nField = pDPObj->GetHeaderDim( ScAddress( nCol-1, nRow, nTab ), nOrient );
623cdf0e10cSrcweir         if ( nField >= 0 && nOrient == sheet::DataPilotFieldOrientation_PAGE )
624cdf0e10cSrcweir         {
625cdf0e10cSrcweir             pDPObj->FillPageList( aStrings, nField );
626cdf0e10cSrcweir 
627cdf0e10cSrcweir             // get current page from SaveData
628cdf0e10cSrcweir 
629cdf0e10cSrcweir             ScDPSaveData* pSaveData = pDPObj->GetSaveData();
630cdf0e10cSrcweir             sal_Bool bIsDataLayout;
631cdf0e10cSrcweir             String aDimName = pDPObj->GetDimName( nField, bIsDataLayout );
632cdf0e10cSrcweir             if ( pSaveData && !bIsDataLayout )
633cdf0e10cSrcweir             {
634cdf0e10cSrcweir                 ScDPSaveDimension* pDim = pSaveData->GetExistingDimensionByName(aDimName);
635cdf0e10cSrcweir                 if ( pDim && pDim->HasCurrentPage() )
636cdf0e10cSrcweir                 {
637cdf0e10cSrcweir                     aCurrentPage = pDim->GetCurrentPage();
638cdf0e10cSrcweir                     bHasCurrentPage = sal_True;
639cdf0e10cSrcweir                 }
640cdf0e10cSrcweir             }
641cdf0e10cSrcweir         }
642cdf0e10cSrcweir     }
643cdf0e10cSrcweir 
644cdf0e10cSrcweir     //  include all entry widths for the size of the drop-down
645cdf0e10cSrcweir     long nMaxText = 0;
646cdf0e10cSrcweir     sal_uInt16 nCount = aStrings.GetCount();
647cdf0e10cSrcweir     for (i=0; i<nCount; i++)
648cdf0e10cSrcweir     {
649cdf0e10cSrcweir         TypedStrData* pData = aStrings[i];
650cdf0e10cSrcweir         long nTextWidth = pFilterBox->GetTextWidth( pData->GetString() );
651cdf0e10cSrcweir         if ( nTextWidth > nMaxText )
652cdf0e10cSrcweir             nMaxText = nTextWidth;
653cdf0e10cSrcweir     }
654cdf0e10cSrcweir 
655cdf0e10cSrcweir     //  add scrollbar width if needed (string entries are counted here)
656cdf0e10cSrcweir     //  (scrollbar is shown if the box is exactly full?)
657cdf0e10cSrcweir     if ( nCount >= SC_FILTERLISTBOX_LINES )
658cdf0e10cSrcweir         nMaxText += GetSettings().GetStyleSettings().GetScrollBarSize();
659cdf0e10cSrcweir 
660cdf0e10cSrcweir     nMaxText += 4;              // for borders
661cdf0e10cSrcweir 
662cdf0e10cSrcweir     if ( nMaxText > nSizeX )
663cdf0e10cSrcweir         nSizeX = nMaxText;      // just modify width - starting position is unchanged
664cdf0e10cSrcweir 
665cdf0e10cSrcweir     //  adjust position and size to window
666cdf0e10cSrcweir 
667cdf0e10cSrcweir     Size aParentSize = GetParent()->GetOutputSizePixel();
668cdf0e10cSrcweir     Size aSize( nSizeX, nHeight );
669cdf0e10cSrcweir 
670cdf0e10cSrcweir     if ( aSize.Height() > aParentSize.Height() )
671cdf0e10cSrcweir         aSize.Height() = aParentSize.Height();
672cdf0e10cSrcweir     if ( aPos.Y() + aSize.Height() > aParentSize.Height() )
673cdf0e10cSrcweir         aPos.Y() = aParentSize.Height() - aSize.Height();
674cdf0e10cSrcweir 
675cdf0e10cSrcweir     pFilterBox->SetSizePixel( aSize );
676cdf0e10cSrcweir     pFilterBox->Show();                 // Show must be called before SetUpdateMode
677cdf0e10cSrcweir     pFilterBox->SetUpdateMode(sal_False);
678cdf0e10cSrcweir 
679cdf0e10cSrcweir     pFilterFloat->SetOutputSizePixel( aSize );
680cdf0e10cSrcweir     pFilterFloat->StartPopupMode( aCellRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS);
681cdf0e10cSrcweir 
682cdf0e10cSrcweir     //  fill the list box
683cdf0e10cSrcweir     sal_Bool bWait = ( nCount > 100 );
684cdf0e10cSrcweir 
685cdf0e10cSrcweir     if (bWait)
686cdf0e10cSrcweir         EnterWait();
687cdf0e10cSrcweir 
688cdf0e10cSrcweir     for (i=0; i<nCount; i++)
689cdf0e10cSrcweir         pFilterBox->InsertEntry( aStrings[i]->GetString() );
690cdf0e10cSrcweir 
691cdf0e10cSrcweir     pFilterBox->SetSeparatorPos( 0 );
692cdf0e10cSrcweir 
693cdf0e10cSrcweir     if (bWait)
694cdf0e10cSrcweir         LeaveWait();
695cdf0e10cSrcweir 
696cdf0e10cSrcweir     pFilterBox->SetUpdateMode(sal_True);
697cdf0e10cSrcweir 
698cdf0e10cSrcweir     sal_uInt16 nSelPos = LISTBOX_ENTRY_NOTFOUND;
699cdf0e10cSrcweir     if (bHasCurrentPage)
700cdf0e10cSrcweir         nSelPos = pFilterBox->GetEntryPos( aCurrentPage );
701cdf0e10cSrcweir 
702cdf0e10cSrcweir     if ( nSelPos == LISTBOX_ENTRY_NOTFOUND )
703cdf0e10cSrcweir         nSelPos = 0;                            // first entry
704cdf0e10cSrcweir 
705cdf0e10cSrcweir     pFilterBox->GrabFocus();
706cdf0e10cSrcweir 
707cdf0e10cSrcweir     //  call Select after GrabFocus, so the focus rectangle ends up in the right position
708cdf0e10cSrcweir     if ( nSelPos != LISTBOX_ENTRY_NOTFOUND )
709cdf0e10cSrcweir         pFilterBox->SelectEntryPos( nSelPos );
710cdf0e10cSrcweir 
711cdf0e10cSrcweir     pFilterBox->EndInit();
712cdf0e10cSrcweir 
713cdf0e10cSrcweir     nMouseStatus = SC_GM_FILTER;
714cdf0e10cSrcweir     CaptureMouse();
715cdf0e10cSrcweir }
716cdf0e10cSrcweir 
LaunchDPFieldMenu(SCCOL nCol,SCROW nRow)717cdf0e10cSrcweir void ScGridWindow::LaunchDPFieldMenu( SCCOL nCol, SCROW nRow )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
720cdf0e10cSrcweir     ScDPObject* pDPObj = pViewData->GetDocument()->GetDPAtCursor(nCol, nRow, nTab);
721cdf0e10cSrcweir     if (!pDPObj)
722cdf0e10cSrcweir         return;
723cdf0e10cSrcweir 
724cdf0e10cSrcweir     // Get the geometry of the cell.
725cdf0e10cSrcweir     Point aScrPos = pViewData->GetScrPos(nCol, nRow, eWhich);
726cdf0e10cSrcweir     long nSizeX, nSizeY;
727cdf0e10cSrcweir     pViewData->GetMergeSizePixel(nCol, nRow, nSizeX, nSizeY);
728cdf0e10cSrcweir     Size aScrSize(nSizeX-1, nSizeY-1);
729cdf0e10cSrcweir 
730cdf0e10cSrcweir     DPLaunchFieldPopupMenu(OutputToScreenPixel(aScrPos), aScrSize, ScAddress(nCol, nRow, nTab), pDPObj);
731cdf0e10cSrcweir }
732cdf0e10cSrcweir 
DoScenarioMenue(const ScRange & rScenRange)733cdf0e10cSrcweir void ScGridWindow::DoScenarioMenue( const ScRange& rScenRange )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir     delete pFilterBox;
736cdf0e10cSrcweir     delete pFilterFloat;
737cdf0e10cSrcweir 
738cdf0e10cSrcweir     SCCOL nCol = rScenRange.aEnd.Col();     // Zelle unterhalb des Buttons
739cdf0e10cSrcweir     SCROW nRow = rScenRange.aStart.Row();
740cdf0e10cSrcweir     if (nRow == 0)
741cdf0e10cSrcweir     {
742cdf0e10cSrcweir         nRow = rScenRange.aEnd.Row() + 1;       // Bereich ganz oben -> Button unterhalb
743cdf0e10cSrcweir         if (nRow>MAXROW) nRow = MAXROW;
744cdf0e10cSrcweir         //! Texthoehe addieren (wenn sie an der View gespeichert ist...)
745cdf0e10cSrcweir     }
746cdf0e10cSrcweir 
747cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
748cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
749cdf0e10cSrcweir     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
750cdf0e10cSrcweir 
751cdf0e10cSrcweir     long nSizeX  = 0;
752cdf0e10cSrcweir     long nSizeY  = 0;
753cdf0e10cSrcweir     long nHeight = 0;
754cdf0e10cSrcweir     pViewData->GetMergeSizePixel( nCol, nRow, nSizeX, nSizeY );
755cdf0e10cSrcweir     Point aPos = pViewData->GetScrPos( nCol, nRow, eWhich );
756cdf0e10cSrcweir     if ( bLayoutRTL )
757cdf0e10cSrcweir         aPos.X() -= nSizeX;
758cdf0e10cSrcweir     Rectangle aCellRect( OutputToScreenPixel(aPos), Size(nSizeX,nSizeY) );
759cdf0e10cSrcweir     aCellRect.Top()    -= nSizeY;
760cdf0e10cSrcweir     aCellRect.Bottom() -= nSizeY - 1;
761cdf0e10cSrcweir     //  Die ListBox direkt unter der schwarzen Linie auf dem Zellgitter
762cdf0e10cSrcweir     //  (wenn die Linie verdeckt wird, sieht es komisch aus...)
763cdf0e10cSrcweir 
764cdf0e10cSrcweir     pFilterFloat = new ScFilterFloatingWindow( this, WinBits(WB_BORDER) );      // nicht resizable etc.
765cdf0e10cSrcweir     pFilterFloat->SetPopupModeEndHdl( LINK( this, ScGridWindow, PopupModeEndHdl ) );
766cdf0e10cSrcweir     pFilterBox = new ScFilterListBox( pFilterFloat, this, nCol, nRow, SC_FILTERBOX_SCENARIO );
767cdf0e10cSrcweir     if ( bLayoutRTL )
768cdf0e10cSrcweir         pFilterBox->EnableMirroring();
769cdf0e10cSrcweir 
770cdf0e10cSrcweir     nSizeX += 1;
771cdf0e10cSrcweir 
772cdf0e10cSrcweir     {
773cdf0e10cSrcweir         Font    aOldFont = GetFont(); SetFont( pFilterBox->GetFont() );
774cdf0e10cSrcweir         MapMode aOldMode = GetMapMode(); SetMapMode( MAP_PIXEL );
775cdf0e10cSrcweir 
776cdf0e10cSrcweir         nHeight  = GetTextHeight();
777cdf0e10cSrcweir         nHeight *= SC_FILTERLISTBOX_LINES;
778cdf0e10cSrcweir 
779cdf0e10cSrcweir         SetMapMode( aOldMode );
780cdf0e10cSrcweir         SetFont( aOldFont );
781cdf0e10cSrcweir     }
782cdf0e10cSrcweir 
783cdf0e10cSrcweir     //  SetSize spaeter
784cdf0e10cSrcweir /*
785cdf0e10cSrcweir     pFilterBox->SetSelectionMode( SINGLE_SELECTION );
786cdf0e10cSrcweir     pFilterBox->SetTabs( nFilterBoxTabs, MapUnit( MAP_APPFONT ));
787cdf0e10cSrcweir     pFilterBox->SetTabJustify( 1, bLayoutRTL ? AdjustRight : AdjustLeft );
788cdf0e10cSrcweir */
789cdf0e10cSrcweir 
790cdf0e10cSrcweir     //  ParentSize Abfrage fehlt
791cdf0e10cSrcweir     Size aSize( nSizeX, nHeight );
792cdf0e10cSrcweir     pFilterBox->SetSizePixel( aSize );
793cdf0e10cSrcweir     pFilterBox->Show();                 // Show muss vor SetUpdateMode kommen !!!
794cdf0e10cSrcweir     pFilterBox->SetUpdateMode(sal_False);
795cdf0e10cSrcweir 
796cdf0e10cSrcweir     //  SetOutputSizePixel/StartPopupMode erst unten, wenn die Groesse feststeht
797cdf0e10cSrcweir 
798cdf0e10cSrcweir     //  Listbox fuellen
799cdf0e10cSrcweir 
800cdf0e10cSrcweir     long nMaxText = 0;
801cdf0e10cSrcweir     String aCurrent;
802cdf0e10cSrcweir     String aTabName;
803cdf0e10cSrcweir     SCTAB nTabCount = pDoc->GetTableCount();
804cdf0e10cSrcweir     SCTAB nEntryCount = 0;
805cdf0e10cSrcweir     for (SCTAB i=nTab+1; i<nTabCount && pDoc->IsScenario(i); i++)
806cdf0e10cSrcweir     {
807cdf0e10cSrcweir         if (pDoc->HasScenarioRange( i, rScenRange ))
808cdf0e10cSrcweir             if (pDoc->GetName( i, aTabName ))
809cdf0e10cSrcweir             {
810cdf0e10cSrcweir                 pFilterBox->InsertEntry( aTabName );
811cdf0e10cSrcweir                 if (pDoc->IsActiveScenario(i))
812cdf0e10cSrcweir                     aCurrent = aTabName;
813cdf0e10cSrcweir                 long nTextWidth = pFilterBox->GetTextWidth( aTabName );
814cdf0e10cSrcweir                 if ( nTextWidth > nMaxText )
815cdf0e10cSrcweir                     nMaxText = nTextWidth;
816cdf0e10cSrcweir                 ++nEntryCount;
817cdf0e10cSrcweir             }
818cdf0e10cSrcweir     }
819cdf0e10cSrcweir     if (nEntryCount > SC_FILTERLISTBOX_LINES)
820cdf0e10cSrcweir         nMaxText += GetSettings().GetStyleSettings().GetScrollBarSize();
821cdf0e10cSrcweir     nMaxText += 4;          // fuer Rand
822cdf0e10cSrcweir     if ( nMaxText > 300 )
823cdf0e10cSrcweir         nMaxText = 300;     // auch nicht uebertreiben (Pixel)
824cdf0e10cSrcweir 
825cdf0e10cSrcweir     if (nMaxText > nSizeX)  // Groesse auf benoetigte Groesse anpassen
826cdf0e10cSrcweir     {
827cdf0e10cSrcweir         long nDiff = nMaxText - nSizeX;
828cdf0e10cSrcweir         aSize = Size( nMaxText, nHeight );
829cdf0e10cSrcweir         pFilterBox->SetSizePixel( aSize );
830cdf0e10cSrcweir         pFilterFloat->SetOutputSizePixel( aSize );
831cdf0e10cSrcweir 
832cdf0e10cSrcweir         if ( !bLayoutRTL )
833cdf0e10cSrcweir         {
834cdf0e10cSrcweir             //  also move popup position
835cdf0e10cSrcweir             long nNewX = aCellRect.Left() - nDiff;
836cdf0e10cSrcweir             if ( nNewX < 0 )
837cdf0e10cSrcweir                 nNewX = 0;
838cdf0e10cSrcweir             aCellRect.Left() = nNewX;
839cdf0e10cSrcweir         }
840cdf0e10cSrcweir     }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir     pFilterFloat->SetOutputSizePixel( aSize );
843cdf0e10cSrcweir     pFilterFloat->StartPopupMode( aCellRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS );
844cdf0e10cSrcweir 
845cdf0e10cSrcweir     pFilterBox->SetUpdateMode(sal_True);
846cdf0e10cSrcweir     pFilterBox->GrabFocus();
847cdf0e10cSrcweir 
848cdf0e10cSrcweir     //  Select erst nach GrabFocus, damit das Focus-Rechteck richtig landet
849cdf0e10cSrcweir //! SvLBoxEntry* pSelect = NULL;
850cdf0e10cSrcweir     sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND;
851cdf0e10cSrcweir     if (aCurrent.Len())
852cdf0e10cSrcweir     {
853cdf0e10cSrcweir         nPos = pFilterBox->GetEntryPos( aCurrent );
854cdf0e10cSrcweir //!     pSelect = pFilterBox->GetEntry( nPos );
855cdf0e10cSrcweir     }
856cdf0e10cSrcweir     if (/*!pSelect*/ LISTBOX_ENTRY_NOTFOUND == nPos && pFilterBox->GetEntryCount() > 0 )
857cdf0e10cSrcweir         nPos = 0;
858cdf0e10cSrcweir //!     pSelect = pFilterBox->GetEntry(0);          // einer sollte immer selektiert sein
859cdf0e10cSrcweir     if (/*pSelect*/ LISTBOX_ENTRY_NOTFOUND != nPos )
860cdf0e10cSrcweir         pFilterBox->SelectEntryPos(nPos);
861cdf0e10cSrcweir 
862cdf0e10cSrcweir     pFilterBox->EndInit();
863cdf0e10cSrcweir 
864cdf0e10cSrcweir     // Szenario-Auswahl kommt aus MouseButtonDown:
865cdf0e10cSrcweir     //  der naechste MouseMove auf die Filterbox ist wie ein ButtonDown
866cdf0e10cSrcweir 
867cdf0e10cSrcweir     nMouseStatus = SC_GM_FILTER;
868cdf0e10cSrcweir     CaptureMouse();
869cdf0e10cSrcweir }
870cdf0e10cSrcweir 
HasScenarioRange(sal_uInt16 nCol,sal_Int32 nRow,ScRange & rScenRange)8710deba7fbSSteve Yin sal_Bool ScGridWindow::HasScenarioRange( sal_uInt16 nCol, sal_Int32 nRow, ScRange& rScenRange )
8720deba7fbSSteve Yin {
8730deba7fbSSteve Yin     ScDocument* pDoc = pViewData->GetDocument();
8740deba7fbSSteve Yin     sal_uInt16 nTab = pViewData->GetTabNo();
8750deba7fbSSteve Yin     sal_uInt16 nTabCount = pDoc->GetTableCount();
8760deba7fbSSteve Yin     if ( nTab+1<nTabCount && pDoc->IsScenario(nTab+1) && !pDoc->IsScenario(nTab) )
8770deba7fbSSteve Yin     {
8780deba7fbSSteve Yin         sal_uInt16 i;
8790deba7fbSSteve Yin         ScMarkData aMarks;
8800deba7fbSSteve Yin         for (i=nTab+1; i<nTabCount && pDoc->IsScenario(i); i++)
8810deba7fbSSteve Yin             pDoc->MarkScenario( i, nTab, aMarks, sal_False, SC_SCENARIO_SHOWFRAME );
8820deba7fbSSteve Yin         ScRangeList aRanges;
8830deba7fbSSteve Yin         aMarks.FillRangeListWithMarks( &aRanges, sal_False );
8840deba7fbSSteve Yin         sal_uInt16 nRangeCount = (sal_uInt16)aRanges.Count();
8850deba7fbSSteve Yin         for (i=0; i<nRangeCount; i++)
8860deba7fbSSteve Yin         {
8870deba7fbSSteve Yin             ScRange aRange = *aRanges.GetObject(i);
8880deba7fbSSteve Yin             pDoc->ExtendTotalMerge( aRange );
8890deba7fbSSteve Yin             sal_Bool bTextBelow = ( aRange.aStart.Row() == 0 );
8900deba7fbSSteve Yin             sal_Bool bIsInScen = sal_False;
8910deba7fbSSteve Yin             if ( bTextBelow )
8920deba7fbSSteve Yin             {
8930deba7fbSSteve Yin                 bIsInScen = (aRange.aStart.Col() == nCol && aRange.aEnd.Row() == nRow-1);
8940deba7fbSSteve Yin             }
8950deba7fbSSteve Yin             else
8960deba7fbSSteve Yin             {
8970deba7fbSSteve Yin                 bIsInScen = (aRange.aStart.Col() == nCol && aRange.aStart.Row() == nRow+1);
8980deba7fbSSteve Yin             }
8990deba7fbSSteve Yin             if (bIsInScen)
9000deba7fbSSteve Yin             {
9010deba7fbSSteve Yin                 rScenRange = aRange;
9020deba7fbSSteve Yin                 return sal_True;
9030deba7fbSSteve Yin             }
9040deba7fbSSteve Yin         }
9050deba7fbSSteve Yin     }
9060deba7fbSSteve Yin     return sal_False;
9070deba7fbSSteve Yin }
DoAutoFilterMenue(SCCOL nCol,SCROW nRow,sal_Bool bDataSelect)908cdf0e10cSrcweir void ScGridWindow::DoAutoFilterMenue( SCCOL nCol, SCROW nRow, sal_Bool bDataSelect )
909cdf0e10cSrcweir {
910cdf0e10cSrcweir     delete pFilterBox;
911cdf0e10cSrcweir     delete pFilterFloat;
912cdf0e10cSrcweir 
913cdf0e10cSrcweir     sal_uInt16 i;
914cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
915cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
916cdf0e10cSrcweir     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
917cdf0e10cSrcweir 
918cdf0e10cSrcweir     long nSizeX  = 0;
919cdf0e10cSrcweir     long nSizeY  = 0;
920cdf0e10cSrcweir     long nHeight = 0;
921cdf0e10cSrcweir     pViewData->GetMergeSizePixel( nCol, nRow, nSizeX, nSizeY );
92251b45b88SJian Fang Zhang     // The button height should not use the merged cell height, should still use single row height
92351b45b88SJian Fang Zhang     nSizeY = pViewData->ToPixel(pDoc->GetRowHeight(nRow, nTab), pViewData->GetPPTY());
924cdf0e10cSrcweir     Point aPos = pViewData->GetScrPos( nCol, nRow, eWhich );
925cdf0e10cSrcweir     if ( bLayoutRTL )
926cdf0e10cSrcweir         aPos.X() -= nSizeX;
927cdf0e10cSrcweir 
928cdf0e10cSrcweir     Rectangle aCellRect( OutputToScreenPixel(aPos), Size(nSizeX,nSizeY) );
929cdf0e10cSrcweir 
930cdf0e10cSrcweir     aPos.X() -= 1;
931cdf0e10cSrcweir     aPos.Y() += nSizeY - 1;
932cdf0e10cSrcweir 
933cdf0e10cSrcweir     pFilterFloat = new ScFilterFloatingWindow( this, WinBits(WB_BORDER) );      // nicht resizable etc.
934cdf0e10cSrcweir     pFilterFloat->SetPopupModeEndHdl( LINK( this, ScGridWindow, PopupModeEndHdl ) );
935cdf0e10cSrcweir     pFilterBox = new ScFilterListBox(
936cdf0e10cSrcweir         pFilterFloat, this, nCol, nRow, bDataSelect ? SC_FILTERBOX_DATASELECT : SC_FILTERBOX_FILTER );
937cdf0e10cSrcweir     if ( bLayoutRTL )
938cdf0e10cSrcweir         pFilterBox->EnableMirroring();
939cdf0e10cSrcweir 
940cdf0e10cSrcweir     nSizeX += 1;
941cdf0e10cSrcweir 
942cdf0e10cSrcweir     {
943cdf0e10cSrcweir         Font    aOldFont = GetFont(); SetFont( pFilterBox->GetFont() );
944cdf0e10cSrcweir         MapMode aOldMode = GetMapMode(); SetMapMode( MAP_PIXEL );
945cdf0e10cSrcweir 
946cdf0e10cSrcweir         nHeight  = GetTextHeight();
947cdf0e10cSrcweir         nHeight *= SC_FILTERLISTBOX_LINES;
948cdf0e10cSrcweir 
949cdf0e10cSrcweir         SetMapMode( aOldMode );
950cdf0e10cSrcweir         SetFont( aOldFont );
951cdf0e10cSrcweir     }
952cdf0e10cSrcweir 
953cdf0e10cSrcweir     //  SetSize spaeter
954cdf0e10cSrcweir /*
955cdf0e10cSrcweir     pFilterBox->SetSelectionMode( SINGLE_SELECTION );
956cdf0e10cSrcweir     pFilterBox->SetTabs( nFilterBoxTabs, MapUnit( MAP_APPFONT ));
957cdf0e10cSrcweir     pFilterBox->SetTabJustify( 1, bLayoutRTL ? AdjustRight : AdjustLeft );
958cdf0e10cSrcweir */
959cdf0e10cSrcweir 
960cdf0e10cSrcweir     sal_Bool bEmpty = sal_False;
961cdf0e10cSrcweir     TypedScStrCollection aStrings( 128, 128 );
962cdf0e10cSrcweir     if ( bDataSelect )                                  // Auswahl-Liste
963cdf0e10cSrcweir     {
964cdf0e10cSrcweir         //  Liste fuellen
965cdf0e10cSrcweir         aStrings.SetCaseSensitive( sal_True );
966cdf0e10cSrcweir         pDoc->GetDataEntries( nCol, nRow, nTab, aStrings );
967cdf0e10cSrcweir         if ( aStrings.GetCount() == 0 )
968cdf0e10cSrcweir             bEmpty = sal_True;
969cdf0e10cSrcweir     }
970cdf0e10cSrcweir     else                                                // AutoFilter
971cdf0e10cSrcweir     {
972cdf0e10cSrcweir         //! wird der Titel ueberhaupt ausgewertet ???
973cdf0e10cSrcweir         String aString;
974cdf0e10cSrcweir         pDoc->GetString( nCol, nRow, nTab, aString );
975cdf0e10cSrcweir         pFilterBox->SetText( aString );
976cdf0e10cSrcweir 
977cdf0e10cSrcweir         long nMaxText = 0;
978cdf0e10cSrcweir 
979cdf0e10cSrcweir         //  default entries
980*840d0e68SArrigo Marchiori         static const sal_uInt16 nDefIDs[] = { SCSTR_ALLFILTER, SCSTR_TOP10FILTER, SCSTR_STDFILTER, SCSTR_EMPTY, SCSTR_NOTEMPTY };
981cdf0e10cSrcweir         const sal_uInt16 nDefCount = sizeof(nDefIDs) / sizeof(sal_uInt16);
982cdf0e10cSrcweir         for (i=0; i<nDefCount; i++)
983cdf0e10cSrcweir         {
984cdf0e10cSrcweir             String aEntry( (ScResId) nDefIDs[i] );
985cdf0e10cSrcweir             pFilterBox->InsertEntry( aEntry );
986cdf0e10cSrcweir             long nTextWidth = pFilterBox->GetTextWidth( aEntry );
987cdf0e10cSrcweir             if ( nTextWidth > nMaxText )
988cdf0e10cSrcweir                 nMaxText = nTextWidth;
989cdf0e10cSrcweir         }
990cdf0e10cSrcweir         pFilterBox->SetSeparatorPos( nDefCount - 1 );
991cdf0e10cSrcweir 
992cdf0e10cSrcweir         //  get list entries
993cdf0e10cSrcweir         bool bHasDates = false;
994cdf0e10cSrcweir         pDoc->GetFilterEntries( nCol, nRow, nTab, true, aStrings, bHasDates);
995cdf0e10cSrcweir         pFilterBox->SetListHasDates(bHasDates);
996cdf0e10cSrcweir 
997cdf0e10cSrcweir         //  check widths of numerical entries (string entries are not included)
998cdf0e10cSrcweir         //  so all numbers are completely visible
999cdf0e10cSrcweir         sal_uInt16 nCount = aStrings.GetCount();
1000cdf0e10cSrcweir         for (i=0; i<nCount; i++)
1001cdf0e10cSrcweir         {
1002cdf0e10cSrcweir             TypedStrData* pData = aStrings[i];
1003cdf0e10cSrcweir             if ( !pData->IsStrData() )              // only numerical entries
1004cdf0e10cSrcweir             {
1005cdf0e10cSrcweir                 long nTextWidth = pFilterBox->GetTextWidth( pData->GetString() );
1006cdf0e10cSrcweir                 if ( nTextWidth > nMaxText )
1007cdf0e10cSrcweir                     nMaxText = nTextWidth;
1008cdf0e10cSrcweir             }
1009cdf0e10cSrcweir         }
1010cdf0e10cSrcweir 
1011cdf0e10cSrcweir         //  add scrollbar width if needed (string entries are counted here)
1012cdf0e10cSrcweir         //  (scrollbar is shown if the box is exactly full?)
1013cdf0e10cSrcweir         if ( nCount + nDefCount >= SC_FILTERLISTBOX_LINES )
1014cdf0e10cSrcweir             nMaxText += GetSettings().GetStyleSettings().GetScrollBarSize();
1015cdf0e10cSrcweir 
1016cdf0e10cSrcweir         nMaxText += 4;              // for borders
1017cdf0e10cSrcweir 
1018cdf0e10cSrcweir         if ( nMaxText > nSizeX )
1019cdf0e10cSrcweir             nSizeX = nMaxText;      // just modify width - starting position is unchanged
1020cdf0e10cSrcweir     }
1021cdf0e10cSrcweir 
1022cdf0e10cSrcweir     if (!bEmpty)
1023cdf0e10cSrcweir     {
1024cdf0e10cSrcweir         //  Position und Groesse an Fenster anpassen
1025cdf0e10cSrcweir         //! vorher Abfrage, ob die Eintraege hineinpassen (Breite)
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir         Size aParentSize = GetParent()->GetOutputSizePixel();
1028cdf0e10cSrcweir         Size aSize( nSizeX, nHeight );
1029cdf0e10cSrcweir 
1030cdf0e10cSrcweir         if ( aSize.Height() > aParentSize.Height() )
1031cdf0e10cSrcweir             aSize.Height() = aParentSize.Height();
1032cdf0e10cSrcweir         if ( aPos.Y() + aSize.Height() > aParentSize.Height() )
1033cdf0e10cSrcweir             aPos.Y() = aParentSize.Height() - aSize.Height();
1034cdf0e10cSrcweir 
1035cdf0e10cSrcweir         pFilterBox->SetSizePixel( aSize );
1036cdf0e10cSrcweir         pFilterBox->Show();                 // Show muss vor SetUpdateMode kommen !!!
1037cdf0e10cSrcweir         pFilterBox->SetUpdateMode(sal_False);
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir         pFilterFloat->SetOutputSizePixel( aSize );
1040cdf0e10cSrcweir         pFilterFloat->StartPopupMode( aCellRect, FLOATWIN_POPUPMODE_DOWN|FLOATWIN_POPUPMODE_GRABFOCUS);
1041cdf0e10cSrcweir 
1042cdf0e10cSrcweir         //  Listbox fuellen
1043cdf0e10cSrcweir         sal_uInt16 nCount = aStrings.GetCount();
1044cdf0e10cSrcweir         sal_Bool bWait = ( nCount > 100 );
1045cdf0e10cSrcweir 
1046cdf0e10cSrcweir         if (bWait)
1047cdf0e10cSrcweir             EnterWait();
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir         for (i=0; i<nCount; i++)
1050cdf0e10cSrcweir             pFilterBox->InsertEntry( aStrings[i]->GetString() );
1051cdf0e10cSrcweir 
1052cdf0e10cSrcweir         if (bWait)
1053cdf0e10cSrcweir             LeaveWait();
1054cdf0e10cSrcweir 
1055cdf0e10cSrcweir         pFilterBox->SetUpdateMode(sal_True);
1056cdf0e10cSrcweir     }
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir //! SvLBoxEntry* pSelect = NULL;
1059cdf0e10cSrcweir     sal_uInt16 nSelPos = LISTBOX_ENTRY_NOTFOUND;
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir     if (!bDataSelect)                       // AutoFilter: aktiven Eintrag selektieren
1062cdf0e10cSrcweir     {
1063cdf0e10cSrcweir         ScDBData* pDBData = pDoc->GetDBAtCursor( nCol, nRow, nTab );
1064cdf0e10cSrcweir         if (pDBData)
1065cdf0e10cSrcweir         {
1066cdf0e10cSrcweir             ScQueryParam aParam;
1067cdf0e10cSrcweir             pDBData->GetQueryParam( aParam );       // kann nur MAXQUERY Eintraege ergeben
1068cdf0e10cSrcweir 
1069cdf0e10cSrcweir             sal_Bool bValid = sal_True;
1070cdf0e10cSrcweir             for (SCSIZE j=0; j<MAXQUERY && bValid; j++)         // bisherige Filter-Einstellungen
1071cdf0e10cSrcweir                 if (aParam.GetEntry(j).bDoQuery)
1072cdf0e10cSrcweir                 {
1073cdf0e10cSrcweir                     //!         Abfrage mit DrawButtons zusammenfassen!
1074cdf0e10cSrcweir 
1075cdf0e10cSrcweir                     ScQueryEntry& rEntry = aParam.GetEntry(j);
1076cdf0e10cSrcweir                     if (j>0)
1077cdf0e10cSrcweir                         if (rEntry.eConnect != SC_AND)
1078cdf0e10cSrcweir                             bValid = sal_False;
1079cdf0e10cSrcweir                     if (rEntry.nField == nCol)
1080cdf0e10cSrcweir                     {
1081cdf0e10cSrcweir                         if (rEntry.eOp == SC_EQUAL)
1082cdf0e10cSrcweir                         {
1083cdf0e10cSrcweir                             String* pStr = rEntry.pStr;
1084cdf0e10cSrcweir                             if (pStr)
1085cdf0e10cSrcweir                             {
1086cdf0e10cSrcweir                                 nSelPos = pFilterBox->GetEntryPos( *pStr );
1087cdf0e10cSrcweir //!                             pSelect = pFilterBox->GetEntry( nPos );
1088cdf0e10cSrcweir                             }
1089cdf0e10cSrcweir                         }
1090cdf0e10cSrcweir                         else if (rEntry.eOp == SC_TOPVAL && rEntry.pStr &&
1091cdf0e10cSrcweir                                     rEntry.pStr->EqualsAscii("10"))
1092cdf0e10cSrcweir                             nSelPos = SC_AUTOFILTER_TOP10;
1093cdf0e10cSrcweir                         else
1094cdf0e10cSrcweir                             nSelPos = SC_AUTOFILTER_CUSTOM;
1095cdf0e10cSrcweir                     }
1096cdf0e10cSrcweir                 }
1097cdf0e10cSrcweir 
1098cdf0e10cSrcweir             if (!bValid)
1099cdf0e10cSrcweir                 nSelPos = SC_AUTOFILTER_CUSTOM;
1100cdf0e10cSrcweir         }
1101cdf0e10cSrcweir     }
1102cdf0e10cSrcweir     else
1103cdf0e10cSrcweir     {
1104cdf0e10cSrcweir 
1105cdf0e10cSrcweir         sal_uLong nIndex = ((SfxUInt32Item*)pDoc->GetAttr(
1106cdf0e10cSrcweir                                 nCol, nRow, nTab, ATTR_VALIDDATA ))->GetValue();
1107cdf0e10cSrcweir         if ( nIndex )
1108cdf0e10cSrcweir         {
1109cdf0e10cSrcweir             const ScValidationData* pData = pDoc->GetValidationEntry( nIndex );
1110cdf0e10cSrcweir             if (pData)
1111cdf0e10cSrcweir             {
1112cdf0e10cSrcweir                 TypedStrData* pNew = NULL;
1113cdf0e10cSrcweir                 String aDocStr;
1114cdf0e10cSrcweir                 pDoc->GetString( nCol, nRow, nTab, aDocStr );
1115cdf0e10cSrcweir                 if ( pDoc->HasValueData( nCol, nRow, nTab ) )
1116cdf0e10cSrcweir                 {
1117cdf0e10cSrcweir                     double fVal = pDoc->GetValue(ScAddress(nCol, nRow, nTab));
1118cdf0e10cSrcweir                     pNew = new TypedStrData( aDocStr, fVal, SC_STRTYPE_VALUE );
1119cdf0e10cSrcweir                 }
1120cdf0e10cSrcweir                 else
1121cdf0e10cSrcweir                     pNew = new TypedStrData( aDocStr, 0.0, SC_STRTYPE_STANDARD );
1122cdf0e10cSrcweir 
1123cdf0e10cSrcweir                 bool bSortList = ( pData->GetListType() == ValidListType::SORTEDASCENDING);
1124cdf0e10cSrcweir                 if ( bSortList )
1125cdf0e10cSrcweir                 {
1126cdf0e10cSrcweir                     sal_uInt16 nStrIndex;
1127cdf0e10cSrcweir                     if (aStrings.Search(pNew,nStrIndex))
1128cdf0e10cSrcweir                         nSelPos = nStrIndex;
1129cdf0e10cSrcweir                 }
1130cdf0e10cSrcweir                 else
1131cdf0e10cSrcweir                 {
1132cdf0e10cSrcweir                     sal_uInt16 nCount = aStrings.GetCount();
1133cdf0e10cSrcweir                     for (i = 0; ((i < nCount) && ( LISTBOX_ENTRY_NOTFOUND == nSelPos)); i++)
1134cdf0e10cSrcweir                     {
1135cdf0e10cSrcweir                         if ( aStrings.Compare(aStrings[i], pNew)==0 )
1136cdf0e10cSrcweir                             nSelPos = i;
1137cdf0e10cSrcweir                     }
1138cdf0e10cSrcweir                 }
1139cdf0e10cSrcweir                 delete pNew;
1140cdf0e10cSrcweir             }
1141cdf0e10cSrcweir         }
1142cdf0e10cSrcweir     }
1143cdf0e10cSrcweir 
1144cdf0e10cSrcweir         //  neu (309): irgendwas muss immer selektiert sein:
1145cdf0e10cSrcweir     if ( LISTBOX_ENTRY_NOTFOUND == nSelPos && pFilterBox->GetEntryCount() > 0 && !bDataSelect)
1146cdf0e10cSrcweir         nSelPos = 0;
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir     //  keine leere Auswahl-Liste anzeigen:
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir     if ( bEmpty )
1151cdf0e10cSrcweir     {
1152cdf0e10cSrcweir         DELETEZ(pFilterBox);                // war nix
1153cdf0e10cSrcweir         DELETEZ(pFilterFloat);
1154cdf0e10cSrcweir         Sound::Beep();                      // bemerkbar machen
1155cdf0e10cSrcweir     }
1156cdf0e10cSrcweir     else
1157cdf0e10cSrcweir     {
1158cdf0e10cSrcweir //      pFilterBox->Show();                 // schon vorne
1159cdf0e10cSrcweir         pFilterBox->GrabFocus();
1160cdf0e10cSrcweir 
1161cdf0e10cSrcweir             //  Select erst nach GrabFocus, damit das Focus-Rechteck richtig landet
1162cdf0e10cSrcweir         if ( LISTBOX_ENTRY_NOTFOUND != nSelPos )
1163cdf0e10cSrcweir             pFilterBox->SelectEntryPos( nSelPos );
1164cdf0e10cSrcweir         else
1165cdf0e10cSrcweir         {
1166cdf0e10cSrcweir             if (bDataSelect)
1167cdf0e10cSrcweir                 pFilterBox->SetNoSelection();
1168cdf0e10cSrcweir         }
1169cdf0e10cSrcweir 
1170cdf0e10cSrcweir         pFilterBox->EndInit();
1171cdf0e10cSrcweir 
1172cdf0e10cSrcweir         if (!bDataSelect)
1173cdf0e10cSrcweir         {
1174cdf0e10cSrcweir             // AutoFilter (aus MouseButtonDown):
1175cdf0e10cSrcweir             //  der naechste MouseMove auf die Filterbox ist wie ein ButtonDown
1176cdf0e10cSrcweir 
1177cdf0e10cSrcweir             nMouseStatus = SC_GM_FILTER;
1178cdf0e10cSrcweir             CaptureMouse();
1179cdf0e10cSrcweir         }
1180cdf0e10cSrcweir     }
1181cdf0e10cSrcweir }
1182cdf0e10cSrcweir 
FilterSelect(sal_uLong nSel)1183cdf0e10cSrcweir void ScGridWindow::FilterSelect( sal_uLong nSel )
1184cdf0e10cSrcweir {
1185cdf0e10cSrcweir     String aString;
1186cdf0e10cSrcweir /*
1187cdf0e10cSrcweir     SvLBoxEntry* pEntry = pFilterBox->GetEntry( nSel );
1188cdf0e10cSrcweir     if (pEntry)
1189cdf0e10cSrcweir     {
1190cdf0e10cSrcweir         SvLBoxString* pStringEntry = (SvLBoxString*) pEntry->GetFirstItem( SV_ITEM_ID_LBOXSTRING );
1191cdf0e10cSrcweir         if ( pStringEntry )
1192cdf0e10cSrcweir             aString = pStringEntry->GetText();
1193cdf0e10cSrcweir     }
1194cdf0e10cSrcweir */
1195cdf0e10cSrcweir     aString = pFilterBox->GetEntry( static_cast< sal_uInt16 >( nSel ) );
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir     SCCOL nCol = pFilterBox->GetCol();
1198cdf0e10cSrcweir     SCROW nRow = pFilterBox->GetRow();
1199cdf0e10cSrcweir     switch ( pFilterBox->GetMode() )
1200cdf0e10cSrcweir     {
1201cdf0e10cSrcweir         case SC_FILTERBOX_DATASELECT:
1202cdf0e10cSrcweir             ExecDataSelect( nCol, nRow, aString );
1203cdf0e10cSrcweir             break;
1204cdf0e10cSrcweir         case SC_FILTERBOX_FILTER:
1205cdf0e10cSrcweir             ExecFilter( nSel, nCol, nRow, aString, pFilterBox->HasDates() );
1206cdf0e10cSrcweir             break;
1207cdf0e10cSrcweir         case SC_FILTERBOX_SCENARIO:
1208cdf0e10cSrcweir             pViewData->GetView()->UseScenario( aString );
1209cdf0e10cSrcweir             break;
1210cdf0e10cSrcweir         case SC_FILTERBOX_PAGEFIELD:
1211cdf0e10cSrcweir             // first entry is "all"
1212cdf0e10cSrcweir             ExecPageFieldSelect( nCol, nRow, (nSel != 0), aString );
1213cdf0e10cSrcweir             break;
1214cdf0e10cSrcweir     }
1215cdf0e10cSrcweir 
1216cdf0e10cSrcweir     if (pFilterFloat)
1217cdf0e10cSrcweir         pFilterFloat->EndPopupMode();
1218cdf0e10cSrcweir 
1219cdf0e10cSrcweir     GrabFocus();        // unter OS/2 stimmt der Focus sonst nicht
1220cdf0e10cSrcweir }
1221cdf0e10cSrcweir 
ExecDataSelect(SCCOL nCol,SCROW nRow,const String & rStr)1222cdf0e10cSrcweir void ScGridWindow::ExecDataSelect( SCCOL nCol, SCROW nRow, const String& rStr )
1223cdf0e10cSrcweir {
1224cdf0e10cSrcweir     if ( rStr.Len() )
1225cdf0e10cSrcweir     {
1226cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
1227cdf0e10cSrcweir         ScViewFunc* pView = pViewData->GetView();
1228cdf0e10cSrcweir         pView->EnterData( nCol, nRow, nTab, rStr );
1229cdf0e10cSrcweir 
1230cdf0e10cSrcweir         // #i52307# CellContentChanged is not in EnterData so it isn't called twice
1231cdf0e10cSrcweir         // if the cursor is moved afterwards.
1232cdf0e10cSrcweir         pView->CellContentChanged();
1233cdf0e10cSrcweir     }
1234cdf0e10cSrcweir }
1235cdf0e10cSrcweir 
ExecFilter(sal_uLong nSel,SCCOL nCol,SCROW nRow,const String & aValue,bool bCheckForDates)1236cdf0e10cSrcweir void ScGridWindow::ExecFilter( sal_uLong nSel,
1237cdf0e10cSrcweir                                SCCOL nCol, SCROW nRow,
1238cdf0e10cSrcweir                                const String& aValue, bool bCheckForDates )
1239cdf0e10cSrcweir {
1240cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
1241cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
1242cdf0e10cSrcweir 
1243cdf0e10cSrcweir     ScDBData* pDBData = pDoc->GetDBAtCursor( nCol, nRow, nTab );
1244cdf0e10cSrcweir     if (pDBData)
1245cdf0e10cSrcweir     {
1246cdf0e10cSrcweir         ScQueryParam aParam;
1247cdf0e10cSrcweir         pDBData->GetQueryParam( aParam );       // kann nur MAXQUERY Eintraege ergeben
1248cdf0e10cSrcweir 
1249cdf0e10cSrcweir         if (SC_AUTOFILTER_CUSTOM == nSel)
1250cdf0e10cSrcweir         {
1251cdf0e10cSrcweir             SCTAB nAreaTab;
1252cdf0e10cSrcweir             SCCOL nStartCol;
1253cdf0e10cSrcweir             SCROW nStartRow;
1254cdf0e10cSrcweir             SCCOL nEndCol;
1255cdf0e10cSrcweir             SCROW nEndRow;
1256cdf0e10cSrcweir             pDBData->GetArea( nAreaTab, nStartCol,nStartRow,nEndCol,nEndRow );
1257cdf0e10cSrcweir             pViewData->GetView()->MarkRange( ScRange( nStartCol,nStartRow,nAreaTab,nEndCol,nEndRow,nAreaTab));
1258cdf0e10cSrcweir             pViewData->GetView()->SetCursor(nCol,nRow);     //! auch ueber Slot ??
1259cdf0e10cSrcweir             pViewData->GetDispatcher().Execute( SID_FILTER, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD );
1260cdf0e10cSrcweir         }
1261cdf0e10cSrcweir         else
1262cdf0e10cSrcweir         {
1263cdf0e10cSrcweir             sal_Bool bDeleteOld = sal_False;
1264cdf0e10cSrcweir             SCSIZE nQueryPos = 0;
1265cdf0e10cSrcweir             sal_Bool bFound = sal_False;
1266cdf0e10cSrcweir             if (!aParam.bInplace)
1267cdf0e10cSrcweir                 bDeleteOld = sal_True;
1268cdf0e10cSrcweir             if (aParam.bRegExp)
1269cdf0e10cSrcweir                 bDeleteOld = sal_True;
1270cdf0e10cSrcweir             for (SCSIZE i=0; i<MAXQUERY && !bDeleteOld; i++)    // bisherige Filter-Einstellungen
1271cdf0e10cSrcweir                 if (aParam.GetEntry(i).bDoQuery)
1272cdf0e10cSrcweir                 {
1273cdf0e10cSrcweir                     //!         Abfrage mit DrawButtons zusammenfassen!
1274cdf0e10cSrcweir 
1275cdf0e10cSrcweir                     ScQueryEntry& rEntry = aParam.GetEntry(i);
1276cdf0e10cSrcweir                     if (i>0)
1277cdf0e10cSrcweir                         if (rEntry.eConnect != SC_AND)
1278cdf0e10cSrcweir                             bDeleteOld = sal_True;
1279cdf0e10cSrcweir 
1280cdf0e10cSrcweir                     if (rEntry.nField == nCol)
1281cdf0e10cSrcweir                     {
1282cdf0e10cSrcweir                         if (bFound)                         // diese Spalte zweimal?
1283cdf0e10cSrcweir                             bDeleteOld = sal_True;
1284cdf0e10cSrcweir                         nQueryPos = i;
1285cdf0e10cSrcweir                         bFound = sal_True;
1286cdf0e10cSrcweir                     }
1287cdf0e10cSrcweir                     if (!bFound)
1288cdf0e10cSrcweir                         nQueryPos = i + 1;
1289cdf0e10cSrcweir                 }
1290cdf0e10cSrcweir 
1291cdf0e10cSrcweir             if (bDeleteOld)
1292cdf0e10cSrcweir             {
1293cdf0e10cSrcweir                 SCSIZE nEC = aParam.GetEntryCount();
1294cdf0e10cSrcweir                 for (SCSIZE i=0; i<nEC; i++)
1295cdf0e10cSrcweir                     aParam.GetEntry(i).Clear();
1296cdf0e10cSrcweir                 nQueryPos = 0;
1297cdf0e10cSrcweir                 aParam.bInplace = sal_True;
1298cdf0e10cSrcweir                 aParam.bRegExp = sal_False;
1299cdf0e10cSrcweir             }
1300cdf0e10cSrcweir 
1301cdf0e10cSrcweir             if ( nQueryPos < MAXQUERY || SC_AUTOFILTER_ALL == nSel )    // loeschen geht immer
1302cdf0e10cSrcweir             {
1303cdf0e10cSrcweir                 if (nSel)
1304cdf0e10cSrcweir                 {
1305cdf0e10cSrcweir                     ScQueryEntry& rNewEntry = aParam.GetEntry(nQueryPos);
1306cdf0e10cSrcweir 
1307cdf0e10cSrcweir                     rNewEntry.bDoQuery       = sal_True;
1308cdf0e10cSrcweir                     rNewEntry.bQueryByString = sal_True;
1309cdf0e10cSrcweir                     rNewEntry.nField         = nCol;
1310cdf0e10cSrcweir                     rNewEntry.bQueryByDate   = bCheckForDates;
1311cdf0e10cSrcweir                     if ( nSel == SC_AUTOFILTER_TOP10 )
1312cdf0e10cSrcweir                     {
1313cdf0e10cSrcweir                         rNewEntry.eOp   = SC_TOPVAL;
1314cdf0e10cSrcweir                         *rNewEntry.pStr = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("10"));
1315cdf0e10cSrcweir                     }
1316*840d0e68SArrigo Marchiori                     else if ( nSel == SC_AUTOFILTER_EMPTY) {
1317*840d0e68SArrigo Marchiori                         rNewEntry.pStr->Erase();
1318*840d0e68SArrigo Marchiori                         rNewEntry.bQueryByString = sal_False;
1319*840d0e68SArrigo Marchiori                         rNewEntry.eOp   = SC_EQUAL;
1320*840d0e68SArrigo Marchiori                         rNewEntry.nVal  = SC_EMPTYFIELDS;
1321*840d0e68SArrigo Marchiori                     }
1322*840d0e68SArrigo Marchiori                     else if (nSel == SC_AUTOFILTER_NOTEMPTY)
1323*840d0e68SArrigo Marchiori                     {
1324*840d0e68SArrigo Marchiori                         rNewEntry.pStr->Erase();
1325*840d0e68SArrigo Marchiori                         rNewEntry.bQueryByString = sal_False;
1326*840d0e68SArrigo Marchiori                         rNewEntry.eOp   = SC_EQUAL;
1327*840d0e68SArrigo Marchiori                         rNewEntry.nVal  = SC_NONEMPTYFIELDS;
1328*840d0e68SArrigo Marchiori                     }
1329cdf0e10cSrcweir                     else
1330cdf0e10cSrcweir                     {
1331cdf0e10cSrcweir                         rNewEntry.eOp   = SC_EQUAL;
1332cdf0e10cSrcweir                         *rNewEntry.pStr = aValue;
1333cdf0e10cSrcweir                     }
1334cdf0e10cSrcweir                     if (nQueryPos > 0)
1335cdf0e10cSrcweir                         rNewEntry.eConnect   = SC_AND;
1336cdf0e10cSrcweir                 }
1337cdf0e10cSrcweir                 else
1338cdf0e10cSrcweir                 {
1339cdf0e10cSrcweir                     if (bFound)
1340cdf0e10cSrcweir                         aParam.DeleteQuery(nQueryPos);
1341cdf0e10cSrcweir                 }
1342cdf0e10cSrcweir 
1343cdf0e10cSrcweir                 //  #100597# end edit mode - like in ScCellShell::ExecuteDB
1344cdf0e10cSrcweir                 if ( pViewData->HasEditView( pViewData->GetActivePart() ) )
1345cdf0e10cSrcweir                 {
1346cdf0e10cSrcweir                     SC_MOD()->InputEnterHandler();
1347cdf0e10cSrcweir                     pViewData->GetViewShell()->UpdateInputHandler();
1348cdf0e10cSrcweir                 }
1349cdf0e10cSrcweir 
1350cdf0e10cSrcweir                 pViewData->GetView()->Query( aParam, NULL, sal_True );
1351cdf0e10cSrcweir                 pDBData->SetQueryParam( aParam );                           // speichern
1352cdf0e10cSrcweir             }
1353cdf0e10cSrcweir             else                    //  "Zuviele Bedingungen"
1354cdf0e10cSrcweir                 pViewData->GetView()->ErrorMessage( STR_FILTER_TOOMANY );
1355cdf0e10cSrcweir         }
1356cdf0e10cSrcweir     }
1357cdf0e10cSrcweir     else
1358cdf0e10cSrcweir     {
1359cdf0e10cSrcweir         DBG_ERROR("Wo ist der Datenbankbereich?");
1360cdf0e10cSrcweir     }
1361cdf0e10cSrcweir }
1362cdf0e10cSrcweir 
SetPointer(const Pointer & rPointer)1363cdf0e10cSrcweir void ScGridWindow::SetPointer( const Pointer& rPointer )
1364cdf0e10cSrcweir {
1365cdf0e10cSrcweir     nCurrentPointer = 0;
1366cdf0e10cSrcweir     Window::SetPointer( rPointer );
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir 
MoveMouseStatus(ScGridWindow & rDestWin)1369cdf0e10cSrcweir void ScGridWindow::MoveMouseStatus( ScGridWindow& rDestWin )
1370cdf0e10cSrcweir {
1371cdf0e10cSrcweir     if (nButtonDown)
1372cdf0e10cSrcweir     {
1373cdf0e10cSrcweir         rDestWin.nButtonDown = nButtonDown;
1374cdf0e10cSrcweir         rDestWin.nMouseStatus = nMouseStatus;
1375cdf0e10cSrcweir     }
1376cdf0e10cSrcweir 
1377cdf0e10cSrcweir     if (bRFMouse)
1378cdf0e10cSrcweir     {
1379cdf0e10cSrcweir         rDestWin.bRFMouse = bRFMouse;
1380cdf0e10cSrcweir         rDestWin.bRFSize  = bRFSize;
1381cdf0e10cSrcweir         rDestWin.nRFIndex = nRFIndex;
1382cdf0e10cSrcweir         rDestWin.nRFAddX  = nRFAddX;
1383cdf0e10cSrcweir         rDestWin.nRFAddY  = nRFAddY;
1384cdf0e10cSrcweir         bRFMouse = sal_False;
1385cdf0e10cSrcweir     }
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir     if (nPagebreakMouse)
1388cdf0e10cSrcweir     {
1389cdf0e10cSrcweir         rDestWin.nPagebreakMouse  = nPagebreakMouse;
1390cdf0e10cSrcweir         rDestWin.nPagebreakBreak  = nPagebreakBreak;
1391cdf0e10cSrcweir         rDestWin.nPagebreakPrev   = nPagebreakPrev;
1392cdf0e10cSrcweir         rDestWin.aPagebreakSource = aPagebreakSource;
1393cdf0e10cSrcweir         rDestWin.aPagebreakDrag   = aPagebreakDrag;
1394cdf0e10cSrcweir         nPagebreakMouse = SC_PD_NONE;
1395cdf0e10cSrcweir     }
1396cdf0e10cSrcweir }
1397cdf0e10cSrcweir 
TestMouse(const MouseEvent & rMEvt,sal_Bool bAction)1398cdf0e10cSrcweir sal_Bool ScGridWindow::TestMouse( const MouseEvent& rMEvt, sal_Bool bAction )
1399cdf0e10cSrcweir {
1400cdf0e10cSrcweir     //  MouseEvent buttons must only be checked if bAction==TRUE
1401cdf0e10cSrcweir     //  to allow changing the mouse pointer in MouseMove,
1402cdf0e10cSrcweir     //  but not start AutoFill with right button (#74229#).
1403cdf0e10cSrcweir     //  with bAction==sal_True, SetFillMode / SetDragMode is called
1404cdf0e10cSrcweir 
1405cdf0e10cSrcweir     if ( bAction && !rMEvt.IsLeft() )
1406cdf0e10cSrcweir         return sal_False;
1407cdf0e10cSrcweir 
1408cdf0e10cSrcweir     sal_Bool bNewPointer = sal_False;
1409cdf0e10cSrcweir 
1410cdf0e10cSrcweir     SfxInPlaceClient* pClient = pViewData->GetViewShell()->GetIPClient();
1411cdf0e10cSrcweir     sal_Bool bOleActive = ( pClient && pClient->IsObjectInPlaceActive() );
1412cdf0e10cSrcweir 
1413cdf0e10cSrcweir     if ( pViewData->IsActive() && !bOleActive )
1414cdf0e10cSrcweir     {
1415cdf0e10cSrcweir         ScDocument* pDoc = pViewData->GetDocument();
1416cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
1417cdf0e10cSrcweir         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
1418cdf0e10cSrcweir 
1419cdf0e10cSrcweir         //  Auto-Fill
1420cdf0e10cSrcweir 
1421cdf0e10cSrcweir         ScRange aMarkRange;
1422cdf0e10cSrcweir         if (pViewData->GetSimpleArea( aMarkRange ) == SC_MARK_SIMPLE)
1423cdf0e10cSrcweir         {
1424cdf0e10cSrcweir             if (aMarkRange.aStart.Tab() == pViewData->GetTabNo() && mpAutoFillRect)
1425cdf0e10cSrcweir             {
1426cdf0e10cSrcweir                 Point aMousePos = rMEvt.GetPosPixel();
1427cdf0e10cSrcweir                 if (mpAutoFillRect->IsInside(aMousePos))
1428cdf0e10cSrcweir                 {
1429cdf0e10cSrcweir                     SetPointer( Pointer( POINTER_CROSS ) );     //! dickeres Kreuz ?
1430cdf0e10cSrcweir                     if (bAction)
1431cdf0e10cSrcweir                     {
1432cdf0e10cSrcweir                         SCCOL nX = aMarkRange.aEnd.Col();
1433cdf0e10cSrcweir                         SCROW nY = aMarkRange.aEnd.Row();
1434cdf0e10cSrcweir 
1435cdf0e10cSrcweir                         if ( lcl_IsEditableMatrix( pViewData->GetDocument(), aMarkRange ) )
1436cdf0e10cSrcweir                             pViewData->SetDragMode(
1437cdf0e10cSrcweir                                 aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), nX, nY, SC_FILL_MATRIX );
1438cdf0e10cSrcweir                         else
1439cdf0e10cSrcweir                             pViewData->SetFillMode(
1440cdf0e10cSrcweir                                 aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), nX, nY );
1441cdf0e10cSrcweir 
1442cdf0e10cSrcweir                         //  #108266# The simple selection must also be recognized when dragging,
1443cdf0e10cSrcweir                         //  where the Marking flag is set and MarkToSimple won't work anymore.
1444cdf0e10cSrcweir                         pViewData->GetMarkData().MarkToSimple();
1445cdf0e10cSrcweir                     }
1446cdf0e10cSrcweir                     bNewPointer = sal_True;
1447cdf0e10cSrcweir                 }
1448cdf0e10cSrcweir             }
1449cdf0e10cSrcweir         }
1450cdf0e10cSrcweir 
1451cdf0e10cSrcweir         //  Embedded-Rechteck
1452cdf0e10cSrcweir 
1453cdf0e10cSrcweir         if (pDoc->IsEmbedded())
1454cdf0e10cSrcweir         {
1455cdf0e10cSrcweir             ScRange aRange;
1456cdf0e10cSrcweir             pDoc->GetEmbedded( aRange );
1457cdf0e10cSrcweir             if ( pViewData->GetTabNo() == aRange.aStart.Tab() )
1458cdf0e10cSrcweir             {
1459cdf0e10cSrcweir                 Point aStartPos = pViewData->GetScrPos( aRange.aStart.Col(), aRange.aStart.Row(), eWhich );
1460cdf0e10cSrcweir                 Point aEndPos   = pViewData->GetScrPos( aRange.aEnd.Col()+1, aRange.aEnd.Row()+1, eWhich );
1461cdf0e10cSrcweir                 Point aMousePos = rMEvt.GetPosPixel();
1462cdf0e10cSrcweir                 if ( bLayoutRTL )
1463cdf0e10cSrcweir                 {
1464cdf0e10cSrcweir                     aStartPos.X() += 2;
1465cdf0e10cSrcweir                     aEndPos.X()   += 2;
1466cdf0e10cSrcweir                 }
1467cdf0e10cSrcweir                 sal_Bool bTop = ( aMousePos.X() >= aStartPos.X()-3 && aMousePos.X() <= aStartPos.X()+1 &&
1468cdf0e10cSrcweir                               aMousePos.Y() >= aStartPos.Y()-3 && aMousePos.Y() <= aStartPos.Y()+1 );
1469cdf0e10cSrcweir                 sal_Bool bBottom = ( aMousePos.X() >= aEndPos.X()-3 && aMousePos.X() <= aEndPos.X()+1 &&
1470cdf0e10cSrcweir                                  aMousePos.Y() >= aEndPos.Y()-3 && aMousePos.Y() <= aEndPos.Y()+1 );
1471cdf0e10cSrcweir                 if ( bTop || bBottom )
1472cdf0e10cSrcweir                 {
1473cdf0e10cSrcweir                     SetPointer( Pointer( POINTER_CROSS ) );
1474cdf0e10cSrcweir                     if (bAction)
1475cdf0e10cSrcweir                     {
1476cdf0e10cSrcweir                         sal_uInt8 nMode = bTop ? SC_FILL_EMBED_LT : SC_FILL_EMBED_RB;
1477cdf0e10cSrcweir                         pViewData->SetDragMode(
1478cdf0e10cSrcweir                                     aRange.aStart.Col(), aRange.aStart.Row(),
1479cdf0e10cSrcweir                                     aRange.aEnd.Col(), aRange.aEnd.Row(), nMode );
1480cdf0e10cSrcweir                     }
1481cdf0e10cSrcweir                     bNewPointer = sal_True;
1482cdf0e10cSrcweir                 }
1483cdf0e10cSrcweir             }
1484cdf0e10cSrcweir         }
1485cdf0e10cSrcweir     }
1486cdf0e10cSrcweir 
1487cdf0e10cSrcweir     if (!bNewPointer && bAction)
1488cdf0e10cSrcweir     {
1489cdf0e10cSrcweir //      SetPointer( POINTER_ARROW );            // in Fu...
1490cdf0e10cSrcweir         pViewData->ResetFillMode();
1491cdf0e10cSrcweir     }
1492cdf0e10cSrcweir 
1493cdf0e10cSrcweir     return bNewPointer;
1494cdf0e10cSrcweir }
1495cdf0e10cSrcweir 
MouseButtonDown(const MouseEvent & rMEvt)1496cdf0e10cSrcweir void __EXPORT ScGridWindow::MouseButtonDown( const MouseEvent& rMEvt )
1497cdf0e10cSrcweir {
1498cdf0e10cSrcweir     nNestedButtonState = SC_NESTEDBUTTON_DOWN;
1499cdf0e10cSrcweir 
1500cdf0e10cSrcweir     HandleMouseButtonDown( rMEvt );
1501cdf0e10cSrcweir 
1502cdf0e10cSrcweir     if ( nNestedButtonState == SC_NESTEDBUTTON_UP )
1503cdf0e10cSrcweir     {
1504cdf0e10cSrcweir         // #i41690# If an object is deactivated from MouseButtonDown, it might reschedule,
1505cdf0e10cSrcweir         // so MouseButtonUp comes before the MouseButtonDown call is finished. In this case,
1506cdf0e10cSrcweir         // simulate another MouseButtonUp call, so the selection state is consistent.
1507cdf0e10cSrcweir 
1508cdf0e10cSrcweir         nButtonDown = rMEvt.GetButtons();
1509cdf0e10cSrcweir         FakeButtonUp();
1510cdf0e10cSrcweir 
1511cdf0e10cSrcweir         if ( IsTracking() )
1512cdf0e10cSrcweir             EndTracking();      // normally done in VCL as part of MouseButtonUp handling
1513cdf0e10cSrcweir     }
1514cdf0e10cSrcweir     nNestedButtonState = SC_NESTEDBUTTON_NONE;
1515cdf0e10cSrcweir }
1516cdf0e10cSrcweir 
HandleMouseButtonDown(const MouseEvent & rMEvt)1517cdf0e10cSrcweir void ScGridWindow::HandleMouseButtonDown( const MouseEvent& rMEvt )
1518cdf0e10cSrcweir {
1519cdf0e10cSrcweir     // We have to check if a context menu is shown and we have an UI
1520cdf0e10cSrcweir     // active inplace client. In that case we have to ignore the event.
1521cdf0e10cSrcweir     // Otherwise we would crash (context menu has been
1522cdf0e10cSrcweir     // opened by inplace client and we would deactivate the inplace client,
15236f247e9cSmseidel     // the context menu is closed by VCL asynchronously which in the end
1524cdf0e10cSrcweir     // would work on deleted objects or the context menu has no parent anymore)
1525cdf0e10cSrcweir     // See #126086# and #128122#
1526cdf0e10cSrcweir     SfxViewShell* pViewSh = pViewData->GetViewShell();
1527cdf0e10cSrcweir     SfxInPlaceClient* pClient = pViewSh->GetIPClient();
1528cdf0e10cSrcweir     if ( pClient &&
1529cdf0e10cSrcweir          pClient->IsObjectInPlaceActive() &&
1530cdf0e10cSrcweir          PopupMenu::IsInExecute() )
1531cdf0e10cSrcweir         return;
1532cdf0e10cSrcweir 
1533cdf0e10cSrcweir     aCurMousePos = rMEvt.GetPosPixel();
1534cdf0e10cSrcweir 
1535cdf0e10cSrcweir     //  Filter-Popup beendet sich mit eigenem Mausklick, nicht erst beim Klick
1536cdf0e10cSrcweir     //  in das GridWindow, darum ist die folgende Abfrage nicht mehr noetig:
1537cdf0e10cSrcweir #if 0
1538cdf0e10cSrcweir     // merken, dass FilterBox geloescht wird, damit sichergestellt
1539cdf0e10cSrcweir     // ist, dass in diesem Handler nicht an gleicher Stelle wieder
1540cdf0e10cSrcweir     // eine neue geoeffnet wird.
1541cdf0e10cSrcweir     sal_Bool    bWasFilterBox = ( pFilterBox != NULL &&
1542cdf0e10cSrcweir                                 ((Window*)pFilterBox)->IsVisible() &&
1543cdf0e10cSrcweir                                 !pFilterBox->IsDataSelect() );
1544cdf0e10cSrcweir     SCCOL   nOldColFBox   = bWasFilterBox ? pFilterBox->GetCol() : 0;
1545cdf0e10cSrcweir     SCROW  nOldRowFBox    = bWasFilterBox ? pFilterBox->GetRow() : 0;
1546cdf0e10cSrcweir #endif
1547cdf0e10cSrcweir 
1548cdf0e10cSrcweir     ClickExtern();  // loescht FilterBox, wenn vorhanden
1549cdf0e10cSrcweir 
1550cdf0e10cSrcweir     HideNoteMarker();   // Notiz-Anzeige
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir     bEEMouse = sal_False;
1553cdf0e10cSrcweir 
1554cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
1555cdf0e10cSrcweir     if (pScMod->IsModalMode(pViewData->GetSfxDocShell()))
1556cdf0e10cSrcweir     {
1557cdf0e10cSrcweir         Sound::Beep();
1558cdf0e10cSrcweir         return;
1559cdf0e10cSrcweir     }
1560cdf0e10cSrcweir 
1561cdf0e10cSrcweir     pScActiveViewShell = pViewData->GetViewShell();         // falls auf Link geklickt wird
1562cdf0e10cSrcweir     nScClickMouseModifier = rMEvt.GetModifier();            // um Control-Klick immer zu erkennen
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir     sal_Bool bDetective = pViewData->GetViewShell()->IsAuditShell();
1565cdf0e10cSrcweir     sal_Bool bRefMode = pViewData->IsRefMode();                 // Referenz angefangen
1566cdf0e10cSrcweir     sal_Bool bFormulaMode = pScMod->IsFormulaMode();            // naechster Klick -> Referenz
1567cdf0e10cSrcweir     sal_Bool bEditMode = pViewData->HasEditView(eWhich);        // auch bei Mode==SC_INPUT_TYPE
1568cdf0e10cSrcweir     sal_Bool bDouble = (rMEvt.GetClicks() == 2);
1569cdf0e10cSrcweir 
1570cdf0e10cSrcweir     //  DeactivateIP passiert nur noch bei MarkListHasChanged
1571cdf0e10cSrcweir 
1572cdf0e10cSrcweir     //  im GrabFocus Aufruf kann eine Fehlermeldung hochkommen
1573cdf0e10cSrcweir     //  (z.B. beim Umbenennen von Tabellen per Tab-Reiter)
1574cdf0e10cSrcweir 
1575cdf0e10cSrcweir     if ( !nButtonDown || !bDouble )             // single (first) click is always valid
1576cdf0e10cSrcweir         nButtonDown = rMEvt.GetButtons();       // set nButtonDown first, so StopMarking works
1577cdf0e10cSrcweir 
1578cdf0e10cSrcweir //  pViewData->GetViewShell()->GetViewFrame()->GetWindow().GrabFocus();
1579cdf0e10cSrcweir     if ( ( bEditMode && pViewData->GetActivePart() == eWhich ) || !bFormulaMode )
1580cdf0e10cSrcweir         GrabFocus();
1581cdf0e10cSrcweir 
1582cdf0e10cSrcweir     // #i31846# need to cancel a double click if the first click has set the "ignore" state,
1583cdf0e10cSrcweir     // but a single (first) click is always valid
1584cdf0e10cSrcweir     if ( nMouseStatus == SC_GM_IGNORE && bDouble )
1585cdf0e10cSrcweir     {
1586cdf0e10cSrcweir         nButtonDown = 0;
1587cdf0e10cSrcweir         nMouseStatus = SC_GM_NONE;
1588cdf0e10cSrcweir         return;
1589cdf0e10cSrcweir     }
1590cdf0e10cSrcweir 
1591cdf0e10cSrcweir     if ( bDetective )               // Detektiv-Fuell-Modus
1592cdf0e10cSrcweir     {
1593cdf0e10cSrcweir         if ( rMEvt.IsLeft() && !rMEvt.GetModifier() )
1594cdf0e10cSrcweir         {
1595cdf0e10cSrcweir             Point   aPos = rMEvt.GetPosPixel();
1596cdf0e10cSrcweir             SCsCOL  nPosX;
1597cdf0e10cSrcweir             SCsROW  nPosY;
1598cdf0e10cSrcweir             pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
1599cdf0e10cSrcweir 
1600cdf0e10cSrcweir             SfxInt16Item aPosXItem( SID_RANGE_COL, nPosX );
1601cdf0e10cSrcweir             SfxInt32Item aPosYItem( SID_RANGE_ROW, nPosY );
1602cdf0e10cSrcweir             pViewData->GetDispatcher().Execute( SID_FILL_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
1603cdf0e10cSrcweir                                         &aPosXItem, &aPosYItem, (void*)0L );
1604cdf0e10cSrcweir 
1605cdf0e10cSrcweir         }
1606cdf0e10cSrcweir         nButtonDown = 0;
1607cdf0e10cSrcweir         nMouseStatus = SC_GM_NONE;
1608cdf0e10cSrcweir         return;
1609cdf0e10cSrcweir     }
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir     if (!bDouble)
1612cdf0e10cSrcweir         nMouseStatus = SC_GM_NONE;
1613cdf0e10cSrcweir 
1614cdf0e10cSrcweir     if (!bFormulaMode)
1615cdf0e10cSrcweir     {
1616cdf0e10cSrcweir         if ( pViewData->GetActivePart() != eWhich )
1617cdf0e10cSrcweir             pViewData->GetView()->ActivatePart( eWhich );
1618cdf0e10cSrcweir     }
1619cdf0e10cSrcweir     else
1620cdf0e10cSrcweir     {
1621cdf0e10cSrcweir         ScViewSelectionEngine* pSelEng = pViewData->GetView()->GetSelEngine();
1622cdf0e10cSrcweir         pSelEng->SetWindow(this);
1623cdf0e10cSrcweir         pSelEng->SetWhich(eWhich);
1624cdf0e10cSrcweir         pSelEng->SetVisibleArea( Rectangle(Point(), GetOutputSizePixel()) );
1625cdf0e10cSrcweir     }
1626cdf0e10cSrcweir 
1627cdf0e10cSrcweir     if (bEditMode && (pViewData->GetRefTabNo() == pViewData->GetTabNo()))
1628cdf0e10cSrcweir     {
1629cdf0e10cSrcweir         Point   aPos = rMEvt.GetPosPixel();
1630cdf0e10cSrcweir         SCsCOL  nPosX;
1631cdf0e10cSrcweir         SCsROW  nPosY;
1632cdf0e10cSrcweir         pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
1633cdf0e10cSrcweir 
1634cdf0e10cSrcweir         EditView*   pEditView;
1635cdf0e10cSrcweir         SCCOL       nEditCol;
1636cdf0e10cSrcweir         SCROW       nEditRow;
1637cdf0e10cSrcweir         pViewData->GetEditView( eWhich, pEditView, nEditCol, nEditRow );
1638cdf0e10cSrcweir         SCCOL nEndCol = pViewData->GetEditEndCol();
1639cdf0e10cSrcweir         SCROW nEndRow = pViewData->GetEditEndRow();
1640cdf0e10cSrcweir 
1641cdf0e10cSrcweir         if ( nPosX >= (SCsCOL) nEditCol && nPosX <= (SCsCOL) nEndCol &&
1642cdf0e10cSrcweir              nPosY >= (SCsROW) nEditRow && nPosY <= (SCsROW) nEndRow )
1643cdf0e10cSrcweir         {
1644cdf0e10cSrcweir             //  #53966# beim Klick in die Tabellen-EditView immer den Focus umsetzen
1645cdf0e10cSrcweir             if (bFormulaMode)   // sonst ist es oben schon passiert
1646cdf0e10cSrcweir                 GrabFocus();
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir             pScMod->SetInputMode( SC_INPUT_TABLE );
1649cdf0e10cSrcweir             bEEMouse = sal_True;
1650cdf0e10cSrcweir             bEditMode = pEditView->MouseButtonDown( rMEvt );
1651cdf0e10cSrcweir             return;
1652cdf0e10cSrcweir         }
1653cdf0e10cSrcweir     }
1654cdf0e10cSrcweir 
1655cdf0e10cSrcweir     if (pScMod->GetIsWaterCan())
1656cdf0e10cSrcweir     {
1657cdf0e10cSrcweir         //!     was is mit'm Mac ???
1658cdf0e10cSrcweir         if ( rMEvt.GetModifier() + rMEvt.GetButtons() == MOUSE_RIGHT )
1659cdf0e10cSrcweir         {
1660cdf0e10cSrcweir             nMouseStatus = SC_GM_WATERUNDO;
1661cdf0e10cSrcweir             return;
1662cdf0e10cSrcweir         }
1663cdf0e10cSrcweir     }
1664cdf0e10cSrcweir 
1665cdf0e10cSrcweir     // Reihenfolge passend zum angezeigten Cursor:
1666cdf0e10cSrcweir     //  RangeFinder, AutoFill, PageBreak, Drawing
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir     if ( HitRangeFinder( rMEvt.GetPosPixel(), bRFSize, &nRFIndex, &nRFAddX, &nRFAddY ) )
1669cdf0e10cSrcweir     {
1670cdf0e10cSrcweir         bRFMouse = sal_True;        // die anderen Variablen sind oben initialisiert
1671cdf0e10cSrcweir 
1672cdf0e10cSrcweir         if ( pViewData->GetActivePart() != eWhich )
1673cdf0e10cSrcweir             pViewData->GetView()->ActivatePart( eWhich );   //! schon oben immer ???
1674cdf0e10cSrcweir 
1675cdf0e10cSrcweir         // CaptureMouse();
1676cdf0e10cSrcweir         StartTracking();
1677cdf0e10cSrcweir         return;
1678cdf0e10cSrcweir     }
1679cdf0e10cSrcweir 
1680cdf0e10cSrcweir     sal_Bool bCrossPointer = TestMouse( rMEvt, sal_True );
1681cdf0e10cSrcweir     if ( bCrossPointer )
1682cdf0e10cSrcweir     {
1683cdf0e10cSrcweir         if ( bDouble )
1684cdf0e10cSrcweir             pViewData->GetView()->FillCrossDblClick();
1685cdf0e10cSrcweir         else
1686cdf0e10cSrcweir         pScMod->InputEnterHandler();                                // Autofill etc.
1687cdf0e10cSrcweir     }
1688cdf0e10cSrcweir 
1689cdf0e10cSrcweir     if ( !bCrossPointer )
1690cdf0e10cSrcweir     {
1691cdf0e10cSrcweir         nPagebreakMouse = HitPageBreak( rMEvt.GetPosPixel(), &aPagebreakSource,
1692cdf0e10cSrcweir                                             &nPagebreakBreak, &nPagebreakPrev );
1693cdf0e10cSrcweir         if (nPagebreakMouse)
1694cdf0e10cSrcweir         {
1695cdf0e10cSrcweir             bPagebreakDrawn = sal_False;
1696cdf0e10cSrcweir             // CaptureMouse();
1697cdf0e10cSrcweir             StartTracking();
1698cdf0e10cSrcweir             PagebreakMove( rMEvt, sal_False );
1699cdf0e10cSrcweir             return;
1700cdf0e10cSrcweir         }
1701cdf0e10cSrcweir     }
1702cdf0e10cSrcweir 
1703cdf0e10cSrcweir     if (!bFormulaMode && !bEditMode && rMEvt.IsLeft())
1704cdf0e10cSrcweir     {
1705cdf0e10cSrcweir         if ( !bCrossPointer && DrawMouseButtonDown(rMEvt) )
1706cdf0e10cSrcweir         {
1707cdf0e10cSrcweir             //if (DrawHasMarkedObj())
1708cdf0e10cSrcweir             //  pViewData->GetViewShell()->SetDrawShellOrSub();     // Draw-Objekt selektiert
1709cdf0e10cSrcweir             return;
1710cdf0e10cSrcweir         }
1711cdf0e10cSrcweir 
1712cdf0e10cSrcweir         pViewData->GetViewShell()->SetDrawShell( sal_False );               // kein Draw-Objekt selektiert
1713cdf0e10cSrcweir 
1714cdf0e10cSrcweir         //  TestMouse schon oben passiert
1715cdf0e10cSrcweir     }
1716cdf0e10cSrcweir 
1717cdf0e10cSrcweir     Point aPos = rMEvt.GetPosPixel();
1718cdf0e10cSrcweir     SCsCOL nPosX;
1719cdf0e10cSrcweir     SCsROW nPosY;
1720cdf0e10cSrcweir     pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
1721cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
1722cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
1723cdf0e10cSrcweir 
1724cdf0e10cSrcweir 
1725cdf0e10cSrcweir             //
1726cdf0e10cSrcweir             //      AutoFilter buttons
1727cdf0e10cSrcweir             //
1728cdf0e10cSrcweir 
1729cdf0e10cSrcweir     if ( !bDouble && !bFormulaMode && rMEvt.IsLeft() )
1730cdf0e10cSrcweir     {
173151b45b88SJian Fang Zhang         SCsCOL nRealPosX;
173251b45b88SJian Fang Zhang         SCsROW nRealPosY;
173351b45b88SJian Fang Zhang         pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nRealPosX, nRealPosY, false );//the real row/col
173451b45b88SJian Fang Zhang         ScMergeFlagAttr* pRealPosAttr = (ScMergeFlagAttr*)
173551b45b88SJian Fang Zhang                                     pDoc->GetAttr( nRealPosX, nRealPosY, nTab, ATTR_MERGE_FLAG );
1736cdf0e10cSrcweir         ScMergeFlagAttr* pAttr = (ScMergeFlagAttr*)
1737cdf0e10cSrcweir                                     pDoc->GetAttr( nPosX, nPosY, nTab, ATTR_MERGE_FLAG );
173851b45b88SJian Fang Zhang         if( pRealPosAttr->HasAutoFilter() )
173951b45b88SJian Fang Zhang         {
174051b45b88SJian Fang Zhang             SC_MOD()->InputEnterHandler();
174151b45b88SJian Fang Zhang             if (DoAutoFilterButton( nRealPosX, nRealPosY, rMEvt))
174251b45b88SJian Fang Zhang                 return;
174351b45b88SJian Fang Zhang         }
1744cdf0e10cSrcweir         if( pAttr->HasAutoFilter() )
1745cdf0e10cSrcweir         {
1746cdf0e10cSrcweir             SC_MOD()->InputEnterHandler();  //Add for i85305
1747cdf0e10cSrcweir             if (DoAutoFilterButton( nPosX, nPosY, rMEvt))
1748cdf0e10cSrcweir                 return;
1749cdf0e10cSrcweir         }
1750cdf0e10cSrcweir         if (pAttr->HasButton())
1751cdf0e10cSrcweir         {
1752cdf0e10cSrcweir             DoPushButton( nPosX, nPosY, rMEvt );    // setzt evtl. bPivotMouse / bDPMouse
1753cdf0e10cSrcweir             return;
1754cdf0e10cSrcweir         }
1755cdf0e10cSrcweir 
1756cdf0e10cSrcweir         //  List Validity drop-down button
1757cdf0e10cSrcweir 
1758cdf0e10cSrcweir         if ( bListValButton )
1759cdf0e10cSrcweir         {
1760cdf0e10cSrcweir             Rectangle aButtonRect = GetListValButtonRect( aListValPos );
1761cdf0e10cSrcweir             if ( aButtonRect.IsInside( aPos ) )
1762cdf0e10cSrcweir             {
1763cdf0e10cSrcweir                 DoAutoFilterMenue( aListValPos.Col(), aListValPos.Row(), sal_True );
1764cdf0e10cSrcweir 
1765cdf0e10cSrcweir                 nMouseStatus = SC_GM_FILTER;    // not set in DoAutoFilterMenue for bDataSelect
1766cdf0e10cSrcweir                 CaptureMouse();
1767cdf0e10cSrcweir                 return;
1768cdf0e10cSrcweir             }
1769cdf0e10cSrcweir         }
1770cdf0e10cSrcweir     }
1771cdf0e10cSrcweir 
1772cdf0e10cSrcweir             //
1773cdf0e10cSrcweir             //      scenario selection
1774cdf0e10cSrcweir             //
1775cdf0e10cSrcweir 
1776cdf0e10cSrcweir     ScRange aScenRange;
1777cdf0e10cSrcweir     if ( rMEvt.IsLeft() && HasScenarioButton( aPos, aScenRange ) )
1778cdf0e10cSrcweir     {
1779cdf0e10cSrcweir         DoScenarioMenue( aScenRange );
1780cdf0e10cSrcweir         return;
1781cdf0e10cSrcweir     }
1782cdf0e10cSrcweir 
1783cdf0e10cSrcweir             //
1784cdf0e10cSrcweir             //      Doppelklick angefangen ?
1785cdf0e10cSrcweir             //
1786cdf0e10cSrcweir 
1787cdf0e10cSrcweir     // StopMarking kann aus DrawMouseButtonDown gerufen werden
1788cdf0e10cSrcweir 
1789cdf0e10cSrcweir     if ( nMouseStatus != SC_GM_IGNORE && !bRefMode )
1790cdf0e10cSrcweir     {
1791cdf0e10cSrcweir         if ( bDouble && !bCrossPointer )
1792cdf0e10cSrcweir         {
1793cdf0e10cSrcweir             if (nMouseStatus == SC_GM_TABDOWN)
1794cdf0e10cSrcweir                 nMouseStatus = SC_GM_DBLDOWN;
1795cdf0e10cSrcweir         }
1796cdf0e10cSrcweir         else
1797cdf0e10cSrcweir             nMouseStatus = SC_GM_TABDOWN;
1798cdf0e10cSrcweir     }
1799cdf0e10cSrcweir 
1800cdf0e10cSrcweir             //
1801cdf0e10cSrcweir             //      Links in Edit-Zellen
1802cdf0e10cSrcweir             //
1803cdf0e10cSrcweir 
1804cdf0e10cSrcweir     sal_Bool bAlt = rMEvt.IsMod2();
1805cdf0e10cSrcweir     if ( !bAlt && rMEvt.IsLeft() &&
1806cdf0e10cSrcweir             GetEditUrl(rMEvt.GetPosPixel()) )           // Klick auf Link: Cursor nicht bewegen
1807cdf0e10cSrcweir     {
1808cdf0e10cSrcweir         SetPointer( Pointer( POINTER_REFHAND ) );
1809cdf0e10cSrcweir         nMouseStatus = SC_GM_URLDOWN;                   // auch nur dann beim ButtonUp ausfuehren
1810cdf0e10cSrcweir         return;
1811cdf0e10cSrcweir     }
1812cdf0e10cSrcweir 
1813cdf0e10cSrcweir             //
1814cdf0e10cSrcweir             //      Gridwin - SelectionEngine
1815cdf0e10cSrcweir             //
1816cdf0e10cSrcweir 
1817cdf0e10cSrcweir     if ( rMEvt.IsLeft() )
1818cdf0e10cSrcweir     {
1819cdf0e10cSrcweir         ScViewSelectionEngine* pSelEng = pViewData->GetView()->GetSelEngine();
1820cdf0e10cSrcweir         pSelEng->SetWindow(this);
1821cdf0e10cSrcweir         pSelEng->SetWhich(eWhich);
1822cdf0e10cSrcweir         pSelEng->SetVisibleArea( Rectangle(Point(), GetOutputSizePixel()) );
1823cdf0e10cSrcweir 
1824cdf0e10cSrcweir         //  SelMouseButtonDown an der View setzt noch das bMoveIsShift Flag
1825cdf0e10cSrcweir         if ( pViewData->GetView()->SelMouseButtonDown( rMEvt ) )
1826cdf0e10cSrcweir         {
1827cdf0e10cSrcweir             if (IsMouseCaptured())
1828cdf0e10cSrcweir             {
1829cdf0e10cSrcweir                 //  Tracking statt CaptureMouse, damit sauber abgebrochen werden kann
1830cdf0e10cSrcweir                 //! Irgendwann sollte die SelectionEngine selber StartTracking rufen!?!
1831cdf0e10cSrcweir                 ReleaseMouse();
1832cdf0e10cSrcweir                 StartTracking();
1833cdf0e10cSrcweir             }
1834cdf0e10cSrcweir             pViewData->GetMarkData().SetMarking(sal_True);
1835cdf0e10cSrcweir             return;
1836cdf0e10cSrcweir         }
1837cdf0e10cSrcweir     }
1838cdf0e10cSrcweir }
1839cdf0e10cSrcweir 
MouseButtonUp(const MouseEvent & rMEvt)1840cdf0e10cSrcweir void __EXPORT ScGridWindow::MouseButtonUp( const MouseEvent& rMEvt )
1841cdf0e10cSrcweir {
1842cdf0e10cSrcweir     aCurMousePos = rMEvt.GetPosPixel();
1843cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
1844cdf0e10cSrcweir     ScMarkData& rMark = pViewData->GetMarkData();
1845cdf0e10cSrcweir 
1846cdf0e10cSrcweir     // #i41690# detect a MouseButtonUp call from within MouseButtonDown
1847cdf0e10cSrcweir     // (possible through Reschedule from storing an OLE object that is deselected)
1848cdf0e10cSrcweir 
1849cdf0e10cSrcweir     if ( nNestedButtonState == SC_NESTEDBUTTON_DOWN )
1850cdf0e10cSrcweir         nNestedButtonState = SC_NESTEDBUTTON_UP;
1851cdf0e10cSrcweir 
1852cdf0e10cSrcweir     if (nButtonDown != rMEvt.GetButtons())
1853cdf0e10cSrcweir         nMouseStatus = SC_GM_IGNORE;            // reset und return
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir     nButtonDown = 0;
1856cdf0e10cSrcweir 
1857cdf0e10cSrcweir     if (nMouseStatus == SC_GM_IGNORE)
1858cdf0e10cSrcweir     {
1859cdf0e10cSrcweir         nMouseStatus = SC_GM_NONE;
1860cdf0e10cSrcweir                                         // Selection-Engine: Markieren abbrechen
1861cdf0e10cSrcweir         pViewData->GetView()->GetSelEngine()->Reset();
1862cdf0e10cSrcweir         rMark.SetMarking(sal_False);
1863cdf0e10cSrcweir         if (pViewData->IsAnyFillMode())
1864cdf0e10cSrcweir         {
1865cdf0e10cSrcweir             pViewData->GetView()->StopRefMode();
1866cdf0e10cSrcweir             pViewData->ResetFillMode();
1867cdf0e10cSrcweir         }
1868cdf0e10cSrcweir         StopMarking();
1869cdf0e10cSrcweir         DrawEndAction();                // Markieren/Verschieben auf Drawing-Layer abbrechen
1870cdf0e10cSrcweir         ReleaseMouse();
1871cdf0e10cSrcweir         return;
1872cdf0e10cSrcweir     }
1873cdf0e10cSrcweir 
1874cdf0e10cSrcweir     if (nMouseStatus == SC_GM_FILTER)
1875cdf0e10cSrcweir     {
1876cdf0e10cSrcweir         if ( pFilterBox && pFilterBox->GetMode() == SC_FILTERBOX_FILTER )
1877cdf0e10cSrcweir         {
1878cdf0e10cSrcweir             if (mpFilterButton.get())
1879cdf0e10cSrcweir             {
1880cdf0e10cSrcweir                 bool bFilterActive = IsAutoFilterActive(
1881cdf0e10cSrcweir                     pFilterBox->GetCol(), pFilterBox->GetRow(), pViewData->GetTabNo() );
1882cdf0e10cSrcweir 
1883cdf0e10cSrcweir                 mpFilterButton->setHasHiddenMember(bFilterActive);
1884cdf0e10cSrcweir                 mpFilterButton->setPopupPressed(false);
1885cdf0e10cSrcweir                 HideCursor();
1886cdf0e10cSrcweir                 mpFilterButton->draw();
1887cdf0e10cSrcweir                 ShowCursor();
1888cdf0e10cSrcweir             }
1889cdf0e10cSrcweir         }
1890cdf0e10cSrcweir         nMouseStatus = SC_GM_NONE;
1891cdf0e10cSrcweir         ReleaseMouse();
1892cdf0e10cSrcweir         return;                         // da muss nix mehr passieren
1893cdf0e10cSrcweir     }
1894cdf0e10cSrcweir 
1895cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
1896cdf0e10cSrcweir     if (pScMod->IsModalMode(pViewData->GetSfxDocShell()))
1897cdf0e10cSrcweir         return;
1898cdf0e10cSrcweir 
1899cdf0e10cSrcweir     SfxBindings& rBindings = pViewData->GetBindings();
1900cdf0e10cSrcweir     if (bEEMouse && pViewData->HasEditView( eWhich ))
1901cdf0e10cSrcweir     {
1902cdf0e10cSrcweir         EditView*   pEditView;
1903cdf0e10cSrcweir         SCCOL       nEditCol;
1904cdf0e10cSrcweir         SCROW       nEditRow;
1905cdf0e10cSrcweir         pViewData->GetEditView( eWhich, pEditView, nEditCol, nEditRow );
1906cdf0e10cSrcweir         pEditView->MouseButtonUp( rMEvt );
1907cdf0e10cSrcweir 
1908cdf0e10cSrcweir         if ( rMEvt.IsMiddle() &&
1909cdf0e10cSrcweir                 GetSettings().GetMouseSettings().GetMiddleButtonAction() == MOUSE_MIDDLE_PASTESELECTION )
1910cdf0e10cSrcweir         {
1911cdf0e10cSrcweir             //  EditView may have pasted from selection
1912cdf0e10cSrcweir             pScMod->InputChanged( pEditView );
1913cdf0e10cSrcweir         }
1914cdf0e10cSrcweir         else
1915cdf0e10cSrcweir             pScMod->InputSelection( pEditView );            // parentheses etc.
1916cdf0e10cSrcweir 
1917cdf0e10cSrcweir         pViewData->GetView()->InvalidateAttribs();
1918cdf0e10cSrcweir         rBindings.Invalidate( SID_HYPERLINK_GETLINK );
1919cdf0e10cSrcweir         bEEMouse = sal_False;
1920cdf0e10cSrcweir         return;
1921cdf0e10cSrcweir     }
1922cdf0e10cSrcweir 
1923cdf0e10cSrcweir     if (bDPMouse)
1924cdf0e10cSrcweir     {
1925cdf0e10cSrcweir         DPMouseButtonUp( rMEvt );       // resets bDPMouse
1926cdf0e10cSrcweir         return;
1927cdf0e10cSrcweir     }
1928cdf0e10cSrcweir 
1929cdf0e10cSrcweir     if (bRFMouse)
1930cdf0e10cSrcweir     {
1931cdf0e10cSrcweir         RFMouseMove( rMEvt, sal_True );     // Range wieder richtigherum
1932cdf0e10cSrcweir         bRFMouse = sal_False;
1933cdf0e10cSrcweir         SetPointer( Pointer( POINTER_ARROW ) );
1934cdf0e10cSrcweir         ReleaseMouse();
1935cdf0e10cSrcweir         return;
1936cdf0e10cSrcweir     }
1937cdf0e10cSrcweir 
1938cdf0e10cSrcweir     if (nPagebreakMouse)
1939cdf0e10cSrcweir     {
1940cdf0e10cSrcweir         PagebreakMove( rMEvt, sal_True );
1941cdf0e10cSrcweir         nPagebreakMouse = SC_PD_NONE;
1942cdf0e10cSrcweir         SetPointer( Pointer( POINTER_ARROW ) );
1943cdf0e10cSrcweir         ReleaseMouse();
1944cdf0e10cSrcweir         return;
1945cdf0e10cSrcweir     }
1946cdf0e10cSrcweir 
1947cdf0e10cSrcweir     if (nMouseStatus == SC_GM_WATERUNDO)    // Undo im Giesskannenmodus
1948cdf0e10cSrcweir     {
1949cdf0e10cSrcweir         ::svl::IUndoManager* pMgr = pViewData->GetDocShell()->GetUndoManager();
1950cdf0e10cSrcweir         if ( pMgr->GetUndoActionCount() && pMgr->GetUndoActionId() == STR_UNDO_APPLYCELLSTYLE )
1951cdf0e10cSrcweir             pMgr->Undo();
1952cdf0e10cSrcweir         else
1953cdf0e10cSrcweir             Sound::Beep();
1954cdf0e10cSrcweir         return;
1955cdf0e10cSrcweir     }
1956cdf0e10cSrcweir 
1957cdf0e10cSrcweir     if (DrawMouseButtonUp(rMEvt))       // includes format paint brush handling for drawing objects
1958ee093554SAndre Fischer     {
1959ee093554SAndre Fischer         ScTabViewShell* pViewShell = pViewData->GetViewShell();
1960ee093554SAndre Fischer         SfxBindings& rBindings=pViewShell->GetViewFrame()->GetBindings();
1961ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_WIDTH);
1962ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_HEIGHT);
1963ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_X);
1964ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_Y);
1965ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_ANGLE);
1966ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_ROT_X);
1967ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_ROT_Y);
1968ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_AUTOWIDTH);
1969ee093554SAndre Fischer         rBindings.Invalidate(SID_ATTR_TRANSFORM_AUTOHEIGHT);
1970cdf0e10cSrcweir         return;
1971ee093554SAndre Fischer     }
1972cdf0e10cSrcweir 
1973cdf0e10cSrcweir     rMark.SetMarking(sal_False);
1974cdf0e10cSrcweir 
1975cdf0e10cSrcweir     SetPointer( Pointer( POINTER_ARROW ) );
1976cdf0e10cSrcweir 
1977cdf0e10cSrcweir     if (pViewData->IsFillMode() ||
1978cdf0e10cSrcweir         ( pViewData->GetFillMode() == SC_FILL_MATRIX && rMEvt.IsMod1() ))
1979cdf0e10cSrcweir     {
1980cdf0e10cSrcweir         nScFillModeMouseModifier = rMEvt.GetModifier();
1981cdf0e10cSrcweir         SCCOL nStartCol;
1982cdf0e10cSrcweir         SCROW nStartRow;
1983cdf0e10cSrcweir         SCCOL nEndCol;
1984cdf0e10cSrcweir         SCROW nEndRow;
1985cdf0e10cSrcweir         pViewData->GetFillData( nStartCol, nStartRow, nEndCol, nEndRow );
1986cdf0e10cSrcweir //      DBG_ASSERT( nStartCol==pViewData->GetRefStartX() && nStartRow==pViewData->GetRefStartY(),
1987cdf0e10cSrcweir //                              "Block falsch fuer AutoFill" );
1988cdf0e10cSrcweir         ScRange aDelRange;
1989cdf0e10cSrcweir         sal_Bool bIsDel = pViewData->GetDelMark( aDelRange );
1990cdf0e10cSrcweir 
1991cdf0e10cSrcweir         ScViewFunc* pView = pViewData->GetView();
1992cdf0e10cSrcweir         pView->StopRefMode();
1993cdf0e10cSrcweir         pViewData->ResetFillMode();
1994cdf0e10cSrcweir         pView->GetFunctionSet()->SetAnchorFlag( sal_False );    // #i5819# don't use AutoFill anchor flag for selection
1995cdf0e10cSrcweir 
1996cdf0e10cSrcweir         if ( bIsDel )
1997cdf0e10cSrcweir         {
1998cdf0e10cSrcweir             pView->MarkRange( aDelRange, sal_False );
1999cdf0e10cSrcweir             pView->DeleteContents( IDF_CONTENTS );
2000cdf0e10cSrcweir             SCTAB nTab = pViewData->GetTabNo();
2001cdf0e10cSrcweir             ScRange aBlockRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab );
2002cdf0e10cSrcweir             if ( aBlockRange != aDelRange )
2003cdf0e10cSrcweir             {
2004cdf0e10cSrcweir                 if ( aDelRange.aStart.Row() == nStartRow )
2005cdf0e10cSrcweir                     aBlockRange.aEnd.SetCol( aDelRange.aStart.Col() - 1 );
2006cdf0e10cSrcweir                 else
2007cdf0e10cSrcweir                     aBlockRange.aEnd.SetRow( aDelRange.aStart.Row() - 1 );
2008cdf0e10cSrcweir                 pView->MarkRange( aBlockRange, sal_False );
2009cdf0e10cSrcweir             }
2010cdf0e10cSrcweir         }
2011cdf0e10cSrcweir         else
2012cdf0e10cSrcweir             pViewData->GetDispatcher().Execute( FID_FILL_AUTO, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD );
2013cdf0e10cSrcweir     }
2014cdf0e10cSrcweir     else if (pViewData->GetFillMode() == SC_FILL_MATRIX)
2015cdf0e10cSrcweir     {
2016cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
2017cdf0e10cSrcweir         SCCOL nStartCol;
2018cdf0e10cSrcweir         SCROW nStartRow;
2019cdf0e10cSrcweir         SCCOL nEndCol;
2020cdf0e10cSrcweir         SCROW nEndRow;
2021cdf0e10cSrcweir         pViewData->GetFillData( nStartCol, nStartRow, nEndCol, nEndRow );
2022cdf0e10cSrcweir         ScRange aBlockRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab );
2023cdf0e10cSrcweir         SCCOL nFillCol = pViewData->GetRefEndX();
2024cdf0e10cSrcweir         SCROW nFillRow = pViewData->GetRefEndY();
2025cdf0e10cSrcweir         ScAddress aEndPos( nFillCol, nFillRow, nTab );
2026cdf0e10cSrcweir 
2027cdf0e10cSrcweir         ScTabView* pView = pViewData->GetView();
2028cdf0e10cSrcweir         pView->StopRefMode();
2029cdf0e10cSrcweir         pViewData->ResetFillMode();
2030cdf0e10cSrcweir         pView->GetFunctionSet()->SetAnchorFlag( sal_False );
2031cdf0e10cSrcweir 
2032cdf0e10cSrcweir         if ( aEndPos != aBlockRange.aEnd )
2033cdf0e10cSrcweir         {
2034cdf0e10cSrcweir             pViewData->GetDocShell()->GetDocFunc().ResizeMatrix( aBlockRange, aEndPos, sal_False );
2035cdf0e10cSrcweir             pViewData->GetView()->MarkRange( ScRange( aBlockRange.aStart, aEndPos ) );
2036cdf0e10cSrcweir         }
2037cdf0e10cSrcweir     }
2038cdf0e10cSrcweir     else if (pViewData->IsAnyFillMode())
2039cdf0e10cSrcweir     {
2040cdf0e10cSrcweir                                                 // Embedded-Area has been changed
2041cdf0e10cSrcweir         ScTabView* pView = pViewData->GetView();
2042cdf0e10cSrcweir         pView->StopRefMode();
2043cdf0e10cSrcweir         pViewData->ResetFillMode();
2044cdf0e10cSrcweir         pView->GetFunctionSet()->SetAnchorFlag( sal_False );
2045cdf0e10cSrcweir         pViewData->GetDocShell()->UpdateOle(pViewData);
2046cdf0e10cSrcweir     }
2047cdf0e10cSrcweir 
2048cdf0e10cSrcweir     sal_Bool bRefMode = pViewData->IsRefMode();
2049cdf0e10cSrcweir     if (bRefMode)
2050cdf0e10cSrcweir         pScMod->EndReference();
2051cdf0e10cSrcweir 
2052cdf0e10cSrcweir         //
2053cdf0e10cSrcweir         //  Giesskannen-Modus (Gestalter)
2054cdf0e10cSrcweir         //
2055cdf0e10cSrcweir 
2056cdf0e10cSrcweir     if (pScMod->GetIsWaterCan())
2057cdf0e10cSrcweir     {
2058cdf0e10cSrcweir         //  Abfrage auf Undo schon oben
2059cdf0e10cSrcweir 
2060cdf0e10cSrcweir         ScStyleSheetPool* pStylePool = (ScStyleSheetPool*)
2061cdf0e10cSrcweir                                        (pViewData->GetDocument()->
2062cdf0e10cSrcweir                                             GetStyleSheetPool());
2063cdf0e10cSrcweir         if ( pStylePool )
2064cdf0e10cSrcweir         {
2065cdf0e10cSrcweir             SfxStyleSheet* pStyleSheet = (SfxStyleSheet*)
2066cdf0e10cSrcweir                                          pStylePool->GetActualStyleSheet();
2067cdf0e10cSrcweir 
2068cdf0e10cSrcweir             if ( pStyleSheet )
2069cdf0e10cSrcweir             {
2070cdf0e10cSrcweir                 SfxStyleFamily eFamily = pStyleSheet->GetFamily();
2071cdf0e10cSrcweir 
2072cdf0e10cSrcweir                 switch ( eFamily )
2073cdf0e10cSrcweir                 {
2074cdf0e10cSrcweir                     case SFX_STYLE_FAMILY_PARA:
2075cdf0e10cSrcweir                         pViewData->GetView()->SetStyleSheetToMarked( pStyleSheet );
2076cdf0e10cSrcweir                         pViewData->GetView()->DoneBlockMode();
2077cdf0e10cSrcweir                         break;
2078cdf0e10cSrcweir 
2079cdf0e10cSrcweir                     case SFX_STYLE_FAMILY_PAGE:
2080cdf0e10cSrcweir                         pViewData->GetDocument()->SetPageStyle( pViewData->GetTabNo(),
2081cdf0e10cSrcweir                                                                 pStyleSheet->GetName() );
2082cdf0e10cSrcweir 
2083cdf0e10cSrcweir                         ScPrintFunc( pViewData->GetDocShell(),
2084cdf0e10cSrcweir                                      pViewData->GetViewShell()->GetPrinter(sal_True),
2085cdf0e10cSrcweir                                      pViewData->GetTabNo() ).UpdatePages();
2086cdf0e10cSrcweir 
2087cdf0e10cSrcweir                         rBindings.Invalidate( SID_STATUS_PAGESTYLE );
2088cdf0e10cSrcweir                         break;
2089cdf0e10cSrcweir 
2090cdf0e10cSrcweir                     default:
2091cdf0e10cSrcweir                         break;
2092cdf0e10cSrcweir                 }
2093cdf0e10cSrcweir             }
2094cdf0e10cSrcweir         }
2095cdf0e10cSrcweir     }
2096cdf0e10cSrcweir 
2097cdf0e10cSrcweir     ScDBFunc* pView = pViewData->GetView();
2098cdf0e10cSrcweir     ScDocument* pBrushDoc = pView->GetBrushDocument();
2099cdf0e10cSrcweir     if ( pBrushDoc )
2100cdf0e10cSrcweir     {
2101cdf0e10cSrcweir         pView->PasteFromClip( IDF_ATTRIB, pBrushDoc );
2102cdf0e10cSrcweir         if ( !pView->IsPaintBrushLocked() )
2103cdf0e10cSrcweir             pView->ResetBrushDocument();            // invalidates pBrushDoc pointer
2104cdf0e10cSrcweir     }
2105cdf0e10cSrcweir 
2106cdf0e10cSrcweir             //
2107cdf0e10cSrcweir             //      double click (only left button)
2108cdf0e10cSrcweir             //
2109cdf0e10cSrcweir 
2110cdf0e10cSrcweir     sal_Bool bDouble = ( rMEvt.GetClicks() == 2 && rMEvt.IsLeft() );
2111cdf0e10cSrcweir     if ( bDouble && !bRefMode && nMouseStatus == SC_GM_DBLDOWN && !pScMod->IsRefDialogOpen() )
2112cdf0e10cSrcweir     {
2113cdf0e10cSrcweir         //  data pilot table
2114cdf0e10cSrcweir         Point aPos = rMEvt.GetPosPixel();
2115cdf0e10cSrcweir         SCsCOL nPosX;
2116cdf0e10cSrcweir         SCsROW nPosY;
2117cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
2118cdf0e10cSrcweir         pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
2119cdf0e10cSrcweir         ScDPObject* pDPObj  = pDoc->GetDPAtCursor( nPosX, nPosY, nTab );
2120cdf0e10cSrcweir         if ( pDPObj && pDPObj->GetSaveData()->GetDrillDown() )
2121cdf0e10cSrcweir         {
2122cdf0e10cSrcweir             ScAddress aCellPos( nPosX, nPosY, pViewData->GetTabNo() );
2123cdf0e10cSrcweir 
2124cdf0e10cSrcweir             // Check for header drill-down first.
2125cdf0e10cSrcweir             sheet::DataPilotTableHeaderData aData;
2126cdf0e10cSrcweir             pDPObj->GetHeaderPositionData(aCellPos, aData);
2127cdf0e10cSrcweir 
2128cdf0e10cSrcweir             if ( ( aData.Flags & sheet::MemberResultFlags::HASMEMBER ) &&
2129cdf0e10cSrcweir                  ! ( aData.Flags & sheet::MemberResultFlags::SUBTOTAL ) )
2130cdf0e10cSrcweir             {
2131cdf0e10cSrcweir                 sal_uInt16 nDummy;
2132cdf0e10cSrcweir                 if ( pView->HasSelectionForDrillDown( nDummy ) )
2133cdf0e10cSrcweir                 {
2134cdf0e10cSrcweir                     // execute slot to show dialog
2135cdf0e10cSrcweir                     pViewData->GetDispatcher().Execute( SID_OUTLINE_SHOW, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD );
2136cdf0e10cSrcweir                 }
2137cdf0e10cSrcweir                 else
2138cdf0e10cSrcweir                 {
2139cdf0e10cSrcweir                     // toggle single entry
2140cdf0e10cSrcweir                     ScDPObject aNewObj( *pDPObj );
2141cdf0e10cSrcweir                     pDPObj->ToggleDetails( aData, &aNewObj );
2142cdf0e10cSrcweir                     ScDBDocFunc aFunc( *pViewData->GetDocShell() );
2143cdf0e10cSrcweir                     aFunc.DataPilotUpdate( pDPObj, &aNewObj, sal_True, sal_False );
2144cdf0e10cSrcweir                     pViewData->GetView()->CursorPosChanged();       // shells may be switched
2145cdf0e10cSrcweir                 }
2146cdf0e10cSrcweir             }
2147cdf0e10cSrcweir             else
2148cdf0e10cSrcweir             {
2149cdf0e10cSrcweir                 // Check if the data area is double-clicked.
2150cdf0e10cSrcweir 
2151cdf0e10cSrcweir                 Sequence<sheet::DataPilotFieldFilter> aFilters;
2152cdf0e10cSrcweir                 if ( pDPObj->GetDataFieldPositionData(aCellPos, aFilters) )
2153cdf0e10cSrcweir                     pViewData->GetView()->ShowDataPilotSourceData( *pDPObj, aFilters );
2154cdf0e10cSrcweir                 else
2155cdf0e10cSrcweir                     Sound::Beep();  // nothing to expand/collapse/show
2156cdf0e10cSrcweir             }
2157cdf0e10cSrcweir 
2158cdf0e10cSrcweir             return;
2159cdf0e10cSrcweir         }
2160cdf0e10cSrcweir 
2161cdf0e10cSrcweir         // Check for cell protection attribute.
2162cdf0e10cSrcweir         ScTableProtection* pProtect = pDoc->GetTabProtection( nTab );
2163cdf0e10cSrcweir         bool bEditAllowed = true;
2164cdf0e10cSrcweir         if ( pProtect && pProtect->isProtected() )
2165cdf0e10cSrcweir         {
2166cdf0e10cSrcweir             bool bCellProtected = pDoc->HasAttrib(nPosX, nPosY, nTab, nPosX, nPosY, nTab, HASATTR_PROTECTED);
2167cdf0e10cSrcweir             bool bSkipProtected = !pProtect->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS);
2168cdf0e10cSrcweir             bool bSkipUnprotected = !pProtect->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS);
2169cdf0e10cSrcweir 
2170cdf0e10cSrcweir             if ( bSkipProtected && bSkipUnprotected )
2171cdf0e10cSrcweir                 bEditAllowed = false;
2172cdf0e10cSrcweir             else if ( (bCellProtected && bSkipProtected) || (!bCellProtected && bSkipUnprotected) )
2173cdf0e10cSrcweir                 bEditAllowed = false;
2174cdf0e10cSrcweir         }
2175cdf0e10cSrcweir 
2176cdf0e10cSrcweir         if ( bEditAllowed )
2177cdf0e10cSrcweir         {
2178cdf0e10cSrcweir             //  edit cell contents
2179cdf0e10cSrcweir             pViewData->GetViewShell()->UpdateInputHandler();
2180cdf0e10cSrcweir             pScMod->SetInputMode( SC_INPUT_TABLE );
2181cdf0e10cSrcweir             if (pViewData->HasEditView(eWhich))
2182cdf0e10cSrcweir             {
2183cdf0e10cSrcweir                 //  Text-Cursor gleich an die geklickte Stelle setzen
2184cdf0e10cSrcweir                 EditView* pEditView = pViewData->GetEditView( eWhich );
2185cdf0e10cSrcweir                 MouseEvent aEditEvt( rMEvt.GetPosPixel(), 1, MOUSE_SYNTHETIC, MOUSE_LEFT, 0 );
2186cdf0e10cSrcweir                 pEditView->MouseButtonDown( aEditEvt );
2187cdf0e10cSrcweir                 pEditView->MouseButtonUp( aEditEvt );
2188cdf0e10cSrcweir             }
2189cdf0e10cSrcweir         }
2190cdf0e10cSrcweir         return;
2191cdf0e10cSrcweir     }
2192cdf0e10cSrcweir 
2193cdf0e10cSrcweir             //
2194cdf0e10cSrcweir             //      Links in edit cells
2195cdf0e10cSrcweir             //
2196cdf0e10cSrcweir 
2197cdf0e10cSrcweir     sal_Bool bAlt = rMEvt.IsMod2();
2198cdf0e10cSrcweir     if ( !bAlt && !bRefMode && !bDouble && nMouseStatus == SC_GM_URLDOWN )
2199cdf0e10cSrcweir     {
2200cdf0e10cSrcweir         //  beim ButtonUp nur ausfuehren, wenn ButtonDown auch ueber einer URL war
2201cdf0e10cSrcweir 
2202cdf0e10cSrcweir         String aName, aUrl, aTarget;
2203cdf0e10cSrcweir         if ( GetEditUrl( rMEvt.GetPosPixel(), &aName, &aUrl, &aTarget ) )
2204cdf0e10cSrcweir         {
2205cdf0e10cSrcweir             nMouseStatus = SC_GM_NONE;              // keinen Doppelklick anfangen
2206cdf0e10cSrcweir             ScGlobal::OpenURL( aUrl, aTarget );
2207cdf0e10cSrcweir 
2208cdf0e10cSrcweir             // fire worksheet_followhyperlink event
2209cdf0e10cSrcweir             uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = pDoc->GetVbaEventProcessor();
2210cdf0e10cSrcweir             if( xVbaEvents.is() ) try
2211cdf0e10cSrcweir             {
2212cdf0e10cSrcweir                 Point aPos = rMEvt.GetPosPixel();
2213cdf0e10cSrcweir                 SCsCOL nPosX;
2214cdf0e10cSrcweir                 SCsROW nPosY;
2215cdf0e10cSrcweir                 SCTAB nTab = pViewData->GetTabNo();
2216cdf0e10cSrcweir                 pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
2217cdf0e10cSrcweir                 ScBaseCell* pCell = NULL;
2218cdf0e10cSrcweir                 if( lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell ) )
2219cdf0e10cSrcweir                 {
2220cdf0e10cSrcweir                     ScAddress aCellPos( nPosX, nPosY, nTab );
2221cdf0e10cSrcweir                     uno::Reference< table::XCell > xCell( new ScCellObj( pViewData->GetDocShell(), aCellPos ) );
2222cdf0e10cSrcweir                     uno::Sequence< uno::Any > aArgs(1);
2223cdf0e10cSrcweir                     aArgs[0] <<= xCell;
2224cdf0e10cSrcweir                     xVbaEvents->processVbaEvent( script::vba::VBAEventId::WORKSHEET_FOLLOWHYPERLINK, aArgs );
2225cdf0e10cSrcweir                 }
2226cdf0e10cSrcweir             }
2227cdf0e10cSrcweir             catch( uno::Exception& )
2228cdf0e10cSrcweir             {
2229cdf0e10cSrcweir             }
2230cdf0e10cSrcweir 
2231cdf0e10cSrcweir             return;
2232cdf0e10cSrcweir         }
2233cdf0e10cSrcweir     }
2234cdf0e10cSrcweir 
2235cdf0e10cSrcweir             //
2236cdf0e10cSrcweir             //      Gridwin - SelectionEngine
2237cdf0e10cSrcweir             //
2238cdf0e10cSrcweir 
2239cdf0e10cSrcweir     //  SelMouseButtonDown is called only for left button, but SelMouseButtonUp would return
2240cdf0e10cSrcweir     //  sal_True for any call, so IsLeft must be checked here, too.
2241cdf0e10cSrcweir 
2242cdf0e10cSrcweir     if ( rMEvt.IsLeft() && pViewData->GetView()->GetSelEngine()->SelMouseButtonUp( rMEvt ) )
2243cdf0e10cSrcweir     {
2244cdf0e10cSrcweir //      rMark.MarkToSimple();
2245cdf0e10cSrcweir         pViewData->GetView()->UpdateAutoFillMark();
2246cdf0e10cSrcweir 
2247cdf0e10cSrcweir         SfxDispatcher* pDisp = pViewData->GetViewShell()->GetDispatcher();
2248cdf0e10cSrcweir         sal_Bool bFormulaMode = pScMod->IsFormulaMode();
2249cdf0e10cSrcweir         DBG_ASSERT( pDisp || bFormulaMode, "Cursor auf nicht aktiver View bewegen ?" );
2250cdf0e10cSrcweir 
2251cdf0e10cSrcweir         //  #i14927# execute SID_CURRENTCELL (for macro recording) only if there is no
2252cdf0e10cSrcweir         //  multiple selection, so the argument string completely describes the selection,
2253cdf0e10cSrcweir         //  and executing the slot won't change the existing selection (executing the slot
2254cdf0e10cSrcweir         //  here and from a recorded macro is treated equally)
2255cdf0e10cSrcweir 
2256cdf0e10cSrcweir         if ( pDisp && !bFormulaMode && !rMark.IsMultiMarked() )
2257cdf0e10cSrcweir         {
2258cdf0e10cSrcweir             String aAddr;                               // CurrentCell
2259cdf0e10cSrcweir             if( rMark.IsMarked() )
2260cdf0e10cSrcweir             {
2261cdf0e10cSrcweir //              sal_Bool bKeep = rMark.IsMultiMarked();     //! wohin damit ???
2262cdf0e10cSrcweir 
2263cdf0e10cSrcweir                 ScRange aScRange;
2264cdf0e10cSrcweir                 rMark.GetMarkArea( aScRange );
2265cdf0e10cSrcweir                 aScRange.Format( aAddr, SCR_ABS );
2266cdf0e10cSrcweir                 if ( aScRange.aStart == aScRange.aEnd )
2267cdf0e10cSrcweir                 {
2268cdf0e10cSrcweir                     //  make sure there is a range selection string even for a single cell
2269cdf0e10cSrcweir                     String aSingle = aAddr;
2270cdf0e10cSrcweir                     aAddr.Append( (sal_Char) ':' );
2271cdf0e10cSrcweir                     aAddr.Append( aSingle );
2272cdf0e10cSrcweir                 }
2273cdf0e10cSrcweir 
2274cdf0e10cSrcweir                 //! SID_MARKAREA gibts nicht mehr ???
2275cdf0e10cSrcweir                 //! was passiert beim Markieren mit dem Cursor ???
2276cdf0e10cSrcweir             }
2277cdf0e10cSrcweir             else                                        // nur Cursor bewegen
2278cdf0e10cSrcweir             {
2279cdf0e10cSrcweir                 ScAddress aScAddress( pViewData->GetCurX(), pViewData->GetCurY(), 0 );
2280cdf0e10cSrcweir                 aScAddress.Format( aAddr, SCA_ABS );
2281cdf0e10cSrcweir             }
2282cdf0e10cSrcweir 
2283cdf0e10cSrcweir             SfxStringItem aPosItem( SID_CURRENTCELL, aAddr );
2284cdf0e10cSrcweir             pDisp->Execute( SID_CURRENTCELL, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
2285cdf0e10cSrcweir                                         &aPosItem, (void*)0L );
2286cdf0e10cSrcweir 
2287cdf0e10cSrcweir             pViewData->GetView()->InvalidateAttribs();
2288cdf0e10cSrcweir         }
22890deba7fbSSteve Yin         pViewData->GetViewShell()->SelectionChanged();
2290cdf0e10cSrcweir         return;
2291cdf0e10cSrcweir     }
2292cdf0e10cSrcweir }
2293cdf0e10cSrcweir 
FakeButtonUp()2294cdf0e10cSrcweir void ScGridWindow::FakeButtonUp()
2295cdf0e10cSrcweir {
2296cdf0e10cSrcweir     if ( nButtonDown )
2297cdf0e10cSrcweir     {
2298cdf0e10cSrcweir         MouseEvent aEvent( aCurMousePos );      // nButtons = 0 -> ignore
2299cdf0e10cSrcweir         MouseButtonUp( aEvent );
2300cdf0e10cSrcweir     }
2301cdf0e10cSrcweir }
2302cdf0e10cSrcweir 
MouseMove(const MouseEvent & rMEvt)2303cdf0e10cSrcweir void __EXPORT ScGridWindow::MouseMove( const MouseEvent& rMEvt )
2304cdf0e10cSrcweir {
2305cdf0e10cSrcweir     aCurMousePos = rMEvt.GetPosPixel();
2306cdf0e10cSrcweir 
2307cdf0e10cSrcweir     if ( rMEvt.IsLeaveWindow() && pNoteMarker && !pNoteMarker->IsByKeyboard() )
2308cdf0e10cSrcweir         HideNoteMarker();
2309cdf0e10cSrcweir 
2310cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
2311cdf0e10cSrcweir     if (pScMod->IsModalMode(pViewData->GetSfxDocShell()))
2312cdf0e10cSrcweir         return;
2313cdf0e10cSrcweir 
2314cdf0e10cSrcweir         //  Ob aus dem Edit-Modus Drag&Drop gestartet wurde, bekommt man leider
2315cdf0e10cSrcweir         //  nicht anders mit:
2316cdf0e10cSrcweir 
2317cdf0e10cSrcweir     if (bEEMouse && nButtonDown && !rMEvt.GetButtons())
2318cdf0e10cSrcweir     {
2319cdf0e10cSrcweir         bEEMouse = sal_False;
2320cdf0e10cSrcweir         nButtonDown = 0;
2321cdf0e10cSrcweir         nMouseStatus = SC_GM_NONE;
2322cdf0e10cSrcweir         return;
2323cdf0e10cSrcweir     }
2324cdf0e10cSrcweir 
2325cdf0e10cSrcweir     if (nMouseStatus == SC_GM_IGNORE)
2326cdf0e10cSrcweir         return;
2327cdf0e10cSrcweir 
2328cdf0e10cSrcweir     if (nMouseStatus == SC_GM_WATERUNDO)    // Undo im Giesskannenmodus -> nur auf Up warten
2329cdf0e10cSrcweir         return;
2330cdf0e10cSrcweir 
2331cdf0e10cSrcweir     if ( pViewData->GetViewShell()->IsAuditShell() )        // Detektiv-Fuell-Modus
2332cdf0e10cSrcweir     {
2333cdf0e10cSrcweir         SetPointer( Pointer( POINTER_FILL ) );
2334cdf0e10cSrcweir         return;
2335cdf0e10cSrcweir     }
2336cdf0e10cSrcweir 
2337cdf0e10cSrcweir     if (nMouseStatus == SC_GM_FILTER && pFilterBox)
2338cdf0e10cSrcweir     {
2339cdf0e10cSrcweir         Point aRelPos = pFilterBox->ScreenToOutputPixel( OutputToScreenPixel( rMEvt.GetPosPixel() ) );
2340cdf0e10cSrcweir         if ( Rectangle(Point(),pFilterBox->GetOutputSizePixel()).IsInside(aRelPos) )
2341cdf0e10cSrcweir         {
2342cdf0e10cSrcweir             nButtonDown = 0;
2343cdf0e10cSrcweir             nMouseStatus = SC_GM_NONE;
2344cdf0e10cSrcweir             if ( pFilterBox->GetMode() == SC_FILTERBOX_FILTER )
2345cdf0e10cSrcweir             {
2346cdf0e10cSrcweir                 if (mpFilterButton.get())
2347cdf0e10cSrcweir                 {
2348cdf0e10cSrcweir                     mpFilterButton->setHasHiddenMember(false);
2349cdf0e10cSrcweir                     mpFilterButton->setPopupPressed(false);
2350cdf0e10cSrcweir                     HideCursor();
2351cdf0e10cSrcweir                     mpFilterButton->draw();
2352cdf0e10cSrcweir                     ShowCursor();
2353cdf0e10cSrcweir                 }
2354cdf0e10cSrcweir             }
2355cdf0e10cSrcweir             ReleaseMouse();
2356cdf0e10cSrcweir             pFilterBox->MouseButtonDown( MouseEvent( aRelPos, 1, MOUSE_SIMPLECLICK, MOUSE_LEFT ) );
2357cdf0e10cSrcweir             return;
2358cdf0e10cSrcweir         }
2359cdf0e10cSrcweir     }
2360cdf0e10cSrcweir 
2361cdf0e10cSrcweir     sal_Bool bFormulaMode = pScMod->IsFormulaMode();            // naechster Klick -> Referenz
2362cdf0e10cSrcweir 
2363cdf0e10cSrcweir     if (bEEMouse && pViewData->HasEditView( eWhich ))
2364cdf0e10cSrcweir     {
2365cdf0e10cSrcweir         EditView*   pEditView;
2366cdf0e10cSrcweir         SCCOL       nEditCol;
2367cdf0e10cSrcweir         SCROW       nEditRow;
2368cdf0e10cSrcweir         pViewData->GetEditView( eWhich, pEditView, nEditCol, nEditRow );
2369cdf0e10cSrcweir         pEditView->MouseMove( rMEvt );
2370cdf0e10cSrcweir         return;
2371cdf0e10cSrcweir     }
2372cdf0e10cSrcweir 
2373cdf0e10cSrcweir     if (bDPMouse)
2374cdf0e10cSrcweir     {
2375cdf0e10cSrcweir         DPMouseMove( rMEvt );
2376cdf0e10cSrcweir         return;
2377cdf0e10cSrcweir     }
2378cdf0e10cSrcweir 
2379cdf0e10cSrcweir     if (bRFMouse)
2380cdf0e10cSrcweir     {
2381cdf0e10cSrcweir         RFMouseMove( rMEvt, sal_False );
2382cdf0e10cSrcweir         return;
2383cdf0e10cSrcweir     }
2384cdf0e10cSrcweir 
2385cdf0e10cSrcweir     if (nPagebreakMouse)
2386cdf0e10cSrcweir     {
2387cdf0e10cSrcweir         PagebreakMove( rMEvt, sal_False );
2388cdf0e10cSrcweir         return;
2389cdf0e10cSrcweir     }
2390cdf0e10cSrcweir 
2391cdf0e10cSrcweir     //  anderen Mauszeiger anzeigen?
2392cdf0e10cSrcweir 
2393cdf0e10cSrcweir     sal_Bool bEditMode = pViewData->HasEditView(eWhich);
2394cdf0e10cSrcweir 
2395cdf0e10cSrcweir                     //! Testen ob RefMode-Dragging !!!
2396cdf0e10cSrcweir     if ( bEditMode && (pViewData->GetRefTabNo() == pViewData->GetTabNo()) )
2397cdf0e10cSrcweir     {
2398cdf0e10cSrcweir         Point   aPos = rMEvt.GetPosPixel();
2399cdf0e10cSrcweir         SCsCOL  nPosX;
2400cdf0e10cSrcweir         SCsROW  nPosY;
2401cdf0e10cSrcweir         pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
2402cdf0e10cSrcweir 
2403cdf0e10cSrcweir         EditView*   pEditView;
2404cdf0e10cSrcweir         SCCOL       nEditCol;
2405cdf0e10cSrcweir         SCROW       nEditRow;
2406cdf0e10cSrcweir         pViewData->GetEditView( eWhich, pEditView, nEditCol, nEditRow );
2407cdf0e10cSrcweir         SCCOL nEndCol = pViewData->GetEditEndCol();
2408cdf0e10cSrcweir         SCROW nEndRow = pViewData->GetEditEndRow();
2409cdf0e10cSrcweir 
2410cdf0e10cSrcweir         if ( nPosX >= (SCsCOL) nEditCol && nPosX <= (SCsCOL) nEndCol &&
2411cdf0e10cSrcweir              nPosY >= (SCsROW) nEditRow && nPosY <= (SCsROW) nEndRow )
2412cdf0e10cSrcweir         {
2413cdf0e10cSrcweir             //  Field can only be URL field
2414cdf0e10cSrcweir             sal_Bool bAlt = rMEvt.IsMod2();
2415cdf0e10cSrcweir             if ( !bAlt && !nButtonDown && pEditView && pEditView->GetFieldUnderMousePointer() )
2416cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_REFHAND ) );
2417cdf0e10cSrcweir             else if ( pEditView && pEditView->GetEditEngine()->IsVertical() )
2418cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_TEXT_VERTICAL ) );
2419cdf0e10cSrcweir             else
2420cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_TEXT ) );
2421cdf0e10cSrcweir             return;
2422cdf0e10cSrcweir         }
2423cdf0e10cSrcweir     }
2424cdf0e10cSrcweir 
2425cdf0e10cSrcweir     sal_Bool bWater = SC_MOD()->GetIsWaterCan() || pViewData->GetView()->HasPaintBrush();
2426cdf0e10cSrcweir     if (bWater)
2427cdf0e10cSrcweir         SetPointer( Pointer(POINTER_FILL) );
2428cdf0e10cSrcweir 
2429cdf0e10cSrcweir     if (!bWater)
2430cdf0e10cSrcweir     {
2431cdf0e10cSrcweir         sal_Bool bCross = sal_False;
2432cdf0e10cSrcweir 
2433cdf0e10cSrcweir         //  Range-Finder
2434cdf0e10cSrcweir 
2435cdf0e10cSrcweir         sal_Bool bCorner;
2436cdf0e10cSrcweir         if ( HitRangeFinder( rMEvt.GetPosPixel(), bCorner ) )
2437cdf0e10cSrcweir         {
2438cdf0e10cSrcweir             if (bCorner)
2439cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_CROSS ) );
2440cdf0e10cSrcweir             else
2441cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_HAND ) );
2442cdf0e10cSrcweir             bCross = sal_True;
2443cdf0e10cSrcweir         }
2444cdf0e10cSrcweir 
2445cdf0e10cSrcweir         //  Page-Break-Modus
2446cdf0e10cSrcweir 
2447cdf0e10cSrcweir         sal_uInt16 nBreakType;
2448cdf0e10cSrcweir         if ( !nButtonDown && pViewData->IsPagebreakMode() &&
2449cdf0e10cSrcweir                 ( nBreakType = HitPageBreak( rMEvt.GetPosPixel() ) ) != 0 )
2450cdf0e10cSrcweir         {
2451cdf0e10cSrcweir             PointerStyle eNew = POINTER_ARROW;
2452cdf0e10cSrcweir             switch ( nBreakType )
2453cdf0e10cSrcweir             {
2454cdf0e10cSrcweir                 case SC_PD_RANGE_L:
2455cdf0e10cSrcweir                 case SC_PD_RANGE_R:
2456cdf0e10cSrcweir                 case SC_PD_BREAK_H:
2457cdf0e10cSrcweir                     eNew = POINTER_ESIZE;
2458cdf0e10cSrcweir                     break;
2459cdf0e10cSrcweir                 case SC_PD_RANGE_T:
2460cdf0e10cSrcweir                 case SC_PD_RANGE_B:
2461cdf0e10cSrcweir                 case SC_PD_BREAK_V:
2462cdf0e10cSrcweir                     eNew = POINTER_SSIZE;
2463cdf0e10cSrcweir                     break;
2464cdf0e10cSrcweir                 case SC_PD_RANGE_TL:
2465cdf0e10cSrcweir                 case SC_PD_RANGE_BR:
2466cdf0e10cSrcweir                     eNew = POINTER_SESIZE;
2467cdf0e10cSrcweir                     break;
2468cdf0e10cSrcweir                 case SC_PD_RANGE_TR:
2469cdf0e10cSrcweir                 case SC_PD_RANGE_BL:
2470cdf0e10cSrcweir                     eNew = POINTER_NESIZE;
2471cdf0e10cSrcweir                     break;
2472cdf0e10cSrcweir             }
2473cdf0e10cSrcweir             SetPointer( Pointer( eNew ) );
2474cdf0e10cSrcweir             bCross = sal_True;
2475cdf0e10cSrcweir         }
2476cdf0e10cSrcweir 
2477cdf0e10cSrcweir         //  Fill-Cursor anzeigen ?
2478cdf0e10cSrcweir 
2479cdf0e10cSrcweir         if ( !bFormulaMode && !nButtonDown )
2480cdf0e10cSrcweir             if (TestMouse( rMEvt, sal_False ))
2481cdf0e10cSrcweir                 bCross = sal_True;
2482cdf0e10cSrcweir 
2483cdf0e10cSrcweir         if ( nButtonDown && pViewData->IsAnyFillMode() )
2484cdf0e10cSrcweir         {
2485cdf0e10cSrcweir             SetPointer( Pointer( POINTER_CROSS ) );
2486cdf0e10cSrcweir             bCross = sal_True;
2487cdf0e10cSrcweir             nScFillModeMouseModifier = rMEvt.GetModifier(); // ausgewertet bei AutoFill und Matrix
2488cdf0e10cSrcweir         }
2489cdf0e10cSrcweir 
2490cdf0e10cSrcweir         if (!bCross)
2491cdf0e10cSrcweir         {
2492cdf0e10cSrcweir             sal_Bool bAlt = rMEvt.IsMod2();
2493cdf0e10cSrcweir 
2494cdf0e10cSrcweir             if (bEditMode)                                  // Edit-Mode muss zuerst kommen!
2495cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_ARROW ) );
2496cdf0e10cSrcweir             else if ( !bAlt && !nButtonDown &&
2497cdf0e10cSrcweir                         GetEditUrl(rMEvt.GetPosPixel()) )
2498cdf0e10cSrcweir                 SetPointer( Pointer( POINTER_REFHAND ) );
2499cdf0e10cSrcweir             else if ( DrawMouseMove(rMEvt) )                // setzt Pointer um
2500cdf0e10cSrcweir                 return;
2501cdf0e10cSrcweir         }
2502cdf0e10cSrcweir     }
2503cdf0e10cSrcweir 
2504cdf0e10cSrcweir     if ( pViewData->GetView()->GetSelEngine()->SelMouseMove( rMEvt ) )
2505cdf0e10cSrcweir         return;
2506cdf0e10cSrcweir }
2507cdf0e10cSrcweir 
lcl_InitMouseEvent(::com::sun::star::awt::MouseEvent & rEvent,const MouseEvent & rEvt)2508cdf0e10cSrcweir void lcl_InitMouseEvent( ::com::sun::star::awt::MouseEvent& rEvent, const MouseEvent& rEvt )
2509cdf0e10cSrcweir {
2510cdf0e10cSrcweir     rEvent.Modifiers = 0;
2511cdf0e10cSrcweir     if ( rEvt.IsShift() )
2512cdf0e10cSrcweir         rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::SHIFT;
2513cdf0e10cSrcweir     if ( rEvt.IsMod1() )
2514cdf0e10cSrcweir     rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD1;
2515cdf0e10cSrcweir     if ( rEvt.IsMod2() )
2516cdf0e10cSrcweir         rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD2;
2517cdf0e10cSrcweir         if ( rEvt.IsMod3() )
2518cdf0e10cSrcweir                 rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD3;
2519cdf0e10cSrcweir 
2520cdf0e10cSrcweir     rEvent.Buttons = 0;
2521cdf0e10cSrcweir     if ( rEvt.IsLeft() )
2522cdf0e10cSrcweir         rEvent.Buttons |= ::com::sun::star::awt::MouseButton::LEFT;
2523cdf0e10cSrcweir     if ( rEvt.IsRight() )
2524cdf0e10cSrcweir         rEvent.Buttons |= ::com::sun::star::awt::MouseButton::RIGHT;
2525cdf0e10cSrcweir     if ( rEvt.IsMiddle() )
2526cdf0e10cSrcweir         rEvent.Buttons |= ::com::sun::star::awt::MouseButton::MIDDLE;
2527cdf0e10cSrcweir 
2528cdf0e10cSrcweir     rEvent.X = rEvt.GetPosPixel().X();
2529cdf0e10cSrcweir     rEvent.Y = rEvt.GetPosPixel().Y();
2530cdf0e10cSrcweir     rEvent.ClickCount = rEvt.GetClicks();
2531cdf0e10cSrcweir     rEvent.PopupTrigger = sal_False;
2532cdf0e10cSrcweir }
2533cdf0e10cSrcweir 
PreNotify(NotifyEvent & rNEvt)2534cdf0e10cSrcweir long ScGridWindow::PreNotify( NotifyEvent& rNEvt )
2535cdf0e10cSrcweir {
2536cdf0e10cSrcweir     bool bDone = false;
2537cdf0e10cSrcweir     sal_uInt16 nType = rNEvt.GetType();
2538cdf0e10cSrcweir     if ( nType == EVENT_MOUSEBUTTONUP || nType == EVENT_MOUSEBUTTONDOWN )
2539cdf0e10cSrcweir     {
2540cdf0e10cSrcweir         Window* pWindow = rNEvt.GetWindow();
2541cdf0e10cSrcweir         if (pWindow == this && pViewData)
2542cdf0e10cSrcweir         {
2543cdf0e10cSrcweir             SfxViewFrame* pViewFrame = pViewData->GetViewShell()->GetViewFrame();
2544cdf0e10cSrcweir             if (pViewFrame)
2545cdf0e10cSrcweir             {
2546cdf0e10cSrcweir                 com::sun::star::uno::Reference<com::sun::star::frame::XController> xController = pViewFrame->GetFrame().GetController();
2547cdf0e10cSrcweir                 if (xController.is())
2548cdf0e10cSrcweir                 {
2549cdf0e10cSrcweir                     ScTabViewObj* pImp = ScTabViewObj::getImplementation( xController );
2550cdf0e10cSrcweir                     if (pImp && pImp->IsMouseListening())
2551cdf0e10cSrcweir                     {
2552cdf0e10cSrcweir                         ::com::sun::star::awt::MouseEvent aEvent;
2553cdf0e10cSrcweir                         lcl_InitMouseEvent( aEvent, *rNEvt.GetMouseEvent() );
2554cdf0e10cSrcweir                         if ( rNEvt.GetWindow() )
2555cdf0e10cSrcweir                             aEvent.Source = rNEvt.GetWindow()->GetComponentInterface();
2556cdf0e10cSrcweir                         if ( nType == EVENT_MOUSEBUTTONDOWN)
2557cdf0e10cSrcweir                             bDone = pImp->MousePressed( aEvent );
2558cdf0e10cSrcweir                         else
2559cdf0e10cSrcweir                             bDone = pImp->MouseReleased( aEvent );
2560cdf0e10cSrcweir                     }
2561cdf0e10cSrcweir                 }
2562cdf0e10cSrcweir             }
2563cdf0e10cSrcweir         }
2564cdf0e10cSrcweir     }
2565cdf0e10cSrcweir     if (bDone)      // event consumed by a listener
2566cdf0e10cSrcweir     {
2567cdf0e10cSrcweir         if ( nType == EVENT_MOUSEBUTTONDOWN )
2568cdf0e10cSrcweir         {
2569cdf0e10cSrcweir             const MouseEvent* pMouseEvent = rNEvt.GetMouseEvent();
2570cdf0e10cSrcweir             if ( pMouseEvent->IsRight() && pMouseEvent->GetClicks() == 1 )
2571cdf0e10cSrcweir             {
2572cdf0e10cSrcweir                 // If a listener returned true for a right-click call, also prevent opening the context menu
2573cdf0e10cSrcweir                 // (this works only if the context menu is opened on mouse-down)
2574cdf0e10cSrcweir                 nMouseStatus = SC_GM_IGNORE;
2575cdf0e10cSrcweir             }
2576cdf0e10cSrcweir         }
2577cdf0e10cSrcweir 
2578cdf0e10cSrcweir         return 1;
2579cdf0e10cSrcweir     }
2580cdf0e10cSrcweir     else
2581cdf0e10cSrcweir         return Window::PreNotify( rNEvt );
2582cdf0e10cSrcweir }
2583cdf0e10cSrcweir 
Tracking(const TrackingEvent & rTEvt)2584cdf0e10cSrcweir void ScGridWindow::Tracking( const TrackingEvent& rTEvt )
2585cdf0e10cSrcweir {
2586cdf0e10cSrcweir     //  Weil die SelectionEngine kein Tracking kennt, die Events nur auf
2587cdf0e10cSrcweir     //  die verschiedenen MouseHandler verteilen...
2588cdf0e10cSrcweir 
2589cdf0e10cSrcweir     const MouseEvent& rMEvt = rTEvt.GetMouseEvent();
2590cdf0e10cSrcweir 
2591cdf0e10cSrcweir     if ( rTEvt.IsTrackingCanceled() )       // alles abbrechen...
2592cdf0e10cSrcweir     {
2593cdf0e10cSrcweir         if (!pViewData->GetView()->IsInActivatePart())
2594cdf0e10cSrcweir         {
2595cdf0e10cSrcweir             if (bDPMouse)
2596cdf0e10cSrcweir                 bDPMouse = sal_False;               // gezeichnet wird per bDragRect
2597cdf0e10cSrcweir             if (bDragRect)
2598cdf0e10cSrcweir             {
2599cdf0e10cSrcweir                 // pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
2600cdf0e10cSrcweir                 bDragRect = sal_False;
2601cdf0e10cSrcweir                 UpdateDragRectOverlay();
2602cdf0e10cSrcweir             }
2603cdf0e10cSrcweir             if (bRFMouse)
2604cdf0e10cSrcweir             {
2605cdf0e10cSrcweir                 RFMouseMove( rMEvt, sal_True );     // richtig abbrechen geht dabei nicht...
2606cdf0e10cSrcweir                 bRFMouse = sal_False;
2607cdf0e10cSrcweir             }
2608cdf0e10cSrcweir             if (nPagebreakMouse)
2609cdf0e10cSrcweir             {
2610cdf0e10cSrcweir                 // if (bPagebreakDrawn)
2611cdf0e10cSrcweir                 //  DrawDragRect( aPagebreakDrag.aStart.Col(), aPagebreakDrag.aStart.Row(),
2612cdf0e10cSrcweir                 //                  aPagebreakDrag.aEnd.Col(), aPagebreakDrag.aEnd.Row(), sal_False );
2613cdf0e10cSrcweir                 bPagebreakDrawn = sal_False;
2614cdf0e10cSrcweir                 UpdateDragRectOverlay();
2615cdf0e10cSrcweir                 nPagebreakMouse = SC_PD_NONE;
2616cdf0e10cSrcweir             }
2617cdf0e10cSrcweir 
2618cdf0e10cSrcweir             SetPointer( Pointer( POINTER_ARROW ) );
2619cdf0e10cSrcweir             StopMarking();
2620cdf0e10cSrcweir             MouseButtonUp( rMEvt );     // mit Status SC_GM_IGNORE aus StopMarking
2621cdf0e10cSrcweir 
2622cdf0e10cSrcweir             sal_Bool bRefMode = pViewData->IsRefMode();
2623cdf0e10cSrcweir             if (bRefMode)
2624cdf0e10cSrcweir                 SC_MOD()->EndReference();       // #63148# Dialog nicht verkleinert lassen
2625cdf0e10cSrcweir         }
2626cdf0e10cSrcweir     }
2627cdf0e10cSrcweir     else if ( rTEvt.IsTrackingEnded() )
2628cdf0e10cSrcweir     {
2629cdf0e10cSrcweir         //  MouseButtonUp immer mit passenden Buttons (z.B. wegen Testtool, #63148#)
2630cdf0e10cSrcweir         //  Schliesslich behauptet der Tracking-Event ja, dass normal beendet und nicht
2631cdf0e10cSrcweir         //  abgebrochen wurde.
2632cdf0e10cSrcweir 
2633cdf0e10cSrcweir         MouseEvent aUpEvt( rMEvt.GetPosPixel(), rMEvt.GetClicks(),
2634cdf0e10cSrcweir                             rMEvt.GetMode(), nButtonDown, rMEvt.GetModifier() );
2635cdf0e10cSrcweir         MouseButtonUp( aUpEvt );
2636cdf0e10cSrcweir     }
2637cdf0e10cSrcweir     else
2638cdf0e10cSrcweir         MouseMove( rMEvt );
2639cdf0e10cSrcweir }
2640cdf0e10cSrcweir 
StartDrag(sal_Int8,const Point & rPosPixel)2641cdf0e10cSrcweir void ScGridWindow::StartDrag( sal_Int8 /* nAction */, const Point& rPosPixel )
2642cdf0e10cSrcweir {
2643cdf0e10cSrcweir     if ( pFilterBox || nPagebreakMouse )
2644cdf0e10cSrcweir         return;
2645cdf0e10cSrcweir 
2646cdf0e10cSrcweir     HideNoteMarker();
2647cdf0e10cSrcweir 
2648cdf0e10cSrcweir     CommandEvent aDragEvent( rPosPixel, COMMAND_STARTDRAG, sal_True );
2649cdf0e10cSrcweir 
2650cdf0e10cSrcweir     if (bEEMouse && pViewData->HasEditView( eWhich ))
2651cdf0e10cSrcweir     {
2652cdf0e10cSrcweir         EditView*   pEditView;
2653cdf0e10cSrcweir         SCCOL       nEditCol;
2654cdf0e10cSrcweir         SCROW       nEditRow;
2655cdf0e10cSrcweir         pViewData->GetEditView( eWhich, pEditView, nEditCol, nEditRow );
2656cdf0e10cSrcweir 
2657cdf0e10cSrcweir         // #63263# don't remove the edit view while switching views
2658cdf0e10cSrcweir         ScModule* pScMod = SC_MOD();
2659cdf0e10cSrcweir         pScMod->SetInEditCommand( sal_True );
2660cdf0e10cSrcweir 
2661cdf0e10cSrcweir         pEditView->Command( aDragEvent );
2662cdf0e10cSrcweir 
2663cdf0e10cSrcweir         ScInputHandler* pHdl = pScMod->GetInputHdl();
2664cdf0e10cSrcweir         if (pHdl)
2665cdf0e10cSrcweir             pHdl->DataChanged();
2666cdf0e10cSrcweir 
2667cdf0e10cSrcweir         pScMod->SetInEditCommand( sal_False );
2668cdf0e10cSrcweir         if (!pViewData->IsActive())             // dropped to different view?
2669cdf0e10cSrcweir         {
2670cdf0e10cSrcweir             ScInputHandler* pViewHdl = pScMod->GetInputHdl( pViewData->GetViewShell() );
2671cdf0e10cSrcweir             if ( pViewHdl && pViewData->HasEditView( eWhich ) )
2672cdf0e10cSrcweir             {
2673cdf0e10cSrcweir                 pViewHdl->CancelHandler();
2674cdf0e10cSrcweir                 ShowCursor();   // missing from KillEditView
2675cdf0e10cSrcweir             }
2676cdf0e10cSrcweir         }
2677cdf0e10cSrcweir     }
2678cdf0e10cSrcweir     else
2679cdf0e10cSrcweir         if ( !DrawCommand(aDragEvent) )
2680cdf0e10cSrcweir             pViewData->GetView()->GetSelEngine()->Command( aDragEvent );
2681cdf0e10cSrcweir }
2682cdf0e10cSrcweir 
lcl_SetTextCursorPos(ScViewData * pViewData,ScSplitPos eWhich,Window * pWin)2683cdf0e10cSrcweir void lcl_SetTextCursorPos( ScViewData* pViewData, ScSplitPos eWhich, Window* pWin )
2684cdf0e10cSrcweir {
2685cdf0e10cSrcweir     SCCOL nCol = pViewData->GetCurX();
2686cdf0e10cSrcweir     SCROW nRow = pViewData->GetCurY();
2687cdf0e10cSrcweir     Rectangle aEditArea = pViewData->GetEditArea( eWhich, nCol, nRow, pWin, NULL, sal_True );
2688cdf0e10cSrcweir     aEditArea.Right() = aEditArea.Left();
2689cdf0e10cSrcweir     aEditArea = pWin->PixelToLogic( aEditArea );
2690cdf0e10cSrcweir     pWin->SetCursorRect( &aEditArea );
2691cdf0e10cSrcweir }
2692cdf0e10cSrcweir 
Command(const CommandEvent & rCEvt)2693cdf0e10cSrcweir void __EXPORT ScGridWindow::Command( const CommandEvent& rCEvt )
2694cdf0e10cSrcweir {
2695cdf0e10cSrcweir     // The command event is send to the window after a possible context
2696cdf0e10cSrcweir     // menu from an inplace client is closed. Now we have the chance to
2697cdf0e10cSrcweir     // deactivate the inplace client without any problem regarding parent
2698cdf0e10cSrcweir     // windows and code on the stack.
2699cdf0e10cSrcweir     // For more information, see #126086# and #128122#
2700cdf0e10cSrcweir     sal_uInt16 nCmd = rCEvt.GetCommand();
2701cdf0e10cSrcweir     ScTabViewShell* pTabViewSh = pViewData->GetViewShell();
2702cdf0e10cSrcweir     SfxInPlaceClient* pClient = pTabViewSh->GetIPClient();
2703cdf0e10cSrcweir     if ( pClient &&
2704cdf0e10cSrcweir          pClient->IsObjectInPlaceActive() &&
2705cdf0e10cSrcweir          nCmd == COMMAND_CONTEXTMENU )
2706cdf0e10cSrcweir     {
2707cdf0e10cSrcweir         pTabViewSh->DeactivateOle();
2708cdf0e10cSrcweir         return;
2709cdf0e10cSrcweir     }
2710cdf0e10cSrcweir 
2711cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
2712cdf0e10cSrcweir     DBG_ASSERT( nCmd != COMMAND_STARTDRAG, "ScGridWindow::Command called with COMMAND_STARTDRAG" );
2713cdf0e10cSrcweir 
2714cdf0e10cSrcweir     if ( nCmd == COMMAND_STARTEXTTEXTINPUT ||
2715cdf0e10cSrcweir          nCmd == COMMAND_ENDEXTTEXTINPUT ||
2716cdf0e10cSrcweir          nCmd == COMMAND_EXTTEXTINPUT ||
2717cdf0e10cSrcweir          nCmd == COMMAND_CURSORPOS )
2718cdf0e10cSrcweir     {
2719cdf0e10cSrcweir         sal_Bool bEditView = pViewData->HasEditView( eWhich );
2720cdf0e10cSrcweir         if (!bEditView)
2721cdf0e10cSrcweir         {
2722cdf0e10cSrcweir             //  only if no cell editview is active, look at drawview
2723cdf0e10cSrcweir             SdrView* pSdrView = pViewData->GetView()->GetSdrView();
2724cdf0e10cSrcweir             if ( pSdrView )
2725cdf0e10cSrcweir             {
2726cdf0e10cSrcweir                 OutlinerView* pOlView = pSdrView->GetTextEditOutlinerView();
2727cdf0e10cSrcweir                 if ( pOlView && pOlView->GetWindow() == this )
2728cdf0e10cSrcweir                 {
2729cdf0e10cSrcweir                     pOlView->Command( rCEvt );
2730cdf0e10cSrcweir                     return;                             // done
2731cdf0e10cSrcweir                 }
2732cdf0e10cSrcweir             }
2733cdf0e10cSrcweir         }
2734cdf0e10cSrcweir 
2735cdf0e10cSrcweir         if ( nCmd == COMMAND_CURSORPOS && !bEditView )
2736cdf0e10cSrcweir         {
2737cdf0e10cSrcweir             //  #88458# CURSORPOS may be called without following text input,
2738cdf0e10cSrcweir             //  to set the input method window position
2739cdf0e10cSrcweir             //  -> input mode must not be started,
2740cdf0e10cSrcweir             //  manually calculate text insert position if not in input mode
2741cdf0e10cSrcweir 
2742cdf0e10cSrcweir             lcl_SetTextCursorPos( pViewData, eWhich, this );
2743cdf0e10cSrcweir             return;
2744cdf0e10cSrcweir         }
2745cdf0e10cSrcweir 
2746cdf0e10cSrcweir         ScInputHandler* pHdl = pScMod->GetInputHdl( pViewData->GetViewShell() );
2747cdf0e10cSrcweir         if ( pHdl )
2748cdf0e10cSrcweir         {
2749cdf0e10cSrcweir             pHdl->InputCommand( rCEvt, sal_True );
2750cdf0e10cSrcweir             return;                                     // done
2751cdf0e10cSrcweir         }
2752cdf0e10cSrcweir 
2753cdf0e10cSrcweir         Window::Command( rCEvt );
2754cdf0e10cSrcweir         return;
2755cdf0e10cSrcweir     }
2756cdf0e10cSrcweir 
2757cdf0e10cSrcweir     if ( nCmd == COMMAND_VOICE )
2758cdf0e10cSrcweir     {
2759cdf0e10cSrcweir         //  Der Handler wird nur gerufen, wenn ein Text-Cursor aktiv ist,
2760cdf0e10cSrcweir         //  also muss es eine EditView oder ein editiertes Zeichenobjekt geben
2761cdf0e10cSrcweir 
2762cdf0e10cSrcweir         ScInputHandler* pHdl = pScMod->GetInputHdl( pViewData->GetViewShell() );
2763cdf0e10cSrcweir         if ( pHdl && pViewData->HasEditView( eWhich ) )
2764cdf0e10cSrcweir         {
2765cdf0e10cSrcweir             EditView* pEditView = pViewData->GetEditView( eWhich ); // ist dann nicht 0
2766cdf0e10cSrcweir             pHdl->DataChanging();
2767cdf0e10cSrcweir             pEditView->Command( rCEvt );
2768cdf0e10cSrcweir             pHdl->DataChanged();
2769cdf0e10cSrcweir             return;                                     // erledigt
2770cdf0e10cSrcweir         }
2771cdf0e10cSrcweir         SdrView* pSdrView = pViewData->GetView()->GetSdrView();
2772cdf0e10cSrcweir         if ( pSdrView )
2773cdf0e10cSrcweir         {
2774cdf0e10cSrcweir             OutlinerView* pOlView = pSdrView->GetTextEditOutlinerView();
2775cdf0e10cSrcweir             if ( pOlView && pOlView->GetWindow() == this )
2776cdf0e10cSrcweir             {
2777cdf0e10cSrcweir                 pOlView->Command( rCEvt );
2778cdf0e10cSrcweir                 return;                                 // erledigt
2779cdf0e10cSrcweir             }
2780cdf0e10cSrcweir         }
2781cdf0e10cSrcweir         Window::Command(rCEvt);     //  sonst soll sich die Basisklasse drum kuemmern...
2782cdf0e10cSrcweir         return;
2783cdf0e10cSrcweir     }
2784cdf0e10cSrcweir 
2785cdf0e10cSrcweir     if ( nCmd == COMMAND_PASTESELECTION )
2786cdf0e10cSrcweir     {
2787cdf0e10cSrcweir         if ( bEEMouse )
2788cdf0e10cSrcweir         {
2789cdf0e10cSrcweir             //  EditEngine handles selection in MouseButtonUp - no action
2790cdf0e10cSrcweir             //  needed in command handler
2791cdf0e10cSrcweir         }
2792cdf0e10cSrcweir         else
2793cdf0e10cSrcweir         {
2794cdf0e10cSrcweir             PasteSelection( rCEvt.GetMousePosPixel() );
2795cdf0e10cSrcweir         }
2796cdf0e10cSrcweir         return;
2797cdf0e10cSrcweir     }
2798cdf0e10cSrcweir 
2799cdf0e10cSrcweir     if ( nCmd == COMMAND_INPUTLANGUAGECHANGE )
2800cdf0e10cSrcweir     {
2801cdf0e10cSrcweir         // #i55929# Font and font size state depends on input language if nothing is selected,
2802cdf0e10cSrcweir         // so the slots have to be invalidated when the input language is changed.
2803cdf0e10cSrcweir 
2804cdf0e10cSrcweir         SfxBindings& rBindings = pViewData->GetBindings();
2805cdf0e10cSrcweir         rBindings.Invalidate( SID_ATTR_CHAR_FONT );
2806cdf0e10cSrcweir         rBindings.Invalidate( SID_ATTR_CHAR_FONTHEIGHT );
2807cdf0e10cSrcweir         return;
2808cdf0e10cSrcweir     }
2809cdf0e10cSrcweir 
2810cdf0e10cSrcweir     if ( nCmd == COMMAND_WHEEL || nCmd == COMMAND_STARTAUTOSCROLL || nCmd == COMMAND_AUTOSCROLL )
2811cdf0e10cSrcweir     {
2812cdf0e10cSrcweir         sal_Bool bDone = pViewData->GetView()->ScrollCommand( rCEvt, eWhich );
2813cdf0e10cSrcweir         if (!bDone)
2814cdf0e10cSrcweir             Window::Command(rCEvt);
2815cdf0e10cSrcweir         return;
2816cdf0e10cSrcweir     }
2817cdf0e10cSrcweir     // #i7560# FormulaMode check is below scrolling - scrolling is allowed during formula input
2818cdf0e10cSrcweir     sal_Bool bDisable = pScMod->IsFormulaMode() ||
2819cdf0e10cSrcweir                     pScMod->IsModalMode(pViewData->GetSfxDocShell());
2820cdf0e10cSrcweir     if (bDisable)
2821cdf0e10cSrcweir         return;
2822cdf0e10cSrcweir 
2823cdf0e10cSrcweir     if ( nCmd == COMMAND_CONTEXTMENU && !SC_MOD()->GetIsWaterCan() )
2824cdf0e10cSrcweir     {
2825cdf0e10cSrcweir         sal_Bool bMouse = rCEvt.IsMouseEvent();
2826cdf0e10cSrcweir         if ( bMouse && nMouseStatus == SC_GM_IGNORE )
2827cdf0e10cSrcweir             return;
2828cdf0e10cSrcweir 
2829cdf0e10cSrcweir         if (pViewData->IsAnyFillMode())
2830cdf0e10cSrcweir         {
2831cdf0e10cSrcweir             pViewData->GetView()->StopRefMode();
2832cdf0e10cSrcweir             pViewData->ResetFillMode();
2833cdf0e10cSrcweir         }
2834cdf0e10cSrcweir         ReleaseMouse();
2835cdf0e10cSrcweir         StopMarking();
2836cdf0e10cSrcweir 
2837cdf0e10cSrcweir         Point aPosPixel = rCEvt.GetMousePosPixel();
2838cdf0e10cSrcweir         Point aMenuPos = aPosPixel;
2839cdf0e10cSrcweir 
2840cdf0e10cSrcweir         if ( bMouse )
2841cdf0e10cSrcweir         {
2842cdf0e10cSrcweir             SCsCOL nCellX = -1;
2843cdf0e10cSrcweir             SCsROW nCellY = -1;
2844cdf0e10cSrcweir             pViewData->GetPosFromPixel(aPosPixel.X(), aPosPixel.Y(), eWhich, nCellX, nCellY);
2845cdf0e10cSrcweir             ScDocument* pDoc = pViewData->GetDocument();
2846cdf0e10cSrcweir             SCTAB nTab = pViewData->GetTabNo();
2847cdf0e10cSrcweir             const ScTableProtection* pProtect = pDoc->GetTabProtection(nTab);
2848cdf0e10cSrcweir             bool bSelectAllowed = true;
2849cdf0e10cSrcweir             if ( pProtect && pProtect->isProtected() )
2850cdf0e10cSrcweir             {
2851cdf0e10cSrcweir                 // This sheet is protected.  Check if a context menu is allowed on this cell.
2852cdf0e10cSrcweir                 bool bCellProtected = pDoc->HasAttrib(nCellX, nCellY, nTab, nCellX, nCellY, nTab, HASATTR_PROTECTED);
2853cdf0e10cSrcweir                 bool bSelProtected   = pProtect->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS);
2854cdf0e10cSrcweir                 bool bSelUnprotected = pProtect->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS);
2855cdf0e10cSrcweir 
2856cdf0e10cSrcweir                 if (bCellProtected)
2857cdf0e10cSrcweir                     bSelectAllowed = bSelProtected;
2858cdf0e10cSrcweir                 else
2859cdf0e10cSrcweir                     bSelectAllowed = bSelUnprotected;
2860cdf0e10cSrcweir             }
2861cdf0e10cSrcweir             if (!bSelectAllowed)
2862cdf0e10cSrcweir                 // Selecting this cell is not allowed, neither is context menu.
2863cdf0e10cSrcweir                 return;
2864cdf0e10cSrcweir 
2865cdf0e10cSrcweir             //  #i18735# First select the item under the mouse pointer.
2866cdf0e10cSrcweir             //  This can change the selection, and the view state (edit mode, etc).
2867cdf0e10cSrcweir             SelectForContextMenu( aPosPixel, nCellX, nCellY );
2868cdf0e10cSrcweir         }
2869cdf0e10cSrcweir 
2870cdf0e10cSrcweir         sal_Bool bDone = sal_False;
2871cdf0e10cSrcweir         sal_Bool bEdit = pViewData->HasEditView(eWhich);
2872cdf0e10cSrcweir         if ( !bEdit )
2873cdf0e10cSrcweir         {
2874cdf0e10cSrcweir                 // Edit-Zelle mit Spelling-Errors ?
2875cdf0e10cSrcweir             if ( bMouse && GetEditUrlOrError( sal_True, aPosPixel ) )
2876cdf0e10cSrcweir             {
2877cdf0e10cSrcweir                 //  GetEditUrlOrError hat den Cursor schon bewegt
2878cdf0e10cSrcweir 
2879cdf0e10cSrcweir                 pScMod->SetInputMode( SC_INPUT_TABLE );
2880cdf0e10cSrcweir                 bEdit = pViewData->HasEditView(eWhich);     // hat's geklappt ?
2881cdf0e10cSrcweir 
2882cdf0e10cSrcweir                 DBG_ASSERT( bEdit, "kann nicht in Edit-Modus schalten" );
2883cdf0e10cSrcweir             }
2884cdf0e10cSrcweir         }
2885cdf0e10cSrcweir         if ( bEdit )
2886cdf0e10cSrcweir         {
2887cdf0e10cSrcweir             EditView* pEditView = pViewData->GetEditView( eWhich );     // ist dann nicht 0
2888cdf0e10cSrcweir 
2889cdf0e10cSrcweir             if ( !bMouse )
2890cdf0e10cSrcweir             {
2891cdf0e10cSrcweir                 Cursor* pCur = pEditView->GetCursor();
2892cdf0e10cSrcweir                 if ( pCur )
2893cdf0e10cSrcweir                 {
2894cdf0e10cSrcweir                     Point aLogicPos = pCur->GetPos();
2895cdf0e10cSrcweir                     //  use the position right of the cursor (spell popup is opened if
2896cdf0e10cSrcweir                     //  the cursor is before the word, but not if behind it)
2897cdf0e10cSrcweir                     aLogicPos.X() += pCur->GetWidth();
2898cdf0e10cSrcweir                     aLogicPos.Y() += pCur->GetHeight() / 2;     // center vertically
2899cdf0e10cSrcweir                     aMenuPos = LogicToPixel( aLogicPos );
2900cdf0e10cSrcweir                 }
2901cdf0e10cSrcweir             }
2902cdf0e10cSrcweir 
2903cdf0e10cSrcweir             //  if edit mode was just started above, online spelling may be incomplete
2904cdf0e10cSrcweir             pEditView->GetEditEngine()->CompleteOnlineSpelling();
2905cdf0e10cSrcweir 
2906cdf0e10cSrcweir             //  IsCursorAtWrongSpelledWord could be used for !bMouse
2907cdf0e10cSrcweir             //  if there was a corresponding ExecuteSpellPopup call
2908cdf0e10cSrcweir 
2909cdf0e10cSrcweir             if( pEditView->IsWrongSpelledWordAtPos( aMenuPos ) )
2910cdf0e10cSrcweir             {
2911cdf0e10cSrcweir                 //  Wenn man unter OS/2 neben das Popupmenue klickt, kommt MouseButtonDown
2912cdf0e10cSrcweir                 //  vor dem Ende des Menue-Execute, darum muss SetModified vorher kommen
2913cdf0e10cSrcweir                 //  (Bug #40968#)
2914cdf0e10cSrcweir                 ScInputHandler* pHdl = pScMod->GetInputHdl();
2915cdf0e10cSrcweir                 if (pHdl)
2916cdf0e10cSrcweir                     pHdl->SetModified();
2917cdf0e10cSrcweir 
2918cdf0e10cSrcweir                 Link aLink = LINK( this, ScGridWindow, PopupSpellingHdl );
2919cdf0e10cSrcweir                 pEditView->ExecuteSpellPopup( aMenuPos, &aLink );
2920cdf0e10cSrcweir 
2921cdf0e10cSrcweir                 bDone = sal_True;
2922cdf0e10cSrcweir             }
2923cdf0e10cSrcweir         }
2924cdf0e10cSrcweir         else if ( !bMouse )
2925cdf0e10cSrcweir         {
2926cdf0e10cSrcweir             //  non-edit menu by keyboard -> use lower right of cell cursor position
2927cdf0e10cSrcweir 
2928cdf0e10cSrcweir             SCCOL nCurX = pViewData->GetCurX();
2929cdf0e10cSrcweir             SCROW nCurY = pViewData->GetCurY();
2930cdf0e10cSrcweir             aMenuPos = pViewData->GetScrPos( nCurX, nCurY, eWhich, sal_True );
2931cdf0e10cSrcweir             long nSizeXPix;
2932cdf0e10cSrcweir             long nSizeYPix;
2933cdf0e10cSrcweir             pViewData->GetMergeSizePixel( nCurX, nCurY, nSizeXPix, nSizeYPix );
2934cdf0e10cSrcweir             aMenuPos.X() += nSizeXPix;
2935cdf0e10cSrcweir             aMenuPos.Y() += nSizeYPix;
2936cdf0e10cSrcweir 
2937cdf0e10cSrcweir             if (pViewData)
2938cdf0e10cSrcweir             {
2939cdf0e10cSrcweir                 ScTabViewShell* pViewSh = pViewData->GetViewShell();
2940cdf0e10cSrcweir                 if (pViewSh)
2941cdf0e10cSrcweir                 {
2942cdf0e10cSrcweir                     //  Is a draw object selected?
2943cdf0e10cSrcweir 
2944cdf0e10cSrcweir                     SdrView* pDrawView = pViewSh->GetSdrView();
2945cdf0e10cSrcweir                     if (pDrawView && pDrawView->AreObjectsMarked())
2946cdf0e10cSrcweir                     {
2947cdf0e10cSrcweir                         // #100442#; the conext menu should open in the middle of the selected objects
2948cdf0e10cSrcweir                         Rectangle aSelectRect(LogicToPixel(pDrawView->GetAllMarkedBoundRect()));
2949cdf0e10cSrcweir                         aMenuPos = aSelectRect.Center();
2950cdf0e10cSrcweir                     }
2951cdf0e10cSrcweir                 }
2952cdf0e10cSrcweir             }
2953cdf0e10cSrcweir         }
2954cdf0e10cSrcweir 
2955cdf0e10cSrcweir         if (!bDone)
2956cdf0e10cSrcweir         {
2957cdf0e10cSrcweir             SfxDispatcher::ExecutePopup( 0, this, &aMenuPos );
2958cdf0e10cSrcweir         }
2959cdf0e10cSrcweir     }
2960cdf0e10cSrcweir }
2961cdf0e10cSrcweir 
SelectForContextMenu(const Point & rPosPixel,SCsCOL nCellX,SCsROW nCellY)2962cdf0e10cSrcweir void ScGridWindow::SelectForContextMenu( const Point& rPosPixel, SCsCOL nCellX, SCsROW nCellY )
2963cdf0e10cSrcweir {
2964cdf0e10cSrcweir     //  #i18735# if the click was outside of the current selection,
2965cdf0e10cSrcweir     //  the cursor is moved or an object at the click position selected.
2966cdf0e10cSrcweir     //  (see SwEditWin::SelectMenuPosition in Writer)
2967cdf0e10cSrcweir 
2968cdf0e10cSrcweir     ScTabView* pView = pViewData->GetView();
2969cdf0e10cSrcweir     ScDrawView* pDrawView = pView->GetScDrawView();
2970cdf0e10cSrcweir 
2971cdf0e10cSrcweir     //  check cell edit mode
2972cdf0e10cSrcweir 
2973cdf0e10cSrcweir     if ( pViewData->HasEditView(eWhich) )
2974cdf0e10cSrcweir     {
2975cdf0e10cSrcweir         ScModule* pScMod = SC_MOD();
2976cdf0e10cSrcweir         SCCOL nEditStartCol = pViewData->GetEditViewCol(); //! change to GetEditStartCol after calcrtl is integrated
2977cdf0e10cSrcweir         SCROW nEditStartRow = pViewData->GetEditViewRow();
2978cdf0e10cSrcweir         SCCOL nEditEndCol = pViewData->GetEditEndCol();
2979cdf0e10cSrcweir         SCROW nEditEndRow = pViewData->GetEditEndRow();
2980cdf0e10cSrcweir 
2981cdf0e10cSrcweir         if ( nCellX >= (SCsCOL) nEditStartCol && nCellX <= (SCsCOL) nEditEndCol &&
2982cdf0e10cSrcweir              nCellY >= (SCsROW) nEditStartRow && nCellY <= (SCsROW) nEditEndRow )
2983cdf0e10cSrcweir         {
2984cdf0e10cSrcweir             //  handle selection within the EditView
2985cdf0e10cSrcweir 
2986cdf0e10cSrcweir             EditView* pEditView = pViewData->GetEditView( eWhich );     // not NULL (HasEditView)
2987cdf0e10cSrcweir             EditEngine* pEditEngine = pEditView->GetEditEngine();
2988cdf0e10cSrcweir             Rectangle aOutputArea = pEditView->GetOutputArea();
2989cdf0e10cSrcweir             Rectangle aVisArea = pEditView->GetVisArea();
2990cdf0e10cSrcweir 
2991cdf0e10cSrcweir             Point aTextPos = PixelToLogic( rPosPixel );
2992cdf0e10cSrcweir             if ( pEditEngine->IsVertical() )            // have to manually transform position
2993cdf0e10cSrcweir             {
2994cdf0e10cSrcweir                 aTextPos -= aOutputArea.TopRight();
2995cdf0e10cSrcweir                 long nTemp = -aTextPos.X();
2996cdf0e10cSrcweir                 aTextPos.X() = aTextPos.Y();
2997cdf0e10cSrcweir                 aTextPos.Y() = nTemp;
2998cdf0e10cSrcweir             }
2999cdf0e10cSrcweir             else
3000cdf0e10cSrcweir                 aTextPos -= aOutputArea.TopLeft();
3001cdf0e10cSrcweir             aTextPos += aVisArea.TopLeft();             // position in the edit document
3002cdf0e10cSrcweir 
3003cdf0e10cSrcweir             EPosition aDocPosition = pEditEngine->FindDocPosition(aTextPos);
3004cdf0e10cSrcweir             ESelection aCompare(aDocPosition.nPara, aDocPosition.nIndex);
3005cdf0e10cSrcweir             ESelection aSelection = pEditView->GetSelection();
3006cdf0e10cSrcweir             aSelection.Adjust();    // needed for IsLess/IsGreater
3007cdf0e10cSrcweir             if ( aCompare.IsLess(aSelection) || aCompare.IsGreater(aSelection) )
3008cdf0e10cSrcweir             {
3009cdf0e10cSrcweir                 // clicked outside the selected text - deselect and move text cursor
3010cdf0e10cSrcweir                 MouseEvent aEvent( rPosPixel );
3011cdf0e10cSrcweir                 pEditView->MouseButtonDown( aEvent );
3012cdf0e10cSrcweir                 pEditView->MouseButtonUp( aEvent );
3013cdf0e10cSrcweir                 pScMod->InputSelection( pEditView );
3014cdf0e10cSrcweir             }
3015cdf0e10cSrcweir 
3016cdf0e10cSrcweir             return;     // clicked within the edit view - keep edit mode
3017cdf0e10cSrcweir         }
3018cdf0e10cSrcweir         else
3019cdf0e10cSrcweir         {
3020cdf0e10cSrcweir             // outside of the edit view - end edit mode, regardless of cell selection, then continue
3021cdf0e10cSrcweir             pScMod->InputEnterHandler();
3022cdf0e10cSrcweir         }
3023cdf0e10cSrcweir     }
3024cdf0e10cSrcweir 
3025cdf0e10cSrcweir     //  check draw text edit mode
3026cdf0e10cSrcweir 
3027cdf0e10cSrcweir     Point aLogicPos = PixelToLogic( rPosPixel );        // after cell edit mode is ended
3028cdf0e10cSrcweir     if ( pDrawView && pDrawView->GetTextEditObject() && pDrawView->GetTextEditOutlinerView() )
3029cdf0e10cSrcweir     {
3030cdf0e10cSrcweir         OutlinerView* pOlView = pDrawView->GetTextEditOutlinerView();
3031cdf0e10cSrcweir         Rectangle aOutputArea = pOlView->GetOutputArea();
3032cdf0e10cSrcweir         if ( aOutputArea.IsInside( aLogicPos ) )
3033cdf0e10cSrcweir         {
3034cdf0e10cSrcweir             //  handle selection within the OutlinerView
3035cdf0e10cSrcweir 
3036cdf0e10cSrcweir             Outliner* pOutliner = pOlView->GetOutliner();
3037cdf0e10cSrcweir             const EditEngine& rEditEngine = pOutliner->GetEditEngine();
3038cdf0e10cSrcweir             Rectangle aVisArea = pOlView->GetVisArea();
3039cdf0e10cSrcweir 
3040cdf0e10cSrcweir             Point aTextPos = aLogicPos;
3041cdf0e10cSrcweir             if ( pOutliner->IsVertical() )              // have to manually transform position
3042cdf0e10cSrcweir             {
3043cdf0e10cSrcweir                 aTextPos -= aOutputArea.TopRight();
3044cdf0e10cSrcweir                 long nTemp = -aTextPos.X();
3045cdf0e10cSrcweir                 aTextPos.X() = aTextPos.Y();
3046cdf0e10cSrcweir                 aTextPos.Y() = nTemp;
3047cdf0e10cSrcweir             }
3048cdf0e10cSrcweir             else
3049cdf0e10cSrcweir                 aTextPos -= aOutputArea.TopLeft();
3050cdf0e10cSrcweir             aTextPos += aVisArea.TopLeft();             // position in the edit document
3051cdf0e10cSrcweir 
3052cdf0e10cSrcweir             EPosition aDocPosition = rEditEngine.FindDocPosition(aTextPos);
3053cdf0e10cSrcweir             ESelection aCompare(aDocPosition.nPara, aDocPosition.nIndex);
3054cdf0e10cSrcweir             ESelection aSelection = pOlView->GetSelection();
3055cdf0e10cSrcweir             aSelection.Adjust();    // needed for IsLess/IsGreater
3056cdf0e10cSrcweir             if ( aCompare.IsLess(aSelection) || aCompare.IsGreater(aSelection) )
3057cdf0e10cSrcweir             {
3058cdf0e10cSrcweir                 // clicked outside the selected text - deselect and move text cursor
3059cdf0e10cSrcweir                 // use DrawView to allow extra handling there (none currently)
3060cdf0e10cSrcweir                 MouseEvent aEvent( rPosPixel );
3061cdf0e10cSrcweir                 pDrawView->MouseButtonDown( aEvent, this );
3062cdf0e10cSrcweir                 pDrawView->MouseButtonUp( aEvent, this );
3063cdf0e10cSrcweir             }
3064cdf0e10cSrcweir 
3065cdf0e10cSrcweir             return;     // clicked within the edit area - keep edit mode
3066cdf0e10cSrcweir         }
3067cdf0e10cSrcweir         else
3068cdf0e10cSrcweir         {
3069cdf0e10cSrcweir             // Outside of the edit area - end text edit mode, then continue.
3070cdf0e10cSrcweir             // DrawDeselectAll also ends text edit mode and updates the shells.
3071cdf0e10cSrcweir             // If the click was on the edited object, it will be selected again below.
3072cdf0e10cSrcweir             pView->DrawDeselectAll();
3073cdf0e10cSrcweir         }
3074cdf0e10cSrcweir     }
3075cdf0e10cSrcweir 
3076cdf0e10cSrcweir     //  look for existing selection
3077cdf0e10cSrcweir 
3078cdf0e10cSrcweir     sal_Bool bHitSelected = sal_False;
3079cdf0e10cSrcweir     if ( pDrawView && pDrawView->IsMarkedObjHit( aLogicPos ) )
3080cdf0e10cSrcweir     {
3081cdf0e10cSrcweir         //  clicked on selected object -> don't change anything
3082cdf0e10cSrcweir         bHitSelected = sal_True;
3083cdf0e10cSrcweir     }
3084cdf0e10cSrcweir     else if ( pViewData->GetMarkData().IsCellMarked(nCellX, nCellY) )
3085cdf0e10cSrcweir     {
3086cdf0e10cSrcweir         //  clicked on selected cell -> don't change anything
3087cdf0e10cSrcweir         bHitSelected = sal_True;
3088cdf0e10cSrcweir     }
3089cdf0e10cSrcweir 
3090cdf0e10cSrcweir     //  select drawing object or move cell cursor
3091cdf0e10cSrcweir 
3092cdf0e10cSrcweir     if ( !bHitSelected )
3093cdf0e10cSrcweir     {
3094cdf0e10cSrcweir         sal_Bool bWasDraw = ( pDrawView && pDrawView->AreObjectsMarked() );
3095cdf0e10cSrcweir         sal_Bool bHitDraw = sal_False;
3096cdf0e10cSrcweir         if ( pDrawView )
3097cdf0e10cSrcweir         {
3098cdf0e10cSrcweir             pDrawView->UnmarkAllObj();
3099cdf0e10cSrcweir             // Unlock the Internal Layer in order to activate the context menu.
3100cdf0e10cSrcweir             // re-lock in ScDrawView::MarkListHasChanged()
3101cdf0e10cSrcweir             lcl_UnLockComment( pDrawView, pDrawView->GetSdrPageView(), pDrawView->GetModel(), aLogicPos ,pViewData);
3102cdf0e10cSrcweir             bHitDraw = pDrawView->MarkObj( aLogicPos );
3103cdf0e10cSrcweir             // draw shell is activated in MarkListHasChanged
3104cdf0e10cSrcweir         }
3105cdf0e10cSrcweir         if ( !bHitDraw )
3106cdf0e10cSrcweir         {
3107cdf0e10cSrcweir             pView->Unmark();
3108cdf0e10cSrcweir             pView->SetCursor(nCellX, nCellY);
3109cdf0e10cSrcweir             if ( bWasDraw )
3110cdf0e10cSrcweir                 pViewData->GetViewShell()->SetDrawShell( sal_False );   // switch shells
3111cdf0e10cSrcweir         }
3112cdf0e10cSrcweir     }
3113cdf0e10cSrcweir }
3114cdf0e10cSrcweir 
KeyInput(const KeyEvent & rKEvt)3115cdf0e10cSrcweir void __EXPORT ScGridWindow::KeyInput(const KeyEvent& rKEvt)
3116cdf0e10cSrcweir {
3117cdf0e10cSrcweir     // #96965# Cursor control for ref input dialog
3118cdf0e10cSrcweir     if( SC_MOD()->IsRefDialogOpen() )
3119cdf0e10cSrcweir     {
3120cdf0e10cSrcweir         const KeyCode& rKeyCode = rKEvt.GetKeyCode();
3121cdf0e10cSrcweir         if( !rKeyCode.GetModifier() && (rKeyCode.GetCode() == KEY_F2) )
3122cdf0e10cSrcweir         {
3123cdf0e10cSrcweir             SC_MOD()->EndReference();
3124cdf0e10cSrcweir         }
3125cdf0e10cSrcweir         else if( pViewData->GetViewShell()->MoveCursorKeyInput( rKEvt ) )
3126cdf0e10cSrcweir         {
3127cdf0e10cSrcweir             ScRange aRef(
3128cdf0e10cSrcweir                 pViewData->GetRefStartX(), pViewData->GetRefStartY(), pViewData->GetRefStartZ(),
3129cdf0e10cSrcweir                 pViewData->GetRefEndX(), pViewData->GetRefEndY(), pViewData->GetRefEndZ() );
3130cdf0e10cSrcweir             SC_MOD()->SetReference( aRef, pViewData->GetDocument() );
3131cdf0e10cSrcweir         }
31320deba7fbSSteve Yin         pViewData->GetViewShell()->SelectionChanged();
31330deba7fbSSteve Yin         return ;
3134cdf0e10cSrcweir     }
3135cdf0e10cSrcweir     // wenn semi-Modeless-SfxChildWindow-Dialog oben, keine KeyInputs:
3136cdf0e10cSrcweir     else if( !pViewData->IsAnyFillMode() )
3137cdf0e10cSrcweir     {
3138cdf0e10cSrcweir         //  query for existing note marker before calling ViewShell's keyboard handling
3139cdf0e10cSrcweir         //  which may remove the marker
3140cdf0e10cSrcweir         sal_Bool bHadKeyMarker = ( pNoteMarker && pNoteMarker->IsByKeyboard() );
3141cdf0e10cSrcweir         ScTabViewShell* pViewSh = pViewData->GetViewShell();
3142cdf0e10cSrcweir 
3143cdf0e10cSrcweir         if (pViewData->GetDocShell()->GetProgress())
3144cdf0e10cSrcweir             return;
3145cdf0e10cSrcweir 
3146cdf0e10cSrcweir         if (DrawKeyInput(rKEvt))
3147ee093554SAndre Fischer         {
3148ee093554SAndre Fischer             const KeyCode& rKeyCode = rKEvt.GetKeyCode();
3149ee093554SAndre Fischer             if (rKeyCode.GetCode() == KEY_DOWN
3150ee093554SAndre Fischer                 || rKeyCode.GetCode() == KEY_UP
3151ee093554SAndre Fischer                 || rKeyCode.GetCode() == KEY_LEFT
3152ee093554SAndre Fischer                 || rKeyCode.GetCode() == KEY_RIGHT)
3153ee093554SAndre Fischer             {
3154ee093554SAndre Fischer                 ScTabViewShell* pViewShell = pViewData->GetViewShell();
3155ee093554SAndre Fischer                 SfxBindings& rBindings = pViewShell->GetViewFrame()->GetBindings();
3156ee093554SAndre Fischer                 rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_X);
3157ee093554SAndre Fischer                 rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_Y);
3158ee093554SAndre Fischer             }
3159cdf0e10cSrcweir             return;
3160ee093554SAndre Fischer         }
3161cdf0e10cSrcweir 
3162cdf0e10cSrcweir         if (!pViewData->GetView()->IsDrawSelMode() && !DrawHasMarkedObj())  //  keine Eingaben im Zeichenmodus
3163cdf0e10cSrcweir         {                                                           //! DrawShell abfragen !!!
3164cdf0e10cSrcweir             if (pViewSh->TabKeyInput(rKEvt))
3165cdf0e10cSrcweir                 return;
3166cdf0e10cSrcweir         }
3167cdf0e10cSrcweir         else
3168cdf0e10cSrcweir             if (pViewSh->SfxViewShell::KeyInput(rKEvt))             // von SfxViewShell
3169cdf0e10cSrcweir                 return;
3170cdf0e10cSrcweir 
3171cdf0e10cSrcweir         KeyCode aCode = rKEvt.GetKeyCode();
3172cdf0e10cSrcweir         if ( aCode.GetCode() == KEY_ESCAPE && aCode.GetModifier() == 0 )
3173cdf0e10cSrcweir         {
3174cdf0e10cSrcweir             if ( bHadKeyMarker )
3175cdf0e10cSrcweir                 HideNoteMarker();
3176cdf0e10cSrcweir             else
3177cdf0e10cSrcweir                 pViewSh->Escape();
3178cdf0e10cSrcweir             return;
3179cdf0e10cSrcweir         }
3180cdf0e10cSrcweir         if ( aCode.GetCode() == KEY_F1 && aCode.GetModifier() == KEY_MOD1 )
3181cdf0e10cSrcweir         {
3182cdf0e10cSrcweir             //  ctrl-F1 shows or hides the note or redlining info for the cursor position
3183cdf0e10cSrcweir             //  (hard-coded because F1 can't be configured)
3184cdf0e10cSrcweir 
3185cdf0e10cSrcweir             if ( bHadKeyMarker )
3186cdf0e10cSrcweir                 HideNoteMarker();       // hide when previously visible
3187cdf0e10cSrcweir             else
3188cdf0e10cSrcweir                 ShowNoteMarker( pViewData->GetCurX(), pViewData->GetCurY(), sal_True );
3189cdf0e10cSrcweir             return;
3190cdf0e10cSrcweir         }
3191cdf0e10cSrcweir     }
3192cdf0e10cSrcweir 
3193cdf0e10cSrcweir     Window::KeyInput(rKEvt);
3194cdf0e10cSrcweir }
3195cdf0e10cSrcweir 
StopMarking()3196cdf0e10cSrcweir void ScGridWindow::StopMarking()
3197cdf0e10cSrcweir {
3198cdf0e10cSrcweir     DrawEndAction();                // Markieren/Verschieben auf Drawing-Layer abbrechen
3199cdf0e10cSrcweir 
3200cdf0e10cSrcweir     if (nButtonDown)
3201cdf0e10cSrcweir     {
3202cdf0e10cSrcweir         pViewData->GetMarkData().SetMarking(sal_False);
3203cdf0e10cSrcweir         nMouseStatus = SC_GM_IGNORE;
3204cdf0e10cSrcweir     }
3205cdf0e10cSrcweir }
3206cdf0e10cSrcweir 
UpdateInputContext()3207cdf0e10cSrcweir void ScGridWindow::UpdateInputContext()
3208cdf0e10cSrcweir {
3209cdf0e10cSrcweir     sal_Bool bReadOnly = pViewData->GetDocShell()->IsReadOnly();
3210cdf0e10cSrcweir     sal_uLong nOptions = bReadOnly ? 0 : ( INPUTCONTEXT_TEXT | INPUTCONTEXT_EXTTEXTINPUT );
3211cdf0e10cSrcweir 
3212cdf0e10cSrcweir     //  when font from InputContext is used,
3213cdf0e10cSrcweir     //  it must be taken from the cursor position's cell attributes
3214cdf0e10cSrcweir 
3215cdf0e10cSrcweir     InputContext aContext;
3216cdf0e10cSrcweir     aContext.SetOptions( nOptions );
3217cdf0e10cSrcweir     SetInputContext( aContext );
3218cdf0e10cSrcweir }
3219cdf0e10cSrcweir 
3220cdf0e10cSrcweir //--------------------------------------------------------
3221cdf0e10cSrcweir 
3222cdf0e10cSrcweir                                 // sensitiver Bereich (Pixel)
3223cdf0e10cSrcweir #define SCROLL_SENSITIVE 20
3224cdf0e10cSrcweir 
DropScroll(const Point & rMousePos)3225cdf0e10cSrcweir sal_Bool ScGridWindow::DropScroll( const Point& rMousePos )
3226cdf0e10cSrcweir {
3227cdf0e10cSrcweir /*  doch auch auf nicht aktiven Views...
3228cdf0e10cSrcweir     if ( !pViewData->IsActive() )
3229cdf0e10cSrcweir         return sal_False;
3230cdf0e10cSrcweir */
3231cdf0e10cSrcweir     SCsCOL nDx = 0;
3232cdf0e10cSrcweir     SCsROW nDy = 0;
3233cdf0e10cSrcweir     Size aSize = GetOutputSizePixel();
3234cdf0e10cSrcweir 
3235cdf0e10cSrcweir     if (aSize.Width() > SCROLL_SENSITIVE * 3)
3236cdf0e10cSrcweir     {
3237cdf0e10cSrcweir         if ( rMousePos.X() < SCROLL_SENSITIVE && pViewData->GetPosX(WhichH(eWhich)) > 0 )
3238cdf0e10cSrcweir             nDx = -1;
3239cdf0e10cSrcweir         if ( rMousePos.X() >= aSize.Width() - SCROLL_SENSITIVE
3240cdf0e10cSrcweir                 && pViewData->GetPosX(WhichH(eWhich)) < MAXCOL )
3241cdf0e10cSrcweir             nDx = 1;
3242cdf0e10cSrcweir     }
3243cdf0e10cSrcweir     if (aSize.Height() > SCROLL_SENSITIVE * 3)
3244cdf0e10cSrcweir     {
3245cdf0e10cSrcweir         if ( rMousePos.Y() < SCROLL_SENSITIVE && pViewData->GetPosY(WhichV(eWhich)) > 0 )
3246cdf0e10cSrcweir             nDy = -1;
3247cdf0e10cSrcweir         if ( rMousePos.Y() >= aSize.Height() - SCROLL_SENSITIVE
3248cdf0e10cSrcweir                 && pViewData->GetPosY(WhichV(eWhich)) < MAXROW )
3249cdf0e10cSrcweir             nDy = 1;
3250cdf0e10cSrcweir     }
3251cdf0e10cSrcweir 
3252cdf0e10cSrcweir     if ( nDx != 0 || nDy != 0 )
3253cdf0e10cSrcweir     {
3254cdf0e10cSrcweir //      if (bDragRect)
3255cdf0e10cSrcweir //          pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3256cdf0e10cSrcweir 
3257cdf0e10cSrcweir         if ( nDx != 0 )
3258cdf0e10cSrcweir             pViewData->GetView()->ScrollX( nDx, WhichH(eWhich) );
3259cdf0e10cSrcweir         if ( nDy != 0 )
3260cdf0e10cSrcweir             pViewData->GetView()->ScrollY( nDy, WhichV(eWhich) );
3261cdf0e10cSrcweir 
3262cdf0e10cSrcweir //      if (bDragRect)
3263cdf0e10cSrcweir //          pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3264cdf0e10cSrcweir     }
3265cdf0e10cSrcweir 
3266cdf0e10cSrcweir     return sal_False;
3267cdf0e10cSrcweir }
3268cdf0e10cSrcweir 
lcl_TestScenarioRedliningDrop(ScDocument * pDoc,const ScRange & aDragRange)3269cdf0e10cSrcweir sal_Bool lcl_TestScenarioRedliningDrop( ScDocument* pDoc, const ScRange& aDragRange)
3270cdf0e10cSrcweir {
3271cdf0e10cSrcweir     //  Testet, ob bei eingeschalteten RedLining,
3272cdf0e10cSrcweir     //  bei einem Drop ein Scenario betroffen ist.
3273cdf0e10cSrcweir 
3274cdf0e10cSrcweir     sal_Bool bReturn = sal_False;
3275cdf0e10cSrcweir     SCTAB nTab = aDragRange.aStart.Tab();
3276cdf0e10cSrcweir     SCTAB nTabCount = pDoc->GetTableCount();
3277cdf0e10cSrcweir 
3278cdf0e10cSrcweir     if(pDoc->GetChangeTrack()!=NULL)
3279cdf0e10cSrcweir     {
3280cdf0e10cSrcweir         if( pDoc->IsScenario(nTab) && pDoc->HasScenarioRange(nTab, aDragRange))
3281cdf0e10cSrcweir         {
3282cdf0e10cSrcweir             bReturn = sal_True;
3283cdf0e10cSrcweir         }
3284cdf0e10cSrcweir         else
3285cdf0e10cSrcweir         {
3286cdf0e10cSrcweir             for(SCTAB i=nTab+1; i<nTabCount && pDoc->IsScenario(i); i++)
3287cdf0e10cSrcweir             {
3288cdf0e10cSrcweir                 if(pDoc->HasScenarioRange(i, aDragRange))
3289cdf0e10cSrcweir                 {
3290cdf0e10cSrcweir                     bReturn = sal_True;
3291cdf0e10cSrcweir                     break;
3292cdf0e10cSrcweir                 }
3293cdf0e10cSrcweir             }
3294cdf0e10cSrcweir         }
3295cdf0e10cSrcweir     }
3296cdf0e10cSrcweir     return bReturn;
3297cdf0e10cSrcweir }
3298cdf0e10cSrcweir 
lcl_MakeDropRange(SCCOL nPosX,SCROW nPosY,SCTAB nTab,const ScRange & rSource)3299cdf0e10cSrcweir ScRange lcl_MakeDropRange( SCCOL nPosX, SCROW nPosY, SCTAB nTab, const ScRange& rSource )
3300cdf0e10cSrcweir {
3301cdf0e10cSrcweir     SCCOL nCol1 = nPosX;
3302cdf0e10cSrcweir     SCCOL nCol2 = nCol1 + ( rSource.aEnd.Col() - rSource.aStart.Col() );
3303cdf0e10cSrcweir     if ( nCol2 > MAXCOL )
3304cdf0e10cSrcweir     {
3305cdf0e10cSrcweir         nCol1 -= nCol2 - MAXCOL;
3306cdf0e10cSrcweir         nCol2 = MAXCOL;
3307cdf0e10cSrcweir     }
3308cdf0e10cSrcweir     SCROW nRow1 = nPosY;
3309cdf0e10cSrcweir     SCROW nRow2 = nRow1 + ( rSource.aEnd.Row() - rSource.aStart.Row() );
3310cdf0e10cSrcweir     if ( nRow2 > MAXROW )
3311cdf0e10cSrcweir     {
3312cdf0e10cSrcweir         nRow1 -= nRow2 - MAXROW;
3313cdf0e10cSrcweir         nRow2 = MAXROW;
3314cdf0e10cSrcweir     }
3315cdf0e10cSrcweir 
3316cdf0e10cSrcweir     return ScRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
3317cdf0e10cSrcweir }
3318cdf0e10cSrcweir 
3319cdf0e10cSrcweir //--------------------------------------------------------
3320cdf0e10cSrcweir 
3321cdf0e10cSrcweir extern sal_Bool bPasteIsDrop;       // viewfun4 -> move to header
3322cdf0e10cSrcweir extern sal_Bool bPasteIsMove;       // viewfun7 -> move to header
3323cdf0e10cSrcweir 
3324cdf0e10cSrcweir //--------------------------------------------------------
3325cdf0e10cSrcweir 
AcceptPrivateDrop(const AcceptDropEvent & rEvt)3326cdf0e10cSrcweir sal_Int8 ScGridWindow::AcceptPrivateDrop( const AcceptDropEvent& rEvt )
3327cdf0e10cSrcweir {
3328cdf0e10cSrcweir     if ( rEvt.mbLeaving )
3329cdf0e10cSrcweir     {
3330cdf0e10cSrcweir         // if (bDragRect)
3331cdf0e10cSrcweir         //  pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3332cdf0e10cSrcweir         bDragRect = sal_False;
3333cdf0e10cSrcweir         UpdateDragRectOverlay();
3334cdf0e10cSrcweir         return rEvt.mnAction;
3335cdf0e10cSrcweir     }
3336cdf0e10cSrcweir 
3337cdf0e10cSrcweir     const ScDragData& rData = SC_MOD()->GetDragData();
3338cdf0e10cSrcweir     if ( rData.pCellTransfer )
3339cdf0e10cSrcweir     {
3340cdf0e10cSrcweir         // Don't move source that would include filtered rows.
3341cdf0e10cSrcweir         if ((rEvt.mnAction & DND_ACTION_MOVE) && rData.pCellTransfer->HasFilteredRows())
3342cdf0e10cSrcweir         {
3343cdf0e10cSrcweir             if (bDragRect)
3344cdf0e10cSrcweir             {
3345cdf0e10cSrcweir                 bDragRect = sal_False;
3346cdf0e10cSrcweir                 UpdateDragRectOverlay();
3347cdf0e10cSrcweir             }
3348cdf0e10cSrcweir             return DND_ACTION_NONE;
3349cdf0e10cSrcweir         }
3350cdf0e10cSrcweir 
3351cdf0e10cSrcweir         Point aPos = rEvt.maPosPixel;
3352cdf0e10cSrcweir 
3353cdf0e10cSrcweir         ScDocument* pSourceDoc = rData.pCellTransfer->GetSourceDocument();
3354cdf0e10cSrcweir         ScDocument* pThisDoc   = pViewData->GetDocument();
3355cdf0e10cSrcweir         if (pSourceDoc == pThisDoc)
3356cdf0e10cSrcweir         {
3357cdf0e10cSrcweir             if ( pThisDoc->HasChartAtPoint(pViewData->GetTabNo(), PixelToLogic(aPos)) )
3358cdf0e10cSrcweir             {
3359cdf0e10cSrcweir                 if (bDragRect)          // Rechteck loeschen
3360cdf0e10cSrcweir                 {
3361cdf0e10cSrcweir                     // pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3362cdf0e10cSrcweir                     bDragRect = sal_False;
3363cdf0e10cSrcweir                     UpdateDragRectOverlay();
3364cdf0e10cSrcweir                 }
3365cdf0e10cSrcweir 
3366cdf0e10cSrcweir                 //! highlight chart? (selection border?)
3367cdf0e10cSrcweir 
3368cdf0e10cSrcweir                 sal_Int8 nRet = rEvt.mnAction;
3369cdf0e10cSrcweir //!             if ( rEvt.GetAction() == DROP_LINK )
3370cdf0e10cSrcweir //!                 bOk = rEvt.SetAction( DROP_COPY );          // can't link onto chart
3371cdf0e10cSrcweir                 return nRet;
3372cdf0e10cSrcweir             }
3373cdf0e10cSrcweir         }
3374cdf0e10cSrcweir //!     else
3375cdf0e10cSrcweir //!         if ( rEvt.GetAction() == DROP_MOVE )
3376cdf0e10cSrcweir //!             rEvt.SetAction( DROP_COPY );                    // different doc: default=COPY
3377cdf0e10cSrcweir 
3378cdf0e10cSrcweir 
3379cdf0e10cSrcweir         if ( rData.pCellTransfer->GetDragSourceFlags() & SC_DROP_TABLE )        // whole sheet?
3380cdf0e10cSrcweir         {
3381cdf0e10cSrcweir             sal_Bool bOk = pThisDoc->IsDocEditable();
3382cdf0e10cSrcweir             return bOk ? rEvt.mnAction : 0;                     // don't draw selection frame
3383cdf0e10cSrcweir         }
3384cdf0e10cSrcweir 
3385cdf0e10cSrcweir         SCsCOL  nPosX;
3386cdf0e10cSrcweir         SCsROW  nPosY;
3387cdf0e10cSrcweir         pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
3388cdf0e10cSrcweir 
3389cdf0e10cSrcweir         ScRange aSourceRange = rData.pCellTransfer->GetRange();
3390cdf0e10cSrcweir         SCCOL nSourceStartX = aSourceRange.aStart.Col();
3391cdf0e10cSrcweir         SCROW nSourceStartY = aSourceRange.aStart.Row();
3392cdf0e10cSrcweir         SCCOL nSourceEndX = aSourceRange.aEnd.Col();
3393cdf0e10cSrcweir         SCROW nSourceEndY = aSourceRange.aEnd.Row();
3394cdf0e10cSrcweir         SCCOL nSizeX = nSourceEndX - nSourceStartX + 1;
3395cdf0e10cSrcweir         SCROW nSizeY = nSourceEndY - nSourceStartY + 1;
3396cdf0e10cSrcweir 
3397cdf0e10cSrcweir         if ( rEvt.mnAction != DND_ACTION_MOVE )
3398cdf0e10cSrcweir             nSizeY = rData.pCellTransfer->GetNonFilteredRows();     // copy/link: no filtered rows
3399cdf0e10cSrcweir 
3400cdf0e10cSrcweir         SCsCOL nNewDragX = nPosX - rData.pCellTransfer->GetDragHandleX();
3401cdf0e10cSrcweir         if (nNewDragX<0) nNewDragX=0;
3402cdf0e10cSrcweir         if (nNewDragX+(nSizeX-1) > MAXCOL)
3403cdf0e10cSrcweir             nNewDragX = MAXCOL-(nSizeX-1);
3404cdf0e10cSrcweir         SCsROW nNewDragY = nPosY - rData.pCellTransfer->GetDragHandleY();
3405cdf0e10cSrcweir         if (nNewDragY<0) nNewDragY=0;
3406cdf0e10cSrcweir         if (nNewDragY+(nSizeY-1) > MAXROW)
3407cdf0e10cSrcweir             nNewDragY = MAXROW-(nSizeY-1);
3408cdf0e10cSrcweir 
3409cdf0e10cSrcweir         //  don't break scenario ranges, don't drop on filtered
3410cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
3411cdf0e10cSrcweir         ScRange aDropRange = lcl_MakeDropRange( nNewDragX, nNewDragY, nTab, aSourceRange );
3412cdf0e10cSrcweir         if ( lcl_TestScenarioRedliningDrop( pThisDoc, aDropRange ) ||
3413cdf0e10cSrcweir              lcl_TestScenarioRedliningDrop( pSourceDoc, aSourceRange ) ||
3414cdf0e10cSrcweir              ScViewUtil::HasFiltered( aDropRange, pThisDoc) )
3415cdf0e10cSrcweir         {
3416cdf0e10cSrcweir             if (bDragRect)
3417cdf0e10cSrcweir             {
3418cdf0e10cSrcweir                 // pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3419cdf0e10cSrcweir                 bDragRect = sal_False;
3420cdf0e10cSrcweir                 UpdateDragRectOverlay();
3421cdf0e10cSrcweir             }
3422cdf0e10cSrcweir             return DND_ACTION_NONE;
3423cdf0e10cSrcweir         }
3424cdf0e10cSrcweir 
3425cdf0e10cSrcweir         InsCellCmd eDragInsertMode = INS_NONE;
3426cdf0e10cSrcweir         Window::PointerState aState = GetPointerState();
3427cdf0e10cSrcweir 
3428cdf0e10cSrcweir         // check for datapilot item sorting
3429cdf0e10cSrcweir         ScDPObject* pDPObj = NULL;
3430cdf0e10cSrcweir         if ( pThisDoc == pSourceDoc && ( pDPObj = pThisDoc->GetDPAtCursor( nNewDragX, nNewDragY, nTab ) ) != NULL )
3431cdf0e10cSrcweir         {
3432cdf0e10cSrcweir             // drop on DataPilot table: sort or nothing
3433cdf0e10cSrcweir 
3434cdf0e10cSrcweir             bool bDPSort = false;
3435cdf0e10cSrcweir             if ( pThisDoc->GetDPAtCursor( nSourceStartX, nSourceStartY, aSourceRange.aStart.Tab() ) == pDPObj )
3436cdf0e10cSrcweir             {
3437cdf0e10cSrcweir                 sheet::DataPilotTableHeaderData aDestData;
3438cdf0e10cSrcweir                 pDPObj->GetHeaderPositionData( ScAddress(nNewDragX, nNewDragY, nTab), aDestData );
3439cdf0e10cSrcweir                 bool bValid = ( aDestData.Dimension >= 0 );        // dropping onto a field
3440cdf0e10cSrcweir 
3441cdf0e10cSrcweir                 // look through the source range
3442cdf0e10cSrcweir                 for (SCROW nRow = aSourceRange.aStart.Row(); bValid && nRow <= aSourceRange.aEnd.Row(); ++nRow )
3443cdf0e10cSrcweir                     for (SCCOL nCol = aSourceRange.aStart.Col(); bValid && nCol <= aSourceRange.aEnd.Col(); ++nCol )
3444cdf0e10cSrcweir                     {
3445cdf0e10cSrcweir                         sheet::DataPilotTableHeaderData aSourceData;
3446cdf0e10cSrcweir                         pDPObj->GetHeaderPositionData( ScAddress( nCol, nRow, aSourceRange.aStart.Tab() ), aSourceData );
3447cdf0e10cSrcweir                         if ( aSourceData.Dimension != aDestData.Dimension || !aSourceData.MemberName.getLength() )
3448cdf0e10cSrcweir                             bValid = false;     // empty (subtotal) or different field
3449cdf0e10cSrcweir                     }
3450cdf0e10cSrcweir 
3451cdf0e10cSrcweir                 if ( bValid )
3452cdf0e10cSrcweir                 {
3453cdf0e10cSrcweir                     sal_Bool bIsDataLayout;
3454cdf0e10cSrcweir                     String aDimName = pDPObj->GetDimName( aDestData.Dimension, bIsDataLayout );
3455cdf0e10cSrcweir                     const ScDPSaveDimension* pDim = pDPObj->GetSaveData()->GetExistingDimensionByName( aDimName );
3456cdf0e10cSrcweir                     if ( pDim )
3457cdf0e10cSrcweir                     {
3458cdf0e10cSrcweir                         ScRange aOutRange = pDPObj->GetOutRange();
3459cdf0e10cSrcweir 
3460cdf0e10cSrcweir                         sal_uInt16 nOrient = pDim->GetOrientation();
3461cdf0e10cSrcweir                         if ( nOrient == sheet::DataPilotFieldOrientation_COLUMN )
3462cdf0e10cSrcweir                         {
3463cdf0e10cSrcweir                             eDragInsertMode = INS_CELLSRIGHT;
3464cdf0e10cSrcweir                             nSizeY = aOutRange.aEnd.Row() - nNewDragY + 1;
3465cdf0e10cSrcweir                             bDPSort = true;
3466cdf0e10cSrcweir                         }
3467cdf0e10cSrcweir                         else if ( nOrient == sheet::DataPilotFieldOrientation_ROW )
3468cdf0e10cSrcweir                         {
3469cdf0e10cSrcweir                             eDragInsertMode = INS_CELLSDOWN;
3470cdf0e10cSrcweir                             nSizeX = aOutRange.aEnd.Col() - nNewDragX + 1;
3471cdf0e10cSrcweir                             bDPSort = true;
3472cdf0e10cSrcweir                         }
3473cdf0e10cSrcweir                     }
3474cdf0e10cSrcweir                 }
3475cdf0e10cSrcweir             }
3476cdf0e10cSrcweir 
3477cdf0e10cSrcweir             if ( !bDPSort )
3478cdf0e10cSrcweir             {
3479cdf0e10cSrcweir                 // no valid sorting in a DataPilot table -> disallow
3480cdf0e10cSrcweir                 if ( bDragRect )
3481cdf0e10cSrcweir                 {
3482cdf0e10cSrcweir                     bDragRect = sal_False;
3483cdf0e10cSrcweir                     UpdateDragRectOverlay();
3484cdf0e10cSrcweir                 }
3485cdf0e10cSrcweir                 return DND_ACTION_NONE;
3486cdf0e10cSrcweir             }
3487cdf0e10cSrcweir         }
3488cdf0e10cSrcweir         else if ( aState.mnState & KEY_MOD2 )
3489cdf0e10cSrcweir         {
3490cdf0e10cSrcweir             if ( pThisDoc == pSourceDoc && nTab == aSourceRange.aStart.Tab() )
3491cdf0e10cSrcweir             {
3492cdf0e10cSrcweir                 long nDeltaX = labs( static_cast< long >( nNewDragX - nSourceStartX ) );
3493cdf0e10cSrcweir                 long nDeltaY = labs( static_cast< long >( nNewDragY - nSourceStartY ) );
3494cdf0e10cSrcweir                 if ( nDeltaX <= nDeltaY )
3495cdf0e10cSrcweir                 {
3496cdf0e10cSrcweir                     eDragInsertMode = INS_CELLSDOWN;
3497cdf0e10cSrcweir                 }
3498cdf0e10cSrcweir                 else
3499cdf0e10cSrcweir                 {
3500cdf0e10cSrcweir                     eDragInsertMode = INS_CELLSRIGHT;
3501cdf0e10cSrcweir                 }
3502cdf0e10cSrcweir 
3503cdf0e10cSrcweir                 if ( ( eDragInsertMode == INS_CELLSDOWN && nNewDragY <= nSourceEndY &&
3504cdf0e10cSrcweir                        ( nNewDragX + nSizeX - 1 ) >= nSourceStartX && nNewDragX <= nSourceEndX &&
3505cdf0e10cSrcweir                        ( nNewDragX != nSourceStartX || nNewDragY >= nSourceStartY ) ) ||
3506cdf0e10cSrcweir                      ( eDragInsertMode == INS_CELLSRIGHT && nNewDragX <= nSourceEndX &&
3507cdf0e10cSrcweir                        ( nNewDragY + nSizeY - 1 ) >= nSourceStartY && nNewDragY <= nSourceEndY &&
3508cdf0e10cSrcweir                        ( nNewDragY != nSourceStartY || nNewDragX >= nSourceStartX ) ) )
3509cdf0e10cSrcweir                 {
3510cdf0e10cSrcweir                     if ( bDragRect )
3511cdf0e10cSrcweir                     {
3512cdf0e10cSrcweir                         bDragRect = sal_False;
3513cdf0e10cSrcweir                         UpdateDragRectOverlay();
3514cdf0e10cSrcweir                     }
3515cdf0e10cSrcweir                     return DND_ACTION_NONE;
3516cdf0e10cSrcweir                 }
3517cdf0e10cSrcweir             }
3518cdf0e10cSrcweir             else
3519cdf0e10cSrcweir             {
3520cdf0e10cSrcweir                 if ( static_cast< long >( nSizeX ) >= static_cast< long >( nSizeY ) )
3521cdf0e10cSrcweir                 {
3522cdf0e10cSrcweir                     eDragInsertMode = INS_CELLSDOWN;
3523cdf0e10cSrcweir 
3524cdf0e10cSrcweir                 }
3525cdf0e10cSrcweir                 else
3526cdf0e10cSrcweir                 {
3527cdf0e10cSrcweir                     eDragInsertMode = INS_CELLSRIGHT;
3528cdf0e10cSrcweir                 }
3529cdf0e10cSrcweir             }
3530cdf0e10cSrcweir         }
3531cdf0e10cSrcweir 
3532cdf0e10cSrcweir         if ( nNewDragX != (SCsCOL) nDragStartX || nNewDragY != (SCsROW) nDragStartY ||
3533cdf0e10cSrcweir              nDragStartX+nSizeX-1 != nDragEndX || nDragStartY+nSizeY-1 != nDragEndY ||
3534cdf0e10cSrcweir              !bDragRect || eDragInsertMode != meDragInsertMode )
3535cdf0e10cSrcweir         {
3536cdf0e10cSrcweir             // if (bDragRect)
3537cdf0e10cSrcweir             //  pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3538cdf0e10cSrcweir 
3539cdf0e10cSrcweir             nDragStartX = nNewDragX;
3540cdf0e10cSrcweir             nDragStartY = nNewDragY;
3541cdf0e10cSrcweir             nDragEndX = nDragStartX+nSizeX-1;
3542cdf0e10cSrcweir             nDragEndY = nDragStartY+nSizeY-1;
3543cdf0e10cSrcweir             bDragRect = sal_True;
3544cdf0e10cSrcweir             meDragInsertMode = eDragInsertMode;
3545cdf0e10cSrcweir 
3546cdf0e10cSrcweir             // pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3547cdf0e10cSrcweir 
3548cdf0e10cSrcweir             UpdateDragRectOverlay();
3549cdf0e10cSrcweir 
3550cdf0e10cSrcweir             //  show target position as tip help
3551cdf0e10cSrcweir #if 0
3552cdf0e10cSrcweir             if (Help::IsQuickHelpEnabled())
3553cdf0e10cSrcweir             {
3554cdf0e10cSrcweir                 ScRange aRange( nDragStartX, nDragStartY, nTab, nDragEndX, nDragEndY, nTab );
3555cdf0e10cSrcweir                 String aHelpStr;
3556cdf0e10cSrcweir                 aRange.Format( aHelpStr, SCA_VALID );   // non-3D
3557cdf0e10cSrcweir 
3558cdf0e10cSrcweir                 Point aPos = Pointer::GetPosPixel();
3559cdf0e10cSrcweir                 sal_uInt16 nAlign = QUICKHELP_BOTTOM|QUICKHELP_RIGHT;
3560cdf0e10cSrcweir                 Rectangle aRect( aPos, aPos );
3561cdf0e10cSrcweir                 Help::ShowQuickHelp(aRect, aHelpStr, nAlign);
3562cdf0e10cSrcweir             }
3563cdf0e10cSrcweir #endif
3564cdf0e10cSrcweir         }
3565cdf0e10cSrcweir     }
3566cdf0e10cSrcweir 
3567cdf0e10cSrcweir     return rEvt.mnAction;
3568cdf0e10cSrcweir }
3569cdf0e10cSrcweir 
AcceptDrop(const AcceptDropEvent & rEvt)3570cdf0e10cSrcweir sal_Int8 ScGridWindow::AcceptDrop( const AcceptDropEvent& rEvt )
3571cdf0e10cSrcweir {
3572cdf0e10cSrcweir     const ScDragData& rData = SC_MOD()->GetDragData();
3573cdf0e10cSrcweir     if ( rEvt.mbLeaving )
3574cdf0e10cSrcweir     {
3575cdf0e10cSrcweir         DrawMarkDropObj( NULL );
3576cdf0e10cSrcweir         if ( rData.pCellTransfer )
3577cdf0e10cSrcweir             return AcceptPrivateDrop( rEvt );   // hide drop marker for internal D&D
3578cdf0e10cSrcweir         else
3579cdf0e10cSrcweir             return rEvt.mnAction;
3580cdf0e10cSrcweir     }
3581cdf0e10cSrcweir 
3582cdf0e10cSrcweir     if ( pViewData->GetDocShell()->IsReadOnly() )
3583cdf0e10cSrcweir         return DND_ACTION_NONE;
3584cdf0e10cSrcweir 
3585cdf0e10cSrcweir 
3586cdf0e10cSrcweir     sal_Int8 nRet = DND_ACTION_NONE;
3587cdf0e10cSrcweir 
3588cdf0e10cSrcweir     if (rData.pCellTransfer)
3589cdf0e10cSrcweir     {
3590cdf0e10cSrcweir         ScRange aSource = rData.pCellTransfer->GetRange();
3591cdf0e10cSrcweir         if ( aSource.aStart.Col() != 0 || aSource.aEnd.Col() != MAXCOL ||
3592cdf0e10cSrcweir              aSource.aStart.Row() != 0 || aSource.aEnd.Row() != MAXROW )
3593cdf0e10cSrcweir             DropScroll( rEvt.maPosPixel );
3594cdf0e10cSrcweir 
3595cdf0e10cSrcweir         nRet = AcceptPrivateDrop( rEvt );
3596cdf0e10cSrcweir     }
3597cdf0e10cSrcweir     else
3598cdf0e10cSrcweir     {
3599cdf0e10cSrcweir         if ( rData.aLinkDoc.Len() )
3600cdf0e10cSrcweir         {
3601cdf0e10cSrcweir             String aThisName;
3602cdf0e10cSrcweir             ScDocShell* pDocSh = pViewData->GetDocShell();
3603cdf0e10cSrcweir             if (pDocSh && pDocSh->HasName())
3604cdf0e10cSrcweir                 aThisName = pDocSh->GetMedium()->GetName();
3605cdf0e10cSrcweir 
3606cdf0e10cSrcweir             if ( rData.aLinkDoc != aThisName )
3607cdf0e10cSrcweir                 nRet = rEvt.mnAction;
3608cdf0e10cSrcweir         }
3609cdf0e10cSrcweir         else if (rData.aJumpTarget.Len())
3610cdf0e10cSrcweir         {
3611cdf0e10cSrcweir             //  internal bookmarks (from Navigator)
3612cdf0e10cSrcweir             //  local jumps from an unnamed document are possible only within a document
3613cdf0e10cSrcweir 
3614cdf0e10cSrcweir             if ( !rData.pJumpLocalDoc || rData.pJumpLocalDoc == pViewData->GetDocument() )
3615cdf0e10cSrcweir                 nRet = rEvt.mnAction;
3616cdf0e10cSrcweir         }
3617cdf0e10cSrcweir         else
3618cdf0e10cSrcweir         {
3619cdf0e10cSrcweir             sal_Int8 nMyAction = rEvt.mnAction;
3620cdf0e10cSrcweir 
36213cc56398SArmin Le Grand             // clear DND_ACTION_LINK when other actions are set. The usage below cannot handle
36223cc56398SArmin Le Grand             // multiple set values
36233cc56398SArmin Le Grand             if((nMyAction & DND_ACTION_LINK) && (nMyAction & (DND_ACTION_COPYMOVE)))
36243cc56398SArmin Le Grand             {
36253cc56398SArmin Le Grand                 nMyAction &= ~DND_ACTION_LINK;
36263cc56398SArmin Le Grand             }
36273cc56398SArmin Le Grand 
3628cdf0e10cSrcweir             if ( !rData.pDrawTransfer ||
3629cdf0e10cSrcweir                     !IsMyModel(rData.pDrawTransfer->GetDragSourceView()) )      // drawing within the document
3630cdf0e10cSrcweir                 if ( rEvt.mbDefault && nMyAction == DND_ACTION_MOVE )
3631cdf0e10cSrcweir                     nMyAction = DND_ACTION_COPY;
3632cdf0e10cSrcweir 
3633cdf0e10cSrcweir             ScDocument* pThisDoc = pViewData->GetDocument();
3634cdf0e10cSrcweir             SdrObject* pHitObj = pThisDoc->GetObjectAtPoint(
3635cdf0e10cSrcweir                         pViewData->GetTabNo(), PixelToLogic(rEvt.maPosPixel) );
36363cc56398SArmin Le Grand             if ( pHitObj && nMyAction == DND_ACTION_LINK ) // && !rData.pDrawTransfer )
3637cdf0e10cSrcweir             {
3638cdf0e10cSrcweir                 if ( IsDropFormatSupported(SOT_FORMATSTR_ID_SVXB)
3639cdf0e10cSrcweir                     || IsDropFormatSupported(SOT_FORMAT_GDIMETAFILE)
3640a206ee71SArmin Le Grand                     || IsDropFormatSupported(SOT_FORMATSTR_ID_PNG)
3641cdf0e10cSrcweir                     || IsDropFormatSupported(SOT_FORMAT_BITMAP) )
3642cdf0e10cSrcweir                 {
3643cdf0e10cSrcweir                     //  graphic dragged onto drawing object
3644cdf0e10cSrcweir                     DrawMarkDropObj( pHitObj );
3645cdf0e10cSrcweir                     nRet = nMyAction;
3646cdf0e10cSrcweir                 }
3647cdf0e10cSrcweir             }
3648cdf0e10cSrcweir             if (!nRet)
3649cdf0e10cSrcweir                 DrawMarkDropObj( NULL );
3650cdf0e10cSrcweir 
3651cdf0e10cSrcweir             if (!nRet)
3652cdf0e10cSrcweir             {
3653cdf0e10cSrcweir                 switch ( nMyAction )
3654cdf0e10cSrcweir                 {
3655cdf0e10cSrcweir                     case DND_ACTION_COPY:
3656cdf0e10cSrcweir                     case DND_ACTION_MOVE:
3657cdf0e10cSrcweir                     case DND_ACTION_COPYMOVE:
3658cdf0e10cSrcweir                         {
3659cdf0e10cSrcweir                             sal_Bool bMove = ( nMyAction == DND_ACTION_MOVE );
3660cdf0e10cSrcweir                             if ( IsDropFormatSupported( SOT_FORMATSTR_ID_EMBED_SOURCE ) ||
3661cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_LINK_SOURCE ) ||
3662cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE ) ||
3663cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_LINK_SOURCE_OLE ) ||
3664cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ) ||
3665cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMAT_STRING ) ||
3666cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_SYLK ) ||
3667cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_LINK ) ||
3668cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_HTML ) ||
3669cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_HTML_SIMPLE ) ||
3670cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_DIF ) ||
3671cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_DRAWING ) ||
3672cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_SVXB ) ||
3673cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMAT_RTF ) ||
3674cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMAT_GDIMETAFILE ) ||
3675a206ee71SArmin Le Grand                                  IsDropFormatSupported( SOT_FORMATSTR_ID_PNG ) ||
3676cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMAT_BITMAP ) ||
3677cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_SBA_DATAEXCHANGE ) ||
3678cdf0e10cSrcweir                                  IsDropFormatSupported( SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE ) ||
3679cdf0e10cSrcweir                                  ( !bMove && (
3680cdf0e10cSrcweir                                     IsDropFormatSupported( SOT_FORMAT_FILE_LIST ) ||
3681cdf0e10cSrcweir                                     IsDropFormatSupported( SOT_FORMAT_FILE ) ||
3682cdf0e10cSrcweir                                     IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) ||
3683cdf0e10cSrcweir                                     IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) ||
3684cdf0e10cSrcweir                                     IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) ||
3685cdf0e10cSrcweir                                     IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) ) ) )
3686cdf0e10cSrcweir                             {
3687cdf0e10cSrcweir                                 nRet = nMyAction;
3688cdf0e10cSrcweir                             }
3689cdf0e10cSrcweir                         }
3690cdf0e10cSrcweir                         break;
3691cdf0e10cSrcweir                     case DND_ACTION_LINK:
3692cdf0e10cSrcweir                         if ( IsDropFormatSupported( SOT_FORMATSTR_ID_LINK_SOURCE ) ||
3693cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMATSTR_ID_LINK_SOURCE_OLE ) ||
3694cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMATSTR_ID_LINK ) ||
3695cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMAT_FILE_LIST ) ||
3696cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMAT_FILE ) ||
3697cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) ||
3698cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) ||
3699cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) ||
3700cdf0e10cSrcweir                              IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) )
3701cdf0e10cSrcweir                         {
3702cdf0e10cSrcweir                             nRet = nMyAction;
3703cdf0e10cSrcweir                         }
3704cdf0e10cSrcweir                         break;
3705cdf0e10cSrcweir                 }
3706cdf0e10cSrcweir 
3707cdf0e10cSrcweir                 if ( nRet )
3708cdf0e10cSrcweir                 {
3709cdf0e10cSrcweir                     // Simple check for protection: It's not known here if the drop will result
3710cdf0e10cSrcweir                     // in cells or drawing objects (some formats can be both) and how many cells
3711cdf0e10cSrcweir                     // the result will be. But if IsFormatEditable for the drop cell position
3712cdf0e10cSrcweir                     // is sal_False (ignores matrix formulas), nothing can be pasted, so the drop
3713cdf0e10cSrcweir                     // can already be rejected here.
3714cdf0e10cSrcweir 
3715cdf0e10cSrcweir                     Point aPos = rEvt.maPosPixel;
3716cdf0e10cSrcweir                     SCsCOL nPosX;
3717cdf0e10cSrcweir                     SCsROW nPosY;
3718cdf0e10cSrcweir                     pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
3719cdf0e10cSrcweir                     SCTAB nTab = pViewData->GetTabNo();
3720cdf0e10cSrcweir                     ScDocument* pDoc = pViewData->GetDocument();
3721cdf0e10cSrcweir 
3722cdf0e10cSrcweir                     ScEditableTester aTester( pDoc, nTab, nPosX,nPosY, nPosX,nPosY );
3723cdf0e10cSrcweir                     if ( !aTester.IsFormatEditable() )
3724cdf0e10cSrcweir                         nRet = DND_ACTION_NONE;             // forbidden
3725cdf0e10cSrcweir                 }
3726cdf0e10cSrcweir             }
3727cdf0e10cSrcweir         }
3728cdf0e10cSrcweir 
3729cdf0e10cSrcweir         //  scroll only for accepted formats
3730cdf0e10cSrcweir         if (nRet)
3731cdf0e10cSrcweir             DropScroll( rEvt.maPosPixel );
3732cdf0e10cSrcweir     }
3733cdf0e10cSrcweir 
3734cdf0e10cSrcweir     return nRet;
3735cdf0e10cSrcweir }
3736cdf0e10cSrcweir 
lcl_GetDropFormatId(const uno::Reference<datatransfer::XTransferable> & xTransfer,bool bPreferText=false)3737cdf0e10cSrcweir sal_uLong lcl_GetDropFormatId( const uno::Reference<datatransfer::XTransferable>& xTransfer, bool bPreferText = false )
3738cdf0e10cSrcweir {
3739cdf0e10cSrcweir     TransferableDataHelper aDataHelper( xTransfer );
3740cdf0e10cSrcweir 
3741cdf0e10cSrcweir     if ( !aDataHelper.HasFormat( SOT_FORMATSTR_ID_SBA_DATAEXCHANGE ) )
3742cdf0e10cSrcweir     {
3743cdf0e10cSrcweir         //  use bookmark formats if no sba is present
3744cdf0e10cSrcweir 
3745cdf0e10cSrcweir         if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SOLK ) )
3746cdf0e10cSrcweir             return SOT_FORMATSTR_ID_SOLK;
3747cdf0e10cSrcweir         else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) )
3748cdf0e10cSrcweir             return SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR;
3749cdf0e10cSrcweir         else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) )
3750cdf0e10cSrcweir             return SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK;
3751cdf0e10cSrcweir         else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) )
3752cdf0e10cSrcweir             return SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR;
3753cdf0e10cSrcweir     }
3754cdf0e10cSrcweir 
3755cdf0e10cSrcweir     sal_uLong nFormatId = 0;
3756cdf0e10cSrcweir     if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) )
3757cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_DRAWING;
3758cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) )
3759cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_SVXB;
3760cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE ) )
3761cdf0e10cSrcweir     {
3762cdf0e10cSrcweir         //  If it's a Writer object, insert RTF instead of OLE
3763cdf0e10cSrcweir 
3764cdf0e10cSrcweir         sal_Bool bDoRtf = sal_False;
3765cdf0e10cSrcweir         SotStorageStreamRef xStm;
3766cdf0e10cSrcweir         TransferableObjectDescriptor aObjDesc;
3767cdf0e10cSrcweir         if( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) &&
3768cdf0e10cSrcweir             aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_EMBED_SOURCE, xStm ) )
3769cdf0e10cSrcweir         {
3770cdf0e10cSrcweir             SotStorageRef xStore( new SotStorage( *xStm ) );
3771cdf0e10cSrcweir             bDoRtf = ( ( aObjDesc.maClassName == SvGlobalName( SO3_SW_CLASSID ) ||
3772cdf0e10cSrcweir                          aObjDesc.maClassName == SvGlobalName( SO3_SWWEB_CLASSID ) )
3773cdf0e10cSrcweir                        && aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
3774cdf0e10cSrcweir         }
3775cdf0e10cSrcweir         if ( bDoRtf )
3776cdf0e10cSrcweir             nFormatId = FORMAT_RTF;
3777cdf0e10cSrcweir         else
3778cdf0e10cSrcweir             nFormatId = SOT_FORMATSTR_ID_EMBED_SOURCE;
3779cdf0e10cSrcweir     }
3780cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE ) )
3781cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_LINK_SOURCE;
3782cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SBA_DATAEXCHANGE ) )
3783cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_SBA_DATAEXCHANGE;
3784cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE ) )
3785cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_SBA_FIELDDATAEXCHANGE;
3786cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_BIFF_8 ) )
3787cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_BIFF_8;
3788cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_BIFF_5 ) )
3789cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_BIFF_5;
3790cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE ) )
3791cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_EMBED_SOURCE_OLE;
3792cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ) )
3793cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE;
3794cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE_OLE ) )
3795cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_LINK_SOURCE_OLE;
3796cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_RTF ) )
3797cdf0e10cSrcweir         nFormatId = SOT_FORMAT_RTF;
3798cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_HTML ) )
3799cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_HTML;
3800cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_HTML_SIMPLE ) )
3801cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_HTML_SIMPLE;
3802cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SYLK ) )
3803cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_SYLK;
3804cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK ) )
3805cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_LINK;
3806cdf0e10cSrcweir     else if ( bPreferText && aDataHelper.HasFormat( SOT_FORMAT_STRING ) ) // #i86734# the behaviour introduced in #i62773# is wrong when pasting
3807cdf0e10cSrcweir         nFormatId = SOT_FORMAT_STRING;
3808cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) )
3809cdf0e10cSrcweir         nFormatId = SOT_FORMAT_FILE_LIST;
3810cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_FILE ) )    // #i62773# FILE_LIST/FILE before STRING (Unix file managers)
3811cdf0e10cSrcweir         nFormatId = SOT_FORMAT_FILE;
3812cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) )
3813cdf0e10cSrcweir         nFormatId = SOT_FORMAT_STRING;
3814cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_GDIMETAFILE ) )
3815cdf0e10cSrcweir         nFormatId = SOT_FORMAT_GDIMETAFILE;
3816a206ee71SArmin Le Grand     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_PNG ) )
3817a206ee71SArmin Le Grand         nFormatId = SOT_FORMATSTR_ID_PNG;
3818cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_BITMAP ) )
3819cdf0e10cSrcweir         nFormatId = SOT_FORMAT_BITMAP;
3820cdf0e10cSrcweir 
3821cdf0e10cSrcweir     return nFormatId;
3822cdf0e10cSrcweir }
3823cdf0e10cSrcweir 
lcl_GetDropLinkId(const uno::Reference<datatransfer::XTransferable> & xTransfer)3824cdf0e10cSrcweir sal_uLong lcl_GetDropLinkId( const uno::Reference<datatransfer::XTransferable>& xTransfer )
3825cdf0e10cSrcweir {
3826cdf0e10cSrcweir     TransferableDataHelper aDataHelper( xTransfer );
3827cdf0e10cSrcweir 
3828cdf0e10cSrcweir     sal_uLong nFormatId = 0;
3829cdf0e10cSrcweir     if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE ) )
3830cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_LINK_SOURCE;
3831cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK_SOURCE_OLE ) )
3832cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_LINK_SOURCE_OLE;
3833cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK ) )
3834cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_LINK;
3835cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) )
3836cdf0e10cSrcweir         nFormatId = SOT_FORMAT_FILE_LIST;
3837cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMAT_FILE ) )
3838cdf0e10cSrcweir         nFormatId = SOT_FORMAT_FILE;
3839cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SOLK ) )
3840cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_SOLK;
3841cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) )
3842cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR;
3843cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ) )
3844cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK;
3845cdf0e10cSrcweir     else if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) )
3846cdf0e10cSrcweir         nFormatId = SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR;
3847cdf0e10cSrcweir 
3848cdf0e10cSrcweir     return nFormatId;
3849cdf0e10cSrcweir }
3850cdf0e10cSrcweir 
3851cdf0e10cSrcweir 
ExecutePrivateDrop(const ExecuteDropEvent & rEvt)3852cdf0e10cSrcweir sal_Int8 ScGridWindow::ExecutePrivateDrop( const ExecuteDropEvent& rEvt )
3853cdf0e10cSrcweir {
3854cdf0e10cSrcweir     // hide drop marker
3855cdf0e10cSrcweir     // if (bDragRect)
3856cdf0e10cSrcweir     //  pViewData->GetView()->DrawDragRect( nDragStartX, nDragStartY, nDragEndX, nDragEndY, eWhich );
3857cdf0e10cSrcweir     bDragRect = sal_False;
3858cdf0e10cSrcweir     UpdateDragRectOverlay();
3859cdf0e10cSrcweir 
3860cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
3861cdf0e10cSrcweir     const ScDragData& rData = pScMod->GetDragData();
3862cdf0e10cSrcweir 
3863cdf0e10cSrcweir     return DropTransferObj( rData.pCellTransfer, nDragStartX, nDragStartY,
3864cdf0e10cSrcweir                                 PixelToLogic(rEvt.maPosPixel), rEvt.mnAction );
3865cdf0e10cSrcweir }
3866cdf0e10cSrcweir 
DropTransferObj(ScTransferObj * pTransObj,SCCOL nDestPosX,SCROW nDestPosY,const Point & rLogicPos,sal_Int8 nDndAction)3867cdf0e10cSrcweir sal_Int8 ScGridWindow::DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPosX, SCROW nDestPosY,
3868cdf0e10cSrcweir                                         const Point& rLogicPos, sal_Int8 nDndAction )
3869cdf0e10cSrcweir {
3870cdf0e10cSrcweir     if ( !pTransObj )
3871cdf0e10cSrcweir         return 0;
3872cdf0e10cSrcweir 
3873cdf0e10cSrcweir     ScDocument* pSourceDoc = pTransObj->GetSourceDocument();
3874cdf0e10cSrcweir     ScDocShell* pDocSh     = pViewData->GetDocShell();
3875cdf0e10cSrcweir     ScDocument* pThisDoc   = pViewData->GetDocument();
3876cdf0e10cSrcweir     ScViewFunc* pView      = pViewData->GetView();
3877cdf0e10cSrcweir     SCTAB       nThisTab   = pViewData->GetTabNo();
3878cdf0e10cSrcweir     sal_uInt16 nFlags = pTransObj->GetDragSourceFlags();
3879cdf0e10cSrcweir 
3880cdf0e10cSrcweir     sal_Bool bIsNavi = ( nFlags & SC_DROP_NAVIGATOR ) != 0;
3881cdf0e10cSrcweir     sal_Bool bIsMove = ( nDndAction == DND_ACTION_MOVE && !bIsNavi );
3882cdf0e10cSrcweir 
3883cdf0e10cSrcweir     // workaround for wrong nDndAction on Windows when pressing solely
3884cdf0e10cSrcweir     // the Alt key during drag and drop;
3885cdf0e10cSrcweir     // can be removed after #i79215# has been fixed
3886cdf0e10cSrcweir     if ( meDragInsertMode != INS_NONE )
3887cdf0e10cSrcweir     {
3888cdf0e10cSrcweir         bIsMove = ( nDndAction & DND_ACTION_MOVE && !bIsNavi );
3889cdf0e10cSrcweir     }
3890cdf0e10cSrcweir 
3891cdf0e10cSrcweir     sal_Bool bIsLink = ( nDndAction == DND_ACTION_LINK );
3892cdf0e10cSrcweir 
3893cdf0e10cSrcweir     ScRange aSource = pTransObj->GetRange();
3894cdf0e10cSrcweir 
3895cdf0e10cSrcweir     //  only use visible tab from source range - when dragging within one table,
3896cdf0e10cSrcweir     //  all selected tables at the time of dropping are used (handled in MoveBlockTo)
3897cdf0e10cSrcweir     SCTAB nSourceTab = pTransObj->GetVisibleTab();
3898cdf0e10cSrcweir     aSource.aStart.SetTab( nSourceTab );
3899cdf0e10cSrcweir     aSource.aEnd.SetTab( nSourceTab );
3900cdf0e10cSrcweir 
3901cdf0e10cSrcweir     SCCOL nSizeX = aSource.aEnd.Col() - aSource.aStart.Col() + 1;
3902cdf0e10cSrcweir     SCROW nSizeY = (bIsMove ? (aSource.aEnd.Row() - aSource.aStart.Row() + 1) :
3903cdf0e10cSrcweir             pTransObj->GetNonFilteredRows());   // copy/link: no filtered rows
3904cdf0e10cSrcweir     ScRange aDest( nDestPosX, nDestPosY, nThisTab,
3905cdf0e10cSrcweir                    nDestPosX + nSizeX - 1, nDestPosY + nSizeY - 1, nThisTab );
3906cdf0e10cSrcweir 
3907cdf0e10cSrcweir 
3908cdf0e10cSrcweir     /* NOTE: AcceptPrivateDrop() already checked for filtered conditions during
3909cdf0e10cSrcweir      * dragging and adapted drawing of the selection frame. We check here
3910cdf0e10cSrcweir      * (again) because this may actually also be called from PasteSelection(),
3911cdf0e10cSrcweir      * we would have to duplicate determination of flags and destination range
3912cdf0e10cSrcweir      * and would lose the context of the "filtered destination is OK" cases
3913cdf0e10cSrcweir      * below, which is already awkward enough as is. */
3914cdf0e10cSrcweir 
3915cdf0e10cSrcweir     // Don't move filtered source.
3916cdf0e10cSrcweir     bool bFiltered = (bIsMove && pTransObj->HasFilteredRows());
3917cdf0e10cSrcweir     if (!bFiltered)
3918cdf0e10cSrcweir     {
3919cdf0e10cSrcweir         if (pSourceDoc != pThisDoc && ((nFlags & SC_DROP_TABLE) ||
3920cdf0e10cSrcweir                     (!bIsLink && meDragInsertMode == INS_NONE)))
3921cdf0e10cSrcweir         {
3922cdf0e10cSrcweir             // Nothing. Either entire sheet to be dropped, or the one case
3923cdf0e10cSrcweir             // where PasteFromClip() is to be called that handles a filtered
3924cdf0e10cSrcweir             // destination itself. Drag-copy from another document without
3925cdf0e10cSrcweir             // inserting cells.
3926cdf0e10cSrcweir         }
3927cdf0e10cSrcweir         else
3928cdf0e10cSrcweir             // Don't copy or move to filtered destination.
3929cdf0e10cSrcweir             bFiltered = ScViewUtil::HasFiltered( aDest, pThisDoc);
3930cdf0e10cSrcweir     }
3931cdf0e10cSrcweir 
3932cdf0e10cSrcweir     sal_Bool bDone = sal_False;
3933cdf0e10cSrcweir 
3934cdf0e10cSrcweir     if (!bFiltered && pSourceDoc == pThisDoc)
3935cdf0e10cSrcweir     {
3936cdf0e10cSrcweir         if ( nFlags & SC_DROP_TABLE )           // whole sheet?
3937cdf0e10cSrcweir         {
3938cdf0e10cSrcweir             if ( pThisDoc->IsDocEditable() )
3939cdf0e10cSrcweir             {
3940cdf0e10cSrcweir                 SCTAB nSrcTab = aSource.aStart.Tab();
3941cdf0e10cSrcweir                 pViewData->GetDocShell()->MoveTable( nSrcTab, nThisTab, !bIsMove, sal_True );   // with Undo
3942cdf0e10cSrcweir                 pView->SetTabNo( nThisTab, sal_True );
3943cdf0e10cSrcweir                 bDone = sal_True;
3944cdf0e10cSrcweir             }
3945cdf0e10cSrcweir         }
3946cdf0e10cSrcweir         else                                        // move/copy block
3947cdf0e10cSrcweir         {
3948cdf0e10cSrcweir             String aChartName;
3949cdf0e10cSrcweir             if (pThisDoc->HasChartAtPoint( nThisTab, rLogicPos, &aChartName ))
3950cdf0e10cSrcweir             {
3951cdf0e10cSrcweir                 String aRangeName;
3952cdf0e10cSrcweir                 aSource.Format( aRangeName, SCR_ABS_3D, pThisDoc );
3953cdf0e10cSrcweir                 SfxStringItem aNameItem( SID_CHART_NAME, aChartName );
3954cdf0e10cSrcweir                 SfxStringItem aRangeItem( SID_CHART_SOURCE, aRangeName );
3955cdf0e10cSrcweir                 sal_uInt16 nId = bIsMove ? SID_CHART_SOURCE : SID_CHART_ADDSOURCE;
3956cdf0e10cSrcweir                 pViewData->GetDispatcher().Execute( nId, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
3957cdf0e10cSrcweir                                             &aRangeItem, &aNameItem, (void*) NULL );
3958cdf0e10cSrcweir                 bDone = sal_True;
3959cdf0e10cSrcweir             }
3960cdf0e10cSrcweir             else if ( pThisDoc->GetDPAtCursor( nDestPosX, nDestPosY, nThisTab ) )
3961cdf0e10cSrcweir             {
3962cdf0e10cSrcweir                 // drop on DataPilot table: try to sort, fail if that isn't possible
3963cdf0e10cSrcweir 
3964cdf0e10cSrcweir                 ScAddress aDestPos( nDestPosX, nDestPosY, nThisTab );
3965cdf0e10cSrcweir                 if ( aDestPos != aSource.aStart )
3966cdf0e10cSrcweir                     bDone = pViewData->GetView()->DataPilotMove( aSource, aDestPos );
3967cdf0e10cSrcweir                 else
3968cdf0e10cSrcweir                     bDone = sal_True;   // same position: nothing
3969cdf0e10cSrcweir             }
3970cdf0e10cSrcweir             else if ( nDestPosX != aSource.aStart.Col() || nDestPosY != aSource.aStart.Row() ||
3971cdf0e10cSrcweir                         nSourceTab != nThisTab )
3972cdf0e10cSrcweir             {
3973cdf0e10cSrcweir                 String aUndo = ScGlobal::GetRscString( bIsMove ? STR_UNDO_MOVE : STR_UNDO_COPY );
3974cdf0e10cSrcweir                 pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
3975cdf0e10cSrcweir 
3976cdf0e10cSrcweir                 bDone = sal_True;
3977cdf0e10cSrcweir                 if ( meDragInsertMode != INS_NONE )
3978cdf0e10cSrcweir                 {
3979cdf0e10cSrcweir                     // call with bApi = sal_True to avoid error messages in drop handler
3980cdf0e10cSrcweir                     bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, sal_True /*bRecord*/, sal_True /*bApi*/, sal_True /*bPartOfPaste*/ );
3981cdf0e10cSrcweir                     if ( bDone )
3982cdf0e10cSrcweir                     {
3983cdf0e10cSrcweir                         if ( nThisTab == nSourceTab )
3984cdf0e10cSrcweir                         {
3985cdf0e10cSrcweir                             if ( meDragInsertMode == INS_CELLSDOWN &&
3986cdf0e10cSrcweir                                  nDestPosX == aSource.aStart.Col() && nDestPosY < aSource.aStart.Row() )
3987cdf0e10cSrcweir                             {
3988cdf0e10cSrcweir                                 bDone = aSource.Move( 0, nSizeY, 0, pSourceDoc );
3989cdf0e10cSrcweir                             }
3990cdf0e10cSrcweir                             else if ( meDragInsertMode == INS_CELLSRIGHT &&
3991cdf0e10cSrcweir                                       nDestPosY == aSource.aStart.Row() && nDestPosX < aSource.aStart.Col() )
3992cdf0e10cSrcweir                             {
3993cdf0e10cSrcweir                                 bDone = aSource.Move( nSizeX, 0, 0, pSourceDoc );
3994cdf0e10cSrcweir                             }
3995cdf0e10cSrcweir                         }
3996cdf0e10cSrcweir                         pDocSh->UpdateOle( pViewData );
3997cdf0e10cSrcweir                         pView->CellContentChanged();
3998cdf0e10cSrcweir                     }
3999cdf0e10cSrcweir                 }
4000cdf0e10cSrcweir 
4001cdf0e10cSrcweir                 if ( bDone )
4002cdf0e10cSrcweir                 {
4003cdf0e10cSrcweir                     if ( bIsLink )
4004cdf0e10cSrcweir                     {
4005cdf0e10cSrcweir                         // call with bApi = sal_True to avoid error messages in drop handler
4006cdf0e10cSrcweir                         bDone = pView->LinkBlock( aSource, aDest.aStart, sal_True /*bApi*/ );
4007cdf0e10cSrcweir                     }
4008cdf0e10cSrcweir                     else
4009cdf0e10cSrcweir                     {
4010cdf0e10cSrcweir                         // call with bApi = sal_True to avoid error messages in drop handler
4011cdf0e10cSrcweir                         bDone = pView->MoveBlockTo( aSource, aDest.aStart, bIsMove, sal_True /*bRecord*/, sal_True /*bPaint*/, sal_True /*bApi*/ );
4012cdf0e10cSrcweir                     }
4013cdf0e10cSrcweir                 }
4014cdf0e10cSrcweir 
4015cdf0e10cSrcweir                 if ( bDone && meDragInsertMode != INS_NONE && bIsMove && nThisTab == nSourceTab )
4016cdf0e10cSrcweir                 {
4017cdf0e10cSrcweir                     DelCellCmd eCmd = DEL_NONE;
4018cdf0e10cSrcweir                     if ( meDragInsertMode == INS_CELLSDOWN )
4019cdf0e10cSrcweir                     {
4020cdf0e10cSrcweir                         eCmd = DEL_CELLSUP;
4021cdf0e10cSrcweir                     }
4022cdf0e10cSrcweir                     else if ( meDragInsertMode == INS_CELLSRIGHT )
4023cdf0e10cSrcweir                     {
4024cdf0e10cSrcweir                         eCmd = DEL_CELLSLEFT;
4025cdf0e10cSrcweir                     }
4026cdf0e10cSrcweir 
4027cdf0e10cSrcweir                     if ( ( eCmd == DEL_CELLSUP  && nDestPosX == aSource.aStart.Col() ) ||
4028cdf0e10cSrcweir                          ( eCmd == DEL_CELLSLEFT && nDestPosY == aSource.aStart.Row() ) )
4029cdf0e10cSrcweir                     {
4030cdf0e10cSrcweir                         // call with bApi = sal_True to avoid error messages in drop handler
4031cdf0e10cSrcweir                         bDone = pDocSh->GetDocFunc().DeleteCells( aSource, NULL, eCmd, sal_True /*bRecord*/, sal_True /*bApi*/ );
4032cdf0e10cSrcweir                         if ( bDone )
4033cdf0e10cSrcweir                         {
4034cdf0e10cSrcweir                             if ( eCmd == DEL_CELLSUP && nDestPosY > aSource.aEnd.Row() )
4035cdf0e10cSrcweir                             {
4036cdf0e10cSrcweir                                 bDone = aDest.Move( 0, -nSizeY, 0, pThisDoc );
4037cdf0e10cSrcweir                             }
4038cdf0e10cSrcweir                             else if ( eCmd == DEL_CELLSLEFT && nDestPosX > aSource.aEnd.Col() )
4039cdf0e10cSrcweir                             {
4040cdf0e10cSrcweir                                 bDone = aDest.Move( -nSizeX, 0, 0, pThisDoc );
4041cdf0e10cSrcweir                             }
4042cdf0e10cSrcweir                             pDocSh->UpdateOle( pViewData );
4043cdf0e10cSrcweir                             pView->CellContentChanged();
4044cdf0e10cSrcweir                         }
4045cdf0e10cSrcweir                     }
4046cdf0e10cSrcweir                 }
4047cdf0e10cSrcweir 
4048cdf0e10cSrcweir                 if ( bDone )
4049cdf0e10cSrcweir                 {
4050cdf0e10cSrcweir                     pView->MarkRange( aDest, sal_False, sal_False );
4051cdf0e10cSrcweir                     pView->SetCursor( aDest.aEnd.Col(), aDest.aEnd.Row() );
4052cdf0e10cSrcweir                 }
4053cdf0e10cSrcweir 
4054cdf0e10cSrcweir                 pDocSh->GetUndoManager()->LeaveListAction();
4055cdf0e10cSrcweir 
4056cdf0e10cSrcweir                 if (!bDone)
4057cdf0e10cSrcweir                     Sound::Beep();  // instead of error message in drop handler
4058cdf0e10cSrcweir             }
4059cdf0e10cSrcweir             else
4060cdf0e10cSrcweir                 bDone = sal_True;       // nothing to do
4061cdf0e10cSrcweir         }
4062cdf0e10cSrcweir 
4063cdf0e10cSrcweir         if (bDone)
4064cdf0e10cSrcweir             pTransObj->SetDragWasInternal();    // don't delete source in DragFinished
4065cdf0e10cSrcweir     }
4066cdf0e10cSrcweir     else if ( !bFiltered && pSourceDoc )                        // between documents
4067cdf0e10cSrcweir     {
4068cdf0e10cSrcweir         if ( nFlags & SC_DROP_TABLE )           // copy/link sheets between documents
4069cdf0e10cSrcweir         {
4070cdf0e10cSrcweir             if ( pThisDoc->IsDocEditable() )
4071cdf0e10cSrcweir             {
4072cdf0e10cSrcweir                 ScDocShell* pSrcShell = pTransObj->GetSourceDocShell();
4073cdf0e10cSrcweir 
4074cdf0e10cSrcweir                 SCTAB nTabs[MAXTABCOUNT];
4075cdf0e10cSrcweir 
4076cdf0e10cSrcweir                 ScMarkData  aMark       = pTransObj->GetSourceMarkData();
4077cdf0e10cSrcweir                 SCTAB       nTabCount   = pSourceDoc->GetTableCount();
4078cdf0e10cSrcweir                 SCTAB       nTabSelCount = 0;
4079cdf0e10cSrcweir 
4080cdf0e10cSrcweir                 for(SCTAB i=0; i<nTabCount; i++)
4081cdf0e10cSrcweir                 {
4082cdf0e10cSrcweir                     if(aMark.GetTableSelect(i))
4083cdf0e10cSrcweir                     {
4084cdf0e10cSrcweir                         nTabs[nTabSelCount++]=i;
4085cdf0e10cSrcweir                         for(SCTAB j=i+1;j<nTabCount;j++)
4086cdf0e10cSrcweir                         {
4087cdf0e10cSrcweir                             if((!pSourceDoc->IsVisible(j))&&(pSourceDoc->IsScenario(j)))
4088cdf0e10cSrcweir                             {
4089cdf0e10cSrcweir                                 nTabs[nTabSelCount++]=j;
4090cdf0e10cSrcweir                                 i=j;
4091cdf0e10cSrcweir                             }
4092cdf0e10cSrcweir                             else break;
4093cdf0e10cSrcweir                         }
4094cdf0e10cSrcweir                     }
4095cdf0e10cSrcweir                 }
4096cdf0e10cSrcweir 
4097cdf0e10cSrcweir                 pView->ImportTables( pSrcShell,nTabSelCount, nTabs, bIsLink, nThisTab );
4098cdf0e10cSrcweir                 bDone = sal_True;
4099cdf0e10cSrcweir             }
4100cdf0e10cSrcweir         }
4101cdf0e10cSrcweir         else if ( bIsLink )
4102cdf0e10cSrcweir         {
4103cdf0e10cSrcweir             //  as in PasteDDE
4104cdf0e10cSrcweir             //  (external references might be used instead?)
4105cdf0e10cSrcweir 
4106cdf0e10cSrcweir             SfxObjectShell* pSourceSh = pSourceDoc->GetDocumentShell();
4107cdf0e10cSrcweir             DBG_ASSERT(pSourceSh, "drag document has no shell");
4108cdf0e10cSrcweir             if (pSourceSh)
4109cdf0e10cSrcweir             {
4110cdf0e10cSrcweir                 String aUndo = ScGlobal::GetRscString( STR_UNDO_COPY );
4111cdf0e10cSrcweir                 pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
4112cdf0e10cSrcweir 
4113cdf0e10cSrcweir                 bDone = sal_True;
4114cdf0e10cSrcweir                 if ( meDragInsertMode != INS_NONE )
4115cdf0e10cSrcweir                 {
4116cdf0e10cSrcweir                     // call with bApi = sal_True to avoid error messages in drop handler
4117cdf0e10cSrcweir                     bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, sal_True /*bRecord*/, sal_True /*bApi*/, sal_True /*bPartOfPaste*/ );
4118cdf0e10cSrcweir                     if ( bDone )
4119cdf0e10cSrcweir                     {
4120cdf0e10cSrcweir                         pDocSh->UpdateOle( pViewData );
4121cdf0e10cSrcweir                         pView->CellContentChanged();
4122cdf0e10cSrcweir                     }
4123cdf0e10cSrcweir                 }
4124cdf0e10cSrcweir 
4125cdf0e10cSrcweir                 if ( bDone )
4126cdf0e10cSrcweir                 {
4127cdf0e10cSrcweir                     String aApp = Application::GetAppName();
4128cdf0e10cSrcweir                     String aTopic = pSourceSh->GetTitle( SFX_TITLE_FULLNAME );
4129cdf0e10cSrcweir                     String aItem;
4130cdf0e10cSrcweir                     aSource.Format( aItem, SCA_VALID | SCA_TAB_3D, pSourceDoc );
4131cdf0e10cSrcweir 
4132cdf0e10cSrcweir                     // TODO: we could define ocQuote for "
4133cdf0e10cSrcweir                     const String aQuote( '"' );
4134cdf0e10cSrcweir                     const String& sSep = ScCompiler::GetNativeSymbol( ocSep);
4135cdf0e10cSrcweir                     String aFormula( '=' );
4136cdf0e10cSrcweir                     aFormula += ScCompiler::GetNativeSymbol( ocDde);
4137cdf0e10cSrcweir                     aFormula += ScCompiler::GetNativeSymbol( ocOpen);
4138cdf0e10cSrcweir                     aFormula += aQuote;
4139cdf0e10cSrcweir                     aFormula += aApp;
4140cdf0e10cSrcweir                     aFormula += aQuote;
4141cdf0e10cSrcweir                     aFormula += sSep;
4142cdf0e10cSrcweir                     aFormula += aQuote;
4143cdf0e10cSrcweir                     aFormula += aTopic;
4144cdf0e10cSrcweir                     aFormula += aQuote;
4145cdf0e10cSrcweir                     aFormula += sSep;
4146cdf0e10cSrcweir                     aFormula += aQuote;
4147cdf0e10cSrcweir                     aFormula += aItem;
4148cdf0e10cSrcweir                     aFormula += aQuote;
4149cdf0e10cSrcweir                     aFormula += ScCompiler::GetNativeSymbol( ocClose);
4150cdf0e10cSrcweir 
4151cdf0e10cSrcweir                     pView->DoneBlockMode();
4152cdf0e10cSrcweir                     pView->InitBlockMode( nDestPosX, nDestPosY, nThisTab );
4153cdf0e10cSrcweir                     pView->MarkCursor( nDestPosX + nSizeX - 1,
4154cdf0e10cSrcweir                                        nDestPosY + nSizeY - 1, nThisTab );
4155cdf0e10cSrcweir 
4156cdf0e10cSrcweir                     pView->EnterMatrix( aFormula );
4157cdf0e10cSrcweir 
4158cdf0e10cSrcweir                     pView->MarkRange( aDest, sal_False, sal_False );
4159cdf0e10cSrcweir                     pView->SetCursor( aDest.aEnd.Col(), aDest.aEnd.Row() );
4160cdf0e10cSrcweir                 }
4161cdf0e10cSrcweir 
4162cdf0e10cSrcweir                 pDocSh->GetUndoManager()->LeaveListAction();
4163cdf0e10cSrcweir             }
4164cdf0e10cSrcweir         }
4165cdf0e10cSrcweir         else
4166cdf0e10cSrcweir         {
4167cdf0e10cSrcweir             //! HasSelectedBlockMatrixFragment without selected sheet?
4168cdf0e10cSrcweir             //! or don't start dragging on a part of a matrix
4169cdf0e10cSrcweir 
4170cdf0e10cSrcweir             String aUndo = ScGlobal::GetRscString( bIsMove ? STR_UNDO_MOVE : STR_UNDO_COPY );
4171cdf0e10cSrcweir             pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
4172cdf0e10cSrcweir 
4173cdf0e10cSrcweir             bDone = sal_True;
4174cdf0e10cSrcweir             if ( meDragInsertMode != INS_NONE )
4175cdf0e10cSrcweir             {
4176cdf0e10cSrcweir                 // call with bApi = sal_True to avoid error messages in drop handler
4177cdf0e10cSrcweir                 bDone = pDocSh->GetDocFunc().InsertCells( aDest, NULL, meDragInsertMode, sal_True /*bRecord*/, sal_True /*bApi*/, sal_True /*bPartOfPaste*/ );
4178cdf0e10cSrcweir                 if ( bDone )
4179cdf0e10cSrcweir                 {
4180cdf0e10cSrcweir                     pDocSh->UpdateOle( pViewData );
4181cdf0e10cSrcweir                     pView->CellContentChanged();
4182cdf0e10cSrcweir                 }
4183cdf0e10cSrcweir             }
4184cdf0e10cSrcweir 
4185cdf0e10cSrcweir             if ( bDone )
4186cdf0e10cSrcweir             {
4187cdf0e10cSrcweir                 pView->Unmark();  // before SetCursor, so CheckSelectionTransfer isn't called with a selection
4188cdf0e10cSrcweir                 pView->SetCursor( nDestPosX, nDestPosY );
4189cdf0e10cSrcweir                 bDone = pView->PasteFromClip( IDF_ALL, pTransObj->GetDocument() );  // clip-doc
4190cdf0e10cSrcweir                 if ( bDone )
4191cdf0e10cSrcweir                 {
4192cdf0e10cSrcweir                     pView->MarkRange( aDest, sal_False, sal_False );
4193cdf0e10cSrcweir                     pView->SetCursor( aDest.aEnd.Col(), aDest.aEnd.Row() );
4194cdf0e10cSrcweir                 }
4195cdf0e10cSrcweir             }
4196cdf0e10cSrcweir 
4197cdf0e10cSrcweir             pDocSh->GetUndoManager()->LeaveListAction();
4198cdf0e10cSrcweir 
4199cdf0e10cSrcweir             //  no longer call ResetMark here - the inserted block has been selected
4200cdf0e10cSrcweir             //  and may have been copied to primary selection
4201cdf0e10cSrcweir         }
4202cdf0e10cSrcweir     }
4203cdf0e10cSrcweir 
4204cdf0e10cSrcweir     sal_Int8 nRet = bDone ? nDndAction : DND_ACTION_NONE;
4205cdf0e10cSrcweir     return nRet;
4206cdf0e10cSrcweir }
4207cdf0e10cSrcweir 
ExecuteDrop(const ExecuteDropEvent & rEvt)4208cdf0e10cSrcweir sal_Int8 ScGridWindow::ExecuteDrop( const ExecuteDropEvent& rEvt )
4209cdf0e10cSrcweir {
4210cdf0e10cSrcweir     DrawMarkDropObj( NULL );    // drawing layer
4211cdf0e10cSrcweir 
4212cdf0e10cSrcweir     ScModule* pScMod = SC_MOD();
4213cdf0e10cSrcweir     const ScDragData& rData = pScMod->GetDragData();
4214cdf0e10cSrcweir     if (rData.pCellTransfer)
4215cdf0e10cSrcweir         return ExecutePrivateDrop( rEvt );
4216cdf0e10cSrcweir 
4217cdf0e10cSrcweir     Point aPos = rEvt.maPosPixel;
4218cdf0e10cSrcweir 
4219cdf0e10cSrcweir     if ( rData.aLinkDoc.Len() )
4220cdf0e10cSrcweir     {
4221cdf0e10cSrcweir         //  try to insert a link
4222cdf0e10cSrcweir 
4223cdf0e10cSrcweir         sal_Bool bOk = sal_True;
4224cdf0e10cSrcweir         String aThisName;
4225cdf0e10cSrcweir         ScDocShell* pDocSh = pViewData->GetDocShell();
4226cdf0e10cSrcweir         if (pDocSh && pDocSh->HasName())
4227cdf0e10cSrcweir             aThisName = pDocSh->GetMedium()->GetName();
4228cdf0e10cSrcweir 
4229cdf0e10cSrcweir         if ( rData.aLinkDoc == aThisName )              // error - no link within a document
4230cdf0e10cSrcweir             bOk = sal_False;
4231cdf0e10cSrcweir         else
4232cdf0e10cSrcweir         {
4233cdf0e10cSrcweir             ScViewFunc* pView = pViewData->GetView();
4234cdf0e10cSrcweir             if ( rData.aLinkTable.Len() )
4235cdf0e10cSrcweir                 pView->InsertTableLink( rData.aLinkDoc, EMPTY_STRING, EMPTY_STRING,
4236cdf0e10cSrcweir                                         rData.aLinkTable );
4237cdf0e10cSrcweir             else if ( rData.aLinkArea.Len() )
4238cdf0e10cSrcweir             {
4239cdf0e10cSrcweir                 SCsCOL  nPosX;
4240cdf0e10cSrcweir                 SCsROW  nPosY;
4241cdf0e10cSrcweir                 pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
4242cdf0e10cSrcweir                 pView->MoveCursorAbs( nPosX, nPosY, SC_FOLLOW_NONE, sal_False, sal_False );
4243cdf0e10cSrcweir 
4244cdf0e10cSrcweir                 pView->InsertAreaLink( rData.aLinkDoc, EMPTY_STRING, EMPTY_STRING,
4245cdf0e10cSrcweir                                         rData.aLinkArea, 0 );
4246cdf0e10cSrcweir             }
4247cdf0e10cSrcweir             else
4248cdf0e10cSrcweir             {
4249cdf0e10cSrcweir                 DBG_ERROR("drop with link: no sheet nor area");
4250cdf0e10cSrcweir                 bOk = sal_False;
4251cdf0e10cSrcweir             }
4252cdf0e10cSrcweir         }
4253cdf0e10cSrcweir 
4254cdf0e10cSrcweir         return bOk ? rEvt.mnAction : DND_ACTION_NONE;           // don't try anything else
4255cdf0e10cSrcweir     }
4256cdf0e10cSrcweir 
4257cdf0e10cSrcweir     Point aLogicPos = PixelToLogic(aPos);
42583cc56398SArmin Le Grand     sal_Bool bIsLink = ( rEvt.mnAction == DND_ACTION_LINK );
4259cdf0e10cSrcweir 
42603cc56398SArmin Le Grand     if (!bIsLink && rData.pDrawTransfer)
4261cdf0e10cSrcweir     {
4262cdf0e10cSrcweir         sal_uInt16 nFlags = rData.pDrawTransfer->GetDragSourceFlags();
4263cdf0e10cSrcweir 
4264cdf0e10cSrcweir         sal_Bool bIsNavi = ( nFlags & SC_DROP_NAVIGATOR ) != 0;
4265cdf0e10cSrcweir         sal_Bool bIsMove = ( rEvt.mnAction == DND_ACTION_MOVE && !bIsNavi );
4266cdf0e10cSrcweir 
4267cdf0e10cSrcweir         bPasteIsMove = bIsMove;
4268cdf0e10cSrcweir 
4269cdf0e10cSrcweir         pViewData->GetView()->PasteDraw( aLogicPos, rData.pDrawTransfer->GetModel() );
4270cdf0e10cSrcweir 
4271cdf0e10cSrcweir         if (bPasteIsMove)
4272cdf0e10cSrcweir             rData.pDrawTransfer->SetDragWasInternal();
4273cdf0e10cSrcweir         bPasteIsMove = sal_False;
4274cdf0e10cSrcweir 
4275cdf0e10cSrcweir         return rEvt.mnAction;
4276cdf0e10cSrcweir     }
4277cdf0e10cSrcweir 
4278cdf0e10cSrcweir 
4279cdf0e10cSrcweir     SCsCOL  nPosX;
4280cdf0e10cSrcweir     SCsROW  nPosY;
4281cdf0e10cSrcweir     pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
4282cdf0e10cSrcweir 
4283cdf0e10cSrcweir     if (rData.aJumpTarget.Len())
4284cdf0e10cSrcweir     {
4285cdf0e10cSrcweir         //  internal bookmark (from Navigator)
4286cdf0e10cSrcweir         //  bookmark clipboard formats are in PasteScDataObject
4287cdf0e10cSrcweir 
4288cdf0e10cSrcweir         if ( !rData.pJumpLocalDoc || rData.pJumpLocalDoc == pViewData->GetDocument() )
4289cdf0e10cSrcweir         {
4290cdf0e10cSrcweir             pViewData->GetViewShell()->InsertBookmark( rData.aJumpText, rData.aJumpTarget,
4291cdf0e10cSrcweir                                                         nPosX, nPosY );
4292cdf0e10cSrcweir             return rEvt.mnAction;
4293cdf0e10cSrcweir         }
4294cdf0e10cSrcweir     }
4295cdf0e10cSrcweir 
4296cdf0e10cSrcweir     ScDocument* pThisDoc = pViewData->GetDocument();
4297cdf0e10cSrcweir     SdrObject* pHitObj = pThisDoc->GetObjectAtPoint( pViewData->GetTabNo(), PixelToLogic(aPos) );
4298cdf0e10cSrcweir     if ( pHitObj && bIsLink )
4299cdf0e10cSrcweir     {
4300cdf0e10cSrcweir         //  dropped on drawing object
430152f1c2eeSArmin Le Grand         //  PasteOnDrawObjectLinked checks for valid formats
430252f1c2eeSArmin Le Grand         if ( pViewData->GetView()->PasteOnDrawObjectLinked( rEvt.maDropEvent.Transferable, *pHitObj ) )
4303cdf0e10cSrcweir             return rEvt.mnAction;
4304cdf0e10cSrcweir     }
4305cdf0e10cSrcweir 
4306cdf0e10cSrcweir     sal_Bool bDone = sal_False;
4307cdf0e10cSrcweir 
4308cdf0e10cSrcweir     sal_uLong nFormatId = bIsLink ?
4309cdf0e10cSrcweir                         lcl_GetDropLinkId( rEvt.maDropEvent.Transferable ) :
4310cdf0e10cSrcweir                         lcl_GetDropFormatId( rEvt.maDropEvent.Transferable );
4311cdf0e10cSrcweir     if ( nFormatId )
4312cdf0e10cSrcweir     {
4313cdf0e10cSrcweir         pScMod->SetInExecuteDrop( sal_True );   // #i28468# prevent error messages from PasteDataFormat
4314cdf0e10cSrcweir         bPasteIsDrop = sal_True;
4315cdf0e10cSrcweir         bDone = pViewData->GetView()->PasteDataFormat(
4316cdf0e10cSrcweir                     nFormatId, rEvt.maDropEvent.Transferable, nPosX, nPosY, &aLogicPos, bIsLink );
4317cdf0e10cSrcweir         bPasteIsDrop = sal_False;
4318cdf0e10cSrcweir         pScMod->SetInExecuteDrop( sal_False );
4319cdf0e10cSrcweir     }
4320cdf0e10cSrcweir 
4321cdf0e10cSrcweir     sal_Int8 nRet = bDone ? rEvt.mnAction : DND_ACTION_NONE;
4322cdf0e10cSrcweir     return nRet;
4323cdf0e10cSrcweir }
4324cdf0e10cSrcweir 
4325cdf0e10cSrcweir //--------------------------------------------------------
4326cdf0e10cSrcweir 
PasteSelection(const Point & rPosPixel)4327cdf0e10cSrcweir void ScGridWindow::PasteSelection( const Point& rPosPixel )
4328cdf0e10cSrcweir {
4329cdf0e10cSrcweir     Point aLogicPos = PixelToLogic( rPosPixel );
4330cdf0e10cSrcweir 
4331cdf0e10cSrcweir     SCsCOL  nPosX;
4332cdf0e10cSrcweir     SCsROW  nPosY;
4333cdf0e10cSrcweir     pViewData->GetPosFromPixel( rPosPixel.X(), rPosPixel.Y(), eWhich, nPosX, nPosY );
4334cdf0e10cSrcweir 
4335cdf0e10cSrcweir     ScSelectionTransferObj* pOwnSelection = SC_MOD()->GetSelectionTransfer();
4336cdf0e10cSrcweir     if ( pOwnSelection )
4337cdf0e10cSrcweir     {
4338cdf0e10cSrcweir         //  within Calc
4339cdf0e10cSrcweir 
4340cdf0e10cSrcweir         ScTransferObj* pCellTransfer = pOwnSelection->GetCellData();
4341cdf0e10cSrcweir         if ( pCellTransfer )
4342cdf0e10cSrcweir         {
4343cdf0e10cSrcweir             // keep a reference to the data in case the selection is changed during paste
4344cdf0e10cSrcweir             uno::Reference<datatransfer::XTransferable> xRef( pCellTransfer );
4345cdf0e10cSrcweir             DropTransferObj( pCellTransfer, nPosX, nPosY, aLogicPos, DND_ACTION_COPY );
4346cdf0e10cSrcweir         }
4347cdf0e10cSrcweir         else
4348cdf0e10cSrcweir         {
4349cdf0e10cSrcweir             ScDrawTransferObj* pDrawTransfer = pOwnSelection->GetDrawData();
4350cdf0e10cSrcweir             if ( pDrawTransfer )
4351cdf0e10cSrcweir             {
4352cdf0e10cSrcweir                 // keep a reference to the data in case the selection is changed during paste
4353cdf0e10cSrcweir                 uno::Reference<datatransfer::XTransferable> xRef( pDrawTransfer );
4354cdf0e10cSrcweir 
4355cdf0e10cSrcweir                 //  #96821# bSameDocClipboard argument for PasteDraw is needed
4356cdf0e10cSrcweir                 //  because only DragData is checked directly inside PasteDraw
4357cdf0e10cSrcweir                 pViewData->GetView()->PasteDraw( aLogicPos, pDrawTransfer->GetModel(), sal_False,
4358cdf0e10cSrcweir                             pDrawTransfer->GetSourceDocID() == pViewData->GetDocument()->GetDocumentID() );
4359cdf0e10cSrcweir             }
4360cdf0e10cSrcweir         }
4361cdf0e10cSrcweir     }
4362cdf0e10cSrcweir     else
4363cdf0e10cSrcweir     {
4364cdf0e10cSrcweir         //  get selection from system
4365cdf0e10cSrcweir 
4366cdf0e10cSrcweir         TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSelection( this ) );
4367cdf0e10cSrcweir         uno::Reference<datatransfer::XTransferable> xTransferable = aDataHelper.GetTransferable();
4368cdf0e10cSrcweir         if ( xTransferable.is() )
4369cdf0e10cSrcweir         {
4370cdf0e10cSrcweir             sal_uLong nFormatId = lcl_GetDropFormatId( xTransferable, true );
4371cdf0e10cSrcweir             if ( nFormatId )
4372cdf0e10cSrcweir             {
4373cdf0e10cSrcweir                 bPasteIsDrop = sal_True;
4374cdf0e10cSrcweir                 pViewData->GetView()->PasteDataFormat( nFormatId, xTransferable, nPosX, nPosY, &aLogicPos );
4375cdf0e10cSrcweir                 bPasteIsDrop = sal_False;
4376cdf0e10cSrcweir             }
4377cdf0e10cSrcweir         }
4378cdf0e10cSrcweir     }
4379cdf0e10cSrcweir }
4380cdf0e10cSrcweir 
4381cdf0e10cSrcweir //--------------------------------------------------------
4382cdf0e10cSrcweir 
UpdateEditViewPos()4383cdf0e10cSrcweir void ScGridWindow::UpdateEditViewPos()
4384cdf0e10cSrcweir {
4385cdf0e10cSrcweir     if (pViewData->HasEditView(eWhich))
4386cdf0e10cSrcweir     {
4387cdf0e10cSrcweir         EditView* pView;
4388cdf0e10cSrcweir         SCCOL nCol;
4389cdf0e10cSrcweir         SCROW nRow;
4390cdf0e10cSrcweir         pViewData->GetEditView( eWhich, pView, nCol, nRow );
4391cdf0e10cSrcweir         SCCOL nEndCol = pViewData->GetEditEndCol();
4392cdf0e10cSrcweir         SCROW nEndRow = pViewData->GetEditEndRow();
4393cdf0e10cSrcweir 
4394cdf0e10cSrcweir         //  hide EditView?
4395cdf0e10cSrcweir 
4396cdf0e10cSrcweir         sal_Bool bHide = ( nEndCol<pViewData->GetPosX(eHWhich) || nEndRow<pViewData->GetPosY(eVWhich) );
4397cdf0e10cSrcweir         if ( SC_MOD()->IsFormulaMode() )
4398cdf0e10cSrcweir             if ( pViewData->GetTabNo() != pViewData->GetRefTabNo() )
4399cdf0e10cSrcweir                 bHide = sal_True;
4400cdf0e10cSrcweir 
4401cdf0e10cSrcweir         if (bHide)
4402cdf0e10cSrcweir         {
4403cdf0e10cSrcweir             Rectangle aRect = pView->GetOutputArea();
4404cdf0e10cSrcweir             long nHeight = aRect.Bottom() - aRect.Top();
4405cdf0e10cSrcweir             aRect.Top() = PixelToLogic(GetOutputSizePixel(), pViewData->GetLogicMode()).
4406cdf0e10cSrcweir                             Height() * 2;
4407cdf0e10cSrcweir             aRect.Bottom() = aRect.Top() + nHeight;
4408cdf0e10cSrcweir             pView->SetOutputArea( aRect );
4409cdf0e10cSrcweir             pView->HideCursor();
4410cdf0e10cSrcweir         }
4411cdf0e10cSrcweir         else
4412cdf0e10cSrcweir         {
4413cdf0e10cSrcweir             // bForceToTop = sal_True for editing
4414cdf0e10cSrcweir             Rectangle aPixRect = pViewData->GetEditArea( eWhich, nCol, nRow, this, NULL, sal_True );
4415cdf0e10cSrcweir             Point aScrPos = PixelToLogic( aPixRect.TopLeft(), pViewData->GetLogicMode() );
4416cdf0e10cSrcweir 
4417cdf0e10cSrcweir             Rectangle aRect = pView->GetOutputArea();
4418cdf0e10cSrcweir             aRect.SetPos( aScrPos );
4419cdf0e10cSrcweir             pView->SetOutputArea( aRect );
4420cdf0e10cSrcweir             pView->ShowCursor();
4421cdf0e10cSrcweir         }
4422cdf0e10cSrcweir     }
4423cdf0e10cSrcweir }
4424cdf0e10cSrcweir 
ScrollPixel(long nDifX,long nDifY)4425cdf0e10cSrcweir void ScGridWindow::ScrollPixel( long nDifX, long nDifY )
4426cdf0e10cSrcweir {
4427cdf0e10cSrcweir     ClickExtern();
4428cdf0e10cSrcweir     HideNoteMarker();
4429cdf0e10cSrcweir 
4430cdf0e10cSrcweir     bIsInScroll = sal_True;
4431cdf0e10cSrcweir     //sal_Bool bXor=DrawBeforeScroll();
4432cdf0e10cSrcweir 
4433cdf0e10cSrcweir     SetMapMode(MAP_PIXEL);
4434cdf0e10cSrcweir     Scroll( nDifX, nDifY, SCROLL_CHILDREN );
4435cdf0e10cSrcweir     SetMapMode( GetDrawMapMode() );             // verschobenen MapMode erzeugen
4436cdf0e10cSrcweir 
4437cdf0e10cSrcweir     UpdateEditViewPos();
4438cdf0e10cSrcweir 
4439cdf0e10cSrcweir     DrawAfterScroll(); //bXor);
4440cdf0e10cSrcweir     bIsInScroll = sal_False;
4441cdf0e10cSrcweir }
4442cdf0e10cSrcweir 
4443cdf0e10cSrcweir //  Formeln neu zeichnen -------------------------------------------------
4444cdf0e10cSrcweir 
UpdateFormulas()4445cdf0e10cSrcweir void ScGridWindow::UpdateFormulas()
4446cdf0e10cSrcweir {
4447cdf0e10cSrcweir     if (pViewData->GetView()->IsMinimized())
4448cdf0e10cSrcweir         return;
4449cdf0e10cSrcweir 
4450cdf0e10cSrcweir     if ( nPaintCount )
4451cdf0e10cSrcweir     {
4452cdf0e10cSrcweir         //  nicht anfangen, verschachtelt zu painten
4453cdf0e10cSrcweir         //  (dann wuerde zumindest der MapMode nicht mehr stimmen)
4454cdf0e10cSrcweir 
4455cdf0e10cSrcweir         bNeedsRepaint = sal_True;           // -> am Ende vom Paint nochmal Invalidate auf alles
4456cdf0e10cSrcweir         aRepaintPixel = Rectangle();    // alles
4457cdf0e10cSrcweir         return;
4458cdf0e10cSrcweir     }
4459cdf0e10cSrcweir 
4460cdf0e10cSrcweir     SCCOL   nX1 = pViewData->GetPosX( eHWhich );
4461cdf0e10cSrcweir     SCROW   nY1 = pViewData->GetPosY( eVWhich );
4462cdf0e10cSrcweir     SCCOL   nX2 = nX1 + pViewData->VisibleCellsX( eHWhich );
4463cdf0e10cSrcweir     SCROW   nY2 = nY1 + pViewData->VisibleCellsY( eVWhich );
4464cdf0e10cSrcweir 
4465cdf0e10cSrcweir     if (nX2 > MAXCOL) nX2 = MAXCOL;
4466cdf0e10cSrcweir     if (nY2 > MAXROW) nY2 = MAXROW;
4467cdf0e10cSrcweir 
4468cdf0e10cSrcweir     // Draw( nX1, nY1, nX2, nY2, SC_UPDATE_CHANGED );
4469cdf0e10cSrcweir 
4470cdf0e10cSrcweir     // don't draw directly - instead use OutputData to find changed area and invalidate
4471cdf0e10cSrcweir 
4472cdf0e10cSrcweir     SCROW nPosY = nY1;
4473cdf0e10cSrcweir 
4474cdf0e10cSrcweir     ScDocShell* pDocSh = pViewData->GetDocShell();
4475cdf0e10cSrcweir     ScDocument* pDoc = pDocSh->GetDocument();
4476cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
4477cdf0e10cSrcweir 
4478cdf0e10cSrcweir     pDoc->ExtendHidden( nX1, nY1, nX2, nY2, nTab );
4479cdf0e10cSrcweir 
4480cdf0e10cSrcweir     Point aScrPos = pViewData->GetScrPos( nX1, nY1, eWhich );
4481cdf0e10cSrcweir     long nMirrorWidth = GetSizePixel().Width();
4482cdf0e10cSrcweir     sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
4483cdf0e10cSrcweir     // unused variable long nLayoutSign = bLayoutRTL ? -1 : 1;
4484cdf0e10cSrcweir     if ( bLayoutRTL )
4485cdf0e10cSrcweir     {
4486cdf0e10cSrcweir         long nEndPixel = pViewData->GetScrPos( nX2+1, nPosY, eWhich ).X();
4487cdf0e10cSrcweir         nMirrorWidth = aScrPos.X() - nEndPixel;
4488cdf0e10cSrcweir         aScrPos.X() = nEndPixel + 1;
4489cdf0e10cSrcweir     }
4490cdf0e10cSrcweir 
4491cdf0e10cSrcweir     long nScrX = aScrPos.X();
4492cdf0e10cSrcweir     long nScrY = aScrPos.Y();
4493cdf0e10cSrcweir 
4494cdf0e10cSrcweir     double nPPTX = pViewData->GetPPTX();
4495cdf0e10cSrcweir     double nPPTY = pViewData->GetPPTY();
4496cdf0e10cSrcweir 
4497cdf0e10cSrcweir     ScTableInfo aTabInfo;
4498cdf0e10cSrcweir     pDoc->FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab, nPPTX, nPPTY, sal_False, sal_False );
4499cdf0e10cSrcweir 
4500cdf0e10cSrcweir     Fraction aZoomX = pViewData->GetZoomX();
4501cdf0e10cSrcweir     Fraction aZoomY = pViewData->GetZoomY();
4502cdf0e10cSrcweir     ScOutputData aOutputData( this, OUTTYPE_WINDOW, aTabInfo, pDoc, nTab,
4503cdf0e10cSrcweir                                 nScrX, nScrY, nX1, nY1, nX2, nY2, nPPTX, nPPTY,
4504cdf0e10cSrcweir                                 &aZoomX, &aZoomY );
4505cdf0e10cSrcweir     aOutputData.SetMirrorWidth( nMirrorWidth );
4506cdf0e10cSrcweir 
4507cdf0e10cSrcweir     aOutputData.FindChanged();
4508cdf0e10cSrcweir 
4509d8ed516eSArmin Le Grand     // #122149# do not use old GetChangedArea() which used polygon-based Regions, but use
4510d8ed516eSArmin Le Grand     // the region-band based new version; anyways, only rectangles are added
4511d8ed516eSArmin Le Grand     Region aChangedRegion( aOutputData.GetChangedAreaRegion() );   // logic (PixelToLogic)
4512d8ed516eSArmin Le Grand     if(!aChangedRegion.IsEmpty())
4513cdf0e10cSrcweir     {
4514d8ed516eSArmin Le Grand         Invalidate(aChangedRegion);
4515cdf0e10cSrcweir     }
4516cdf0e10cSrcweir 
4517cdf0e10cSrcweir     CheckNeedsRepaint();    // #i90362# used to be called via Draw() - still needed here
4518cdf0e10cSrcweir }
4519cdf0e10cSrcweir 
UpdateAutoFillMark(sal_Bool bMarked,const ScRange & rMarkRange)4520cdf0e10cSrcweir void ScGridWindow::UpdateAutoFillMark(sal_Bool bMarked, const ScRange& rMarkRange)
4521cdf0e10cSrcweir {
4522cdf0e10cSrcweir     if ( bMarked != bAutoMarkVisible || ( bMarked && rMarkRange.aEnd != aAutoMarkPos ) )
4523cdf0e10cSrcweir     {
4524cdf0e10cSrcweir         HideCursor();
4525cdf0e10cSrcweir         bAutoMarkVisible = bMarked;
4526cdf0e10cSrcweir         if ( bMarked )
4527cdf0e10cSrcweir             aAutoMarkPos = rMarkRange.aEnd;
4528cdf0e10cSrcweir         ShowCursor();
4529cdf0e10cSrcweir 
4530cdf0e10cSrcweir         UpdateAutoFillOverlay();
4531cdf0e10cSrcweir     }
4532cdf0e10cSrcweir }
4533cdf0e10cSrcweir 
UpdateListValPos(sal_Bool bVisible,const ScAddress & rPos)4534cdf0e10cSrcweir void ScGridWindow::UpdateListValPos( sal_Bool bVisible, const ScAddress& rPos )
4535cdf0e10cSrcweir {
4536cdf0e10cSrcweir     sal_Bool bOldButton = bListValButton;
4537cdf0e10cSrcweir     ScAddress aOldPos = aListValPos;
4538cdf0e10cSrcweir 
4539cdf0e10cSrcweir     bListValButton = bVisible;
4540cdf0e10cSrcweir     aListValPos = rPos;
4541cdf0e10cSrcweir 
4542cdf0e10cSrcweir     if ( bListValButton )
4543cdf0e10cSrcweir     {
4544cdf0e10cSrcweir         if ( !bOldButton || aListValPos != aOldPos )
4545cdf0e10cSrcweir         {
4546cdf0e10cSrcweir             // paint area of new button
4547cdf0e10cSrcweir             Invalidate( PixelToLogic( GetListValButtonRect( aListValPos ) ) );
4548cdf0e10cSrcweir         }
4549cdf0e10cSrcweir     }
4550cdf0e10cSrcweir     if ( bOldButton )
4551cdf0e10cSrcweir     {
4552cdf0e10cSrcweir         if ( !bListValButton || aListValPos != aOldPos )
4553cdf0e10cSrcweir         {
4554cdf0e10cSrcweir             // paint area of old button
4555cdf0e10cSrcweir             Invalidate( PixelToLogic( GetListValButtonRect( aOldPos ) ) );
4556cdf0e10cSrcweir         }
4557cdf0e10cSrcweir     }
4558cdf0e10cSrcweir }
4559cdf0e10cSrcweir 
HideCursor()4560cdf0e10cSrcweir void ScGridWindow::HideCursor()
4561cdf0e10cSrcweir {
4562cdf0e10cSrcweir     ++nCursorHideCount;
4563cdf0e10cSrcweir     if (nCursorHideCount==1)
4564cdf0e10cSrcweir     {
4565cdf0e10cSrcweir         DrawCursor();
4566cdf0e10cSrcweir         DrawAutoFillMark();
4567cdf0e10cSrcweir     }
4568cdf0e10cSrcweir }
4569cdf0e10cSrcweir 
ShowCursor()4570cdf0e10cSrcweir void ScGridWindow::ShowCursor()
4571cdf0e10cSrcweir {
4572cdf0e10cSrcweir     if (nCursorHideCount==0)
4573cdf0e10cSrcweir     {
4574cdf0e10cSrcweir         DBG_ERROR("zuviel ShowCursor");
4575cdf0e10cSrcweir         return;
4576cdf0e10cSrcweir     }
4577cdf0e10cSrcweir 
4578cdf0e10cSrcweir     if (nCursorHideCount==1)
4579cdf0e10cSrcweir     {
4580cdf0e10cSrcweir         // #i57745# Draw the cursor before setting the variable, in case the
4581cdf0e10cSrcweir         // GetSizePixel call from drawing causes a repaint (resize handler is called)
4582cdf0e10cSrcweir         DrawAutoFillMark();
4583cdf0e10cSrcweir         DrawCursor();
4584cdf0e10cSrcweir     }
4585cdf0e10cSrcweir 
4586cdf0e10cSrcweir     --nCursorHideCount;
4587cdf0e10cSrcweir }
4588cdf0e10cSrcweir 
GetFocus()4589cdf0e10cSrcweir void __EXPORT ScGridWindow::GetFocus()
4590cdf0e10cSrcweir {
4591cdf0e10cSrcweir     ScTabViewShell* pViewShell = pViewData->GetViewShell();
4592cdf0e10cSrcweir     pViewShell->GotFocus();
4593cdf0e10cSrcweir     pViewShell->SetFormShellAtTop( sal_False );     // focus in GridWindow -> FormShell no longer on top
4594cdf0e10cSrcweir 
4595cdf0e10cSrcweir     if (pViewShell->HasAccessibilityObjects())
4596cdf0e10cSrcweir         pViewShell->BroadcastAccessibility(ScAccGridWinFocusGotHint(eWhich, GetAccessible()));
4597cdf0e10cSrcweir 
4598cdf0e10cSrcweir 
4599cdf0e10cSrcweir     if ( !SC_MOD()->IsFormulaMode() )
4600cdf0e10cSrcweir     {
4601cdf0e10cSrcweir         pViewShell->UpdateInputHandler();
4602cdf0e10cSrcweir //      StopMarking();      // falls Dialog (Fehler), weil dann kein ButtonUp
4603cdf0e10cSrcweir                             // MO: nur wenn nicht im RefInput-Modus
4604cdf0e10cSrcweir                             //     -> GetFocus/MouseButtonDown-Reihenfolge
4605cdf0e10cSrcweir                             //        auf dem Mac
4606cdf0e10cSrcweir     }
4607cdf0e10cSrcweir 
4608cdf0e10cSrcweir     Window::GetFocus();
4609cdf0e10cSrcweir }
4610cdf0e10cSrcweir 
LoseFocus()4611cdf0e10cSrcweir void __EXPORT ScGridWindow::LoseFocus()
4612cdf0e10cSrcweir {
4613cdf0e10cSrcweir     ScTabViewShell* pViewShell = pViewData->GetViewShell();
4614cdf0e10cSrcweir     pViewShell->LostFocus();
4615cdf0e10cSrcweir 
4616cdf0e10cSrcweir     if (pViewShell->HasAccessibilityObjects())
4617cdf0e10cSrcweir         pViewShell->BroadcastAccessibility(ScAccGridWinFocusLostHint(eWhich, GetAccessible()));
4618cdf0e10cSrcweir 
4619cdf0e10cSrcweir     Window::LoseFocus();
4620cdf0e10cSrcweir }
4621cdf0e10cSrcweir 
GetMousePosPixel() const4622cdf0e10cSrcweir Point ScGridWindow::GetMousePosPixel() const  { return aCurMousePos; }
4623cdf0e10cSrcweir 
4624cdf0e10cSrcweir //------------------------------------------------------------------------
4625cdf0e10cSrcweir 
HitRangeFinder(const Point & rMouse,sal_Bool & rCorner,sal_uInt16 * pIndex,SCsCOL * pAddX,SCsROW * pAddY)4626cdf0e10cSrcweir sal_Bool ScGridWindow::HitRangeFinder( const Point& rMouse, sal_Bool& rCorner,
4627cdf0e10cSrcweir                                 sal_uInt16* pIndex, SCsCOL* pAddX, SCsROW* pAddY )
4628cdf0e10cSrcweir {
4629cdf0e10cSrcweir     sal_Bool bFound = sal_False;
4630cdf0e10cSrcweir     ScInputHandler* pHdl = SC_MOD()->GetInputHdl( pViewData->GetViewShell() );
4631cdf0e10cSrcweir     if (pHdl)
4632cdf0e10cSrcweir     {
4633cdf0e10cSrcweir         ScRangeFindList* pRangeFinder = pHdl->GetRangeFindList();
4634cdf0e10cSrcweir         if ( pRangeFinder && !pRangeFinder->IsHidden() &&
4635cdf0e10cSrcweir                 pRangeFinder->GetDocName() == pViewData->GetDocShell()->GetTitle() )
4636cdf0e10cSrcweir         {
4637cdf0e10cSrcweir             ScDocument* pDoc = pViewData->GetDocument();
4638cdf0e10cSrcweir             SCTAB nTab = pViewData->GetTabNo();
4639cdf0e10cSrcweir             sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
4640cdf0e10cSrcweir             long nLayoutSign = bLayoutRTL ? -1 : 1;
4641cdf0e10cSrcweir 
4642cdf0e10cSrcweir             SCsCOL nPosX;
4643cdf0e10cSrcweir             SCsROW nPosY;
4644cdf0e10cSrcweir             pViewData->GetPosFromPixel( rMouse.X(), rMouse.Y(), eWhich, nPosX, nPosY );
4645cdf0e10cSrcweir             //  zusammengefasste (einzeln/Bereich) ???
4646cdf0e10cSrcweir             ScAddress aAddr( nPosX, nPosY, nTab );
4647cdf0e10cSrcweir 
4648cdf0e10cSrcweir //          Point aNext = pViewData->GetScrPos( nPosX+1, nPosY+1, eWhich );
4649cdf0e10cSrcweir 
4650cdf0e10cSrcweir             Point aNext = pViewData->GetScrPos( nPosX, nPosY, eWhich, sal_True );
4651cdf0e10cSrcweir             long nSizeXPix;
4652cdf0e10cSrcweir             long nSizeYPix;
4653cdf0e10cSrcweir             pViewData->GetMergeSizePixel( nPosX, nPosY, nSizeXPix, nSizeYPix );
4654cdf0e10cSrcweir             aNext.X() += nSizeXPix * nLayoutSign;
4655cdf0e10cSrcweir             aNext.Y() += nSizeYPix;
4656cdf0e10cSrcweir 
4657cdf0e10cSrcweir             sal_Bool bCornerHor;
4658cdf0e10cSrcweir             if ( bLayoutRTL )
4659cdf0e10cSrcweir                 bCornerHor = ( rMouse.X() >= aNext.X() && rMouse.X() <= aNext.X() + 8 );
4660cdf0e10cSrcweir             else
4661cdf0e10cSrcweir                 bCornerHor = ( rMouse.X() >= aNext.X() - 8 && rMouse.X() <= aNext.X() );
4662cdf0e10cSrcweir 
4663cdf0e10cSrcweir             sal_Bool bCellCorner = ( bCornerHor &&
4664cdf0e10cSrcweir                                  rMouse.Y() >= aNext.Y() - 8 && rMouse.Y() <= aNext.Y() );
4665cdf0e10cSrcweir             //  corner is hit only if the mouse is within the cell
4666cdf0e10cSrcweir 
4667cdf0e10cSrcweir             sal_uInt16 nCount = (sal_uInt16)pRangeFinder->Count();
4668cdf0e10cSrcweir             for (sal_uInt16 i=nCount; i;)
4669cdf0e10cSrcweir             {
4670cdf0e10cSrcweir                 //  rueckwaerts suchen, damit der zuletzt gepaintete Rahmen gefunden wird
4671cdf0e10cSrcweir                 --i;
4672cdf0e10cSrcweir                 ScRangeFindData* pData = pRangeFinder->GetObject(i);
4673cdf0e10cSrcweir                 if ( pData && pData->aRef.In(aAddr) )
4674cdf0e10cSrcweir                 {
4675cdf0e10cSrcweir                     if (pIndex) *pIndex = i;
4676cdf0e10cSrcweir                     if (pAddX)  *pAddX = nPosX - pData->aRef.aStart.Col();
4677cdf0e10cSrcweir                     if (pAddY)  *pAddY = nPosY - pData->aRef.aStart.Row();
4678cdf0e10cSrcweir                     bFound = sal_True;
4679cdf0e10cSrcweir                     rCorner = ( bCellCorner && aAddr == pData->aRef.aEnd );
4680cdf0e10cSrcweir                     break;
4681cdf0e10cSrcweir                 }
4682cdf0e10cSrcweir             }
4683cdf0e10cSrcweir         }
4684cdf0e10cSrcweir     }
4685cdf0e10cSrcweir     return bFound;
4686cdf0e10cSrcweir }
4687cdf0e10cSrcweir 
4688cdf0e10cSrcweir #define SCE_TOP     1
4689cdf0e10cSrcweir #define SCE_BOTTOM  2
4690cdf0e10cSrcweir #define SCE_LEFT    4
4691cdf0e10cSrcweir #define SCE_RIGHT   8
4692cdf0e10cSrcweir #define SCE_ALL     15
4693cdf0e10cSrcweir 
lcl_PaintOneRange(ScDocShell * pDocSh,const ScRange & rRange,sal_uInt16 nEdges)4694cdf0e10cSrcweir void lcl_PaintOneRange( ScDocShell* pDocSh, const ScRange& rRange, sal_uInt16 nEdges )
4695cdf0e10cSrcweir {
4696cdf0e10cSrcweir     //  der Range ist immer richtigherum
4697cdf0e10cSrcweir 
4698cdf0e10cSrcweir     SCCOL nCol1 = rRange.aStart.Col();
4699cdf0e10cSrcweir     SCROW nRow1 = rRange.aStart.Row();
4700cdf0e10cSrcweir     SCTAB nTab1 = rRange.aStart.Tab();
4701cdf0e10cSrcweir     SCCOL nCol2 = rRange.aEnd.Col();
4702cdf0e10cSrcweir     SCROW nRow2 = rRange.aEnd.Row();
4703cdf0e10cSrcweir     SCTAB nTab2 = rRange.aEnd.Tab();
4704cdf0e10cSrcweir     sal_Bool bHiddenEdge = sal_False;
4705cdf0e10cSrcweir     SCROW nTmp;
4706cdf0e10cSrcweir 
4707cdf0e10cSrcweir     ScDocument* pDoc = pDocSh->GetDocument();
4708cdf0e10cSrcweir     while ( nCol1 > 0 && pDoc->ColHidden(nCol1, nTab1) )
4709cdf0e10cSrcweir     {
4710cdf0e10cSrcweir         --nCol1;
4711cdf0e10cSrcweir         bHiddenEdge = sal_True;
4712cdf0e10cSrcweir     }
4713cdf0e10cSrcweir     while ( nCol2 < MAXCOL && pDoc->ColHidden(nCol2, nTab1) )
4714cdf0e10cSrcweir     {
4715cdf0e10cSrcweir         ++nCol2;
4716cdf0e10cSrcweir         bHiddenEdge = sal_True;
4717cdf0e10cSrcweir     }
4718cdf0e10cSrcweir     nTmp = pDoc->FirstVisibleRow(0, nRow1, nTab1);
4719cdf0e10cSrcweir     if (!ValidRow(nTmp))
4720cdf0e10cSrcweir         nTmp = 0;
4721cdf0e10cSrcweir     if (nTmp < nRow1)
4722cdf0e10cSrcweir     {
4723cdf0e10cSrcweir         nRow1 = nTmp;
4724cdf0e10cSrcweir         bHiddenEdge = sal_True;
4725cdf0e10cSrcweir     }
4726cdf0e10cSrcweir     nTmp = pDoc->FirstVisibleRow(nRow2, MAXROW, nTab1);
4727cdf0e10cSrcweir     if (!ValidRow(nTmp))
4728cdf0e10cSrcweir         nTmp = MAXROW;
4729cdf0e10cSrcweir     if (nTmp > nRow2)
4730cdf0e10cSrcweir     {
4731cdf0e10cSrcweir         nRow2 = nTmp;
4732cdf0e10cSrcweir         bHiddenEdge = sal_True;
4733cdf0e10cSrcweir     }
4734cdf0e10cSrcweir 
4735cdf0e10cSrcweir     if ( nCol2 > nCol1 + 1 && nRow2 > nRow1 + 1 && !bHiddenEdge )
4736cdf0e10cSrcweir     {
4737cdf0e10cSrcweir         //  nur an den Raendern entlang
4738cdf0e10cSrcweir         //  (die Ecken werden evtl. zweimal getroffen)
4739cdf0e10cSrcweir 
4740cdf0e10cSrcweir         if ( nEdges & SCE_TOP )
4741cdf0e10cSrcweir             pDocSh->PostPaint( nCol1, nRow1, nTab1, nCol2, nRow1, nTab2, PAINT_MARKS );
4742cdf0e10cSrcweir         if ( nEdges & SCE_LEFT )
4743cdf0e10cSrcweir             pDocSh->PostPaint( nCol1, nRow1, nTab1, nCol1, nRow2, nTab2, PAINT_MARKS );
4744cdf0e10cSrcweir         if ( nEdges & SCE_RIGHT )
4745cdf0e10cSrcweir             pDocSh->PostPaint( nCol2, nRow1, nTab1, nCol2, nRow2, nTab2, PAINT_MARKS );
4746cdf0e10cSrcweir         if ( nEdges & SCE_BOTTOM )
4747cdf0e10cSrcweir             pDocSh->PostPaint( nCol1, nRow2, nTab1, nCol2, nRow2, nTab2, PAINT_MARKS );
4748cdf0e10cSrcweir     }
4749cdf0e10cSrcweir     else    // everything in one call
4750cdf0e10cSrcweir         pDocSh->PostPaint( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2, PAINT_MARKS );
4751cdf0e10cSrcweir }
4752cdf0e10cSrcweir 
lcl_PaintRefChanged(ScDocShell * pDocSh,const ScRange & rOldUn,const ScRange & rNewUn)4753cdf0e10cSrcweir void lcl_PaintRefChanged( ScDocShell* pDocSh, const ScRange& rOldUn, const ScRange& rNewUn )
4754cdf0e10cSrcweir {
4755cdf0e10cSrcweir     //  Repaint fuer die Teile des Rahmens in Old, die bei New nicht mehr da sind
4756cdf0e10cSrcweir 
4757cdf0e10cSrcweir     ScRange aOld = rOldUn;
4758cdf0e10cSrcweir     ScRange aNew = rNewUn;
4759cdf0e10cSrcweir     aOld.Justify();
4760cdf0e10cSrcweir     aNew.Justify();
4761cdf0e10cSrcweir 
4762cdf0e10cSrcweir     if ( aOld.aStart == aOld.aEnd )                 //! Tab ignorieren?
4763cdf0e10cSrcweir         pDocSh->GetDocument()->ExtendMerge(aOld);
4764cdf0e10cSrcweir     if ( aNew.aStart == aNew.aEnd )                 //! Tab ignorieren?
4765cdf0e10cSrcweir         pDocSh->GetDocument()->ExtendMerge(aNew);
4766cdf0e10cSrcweir 
4767cdf0e10cSrcweir     SCCOL nOldCol1 = aOld.aStart.Col();
4768cdf0e10cSrcweir     SCROW nOldRow1 = aOld.aStart.Row();
4769cdf0e10cSrcweir     SCCOL nOldCol2 = aOld.aEnd.Col();
4770cdf0e10cSrcweir     SCROW nOldRow2 = aOld.aEnd.Row();
4771cdf0e10cSrcweir     SCCOL nNewCol1 = aNew.aStart.Col();
4772cdf0e10cSrcweir     SCROW nNewRow1 = aNew.aStart.Row();
4773cdf0e10cSrcweir     SCCOL nNewCol2 = aNew.aEnd.Col();
4774cdf0e10cSrcweir     SCROW nNewRow2 = aNew.aEnd.Row();
4775cdf0e10cSrcweir     SCTAB nTab1 = aOld.aStart.Tab();        // Tab aendert sich nicht
4776cdf0e10cSrcweir     SCTAB nTab2 = aOld.aEnd.Tab();
4777cdf0e10cSrcweir 
4778cdf0e10cSrcweir     if ( nNewRow2 < nOldRow1 || nNewRow1 > nOldRow2 ||
4779cdf0e10cSrcweir          nNewCol2 < nOldCol1 || nNewCol1 > nOldCol2 ||
4780cdf0e10cSrcweir          ( nNewCol1 != nOldCol1 && nNewRow1 != nOldRow1 &&
4781cdf0e10cSrcweir            nNewCol2 != nOldCol2 && nNewRow2 != nOldRow2 ) )
4782cdf0e10cSrcweir     {
4783cdf0e10cSrcweir         //  komplett weggeschoben oder alle Seiten veraendert
4784cdf0e10cSrcweir         //  (Abfrage <= statt < geht schief bei einzelnen Zeilen/Spalten)
4785cdf0e10cSrcweir 
4786cdf0e10cSrcweir         lcl_PaintOneRange( pDocSh, aOld, SCE_ALL );
4787cdf0e10cSrcweir     }
4788cdf0e10cSrcweir     else        //  alle vier Kanten einzeln testen
4789cdf0e10cSrcweir     {
4790cdf0e10cSrcweir         //  oberer Teil
4791cdf0e10cSrcweir         if ( nNewRow1 < nOldRow1 )                  //  nur obere Linie loeschen
4792cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4793cdf0e10cSrcweir                     nOldCol1, nOldRow1, nTab1, nOldCol2, nOldRow1, nTab2 ), SCE_ALL );
4794cdf0e10cSrcweir         else if ( nNewRow1 > nOldRow1 )             //  den Teil, der oben wegkommt
4795cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4796cdf0e10cSrcweir                     nOldCol1, nOldRow1, nTab1, nOldCol2, nNewRow1-1, nTab2 ),
4797cdf0e10cSrcweir                     SCE_ALL &~ SCE_BOTTOM );
4798cdf0e10cSrcweir 
4799cdf0e10cSrcweir         //  unterer Teil
4800cdf0e10cSrcweir         if ( nNewRow2 > nOldRow2 )                  //  nur untere Linie loeschen
4801cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4802cdf0e10cSrcweir                     nOldCol1, nOldRow2, nTab1, nOldCol2, nOldRow2, nTab2 ), SCE_ALL );
4803cdf0e10cSrcweir         else if ( nNewRow2 < nOldRow2 )             //  den Teil, der unten wegkommt
4804cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4805cdf0e10cSrcweir                     nOldCol1, nNewRow2+1, nTab1, nOldCol2, nOldRow2, nTab2 ),
4806cdf0e10cSrcweir                     SCE_ALL &~ SCE_TOP );
4807cdf0e10cSrcweir 
4808cdf0e10cSrcweir         //  linker Teil
4809cdf0e10cSrcweir         if ( nNewCol1 < nOldCol1 )                  //  nur linke Linie loeschen
4810cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4811cdf0e10cSrcweir                     nOldCol1, nOldRow1, nTab1, nOldCol1, nOldRow2, nTab2 ), SCE_ALL );
4812cdf0e10cSrcweir         else if ( nNewCol1 > nOldCol1 )             //  den Teil, der links wegkommt
4813cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4814cdf0e10cSrcweir                     nOldCol1, nOldRow1, nTab1, nNewCol1-1, nOldRow2, nTab2 ),
4815cdf0e10cSrcweir                     SCE_ALL &~ SCE_RIGHT );
4816cdf0e10cSrcweir 
4817cdf0e10cSrcweir         //  rechter Teil
4818cdf0e10cSrcweir         if ( nNewCol2 > nOldCol2 )                  //  nur rechte Linie loeschen
4819cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4820cdf0e10cSrcweir                     nOldCol2, nOldRow1, nTab1, nOldCol2, nOldRow2, nTab2 ), SCE_ALL );
4821cdf0e10cSrcweir         else if ( nNewCol2 < nOldCol2 )             //  den Teil, der rechts wegkommt
4822cdf0e10cSrcweir             lcl_PaintOneRange( pDocSh, ScRange(
4823cdf0e10cSrcweir                     nNewCol2+1, nOldRow1, nTab1, nOldCol2, nOldRow2, nTab2 ),
4824cdf0e10cSrcweir                     SCE_ALL &~ SCE_LEFT );
4825cdf0e10cSrcweir     }
4826cdf0e10cSrcweir }
4827cdf0e10cSrcweir 
RFMouseMove(const MouseEvent & rMEvt,sal_Bool bUp)4828cdf0e10cSrcweir void ScGridWindow::RFMouseMove( const MouseEvent& rMEvt, sal_Bool bUp )
4829cdf0e10cSrcweir {
4830cdf0e10cSrcweir     ScInputHandler* pHdl = SC_MOD()->GetInputHdl( pViewData->GetViewShell() );
4831cdf0e10cSrcweir     if (!pHdl)
4832cdf0e10cSrcweir         return;
4833cdf0e10cSrcweir     ScRangeFindList* pRangeFinder = pHdl->GetRangeFindList();
4834cdf0e10cSrcweir     if (!pRangeFinder || nRFIndex >= pRangeFinder->Count())
4835cdf0e10cSrcweir         return;
4836cdf0e10cSrcweir     ScRangeFindData* pData = pRangeFinder->GetObject( nRFIndex );
4837cdf0e10cSrcweir     if (!pData)
4838cdf0e10cSrcweir         return;
4839cdf0e10cSrcweir 
4840cdf0e10cSrcweir     //  Mauszeiger
4841cdf0e10cSrcweir 
4842cdf0e10cSrcweir     if (bRFSize)
4843cdf0e10cSrcweir         SetPointer( Pointer( POINTER_CROSS ) );
4844cdf0e10cSrcweir     else
4845cdf0e10cSrcweir         SetPointer( Pointer( POINTER_HAND ) );
4846cdf0e10cSrcweir 
4847cdf0e10cSrcweir     //  Scrolling
4848cdf0e10cSrcweir 
4849cdf0e10cSrcweir     sal_Bool bTimer = sal_False;
4850cdf0e10cSrcweir     Point aPos = rMEvt.GetPosPixel();
4851cdf0e10cSrcweir     SCsCOL nDx = 0;
4852cdf0e10cSrcweir     SCsROW nDy = 0;
4853cdf0e10cSrcweir     if ( aPos.X() < 0 ) nDx = -1;
4854cdf0e10cSrcweir     if ( aPos.Y() < 0 ) nDy = -1;
4855cdf0e10cSrcweir     Size aSize = GetOutputSizePixel();
4856cdf0e10cSrcweir     if ( aPos.X() >= aSize.Width() )
4857cdf0e10cSrcweir         nDx = 1;
4858cdf0e10cSrcweir     if ( aPos.Y() >= aSize.Height() )
4859cdf0e10cSrcweir         nDy = 1;
4860cdf0e10cSrcweir     if ( nDx != 0 || nDy != 0 )
4861cdf0e10cSrcweir     {
4862cdf0e10cSrcweir         if ( nDx != 0) pViewData->GetView()->ScrollX( nDx, WhichH(eWhich) );
4863cdf0e10cSrcweir         if ( nDy != 0 ) pViewData->GetView()->ScrollY( nDy, WhichV(eWhich) );
4864cdf0e10cSrcweir         bTimer = sal_True;
4865cdf0e10cSrcweir     }
4866cdf0e10cSrcweir 
4867cdf0e10cSrcweir     //  Umschalten bei Fixierung (damit Scrolling funktioniert)
4868cdf0e10cSrcweir 
4869cdf0e10cSrcweir     if ( eWhich == pViewData->GetActivePart() )     //??
4870cdf0e10cSrcweir     {
4871cdf0e10cSrcweir         if ( pViewData->GetHSplitMode() == SC_SPLIT_FIX )
4872cdf0e10cSrcweir             if ( nDx > 0 )
4873cdf0e10cSrcweir             {
4874cdf0e10cSrcweir                 if ( eWhich == SC_SPLIT_TOPLEFT )
4875cdf0e10cSrcweir                     pViewData->GetView()->ActivatePart( SC_SPLIT_TOPRIGHT );
4876cdf0e10cSrcweir                 else if ( eWhich == SC_SPLIT_BOTTOMLEFT )
4877cdf0e10cSrcweir                     pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMRIGHT );
4878cdf0e10cSrcweir             }
4879cdf0e10cSrcweir 
4880cdf0e10cSrcweir         if ( pViewData->GetVSplitMode() == SC_SPLIT_FIX )
4881cdf0e10cSrcweir             if ( nDy > 0 )
4882cdf0e10cSrcweir             {
4883cdf0e10cSrcweir                 if ( eWhich == SC_SPLIT_TOPLEFT )
4884cdf0e10cSrcweir                     pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMLEFT );
4885cdf0e10cSrcweir                 else if ( eWhich == SC_SPLIT_TOPRIGHT )
4886cdf0e10cSrcweir                     pViewData->GetView()->ActivatePart( SC_SPLIT_BOTTOMRIGHT );
4887cdf0e10cSrcweir             }
4888cdf0e10cSrcweir     }
4889cdf0e10cSrcweir 
4890cdf0e10cSrcweir     //  Verschieben
4891cdf0e10cSrcweir 
4892cdf0e10cSrcweir     SCsCOL  nPosX;
4893cdf0e10cSrcweir     SCsROW  nPosY;
4894cdf0e10cSrcweir     pViewData->GetPosFromPixel( aPos.X(), aPos.Y(), eWhich, nPosX, nPosY );
4895cdf0e10cSrcweir 
4896cdf0e10cSrcweir     ScRange aOld = pData->aRef;
4897cdf0e10cSrcweir     ScRange aNew = aOld;
4898cdf0e10cSrcweir     if ( bRFSize )
4899cdf0e10cSrcweir     {
4900cdf0e10cSrcweir         aNew.aEnd.SetCol((SCCOL)nPosX);
4901cdf0e10cSrcweir         aNew.aEnd.SetRow((SCROW)nPosY);
4902cdf0e10cSrcweir     }
4903cdf0e10cSrcweir     else
4904cdf0e10cSrcweir     {
4905cdf0e10cSrcweir         long nStartX = nPosX - nRFAddX;
4906cdf0e10cSrcweir         if ( nStartX < 0 ) nStartX = 0;
4907cdf0e10cSrcweir         long nStartY = nPosY - nRFAddY;
4908cdf0e10cSrcweir         if ( nStartY < 0 ) nStartY = 0;
4909cdf0e10cSrcweir         long nEndX = nStartX + aOld.aEnd.Col() - aOld.aStart.Col();
4910cdf0e10cSrcweir         if ( nEndX > MAXCOL )
4911cdf0e10cSrcweir         {
4912cdf0e10cSrcweir             nStartX -= ( nEndX - MAXROW );
4913cdf0e10cSrcweir             nEndX = MAXCOL;
4914cdf0e10cSrcweir         }
4915cdf0e10cSrcweir         long nEndY = nStartY + aOld.aEnd.Row() - aOld.aStart.Row();
4916cdf0e10cSrcweir         if ( nEndY > MAXROW )
4917cdf0e10cSrcweir         {
4918cdf0e10cSrcweir             nStartY -= ( nEndY - MAXROW );
4919cdf0e10cSrcweir             nEndY = MAXROW;
4920cdf0e10cSrcweir         }
4921cdf0e10cSrcweir 
4922cdf0e10cSrcweir         aNew.aStart.SetCol((SCCOL)nStartX);
4923cdf0e10cSrcweir         aNew.aStart.SetRow((SCROW)nStartY);
4924cdf0e10cSrcweir         aNew.aEnd.SetCol((SCCOL)nEndX);
4925cdf0e10cSrcweir         aNew.aEnd.SetRow((SCROW)nEndY);
4926cdf0e10cSrcweir     }
4927cdf0e10cSrcweir 
4928cdf0e10cSrcweir     if ( bUp )
4929cdf0e10cSrcweir         aNew.Justify();             // beim ButtonUp wieder richtigherum
4930cdf0e10cSrcweir 
4931cdf0e10cSrcweir     if ( aNew != aOld )
4932cdf0e10cSrcweir     {
4933cdf0e10cSrcweir         pHdl->UpdateRange( nRFIndex, aNew );
4934cdf0e10cSrcweir 
4935cdf0e10cSrcweir         ScDocShell* pDocSh = pViewData->GetDocShell();
4936cdf0e10cSrcweir 
4937cdf0e10cSrcweir         //  nur das neuzeichnen, was sich veraendert hat...
4938cdf0e10cSrcweir         lcl_PaintRefChanged( pDocSh, aOld, aNew );
4939cdf0e10cSrcweir 
4940cdf0e10cSrcweir         //  neuen Rahmen nur drueberzeichnen (synchron)
4941cdf0e10cSrcweir         pDocSh->Broadcast( ScIndexHint( SC_HINT_SHOWRANGEFINDER, nRFIndex ) );
4942cdf0e10cSrcweir 
4943cdf0e10cSrcweir         Update();   // was man bewegt, will man auch sofort sehen
4944cdf0e10cSrcweir     }
4945cdf0e10cSrcweir 
4946cdf0e10cSrcweir     //  Timer fuer Scrolling
4947cdf0e10cSrcweir 
4948cdf0e10cSrcweir     if (bTimer)
4949cdf0e10cSrcweir         pViewData->GetView()->SetTimer( this, rMEvt );          // Event wiederholen
4950cdf0e10cSrcweir     else
4951cdf0e10cSrcweir         pViewData->GetView()->ResetTimer();
4952cdf0e10cSrcweir }
4953cdf0e10cSrcweir 
4954cdf0e10cSrcweir //------------------------------------------------------------------------
4955cdf0e10cSrcweir 
GetEditUrl(const Point & rPos,String * pName,String * pUrl,String * pTarget)4956cdf0e10cSrcweir sal_Bool ScGridWindow::GetEditUrl( const Point& rPos,
4957cdf0e10cSrcweir                                 String* pName, String* pUrl, String* pTarget )
4958cdf0e10cSrcweir {
4959cdf0e10cSrcweir     return GetEditUrlOrError( sal_False, rPos, pName, pUrl, pTarget );
4960cdf0e10cSrcweir }
4961cdf0e10cSrcweir 
GetEditUrlOrError(sal_Bool bSpellErr,const Point & rPos,String * pName,String * pUrl,String * pTarget)4962cdf0e10cSrcweir sal_Bool ScGridWindow::GetEditUrlOrError( sal_Bool bSpellErr, const Point& rPos,
4963cdf0e10cSrcweir                                 String* pName, String* pUrl, String* pTarget )
4964cdf0e10cSrcweir {
4965cdf0e10cSrcweir     //! nPosX/Y mit uebergeben?
4966cdf0e10cSrcweir     SCsCOL nPosX;
4967cdf0e10cSrcweir     SCsROW nPosY;
4968cdf0e10cSrcweir     pViewData->GetPosFromPixel( rPos.X(), rPos.Y(), eWhich, nPosX, nPosY );
4969cdf0e10cSrcweir 
4970cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
4971cdf0e10cSrcweir     ScDocShell* pDocSh = pViewData->GetDocShell();
4972cdf0e10cSrcweir     ScDocument* pDoc = pDocSh->GetDocument();
4973cdf0e10cSrcweir     ScBaseCell* pCell = NULL;
4974cdf0e10cSrcweir 
4975cdf0e10cSrcweir     sal_Bool bFound = lcl_GetHyperlinkCell( pDoc, nPosX, nPosY, nTab, pCell );
4976cdf0e10cSrcweir     if( !bFound )
4977cdf0e10cSrcweir         return sal_False;
4978cdf0e10cSrcweir 
4979cdf0e10cSrcweir     ScHideTextCursor aHideCursor( pViewData, eWhich );  // before GetEditArea (MapMode is changed)
4980cdf0e10cSrcweir 
4981cdf0e10cSrcweir     const ScPatternAttr* pPattern = pDoc->GetPattern( nPosX, nPosY, nTab );
4982cdf0e10cSrcweir     // bForceToTop = sal_False, use the cell's real position
4983cdf0e10cSrcweir     Rectangle aEditRect = pViewData->GetEditArea( eWhich, nPosX, nPosY, this, pPattern, sal_False );
4984cdf0e10cSrcweir     if (rPos.Y() < aEditRect.Top())
4985cdf0e10cSrcweir         return sal_False;
4986cdf0e10cSrcweir 
4987cdf0e10cSrcweir         //  vertikal kann (noch) nicht angeklickt werden:
4988cdf0e10cSrcweir 
4989cdf0e10cSrcweir     if (pPattern->GetCellOrientation() != SVX_ORIENTATION_STANDARD)
4990cdf0e10cSrcweir         return sal_False;
4991cdf0e10cSrcweir 
4992cdf0e10cSrcweir     sal_Bool bBreak = ((SfxBoolItem&)pPattern->GetItem(ATTR_LINEBREAK)).GetValue() ||
4993cdf0e10cSrcweir                     ((SvxCellHorJustify)((const SvxHorJustifyItem&)pPattern->
4994cdf0e10cSrcweir                         GetItem( ATTR_HOR_JUSTIFY )).GetValue() == SVX_HOR_JUSTIFY_BLOCK);
4995cdf0e10cSrcweir     SvxCellHorJustify eHorJust = (SvxCellHorJustify)((SvxHorJustifyItem&)pPattern->
4996cdf0e10cSrcweir                         GetItem(ATTR_HOR_JUSTIFY)).GetValue();
4997cdf0e10cSrcweir 
4998cdf0e10cSrcweir         //  EditEngine
4999cdf0e10cSrcweir 
5000cdf0e10cSrcweir     ScFieldEditEngine aEngine( pDoc->GetEditPool() );
5001cdf0e10cSrcweir     ScSizeDeviceProvider aProv(pDocSh);
5002cdf0e10cSrcweir     aEngine.SetRefDevice( aProv.GetDevice() );
5003cdf0e10cSrcweir     aEngine.SetRefMapMode( MAP_100TH_MM );
5004cdf0e10cSrcweir     SfxItemSet aDefault( aEngine.GetEmptyItemSet() );
5005cdf0e10cSrcweir     pPattern->FillEditItemSet( &aDefault );
5006cdf0e10cSrcweir     SvxAdjust eSvxAdjust = SVX_ADJUST_LEFT;
5007cdf0e10cSrcweir     switch (eHorJust)
5008cdf0e10cSrcweir     {
5009cdf0e10cSrcweir         case SVX_HOR_JUSTIFY_LEFT:
5010cdf0e10cSrcweir         case SVX_HOR_JUSTIFY_REPEAT:            // nicht implementiert
5011cdf0e10cSrcweir         case SVX_HOR_JUSTIFY_STANDARD:          // always Text if an EditCell type
5012cdf0e10cSrcweir                 eSvxAdjust = SVX_ADJUST_LEFT;
5013cdf0e10cSrcweir                 break;
5014cdf0e10cSrcweir         case SVX_HOR_JUSTIFY_RIGHT:
5015cdf0e10cSrcweir                 eSvxAdjust = SVX_ADJUST_RIGHT;
5016cdf0e10cSrcweir                 break;
5017cdf0e10cSrcweir         case SVX_HOR_JUSTIFY_CENTER:
5018cdf0e10cSrcweir                 eSvxAdjust = SVX_ADJUST_CENTER;
5019cdf0e10cSrcweir                 break;
5020cdf0e10cSrcweir         case SVX_HOR_JUSTIFY_BLOCK:
5021cdf0e10cSrcweir                 eSvxAdjust = SVX_ADJUST_BLOCK;
5022cdf0e10cSrcweir                 break;
5023cdf0e10cSrcweir     }
5024cdf0e10cSrcweir     aDefault.Put( SvxAdjustItem( eSvxAdjust, EE_PARA_JUST ) );
5025cdf0e10cSrcweir     aEngine.SetDefaults( aDefault );
5026cdf0e10cSrcweir     if (bSpellErr)
5027cdf0e10cSrcweir         aEngine.SetControlWord( aEngine.GetControlWord() | EE_CNTRL_ONLINESPELLING );
5028cdf0e10cSrcweir 
5029cdf0e10cSrcweir     MapMode aEditMode = pViewData->GetLogicMode(eWhich);            // ohne Drawing-Skalierung
5030cdf0e10cSrcweir     Rectangle aLogicEdit = PixelToLogic( aEditRect, aEditMode );
5031cdf0e10cSrcweir     long nThisColLogic = aLogicEdit.Right() - aLogicEdit.Left() + 1;
5032cdf0e10cSrcweir     Size aPaperSize = Size( 1000000, 1000000 );
5033cdf0e10cSrcweir     if(pCell->GetCellType() == CELLTYPE_FORMULA)
5034cdf0e10cSrcweir     {
5035cdf0e10cSrcweir         long nSizeX  = 0;
5036cdf0e10cSrcweir         long nSizeY  = 0;
5037cdf0e10cSrcweir         pViewData->GetMergeSizePixel( nPosX, nPosY, nSizeX, nSizeY );
5038cdf0e10cSrcweir         aPaperSize = Size(nSizeX, nSizeY );
5039cdf0e10cSrcweir         aPaperSize = PixelToLogic(aPaperSize);
5040cdf0e10cSrcweir     }
5041cdf0e10cSrcweir 
5042cdf0e10cSrcweir     if (bBreak)
5043cdf0e10cSrcweir         aPaperSize.Width() = nThisColLogic;
5044cdf0e10cSrcweir     aEngine.SetPaperSize( aPaperSize );
5045cdf0e10cSrcweir 
5046cdf0e10cSrcweir     ::std::auto_ptr< EditTextObject > pTextObj;
5047cdf0e10cSrcweir     const EditTextObject* pData;
5048cdf0e10cSrcweir     if(pCell->GetCellType() == CELLTYPE_EDIT)
5049cdf0e10cSrcweir     {
5050cdf0e10cSrcweir         ((ScEditCell*)pCell)->GetData(pData);
5051cdf0e10cSrcweir         if (pData)
5052cdf0e10cSrcweir             aEngine.SetText(*pData);
5053cdf0e10cSrcweir     }
5054cdf0e10cSrcweir     else  // HyperLink Formula cell
5055cdf0e10cSrcweir     {
5056cdf0e10cSrcweir         pTextObj.reset((static_cast<ScFormulaCell*>(pCell))->CreateURLObject());
5057cdf0e10cSrcweir         if (pTextObj.get())
5058cdf0e10cSrcweir             aEngine.SetText(*pTextObj);
5059cdf0e10cSrcweir     }
5060cdf0e10cSrcweir 
5061cdf0e10cSrcweir     long nStartX = aLogicEdit.Left();
5062cdf0e10cSrcweir 
5063cdf0e10cSrcweir         long nTextWidth = aEngine.CalcTextWidth();
5064cdf0e10cSrcweir     long nTextHeight = aEngine.GetTextHeight();
5065cdf0e10cSrcweir     if ( nTextWidth < nThisColLogic )
5066cdf0e10cSrcweir     {
5067cdf0e10cSrcweir         if (eHorJust == SVX_HOR_JUSTIFY_RIGHT)
5068cdf0e10cSrcweir             nStartX += nThisColLogic - nTextWidth;
5069cdf0e10cSrcweir         else if (eHorJust == SVX_HOR_JUSTIFY_CENTER)
5070cdf0e10cSrcweir             nStartX += (nThisColLogic - nTextWidth) / 2;
5071cdf0e10cSrcweir     }
5072cdf0e10cSrcweir 
5073cdf0e10cSrcweir     aLogicEdit.Left() = nStartX;
5074cdf0e10cSrcweir     if (!bBreak)
5075cdf0e10cSrcweir         aLogicEdit.Right() = nStartX + nTextWidth;
5076cdf0e10cSrcweir 
5077cdf0e10cSrcweir     // There is one glitch when dealing with a hyperlink cell and
5078cdf0e10cSrcweir     // the cell content is NUMERIC. This defaults to right aligned and
5079cdf0e10cSrcweir     // we need to adjust accordingly.
5080cdf0e10cSrcweir     if(pCell->GetCellType() == CELLTYPE_FORMULA &&
5081cdf0e10cSrcweir         static_cast<ScFormulaCell*>(pCell)->IsValue() &&
5082cdf0e10cSrcweir         eHorJust == SVX_HOR_JUSTIFY_STANDARD)
5083cdf0e10cSrcweir     {
5084cdf0e10cSrcweir         aLogicEdit.Right() = aLogicEdit.Left() + nThisColLogic - 1;
5085cdf0e10cSrcweir         aLogicEdit.Left() =  aLogicEdit.Right() - nTextWidth;
5086cdf0e10cSrcweir     }
5087cdf0e10cSrcweir     aLogicEdit.Bottom() = aLogicEdit.Top() + nTextHeight;
5088cdf0e10cSrcweir 
5089cdf0e10cSrcweir 
5090cdf0e10cSrcweir     Point aLogicClick = PixelToLogic(rPos,aEditMode);
5091cdf0e10cSrcweir     if ( aLogicEdit.IsInside(aLogicClick) )
5092cdf0e10cSrcweir     {
5093cdf0e10cSrcweir //      aEngine.SetUpdateMode(sal_False);
5094cdf0e10cSrcweir         EditView aTempView( &aEngine, this );
5095cdf0e10cSrcweir         aTempView.SetOutputArea( aLogicEdit );
5096cdf0e10cSrcweir 
5097cdf0e10cSrcweir         sal_Bool bRet = sal_False;
5098cdf0e10cSrcweir         MapMode aOld = GetMapMode();
5099cdf0e10cSrcweir         SetMapMode(aEditMode);                  // kein return mehr
5100cdf0e10cSrcweir 
5101cdf0e10cSrcweir         if (bSpellErr)                          // Spelling-Fehler suchen
5102cdf0e10cSrcweir         {
5103cdf0e10cSrcweir             bRet = aTempView.IsWrongSpelledWordAtPos( rPos );
5104cdf0e10cSrcweir             if ( bRet )
5105cdf0e10cSrcweir                 pViewData->GetView()->SetCursor( nPosX, nPosY );        // Cursor setzen
5106cdf0e10cSrcweir         }
5107cdf0e10cSrcweir         else                                    // URL suchen
5108cdf0e10cSrcweir         {
5109cdf0e10cSrcweir             const SvxFieldItem* pFieldItem = aTempView.GetFieldUnderMousePointer();
5110cdf0e10cSrcweir 
5111cdf0e10cSrcweir             if (pFieldItem)
5112cdf0e10cSrcweir             {
5113cdf0e10cSrcweir                 const SvxFieldData* pField = pFieldItem->GetField();
5114cdf0e10cSrcweir                 if ( pField && pField->ISA(SvxURLField) )
5115cdf0e10cSrcweir                 {
5116cdf0e10cSrcweir                     if ( pName || pUrl || pTarget )
5117cdf0e10cSrcweir                     {
5118cdf0e10cSrcweir                         const SvxURLField* pURLField = (const SvxURLField*)pField;
5119cdf0e10cSrcweir                         if (pName)
5120cdf0e10cSrcweir                             *pName = pURLField->GetRepresentation();
5121cdf0e10cSrcweir                         if (pUrl)
5122cdf0e10cSrcweir                             *pUrl = pURLField->GetURL();
5123cdf0e10cSrcweir                         if (pTarget)
5124cdf0e10cSrcweir                             *pTarget = pURLField->GetTargetFrame();
5125cdf0e10cSrcweir                     }
5126cdf0e10cSrcweir                     bRet = sal_True;
5127cdf0e10cSrcweir                 }
5128cdf0e10cSrcweir             }
5129cdf0e10cSrcweir         }
5130cdf0e10cSrcweir 
5131cdf0e10cSrcweir         SetMapMode(aOld);
5132cdf0e10cSrcweir 
5133cdf0e10cSrcweir         //  text cursor is restored in ScHideTextCursor dtor
5134cdf0e10cSrcweir 
5135cdf0e10cSrcweir         return bRet;
5136cdf0e10cSrcweir     }
5137cdf0e10cSrcweir     return sal_False;
5138cdf0e10cSrcweir }
5139cdf0e10cSrcweir 
HasScenarioButton(const Point & rPosPixel,ScRange & rScenRange)5140cdf0e10cSrcweir sal_Bool ScGridWindow::HasScenarioButton( const Point& rPosPixel, ScRange& rScenRange )
5141cdf0e10cSrcweir {
5142cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
5143cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
5144cdf0e10cSrcweir     SCTAB nTabCount = pDoc->GetTableCount();
5145cdf0e10cSrcweir     if ( nTab+1<nTabCount && pDoc->IsScenario(nTab+1) && !pDoc->IsScenario(nTab) )
5146cdf0e10cSrcweir     {
5147cdf0e10cSrcweir         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
5148cdf0e10cSrcweir 
5149cdf0e10cSrcweir         Size aButSize = pViewData->GetScenButSize();
5150cdf0e10cSrcweir         long nBWidth  = aButSize.Width();
5151cdf0e10cSrcweir         if (!nBWidth)
5152cdf0e10cSrcweir             return sal_False;                   // noch kein Button gezeichnet -> da ist auch keiner
5153cdf0e10cSrcweir         long nBHeight = aButSize.Height();
5154cdf0e10cSrcweir         long nHSpace  = (long)( SC_SCENARIO_HSPACE * pViewData->GetPPTX() );
5155cdf0e10cSrcweir 
5156cdf0e10cSrcweir         //! Ranges an der Table cachen!!!!
5157cdf0e10cSrcweir 
5158cdf0e10cSrcweir         ScMarkData aMarks;
5159cdf0e10cSrcweir         for (SCTAB i=nTab+1; i<nTabCount && pDoc->IsScenario(i); i++)
5160cdf0e10cSrcweir             pDoc->MarkScenario( i, nTab, aMarks, sal_False, SC_SCENARIO_SHOWFRAME );
5161cdf0e10cSrcweir         ScRangeList aRanges;
5162cdf0e10cSrcweir         aMarks.FillRangeListWithMarks( &aRanges, sal_False );
5163cdf0e10cSrcweir 
5164cdf0e10cSrcweir 
5165cdf0e10cSrcweir         sal_uLong nRangeCount = aRanges.Count();
5166cdf0e10cSrcweir         for (sal_uLong j=0; j<nRangeCount; j++)
5167cdf0e10cSrcweir         {
5168cdf0e10cSrcweir             ScRange aRange = *aRanges.GetObject(j);
5169cdf0e10cSrcweir             //  Szenario-Rahmen immer dann auf zusammengefasste Zellen erweitern, wenn
5170cdf0e10cSrcweir             //  dadurch keine neuen nicht-ueberdeckten Zellen mit umrandet werden
5171cdf0e10cSrcweir             pDoc->ExtendTotalMerge( aRange );
5172cdf0e10cSrcweir 
5173cdf0e10cSrcweir             sal_Bool bTextBelow = ( aRange.aStart.Row() == 0 );
5174cdf0e10cSrcweir 
5175cdf0e10cSrcweir             Point aButtonPos;
5176cdf0e10cSrcweir             if ( bTextBelow )
5177cdf0e10cSrcweir             {
5178cdf0e10cSrcweir                 aButtonPos = pViewData->GetScrPos( aRange.aEnd.Col()+1, aRange.aEnd.Row()+1,
5179cdf0e10cSrcweir                                                     eWhich, sal_True );
5180cdf0e10cSrcweir             }
5181cdf0e10cSrcweir             else
5182cdf0e10cSrcweir             {
5183cdf0e10cSrcweir                 aButtonPos = pViewData->GetScrPos( aRange.aEnd.Col()+1, aRange.aStart.Row(),
5184cdf0e10cSrcweir                                                     eWhich, sal_True );
5185cdf0e10cSrcweir                 aButtonPos.Y() -= nBHeight;
5186cdf0e10cSrcweir             }
5187cdf0e10cSrcweir             if ( bLayoutRTL )
5188cdf0e10cSrcweir                 aButtonPos.X() -= nHSpace - 1;
5189cdf0e10cSrcweir             else
5190cdf0e10cSrcweir                 aButtonPos.X() -= nBWidth - nHSpace;    // same for top or bottom
5191cdf0e10cSrcweir 
5192cdf0e10cSrcweir             Rectangle aButRect( aButtonPos, Size(nBWidth,nBHeight) );
5193cdf0e10cSrcweir             if ( aButRect.IsInside( rPosPixel ) )
5194cdf0e10cSrcweir             {
5195cdf0e10cSrcweir                 rScenRange = aRange;
5196cdf0e10cSrcweir                 return sal_True;
5197cdf0e10cSrcweir             }
5198cdf0e10cSrcweir         }
5199cdf0e10cSrcweir     }
5200cdf0e10cSrcweir 
5201cdf0e10cSrcweir     return sal_False;
5202cdf0e10cSrcweir }
5203cdf0e10cSrcweir 
UpdateVisibleRange()5204cdf0e10cSrcweir void ScGridWindow::UpdateVisibleRange()
5205cdf0e10cSrcweir {
5206cdf0e10cSrcweir     // #163911# Update the visible range outside of paint (called when switching sheets).
5207cdf0e10cSrcweir     // Use the same logic here as in ScGridWindow::Draw.
5208cdf0e10cSrcweir 
5209cdf0e10cSrcweir     SCCOL nPosX = pViewData->GetPosX( eHWhich );
5210cdf0e10cSrcweir     SCROW nPosY = pViewData->GetPosY( eVWhich );
5211cdf0e10cSrcweir 
5212cdf0e10cSrcweir     SCCOL nXRight = nPosX + pViewData->VisibleCellsX(eHWhich);
5213cdf0e10cSrcweir     if (nXRight > MAXCOL) nXRight = MAXCOL;
5214cdf0e10cSrcweir     SCROW nYBottom = nPosY + pViewData->VisibleCellsY(eVWhich);
5215cdf0e10cSrcweir     if (nYBottom > MAXROW) nYBottom = MAXROW;
5216cdf0e10cSrcweir 
5217cdf0e10cSrcweir     // Store the current visible range.
5218cdf0e10cSrcweir     maVisibleRange.mnCol1 = nPosX;
5219cdf0e10cSrcweir     maVisibleRange.mnCol2 = nXRight;
5220cdf0e10cSrcweir     maVisibleRange.mnRow1 = nPosY;
5221cdf0e10cSrcweir     maVisibleRange.mnRow2 = nYBottom;
5222cdf0e10cSrcweir }
5223cdf0e10cSrcweir 
5224cdf0e10cSrcweir // #114409#
DrawLayerCreated()5225cdf0e10cSrcweir void ScGridWindow::DrawLayerCreated()
5226cdf0e10cSrcweir {
5227cdf0e10cSrcweir     SetMapMode( GetDrawMapMode() );
5228cdf0e10cSrcweir 
5229cdf0e10cSrcweir     // initially create overlay objects
5230cdf0e10cSrcweir     ImpCreateOverlayObjects();
5231cdf0e10cSrcweir }
5232cdf0e10cSrcweir 
5233cdf0e10cSrcweir // #114409#
CursorChanged()5234cdf0e10cSrcweir void ScGridWindow::CursorChanged()
5235cdf0e10cSrcweir {
5236cdf0e10cSrcweir     // here the created OverlayObjects may be transformed in later versions. For
5237cdf0e10cSrcweir     // now, just re-create them
5238cdf0e10cSrcweir 
5239cdf0e10cSrcweir     UpdateCursorOverlay();
5240cdf0e10cSrcweir }
5241cdf0e10cSrcweir 
5242cdf0e10cSrcweir // #114409#
ImpCreateOverlayObjects()5243cdf0e10cSrcweir void ScGridWindow::ImpCreateOverlayObjects()
5244cdf0e10cSrcweir {
5245cdf0e10cSrcweir     UpdateCursorOverlay();
5246cdf0e10cSrcweir     UpdateSelectionOverlay();
5247cdf0e10cSrcweir     UpdateAutoFillOverlay();
5248cdf0e10cSrcweir     UpdateDragRectOverlay();
5249cdf0e10cSrcweir     UpdateHeaderOverlay();
5250cdf0e10cSrcweir     UpdateShrinkOverlay();
5251cdf0e10cSrcweir }
5252cdf0e10cSrcweir 
5253cdf0e10cSrcweir // #114409#
ImpDestroyOverlayObjects()5254cdf0e10cSrcweir void ScGridWindow::ImpDestroyOverlayObjects()
5255cdf0e10cSrcweir {
5256cdf0e10cSrcweir     DeleteCursorOverlay();
5257cdf0e10cSrcweir     DeleteSelectionOverlay();
5258cdf0e10cSrcweir     DeleteAutoFillOverlay();
5259cdf0e10cSrcweir     DeleteDragRectOverlay();
5260cdf0e10cSrcweir     DeleteHeaderOverlay();
5261cdf0e10cSrcweir     DeleteShrinkOverlay();
5262cdf0e10cSrcweir }
5263cdf0e10cSrcweir 
UpdateAllOverlays()5264cdf0e10cSrcweir void ScGridWindow::UpdateAllOverlays()
5265cdf0e10cSrcweir {
5266cdf0e10cSrcweir     // delete and re-allocate all overlay objects
5267cdf0e10cSrcweir 
5268cdf0e10cSrcweir     ImpDestroyOverlayObjects();
5269cdf0e10cSrcweir     ImpCreateOverlayObjects();
5270cdf0e10cSrcweir }
5271cdf0e10cSrcweir 
DeleteCursorOverlay()5272cdf0e10cSrcweir void ScGridWindow::DeleteCursorOverlay()
5273cdf0e10cSrcweir {
5274cdf0e10cSrcweir     DELETEZ( mpOOCursors );
5275cdf0e10cSrcweir }
5276cdf0e10cSrcweir 
UpdateCursorOverlay()5277cdf0e10cSrcweir void ScGridWindow::UpdateCursorOverlay()
5278cdf0e10cSrcweir {
5279cdf0e10cSrcweir     MapMode aDrawMode = GetDrawMapMode();
5280cdf0e10cSrcweir     MapMode aOldMode = GetMapMode();
5281cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5282cdf0e10cSrcweir         SetMapMode( aDrawMode );
5283cdf0e10cSrcweir 
5284cdf0e10cSrcweir     // Existing OverlayObjects may be transformed in later versions.
5285cdf0e10cSrcweir     // For now, just re-create them.
5286cdf0e10cSrcweir 
5287cdf0e10cSrcweir     DeleteCursorOverlay();
5288cdf0e10cSrcweir 
5289cdf0e10cSrcweir     std::vector<Rectangle> aPixelRects;
5290cdf0e10cSrcweir 
5291cdf0e10cSrcweir     //
5292cdf0e10cSrcweir     //  determine the cursor rectangles in pixels (moved from ScGridWindow::DrawCursor)
5293cdf0e10cSrcweir     //
5294cdf0e10cSrcweir 
5295cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
5296cdf0e10cSrcweir     SCCOL nX = pViewData->GetCurX();
5297cdf0e10cSrcweir     SCROW nY = pViewData->GetCurY();
5298cdf0e10cSrcweir 
5299cdf0e10cSrcweir     if (!maVisibleRange.isInside(nX, nY))
5300cdf0e10cSrcweir         return;
5301cdf0e10cSrcweir 
5302cdf0e10cSrcweir     //  don't show the cursor in overlapped cells
5303cdf0e10cSrcweir 
5304cdf0e10cSrcweir     ScDocument* pDoc = pViewData->GetDocument();
5305cdf0e10cSrcweir     const ScPatternAttr* pPattern = pDoc->GetPattern(nX,nY,nTab);
5306cdf0e10cSrcweir     const ScMergeFlagAttr& rMergeFlag = (const ScMergeFlagAttr&) pPattern->GetItem(ATTR_MERGE_FLAG);
5307cdf0e10cSrcweir     sal_Bool bOverlapped = rMergeFlag.IsOverlapped();
5308cdf0e10cSrcweir 
5309cdf0e10cSrcweir     //  left or above of the screen?
5310cdf0e10cSrcweir 
5311cdf0e10cSrcweir     sal_Bool bVis = ( nX>=pViewData->GetPosX(eHWhich) && nY>=pViewData->GetPosY(eVWhich) );
5312cdf0e10cSrcweir     if (!bVis)
5313cdf0e10cSrcweir     {
5314cdf0e10cSrcweir         SCCOL nEndX = nX;
5315cdf0e10cSrcweir         SCROW nEndY = nY;
5316cdf0e10cSrcweir         const ScMergeAttr& rMerge = (const ScMergeAttr&) pPattern->GetItem(ATTR_MERGE);
5317cdf0e10cSrcweir         if (rMerge.GetColMerge() > 1)
5318cdf0e10cSrcweir             nEndX += rMerge.GetColMerge()-1;
5319cdf0e10cSrcweir         if (rMerge.GetRowMerge() > 1)
5320cdf0e10cSrcweir             nEndY += rMerge.GetRowMerge()-1;
5321cdf0e10cSrcweir         bVis = ( nEndX>=pViewData->GetPosX(eHWhich) && nEndY>=pViewData->GetPosY(eVWhich) );
5322cdf0e10cSrcweir     }
5323cdf0e10cSrcweir 
5324cdf0e10cSrcweir     if ( bVis && !bOverlapped && !pViewData->HasEditView(eWhich) && pViewData->IsActive() )
5325cdf0e10cSrcweir     {
5326cdf0e10cSrcweir         Point aScrPos = pViewData->GetScrPos( nX, nY, eWhich, sal_True );
5327cdf0e10cSrcweir         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
5328cdf0e10cSrcweir 
5329cdf0e10cSrcweir         //  completely right of/below the screen?
5330cdf0e10cSrcweir         //  (test with logical start position in aScrPos)
5331cdf0e10cSrcweir         sal_Bool bMaybeVisible;
5332cdf0e10cSrcweir         if ( bLayoutRTL )
5333cdf0e10cSrcweir             bMaybeVisible = ( aScrPos.X() >= -2 && aScrPos.Y() >= -2 );
5334cdf0e10cSrcweir         else
5335cdf0e10cSrcweir         {
5336cdf0e10cSrcweir             Size aOutSize = GetOutputSizePixel();
5337cdf0e10cSrcweir             bMaybeVisible = ( aScrPos.X() <= aOutSize.Width() + 2 && aScrPos.Y() <= aOutSize.Height() + 2 );
5338cdf0e10cSrcweir         }
5339cdf0e10cSrcweir         if ( bMaybeVisible )
5340cdf0e10cSrcweir         {
5341cdf0e10cSrcweir             long nSizeXPix;
5342cdf0e10cSrcweir             long nSizeYPix;
5343cdf0e10cSrcweir             pViewData->GetMergeSizePixel( nX, nY, nSizeXPix, nSizeYPix );
5344cdf0e10cSrcweir 
5345cdf0e10cSrcweir             if ( bLayoutRTL )
5346cdf0e10cSrcweir                 aScrPos.X() -= nSizeXPix - 2;       // move instead of mirroring
5347cdf0e10cSrcweir 
5348cdf0e10cSrcweir             sal_Bool bFix = ( pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
5349cdf0e10cSrcweir                             pViewData->GetVSplitMode() == SC_SPLIT_FIX );
5350cdf0e10cSrcweir             if ( pViewData->GetActivePart()==eWhich || bFix )
5351cdf0e10cSrcweir             {
5352cdf0e10cSrcweir                 aScrPos.X() -= 2;
5353cdf0e10cSrcweir                 aScrPos.Y() -= 2;
5354cdf0e10cSrcweir                 Rectangle aRect( aScrPos, Size( nSizeXPix + 3, nSizeYPix + 3 ) );
5355cdf0e10cSrcweir 
5356cdf0e10cSrcweir                 aPixelRects.push_back(Rectangle( aRect.Left(), aRect.Top(), aRect.Left()+2, aRect.Bottom() ));
5357cdf0e10cSrcweir                 aPixelRects.push_back(Rectangle( aRect.Right()-2, aRect.Top(), aRect.Right(), aRect.Bottom() ));
5358cdf0e10cSrcweir                 aPixelRects.push_back(Rectangle( aRect.Left()+3, aRect.Top(), aRect.Right()-3, aRect.Top()+2 ));
5359cdf0e10cSrcweir                 aPixelRects.push_back(Rectangle( aRect.Left()+3, aRect.Bottom()-2, aRect.Right()-3, aRect.Bottom() ));
5360cdf0e10cSrcweir             }
5361cdf0e10cSrcweir             else
5362cdf0e10cSrcweir             {
5363cdf0e10cSrcweir                 Rectangle aRect( aScrPos, Size( nSizeXPix - 1, nSizeYPix - 1 ) );
5364cdf0e10cSrcweir                 aPixelRects.push_back( aRect );
5365cdf0e10cSrcweir             }
5366cdf0e10cSrcweir         }
5367cdf0e10cSrcweir     }
5368cdf0e10cSrcweir 
5369cdf0e10cSrcweir     if ( aPixelRects.size() )
5370cdf0e10cSrcweir     {
5371cdf0e10cSrcweir         // #i70788# get the OverlayManager safely
5372cdf0e10cSrcweir         ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5373cdf0e10cSrcweir 
5374cdf0e10cSrcweir         if(pOverlayManager)
5375cdf0e10cSrcweir         {
5376cdf0e10cSrcweir             const Color aCursorColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
5377cdf0e10cSrcweir             std::vector< basegfx::B2DRange > aRanges;
5378cdf0e10cSrcweir             const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
5379cdf0e10cSrcweir 
5380cdf0e10cSrcweir             for(sal_uInt32 a(0); a < aPixelRects.size(); a++)
5381cdf0e10cSrcweir             {
5382cdf0e10cSrcweir                 const Rectangle aRA(aPixelRects[a]);
5383cdf0e10cSrcweir                 basegfx::B2DRange aRB(aRA.Left(), aRA.Top(), aRA.Right() + 1, aRA.Bottom() + 1);
5384cdf0e10cSrcweir                 aRB.transform(aTransform);
5385cdf0e10cSrcweir                 aRanges.push_back(aRB);
5386cdf0e10cSrcweir             }
5387cdf0e10cSrcweir 
5388cdf0e10cSrcweir             sdr::overlay::OverlayObject* pOverlay = new sdr::overlay::OverlaySelection(
5389cdf0e10cSrcweir                 sdr::overlay::OVERLAY_SOLID,
5390cdf0e10cSrcweir                 aCursorColor,
5391cdf0e10cSrcweir                 aRanges,
5392cdf0e10cSrcweir                 false);
5393cdf0e10cSrcweir 
5394cdf0e10cSrcweir             pOverlayManager->add(*pOverlay);
5395cdf0e10cSrcweir             mpOOCursors = new ::sdr::overlay::OverlayObjectList;
5396cdf0e10cSrcweir             mpOOCursors->append(*pOverlay);
5397cdf0e10cSrcweir         }
5398cdf0e10cSrcweir     }
5399cdf0e10cSrcweir 
5400cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5401cdf0e10cSrcweir         SetMapMode( aOldMode );
5402cdf0e10cSrcweir }
5403cdf0e10cSrcweir 
DeleteSelectionOverlay()5404cdf0e10cSrcweir void ScGridWindow::DeleteSelectionOverlay()
5405cdf0e10cSrcweir {
5406cdf0e10cSrcweir     DELETEZ( mpOOSelection );
5407cdf0e10cSrcweir }
5408cdf0e10cSrcweir 
UpdateSelectionOverlay()5409cdf0e10cSrcweir void ScGridWindow::UpdateSelectionOverlay()
5410cdf0e10cSrcweir {
5411cdf0e10cSrcweir     MapMode aDrawMode = GetDrawMapMode();
5412cdf0e10cSrcweir     MapMode aOldMode = GetMapMode();
5413cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5414cdf0e10cSrcweir         SetMapMode( aDrawMode );
5415cdf0e10cSrcweir 
5416cdf0e10cSrcweir     DeleteSelectionOverlay();
5417cdf0e10cSrcweir     std::vector<Rectangle> aPixelRects;
5418cdf0e10cSrcweir     GetSelectionRects( aPixelRects );
5419cdf0e10cSrcweir 
5420cdf0e10cSrcweir     if ( aPixelRects.size() && pViewData->IsActive() )
5421cdf0e10cSrcweir     {
5422cdf0e10cSrcweir         // #i70788# get the OverlayManager safely
5423cdf0e10cSrcweir         ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5424cdf0e10cSrcweir 
5425cdf0e10cSrcweir         if(pOverlayManager)
5426cdf0e10cSrcweir         {
5427cdf0e10cSrcweir             std::vector< basegfx::B2DRange > aRanges;
5428cdf0e10cSrcweir             const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
5429cdf0e10cSrcweir 
5430cdf0e10cSrcweir             for(sal_uInt32 a(0); a < aPixelRects.size(); a++)
5431cdf0e10cSrcweir             {
5432cdf0e10cSrcweir                 const Rectangle aRA(aPixelRects[a]);
5433cdf0e10cSrcweir                 basegfx::B2DRange aRB(aRA.Left() - 1, aRA.Top() - 1, aRA.Right(), aRA.Bottom());
5434cdf0e10cSrcweir                 aRB.transform(aTransform);
5435cdf0e10cSrcweir                 aRanges.push_back(aRB);
5436cdf0e10cSrcweir             }
5437cdf0e10cSrcweir 
54386043ac9bSArmin Le Grand             // get the system's hilight color
5439cdf0e10cSrcweir             const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer;
54406043ac9bSArmin Le Grand             const Color aHighlight(aSvtOptionsDrawinglayer.getHilightColor());
5441cdf0e10cSrcweir 
5442cdf0e10cSrcweir             sdr::overlay::OverlayObject* pOverlay = new sdr::overlay::OverlaySelection(
5443cdf0e10cSrcweir                 sdr::overlay::OVERLAY_TRANSPARENT,
5444cdf0e10cSrcweir                 aHighlight,
5445cdf0e10cSrcweir                 aRanges,
5446cdf0e10cSrcweir                 true);
5447cdf0e10cSrcweir 
5448cdf0e10cSrcweir             pOverlayManager->add(*pOverlay);
5449cdf0e10cSrcweir             mpOOSelection = new ::sdr::overlay::OverlayObjectList;
5450cdf0e10cSrcweir             mpOOSelection->append(*pOverlay);
5451cdf0e10cSrcweir         }
5452cdf0e10cSrcweir     }
5453cdf0e10cSrcweir 
5454cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5455cdf0e10cSrcweir         SetMapMode( aOldMode );
5456cdf0e10cSrcweir }
5457cdf0e10cSrcweir 
DeleteAutoFillOverlay()5458cdf0e10cSrcweir void ScGridWindow::DeleteAutoFillOverlay()
5459cdf0e10cSrcweir {
5460cdf0e10cSrcweir     DELETEZ( mpOOAutoFill );
5461cdf0e10cSrcweir     mpAutoFillRect.reset();
5462cdf0e10cSrcweir }
5463cdf0e10cSrcweir 
UpdateAutoFillOverlay()5464cdf0e10cSrcweir void ScGridWindow::UpdateAutoFillOverlay()
5465cdf0e10cSrcweir {
5466cdf0e10cSrcweir     MapMode aDrawMode = GetDrawMapMode();
5467cdf0e10cSrcweir     MapMode aOldMode = GetMapMode();
5468cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5469cdf0e10cSrcweir         SetMapMode( aDrawMode );
5470cdf0e10cSrcweir 
5471cdf0e10cSrcweir     DeleteAutoFillOverlay();
5472cdf0e10cSrcweir 
5473cdf0e10cSrcweir     //
5474cdf0e10cSrcweir     //  get the AutoFill handle rectangle in pixels (moved from ScGridWindow::DrawAutoFillMark)
5475cdf0e10cSrcweir     //
5476cdf0e10cSrcweir 
5477cdf0e10cSrcweir     if ( bAutoMarkVisible && aAutoMarkPos.Tab() == pViewData->GetTabNo() &&
5478cdf0e10cSrcweir          !pViewData->HasEditView(eWhich) && pViewData->IsActive() )
5479cdf0e10cSrcweir     {
5480cdf0e10cSrcweir         SCCOL nX = aAutoMarkPos.Col();
5481cdf0e10cSrcweir         SCROW nY = aAutoMarkPos.Row();
5482cdf0e10cSrcweir 
5483cdf0e10cSrcweir         if (!maVisibleRange.isInside(nX, nY))
5484cdf0e10cSrcweir             // Autofill mark is not visible.  Bail out.
5485cdf0e10cSrcweir             return;
5486cdf0e10cSrcweir 
5487cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
5488cdf0e10cSrcweir         ScDocument* pDoc = pViewData->GetDocument();
5489cdf0e10cSrcweir         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
5490cdf0e10cSrcweir 
5491cdf0e10cSrcweir         Point aFillPos = pViewData->GetScrPos( nX, nY, eWhich, sal_True );
5492cdf0e10cSrcweir         long nSizeXPix;
5493cdf0e10cSrcweir         long nSizeYPix;
5494cdf0e10cSrcweir         pViewData->GetMergeSizePixel( nX, nY, nSizeXPix, nSizeYPix );
5495cdf0e10cSrcweir         if ( bLayoutRTL )
5496cdf0e10cSrcweir             aFillPos.X() -= nSizeXPix + 3;
5497cdf0e10cSrcweir         else
5498cdf0e10cSrcweir             aFillPos.X() += nSizeXPix - 2;
5499cdf0e10cSrcweir 
5500cdf0e10cSrcweir         aFillPos.Y() += nSizeYPix;
5501cdf0e10cSrcweir         aFillPos.Y() -= 2;
5502cdf0e10cSrcweir         mpAutoFillRect.reset(new Rectangle(aFillPos, Size(6, 6)));
5503cdf0e10cSrcweir 
5504cdf0e10cSrcweir         // #i70788# get the OverlayManager safely
5505cdf0e10cSrcweir         ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5506cdf0e10cSrcweir 
5507cdf0e10cSrcweir         if(pOverlayManager)
5508cdf0e10cSrcweir         {
5509cdf0e10cSrcweir             const Color aHandleColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
5510cdf0e10cSrcweir             std::vector< basegfx::B2DRange > aRanges;
5511cdf0e10cSrcweir             const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
5512cdf0e10cSrcweir             basegfx::B2DRange aRB(mpAutoFillRect->Left(), mpAutoFillRect->Top(), mpAutoFillRect->Right() + 1, mpAutoFillRect->Bottom() + 1);
5513cdf0e10cSrcweir 
5514cdf0e10cSrcweir             aRB.transform(aTransform);
5515cdf0e10cSrcweir             aRanges.push_back(aRB);
5516cdf0e10cSrcweir 
5517cdf0e10cSrcweir             sdr::overlay::OverlayObject* pOverlay = new sdr::overlay::OverlaySelection(
5518cdf0e10cSrcweir                 sdr::overlay::OVERLAY_SOLID,
5519cdf0e10cSrcweir                 aHandleColor,
5520cdf0e10cSrcweir                 aRanges,
5521cdf0e10cSrcweir                 false);
5522cdf0e10cSrcweir 
5523cdf0e10cSrcweir             pOverlayManager->add(*pOverlay);
5524cdf0e10cSrcweir             mpOOAutoFill = new ::sdr::overlay::OverlayObjectList;
5525cdf0e10cSrcweir             mpOOAutoFill->append(*pOverlay);
5526cdf0e10cSrcweir         }
5527cdf0e10cSrcweir 
5528cdf0e10cSrcweir         if ( aOldMode != aDrawMode )
5529cdf0e10cSrcweir             SetMapMode( aOldMode );
5530cdf0e10cSrcweir     }
5531cdf0e10cSrcweir }
5532cdf0e10cSrcweir 
DeleteDragRectOverlay()5533cdf0e10cSrcweir void ScGridWindow::DeleteDragRectOverlay()
5534cdf0e10cSrcweir {
5535cdf0e10cSrcweir     DELETEZ( mpOODragRect );
5536cdf0e10cSrcweir }
5537cdf0e10cSrcweir 
UpdateDragRectOverlay()5538cdf0e10cSrcweir void ScGridWindow::UpdateDragRectOverlay()
5539cdf0e10cSrcweir {
5540cdf0e10cSrcweir     MapMode aDrawMode = GetDrawMapMode();
5541cdf0e10cSrcweir     MapMode aOldMode = GetMapMode();
5542cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5543cdf0e10cSrcweir         SetMapMode( aDrawMode );
5544cdf0e10cSrcweir 
5545cdf0e10cSrcweir     DeleteDragRectOverlay();
5546cdf0e10cSrcweir 
5547cdf0e10cSrcweir     //
5548cdf0e10cSrcweir     //  get the rectangles in pixels (moved from DrawDragRect)
5549cdf0e10cSrcweir     //
5550cdf0e10cSrcweir 
5551cdf0e10cSrcweir     if ( bDragRect || bPagebreakDrawn )
5552cdf0e10cSrcweir     {
5553cdf0e10cSrcweir         std::vector<Rectangle> aPixelRects;
5554cdf0e10cSrcweir 
5555cdf0e10cSrcweir         SCCOL nX1 = bDragRect ? nDragStartX : aPagebreakDrag.aStart.Col();
5556cdf0e10cSrcweir         SCROW nY1 = bDragRect ? nDragStartY : aPagebreakDrag.aStart.Row();
5557cdf0e10cSrcweir         SCCOL nX2 = bDragRect ? nDragEndX : aPagebreakDrag.aEnd.Col();
5558cdf0e10cSrcweir         SCROW nY2 = bDragRect ? nDragEndY : aPagebreakDrag.aEnd.Row();
5559cdf0e10cSrcweir 
5560cdf0e10cSrcweir         SCTAB nTab = pViewData->GetTabNo();
5561cdf0e10cSrcweir 
5562cdf0e10cSrcweir         SCCOL nPosX = pViewData->GetPosX(WhichH(eWhich));
5563cdf0e10cSrcweir         SCROW nPosY = pViewData->GetPosY(WhichV(eWhich));
5564cdf0e10cSrcweir         if (nX1 < nPosX) nX1 = nPosX;
5565cdf0e10cSrcweir         if (nX2 < nPosX) nX2 = nPosX;
5566cdf0e10cSrcweir         if (nY1 < nPosY) nY1 = nPosY;
5567cdf0e10cSrcweir         if (nY2 < nPosY) nY2 = nPosY;
5568cdf0e10cSrcweir 
5569cdf0e10cSrcweir         Point aScrPos( pViewData->GetScrPos( nX1, nY1, eWhich ) );
5570cdf0e10cSrcweir 
5571cdf0e10cSrcweir         long nSizeXPix=0;
5572cdf0e10cSrcweir         long nSizeYPix=0;
5573cdf0e10cSrcweir         ScDocument* pDoc = pViewData->GetDocument();
5574cdf0e10cSrcweir         double nPPTX = pViewData->GetPPTX();
5575cdf0e10cSrcweir         double nPPTY = pViewData->GetPPTY();
5576cdf0e10cSrcweir         SCCOLROW i;
5577cdf0e10cSrcweir 
5578cdf0e10cSrcweir         sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
5579cdf0e10cSrcweir         long nLayoutSign = bLayoutRTL ? -1 : 1;
5580cdf0e10cSrcweir 
5581cdf0e10cSrcweir         if (ValidCol(nX2) && nX2>=nX1)
5582cdf0e10cSrcweir             for (i=nX1; i<=nX2; i++)
5583cdf0e10cSrcweir                 nSizeXPix += ScViewData::ToPixel( pDoc->GetColWidth( static_cast<SCCOL>(i), nTab ), nPPTX );
5584cdf0e10cSrcweir         else
5585cdf0e10cSrcweir         {
5586cdf0e10cSrcweir             aScrPos.X() -= nLayoutSign;
5587cdf0e10cSrcweir             nSizeXPix   += 2;
5588cdf0e10cSrcweir         }
5589cdf0e10cSrcweir 
5590cdf0e10cSrcweir         if (ValidRow(nY2) && nY2>=nY1)
5591cdf0e10cSrcweir             for (i=nY1; i<=nY2; i++)
5592cdf0e10cSrcweir                 nSizeYPix += ScViewData::ToPixel( pDoc->GetRowHeight( i, nTab ), nPPTY );
5593cdf0e10cSrcweir         else
5594cdf0e10cSrcweir         {
5595cdf0e10cSrcweir             aScrPos.Y() -= 1;
5596cdf0e10cSrcweir             nSizeYPix   += 2;
5597cdf0e10cSrcweir         }
5598cdf0e10cSrcweir 
5599cdf0e10cSrcweir         aScrPos.X() -= 2 * nLayoutSign;
5600cdf0e10cSrcweir         aScrPos.Y() -= 2;
5601cdf0e10cSrcweir //      Rectangle aRect( aScrPos, Size( nSizeXPix + 3, nSizeYPix + 3 ) );
5602cdf0e10cSrcweir         Rectangle aRect( aScrPos.X(), aScrPos.Y(),
5603cdf0e10cSrcweir                          aScrPos.X() + ( nSizeXPix + 2 ) * nLayoutSign, aScrPos.Y() + nSizeYPix + 2 );
5604cdf0e10cSrcweir         if ( bLayoutRTL )
5605cdf0e10cSrcweir         {
5606cdf0e10cSrcweir             aRect.Left() = aRect.Right();   // end position is left
5607cdf0e10cSrcweir             aRect.Right() = aScrPos.X();
5608cdf0e10cSrcweir         }
5609cdf0e10cSrcweir 
5610cdf0e10cSrcweir         if ( meDragInsertMode == INS_CELLSDOWN )
5611cdf0e10cSrcweir         {
5612cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+1, aRect.Top()+3, aRect.Left()+1, aRect.Bottom()-2 ) );
5613cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Right()-1, aRect.Top()+3, aRect.Right()-1, aRect.Bottom()-2 ) );
5614cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+1, aRect.Top(), aRect.Right()-1, aRect.Top()+2 ) );
5615cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+1, aRect.Bottom()-1, aRect.Right()-1, aRect.Bottom()-1 ) );
5616cdf0e10cSrcweir         }
5617cdf0e10cSrcweir         else if ( meDragInsertMode == INS_CELLSRIGHT )
5618cdf0e10cSrcweir         {
5619cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left(), aRect.Top()+1, aRect.Left()+2, aRect.Bottom()-1 ) );
5620cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Right()-1, aRect.Top()+1, aRect.Right()-1, aRect.Bottom()-1 ) );
5621cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+3, aRect.Top()+1, aRect.Right()-2, aRect.Top()+1 ) );
5622cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+3, aRect.Bottom()-1, aRect.Right()-2, aRect.Bottom()-1 ) );
5623cdf0e10cSrcweir         }
5624cdf0e10cSrcweir         else
5625cdf0e10cSrcweir         {
5626cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left(), aRect.Top(), aRect.Left()+2, aRect.Bottom() ) );
5627cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Right()-2, aRect.Top(), aRect.Right(), aRect.Bottom() ) );
5628cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+3, aRect.Top(), aRect.Right()-3, aRect.Top()+2 ) );
5629cdf0e10cSrcweir             aPixelRects.push_back( Rectangle( aRect.Left()+3, aRect.Bottom()-2, aRect.Right()-3, aRect.Bottom() ) );
5630cdf0e10cSrcweir         }
5631cdf0e10cSrcweir 
5632cdf0e10cSrcweir         // #i70788# get the OverlayManager safely
5633cdf0e10cSrcweir         ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5634cdf0e10cSrcweir 
5635cdf0e10cSrcweir         if(pOverlayManager)
5636cdf0e10cSrcweir         {
5637cdf0e10cSrcweir             // Color aHighlight = GetSettings().GetStyleSettings().GetHighlightColor();
5638cdf0e10cSrcweir             std::vector< basegfx::B2DRange > aRanges;
5639cdf0e10cSrcweir             const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
5640cdf0e10cSrcweir 
5641cdf0e10cSrcweir             for(sal_uInt32 a(0); a < aPixelRects.size(); a++)
5642cdf0e10cSrcweir             {
5643cdf0e10cSrcweir                 const Rectangle aRA(aPixelRects[a]);
5644cdf0e10cSrcweir                 basegfx::B2DRange aRB(aRA.Left(), aRA.Top(), aRA.Right() + 1, aRA.Bottom() + 1);
5645cdf0e10cSrcweir                 aRB.transform(aTransform);
5646cdf0e10cSrcweir                 aRanges.push_back(aRB);
5647cdf0e10cSrcweir             }
5648cdf0e10cSrcweir 
5649cdf0e10cSrcweir             sdr::overlay::OverlayObject* pOverlay = new sdr::overlay::OverlaySelection(
5650cdf0e10cSrcweir                 sdr::overlay::OVERLAY_INVERT,
5651cdf0e10cSrcweir                 Color(COL_BLACK),
5652cdf0e10cSrcweir                 aRanges,
5653cdf0e10cSrcweir                 false);
5654cdf0e10cSrcweir 
5655cdf0e10cSrcweir             pOverlayManager->add(*pOverlay);
5656cdf0e10cSrcweir             mpOODragRect = new ::sdr::overlay::OverlayObjectList;
5657cdf0e10cSrcweir             mpOODragRect->append(*pOverlay);
5658cdf0e10cSrcweir         }
5659cdf0e10cSrcweir     }
5660cdf0e10cSrcweir 
5661cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5662cdf0e10cSrcweir         SetMapMode( aOldMode );
5663cdf0e10cSrcweir }
5664cdf0e10cSrcweir 
DeleteHeaderOverlay()5665cdf0e10cSrcweir void ScGridWindow::DeleteHeaderOverlay()
5666cdf0e10cSrcweir {
5667cdf0e10cSrcweir     DELETEZ( mpOOHeader );
5668cdf0e10cSrcweir }
5669cdf0e10cSrcweir 
UpdateHeaderOverlay()5670cdf0e10cSrcweir void ScGridWindow::UpdateHeaderOverlay()
5671cdf0e10cSrcweir {
5672cdf0e10cSrcweir     MapMode aDrawMode = GetDrawMapMode();
5673cdf0e10cSrcweir     MapMode aOldMode = GetMapMode();
5674cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5675cdf0e10cSrcweir         SetMapMode( aDrawMode );
5676cdf0e10cSrcweir 
5677cdf0e10cSrcweir     DeleteHeaderOverlay();
5678cdf0e10cSrcweir 
5679cdf0e10cSrcweir     //  Pixel rectangle is in aInvertRect
5680cdf0e10cSrcweir     if ( !aInvertRect.IsEmpty() )
5681cdf0e10cSrcweir     {
5682cdf0e10cSrcweir         // #i70788# get the OverlayManager safely
5683cdf0e10cSrcweir         ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5684cdf0e10cSrcweir 
5685cdf0e10cSrcweir         if(pOverlayManager)
5686cdf0e10cSrcweir         {
5687cdf0e10cSrcweir             // Color aHighlight = GetSettings().GetStyleSettings().GetHighlightColor();
5688cdf0e10cSrcweir             std::vector< basegfx::B2DRange > aRanges;
5689cdf0e10cSrcweir             const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
5690cdf0e10cSrcweir             basegfx::B2DRange aRB(aInvertRect.Left(), aInvertRect.Top(), aInvertRect.Right() + 1, aInvertRect.Bottom() + 1);
5691cdf0e10cSrcweir 
5692cdf0e10cSrcweir             aRB.transform(aTransform);
5693cdf0e10cSrcweir             aRanges.push_back(aRB);
5694cdf0e10cSrcweir 
5695cdf0e10cSrcweir             sdr::overlay::OverlayObject* pOverlay = new sdr::overlay::OverlaySelection(
5696cdf0e10cSrcweir                 sdr::overlay::OVERLAY_INVERT,
5697cdf0e10cSrcweir                 Color(COL_BLACK),
5698cdf0e10cSrcweir                 aRanges,
5699cdf0e10cSrcweir                 false);
5700cdf0e10cSrcweir 
5701cdf0e10cSrcweir             pOverlayManager->add(*pOverlay);
5702cdf0e10cSrcweir             mpOOHeader = new ::sdr::overlay::OverlayObjectList;
5703cdf0e10cSrcweir             mpOOHeader->append(*pOverlay);
5704cdf0e10cSrcweir         }
5705cdf0e10cSrcweir     }
5706cdf0e10cSrcweir 
5707cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5708cdf0e10cSrcweir         SetMapMode( aOldMode );
5709cdf0e10cSrcweir }
5710cdf0e10cSrcweir 
DeleteShrinkOverlay()5711cdf0e10cSrcweir void ScGridWindow::DeleteShrinkOverlay()
5712cdf0e10cSrcweir {
5713cdf0e10cSrcweir     DELETEZ( mpOOShrink );
5714cdf0e10cSrcweir }
5715cdf0e10cSrcweir 
UpdateShrinkOverlay()5716cdf0e10cSrcweir void ScGridWindow::UpdateShrinkOverlay()
5717cdf0e10cSrcweir {
5718cdf0e10cSrcweir     MapMode aDrawMode = GetDrawMapMode();
5719cdf0e10cSrcweir     MapMode aOldMode = GetMapMode();
5720cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5721cdf0e10cSrcweir         SetMapMode( aDrawMode );
5722cdf0e10cSrcweir 
5723cdf0e10cSrcweir     DeleteShrinkOverlay();
5724cdf0e10cSrcweir 
5725cdf0e10cSrcweir     //
5726cdf0e10cSrcweir     //  get the rectangle in pixels
5727cdf0e10cSrcweir     //
5728cdf0e10cSrcweir 
5729cdf0e10cSrcweir     Rectangle aPixRect;
5730cdf0e10cSrcweir     ScRange aRange;
5731cdf0e10cSrcweir     SCTAB nTab = pViewData->GetTabNo();
5732cdf0e10cSrcweir     if ( pViewData->IsRefMode() && nTab >= pViewData->GetRefStartZ() && nTab <= pViewData->GetRefEndZ() &&
5733cdf0e10cSrcweir          pViewData->GetDelMark( aRange ) )
5734cdf0e10cSrcweir     {
5735cdf0e10cSrcweir         //! limit to visible area
5736cdf0e10cSrcweir         if ( aRange.aStart.Col() <= aRange.aEnd.Col() &&
5737cdf0e10cSrcweir              aRange.aStart.Row() <= aRange.aEnd.Row() )
5738cdf0e10cSrcweir         {
5739cdf0e10cSrcweir             Point aStart = pViewData->GetScrPos( aRange.aStart.Col(),
5740cdf0e10cSrcweir                                                  aRange.aStart.Row(), eWhich );
5741cdf0e10cSrcweir             Point aEnd = pViewData->GetScrPos( aRange.aEnd.Col()+1,
5742cdf0e10cSrcweir                                                aRange.aEnd.Row()+1, eWhich );
5743cdf0e10cSrcweir             aEnd.X() -= 1;
5744cdf0e10cSrcweir             aEnd.Y() -= 1;
5745cdf0e10cSrcweir 
5746cdf0e10cSrcweir             aPixRect = Rectangle( aStart,aEnd );
5747cdf0e10cSrcweir         }
5748cdf0e10cSrcweir     }
5749cdf0e10cSrcweir 
5750cdf0e10cSrcweir     if ( !aPixRect.IsEmpty() )
5751cdf0e10cSrcweir     {
5752cdf0e10cSrcweir         // #i70788# get the OverlayManager safely
5753cdf0e10cSrcweir         ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5754cdf0e10cSrcweir 
5755cdf0e10cSrcweir         if(pOverlayManager)
5756cdf0e10cSrcweir         {
5757cdf0e10cSrcweir             // Color aHighlight = GetSettings().GetStyleSettings().GetHighlightColor();
5758cdf0e10cSrcweir             std::vector< basegfx::B2DRange > aRanges;
5759cdf0e10cSrcweir             const basegfx::B2DHomMatrix aTransform(GetInverseViewTransformation());
5760cdf0e10cSrcweir             basegfx::B2DRange aRB(aPixRect.Left(), aPixRect.Top(), aPixRect.Right() + 1, aPixRect.Bottom() + 1);
5761cdf0e10cSrcweir 
5762cdf0e10cSrcweir             aRB.transform(aTransform);
5763cdf0e10cSrcweir             aRanges.push_back(aRB);
5764cdf0e10cSrcweir 
5765cdf0e10cSrcweir             sdr::overlay::OverlayObject* pOverlay = new sdr::overlay::OverlaySelection(
5766cdf0e10cSrcweir                 sdr::overlay::OVERLAY_INVERT,
5767cdf0e10cSrcweir                 Color(COL_BLACK),
5768cdf0e10cSrcweir                 aRanges,
5769cdf0e10cSrcweir                 false);
5770cdf0e10cSrcweir 
5771cdf0e10cSrcweir             pOverlayManager->add(*pOverlay);
5772cdf0e10cSrcweir             mpOOShrink = new ::sdr::overlay::OverlayObjectList;
5773cdf0e10cSrcweir             mpOOShrink->append(*pOverlay);
5774cdf0e10cSrcweir         }
5775cdf0e10cSrcweir     }
5776cdf0e10cSrcweir 
5777cdf0e10cSrcweir     if ( aOldMode != aDrawMode )
5778cdf0e10cSrcweir         SetMapMode( aOldMode );
5779cdf0e10cSrcweir }
5780cdf0e10cSrcweir 
5781cdf0e10cSrcweir // #i70788# central method to get the OverlayManager safely
getOverlayManager()5782cdf0e10cSrcweir ::sdr::overlay::OverlayManager* ScGridWindow::getOverlayManager()
5783cdf0e10cSrcweir {
5784cdf0e10cSrcweir     SdrPageView* pPV = pViewData->GetView()->GetScDrawView()->GetSdrPageView();
5785cdf0e10cSrcweir 
5786cdf0e10cSrcweir     if(pPV)
5787cdf0e10cSrcweir     {
5788cdf0e10cSrcweir         SdrPageWindow* pPageWin = pPV->FindPageWindow( *this );
5789cdf0e10cSrcweir 
5790cdf0e10cSrcweir         if ( pPageWin )
5791cdf0e10cSrcweir         {
5792cdf0e10cSrcweir             return (pPageWin->GetOverlayManager());
5793cdf0e10cSrcweir         }
5794cdf0e10cSrcweir     }
5795cdf0e10cSrcweir 
5796cdf0e10cSrcweir     return 0L;
5797cdf0e10cSrcweir }
5798cdf0e10cSrcweir 
flushOverlayManager()5799cdf0e10cSrcweir void ScGridWindow::flushOverlayManager()
5800cdf0e10cSrcweir {
5801cdf0e10cSrcweir     // #i70788# get the OverlayManager safely
5802cdf0e10cSrcweir     ::sdr::overlay::OverlayManager* pOverlayManager = getOverlayManager();
5803cdf0e10cSrcweir 
5804cdf0e10cSrcweir     if(pOverlayManager)
5805cdf0e10cSrcweir     {
5806cdf0e10cSrcweir         pOverlayManager->flush();
5807cdf0e10cSrcweir     }
5808cdf0e10cSrcweir }
5809cdf0e10cSrcweir 
5810cdf0e10cSrcweir // ---------------------------------------------------------------------------
5811cdf0e10cSrcweir // eof
5812