2010-10-14 08:27:31 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
re-base on ALv2 code. Includes (at least) relevant parts of:
linecap: Reintegrating finished LineCap feature
Patch contributed by Regina Henschel
http://svn.apache.org/viewvc?view=revision&revision=1232507
Patches contributed by Sven Jacobi
impress212: #i81610# fixed animation export
http://svn.apache.org/viewvc?view=revision&revision=1167620
impress212: drawinglayer gbuild environment changes
http://svn.apache.org/viewvc?view=revision&revision=1167627
http://svn.apache.org/viewvc?view=revision&revision=1167628
impress212: DffPropSet -> minor code improvements, removing table
http://svn.apache.org/viewvc?view=revision&revision=1167634
impress212: #158494# fixed excel import (text rotation)
http://svn.apache.org/viewvc?view=revision&revision=1167638
Patches contributed by Armin Le Grand
Svg: Reintegrated Svg replacement from /branches/alg/svgreplavement
http://svn.apache.org/viewvc?view=revision&revision=1220836
#118728# changed indentifying definitions for Svg file detection
http://svn.apache.org/viewvc?view=revision&revision=1229961
#118838# LineGeometry creation for complicated cases optimized to
create single Polygons
http://svn.apache.org/viewvc?view=revision&revision=1236232
#119176# corrected file type detection for SVG for svg files
without xml header
http://svn.apache.org/viewvc?view=revision&revision=1309445
#118728# Extended Svg file detection
http://svn.apache.org/viewvc?view=revision&revision=1230531
#118529# solve break converters and convert commands for OLEs and images
http://svn.apache.org/viewvc?view=revision&revision=1186168
svg: added WaE changes from branch svgreplacement to trunc
http://svn.apache.org/viewvc?view=revision&revision=1222974
svg: corrected missing member initialization
http://svn.apache.org/viewvc?view=revision&revision=1226134
fix for #118525#: Using primitives for chart sub-geometry visualisation
http://svn.apache.org/viewvc?view=revision&revision=1226879
#118898# Adapted ImpGraphic::ImplGetBitmap to correctly convert
metafiles to bitmapEx ...
http://svn.apache.org/viewvc?view=revision&revision=1293316
fix for #118525#: removed no longer used variable maOriginalMapMode, one
more exception eliminated
http://svn.apache.org/viewvc?view=revision&revision=1227097
#16758# Added buffering to the VDev usages of the VclProcessor2D derivates...
http://svn.apache.org/viewvc?view=revision&revision=1229521
#116758# Secured VDev buffer device to Vcl deinit
http://svn.apache.org/viewvc?view=revision&revision=1230574
#116758# added remembering allocated VDevs for VDevBuffer to be able to also
delete these when vcl goes down; it should never happen, but You never know
http://svn.apache.org/viewvc?view=revision&revision=1230927
#118730# Changed SvgClipPathNode to use MaskPrimitive2D for primitive
representation instead of TransparencePrimitive2D
http://svn.apache.org/viewvc?view=revision&revision=1231198
#118822# secured 3D geometry creation (slices) by subdividing the 2D
source polyPolygon early
http://svn.apache.org/viewvc?view=revision&revision=1234749
#118829# enhanced Svg gradient quality, obstacles avoided
http://svn.apache.org/viewvc?view=revision&revision=1235361
#118834# Unified usage of TextBreakupHelper as single tooling class
for i18n text primitive breakup
http://svn.apache.org/viewvc?view=revision&revision=1236110
#118853# added square pixel size limit to conversion of
TransparencePrimitive2D to Metafile action
http://svn.apache.org/viewvc?view=revision&revision=1237656
#118824# coreccted mirroring and boundrect when the graphicmanager
is used for bitmap output
http://svn.apache.org/viewvc?view=revision&revision=1240097
#115092# Corrected VclProcessor2D::RenderPolygonStrokePrimitive2D for
various optimization scenarios
http://svn.apache.org/viewvc?view=revision&revision=1241434
#118783# Corrected errors in ID strings, corrected Svg line/fill export,
corrected polygon close state
http://svn.apache.org/viewvc?view=revision&revision=1232006
#118796# corrected null-pointer usage in SVG text exporter
http://svn.apache.org/viewvc?view=revision&revision=1240262
#118729# Use GraphicStreamUrl and GraphicUrl to allow multi image
import with linked graphics, too
http://svn.apache.org/viewvc?view=revision&revision=1229962
#118898# corrected error in GDIMetaFile::GetBoundRect in handling
MetaFloatTransparentAction
http://svn.apache.org/viewvc?view=revision&revision=1293349
#118855# Corrected handling of possibly created empty clipRegions
after PolyPolygon clipping
http://svn.apache.org/viewvc?view=revision&revision=1237725
#115962# Better (but not yet optimal, see comments in task) handling
of MetaFloatTransparentAction in PDF export
http://svn.apache.org/viewvc?view=revision&revision=1241078
IP clearance: #118466# This patch removes librsvg, libcroco, libgsf, ...
http://svn.apache.org/viewvc?view=revision&revision=1200879
118779# Added svg content streaming in/out to ImpGraphic stream operators
http://svn.apache.org/viewvc?view=revision&revision=1231908
linecap: correctons for WaE and mac drawing
http://svn.apache.org/viewvc?view=revision&revision=1232793
svg: uses current system Dpi for Svg replacement image creation
http://svn.apache.org/viewvc?view=revision&revision=1233948
Patches contributed by Mathias Bauer (and others)
gnumake4 work variously
http://svn.apache.org/viewvc?view=revision&revision=1394326
http://svn.apache.org/viewvc?view=revision&revision=1396797
http://svn.apache.org/viewvc?view=revision&revision=1397315
http://svn.apache.org/viewvc?view=revision&revision=1394326
Remove duplicate header includes.
cws mba34issues01: #i117720#: convert assertion into warning
http://svn.apache.org/viewvc?view=revision&revision=1172352
118485 - Styles for OLEs are not saved. Submitted by Armin Le Grand.
http://svn.apache.org/viewvc?view=revision&revision=1182166
cws mba34issues01: #i117714#: remove assertion
http://svn.apache.org/viewvc?view=revision&revision=1172357
Patch contributed by Jurgen Schmidt
add some additional checks to ensure proper reading operations
http://svn.apache.org/viewvc?view=revision&revision=1209022
mostly prefer our stream / bounds checking work.
Patches contributed by Herbert Duerr
#i118816# add clarifying comment regarding Font::*Color*() methods
http://svn.apache.org/viewvc?view=revision&revision=1233833
extend macro->string handling for empty strings
http://svn.apache.org/viewvc?view=revision&revision=1175801
avoid magic constants for SALCOLOR_NONE
http://svn.apache.org/viewvc?view=revision&revision=1177543
initialize slant properly in ImplFontMetricData constructor (author=iorsh)
http://svn.apache.org/viewvc?view=revision&revision=1177551
#i118675# make check for extension updates more stable
http://svn.apache.org/viewvc?view=revision&revision=1214797
#a118617# remove VBasicEventListener.dll binary
There are no known users depending on its CLSID
http://svn.apache.org/viewvc?view=revision&revision=1203697
Patches contributed by Ariel Constenla-Haile
Fix build breaker on Linux/gcc
http://svn.apache.org/viewvc?view=revision&revision=1221104
Fix crash when trying to instantiate css.graphic.GraphicRasterizer_RSVG
http://svn.apache.org/viewvc?view=revision&revision=1215559
Patches contributed by Oliver-Rainer Wittmann
sw34bf06: #i117962# - method <SwFlyFrm::IsPaint(..)> - consider
instances of <SwFlyDrawObj>
http://svn.apache.org/viewvc?view=revision&revision=1172120
sw34bf06: #i117783# - Writer's implementation of XPagePrintable -
apply print settings to new printing routines
http://svn.apache.org/viewvc?view=revision&revision=1172115
gnumake4 work variously from Hans-Joachim Lankenau
http://svn.apache.org/viewvc?view=revision&revision=1397315
http://svn.apache.org/viewvc?view=revision&revision=1396797
http://svn.apache.org/viewvc?view=revision&revision=1396782
http://svn.apache.org/viewvc?view=revision&revision=1394707
plus some amount of re-splitting of legacy headers.
Patch contributed by Pavel Janik
WaE: Remove unused variables.
http://svn.apache.org/viewvc?view=revision&revision=1230697
Patches contributed by Takashi Ono
mingwport35: i#117795: MinGW port fix for vcl2gnumake
http://svn.apache.org/viewvc?view=revision&revision=1172091
mingwport35: i#117795: MinGW port fix for vcl2gnumake
http://svn.apache.org/viewvc?view=revision&revision=1172091
Patch contributed by Christian Lippka
impress212: #i98044# re enable Text menu for outline and title shapes
http://svn.apache.org/viewvc?view=revision&revision=1167639
Patch contributed by Andre Fischer
118674: Made category B code optional and disabled by default.
http://svn.apache.org/viewvc?view=revision&revision=1215131
118881: Ignore empty paragraphs after bullets.
http://svn.apache.org/viewvc?view=revision&revision=1296205
Patches contributed by Philipp Lohmann
ooo340fixes: #i117780# use rtl allocator
http://svn.apache.org/viewvc?view=revision&revision=1172087
ooo34gsl02: #i117807# fix an off by one error (index actually
inside the pfb section header)
http://svn.apache.org/viewvc?view=revision&revision=1167576
various cleanups, related compilation fixes, warning cleanups, re-working
of obsolete stl template pieces to use boost instead, changed string
classes, re-adapt KDE about data, about dialog, fixing warnings,
and other fixes & improvements.
Disable svg import / render for about/ branding code-paths for now.
Restore full icon theme set.
Remove OS/2 conditionals and sources.
Remove conflicting gtk/full-screen monitors support.
Retain existing svg rasterizer files - temporarily disabled.
Standardize stringificaiton and fixup dllpostfix issues.
Rename SvgGradientHelper::== to equalTo to avoid overloading issues.
Use the flat GdiPlus API for LineCaps calls.
2012-10-09 12:22:23 +01:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2006-04-07 14:33:31 +00:00
|
|
|
#include <tools/time.hxx>
|
2004-07-06 12:48:09 +00:00
|
|
|
#include <tools/rc.h>
|
2011-01-24 16:34:14 +01:00
|
|
|
|
|
|
|
#include <brdwin.hxx>
|
|
|
|
#include <svdata.hxx>
|
|
|
|
#include <salframe.hxx>
|
|
|
|
#include <window.h>
|
|
|
|
|
2007-06-27 19:30:40 +00:00
|
|
|
#include <vcl/event.hxx>
|
|
|
|
#include <vcl/floatwin.hxx>
|
|
|
|
#include <vcl/dockwin.hxx>
|
|
|
|
#include <vcl/toolbox.hxx>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#include <vcl/timer.hxx>
|
2015-01-14 09:25:30 +00:00
|
|
|
#include <vcl/idle.hxx>
|
2007-06-27 19:30:40 +00:00
|
|
|
#include <vcl/lineinfo.hxx>
|
|
|
|
#include <vcl/unowrap.hxx>
|
2014-01-02 23:52:37 +01:00
|
|
|
#include <vcl/settings.hxx>
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
#define DOCKWIN_FLOATSTYLES (WB_SIZEABLE | WB_MOVEABLE | WB_CLOSEABLE | WB_STANDALONE | WB_PINABLE | WB_ROLLABLE )
|
|
|
|
|
|
|
|
class ImplDockFloatWin2 : public FloatingWindow
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
ImplDockingWindowWrapper* mpDockWin;
|
2015-04-09 14:27:30 +02:00
|
|
|
sal_uInt64 mnLastTicks;
|
2014-11-20 16:21:17 +00:00
|
|
|
Idle maDockIdle;
|
|
|
|
Idle maEndDockIdle;
|
2004-07-06 12:48:09 +00:00
|
|
|
Point maDockPos;
|
|
|
|
Rectangle maDockRect;
|
2013-06-19 22:30:49 +09:00
|
|
|
bool mbInMove;
|
2014-05-07 11:49:46 +02:00
|
|
|
ImplSVEvent * mnLastUserEvent;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-08-27 13:08:02 +02:00
|
|
|
DECL_LINK_TYPED(DockingHdl, void *, void);
|
2015-05-05 09:59:27 +02:00
|
|
|
DECL_LINK_TYPED(DockTimerHdl, Idle *, void);
|
|
|
|
DECL_LINK_TYPED(EndDockTimerHdl, Idle *, void);
|
2004-07-06 12:48:09 +00:00
|
|
|
public:
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplDockFloatWin2( vcl::Window* pParent, WinBits nWinBits,
|
2004-07-06 12:48:09 +00:00
|
|
|
ImplDockingWindowWrapper* pDockingWin );
|
2014-04-01 19:18:35 +02:00
|
|
|
virtual ~ImplDockFloatWin2();
|
2015-10-12 16:04:04 +02:00
|
|
|
virtual void dispose() override;
|
|
|
|
|
|
|
|
virtual void Move() override;
|
|
|
|
virtual void Resize() override;
|
|
|
|
virtual void TitleButtonClick( TitleButton nButton ) override;
|
|
|
|
virtual void Pin() override;
|
|
|
|
virtual void Roll() override;
|
|
|
|
virtual void PopupModeEnd() override;
|
|
|
|
virtual void Resizing( Size& rSize ) override;
|
|
|
|
virtual bool Close() override;
|
2004-07-06 12:48:09 +00:00
|
|
|
};
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplDockFloatWin2::ImplDockFloatWin2( vcl::Window* pParent, WinBits nWinBits,
|
2004-07-06 12:48:09 +00:00
|
|
|
ImplDockingWindowWrapper* pDockingWin ) :
|
|
|
|
FloatingWindow( pParent, nWinBits ),
|
|
|
|
mpDockWin( pDockingWin ),
|
2014-09-28 15:49:26 +02:00
|
|
|
mnLastTicks( tools::Time::GetSystemTicks() ),
|
2013-06-19 22:30:49 +09:00
|
|
|
mbInMove( false ),
|
2015-11-10 10:28:29 +01:00
|
|
|
mnLastUserEvent( nullptr )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2014-02-22 07:46:15 -05:00
|
|
|
// copy state of DockingWindow
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( pDockingWin )
|
|
|
|
{
|
|
|
|
SetSettings( pDockingWin->GetWindow()->GetSettings() );
|
2014-01-28 19:59:13 +01:00
|
|
|
Enable( pDockingWin->GetWindow()->IsEnabled(), false );
|
2014-02-21 12:53:51 +01:00
|
|
|
EnableInput( pDockingWin->GetWindow()->IsInputEnabled(), false );
|
|
|
|
AlwaysEnableInput( pDockingWin->GetWindow()->IsAlwaysEnableInput(), false );
|
2004-07-06 12:48:09 +00:00
|
|
|
EnableAlwaysOnTop( pDockingWin->GetWindow()->IsAlwaysOnTopEnabled() );
|
|
|
|
SetActivateMode( pDockingWin->GetWindow()->GetActivateMode() );
|
|
|
|
}
|
|
|
|
|
2004-11-16 14:10:51 +00:00
|
|
|
SetBackground( GetSettings().GetStyleSettings().GetFaceColor() );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-11-20 16:21:17 +00:00
|
|
|
maDockIdle.SetIdleHdl( LINK( this, ImplDockFloatWin2, DockTimerHdl ) );
|
2015-02-26 07:28:54 +00:00
|
|
|
maDockIdle.SetPriority( SchedulerPriority::MEDIUM );
|
2014-11-20 16:21:17 +00:00
|
|
|
maEndDockIdle.SetIdleHdl( LINK( this, ImplDockFloatWin2, EndDockTimerHdl ) );
|
2015-02-26 07:28:54 +00:00
|
|
|
maEndDockIdle.SetPriority( SchedulerPriority::MEDIUM );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplDockFloatWin2::~ImplDockFloatWin2()
|
2015-01-12 11:38:12 +02:00
|
|
|
{
|
2015-03-10 09:07:06 +02:00
|
|
|
disposeOnce();
|
2015-01-12 11:38:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockFloatWin2::dispose()
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
if( mnLastUserEvent )
|
|
|
|
Application::RemoveUserEvent( mnLastUserEvent );
|
2015-01-12 11:38:12 +02:00
|
|
|
FloatingWindow::dispose();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-05-05 09:59:27 +02:00
|
|
|
IMPL_LINK_NOARG_TYPED(ImplDockFloatWin2, DockTimerHdl, Idle *, void)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( mpDockWin->IsFloatingMode(), "docktimer called but not floating" );
|
|
|
|
|
2014-11-20 16:21:17 +00:00
|
|
|
maDockIdle.Stop();
|
2004-07-06 12:48:09 +00:00
|
|
|
PointerState aState = GetPointerState();
|
2005-03-30 08:07:31 +00:00
|
|
|
|
|
|
|
if( aState.mnState & KEY_MOD1 )
|
|
|
|
{
|
|
|
|
// i43499 CTRL disables docking now
|
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->HideTracking();
|
|
|
|
if( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) )
|
2014-11-20 16:21:17 +00:00
|
|
|
maDockIdle.Start();
|
2005-03-30 08:07:31 +00:00
|
|
|
}
|
|
|
|
else if( ! ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->HideTracking();
|
2014-02-21 12:53:51 +01:00
|
|
|
mpDockWin->EndDocking( maDockRect, false );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-03-30 08:07:31 +00:00
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_BIG | SHOWTRACK_WINDOW );
|
2014-11-20 16:21:17 +00:00
|
|
|
maDockIdle.Start();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-05 09:59:27 +02:00
|
|
|
IMPL_LINK_NOARG_TYPED(ImplDockFloatWin2, EndDockTimerHdl, Idle *, void)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
DBG_ASSERT( mpDockWin->IsFloatingMode(), "enddocktimer called but not floating" );
|
|
|
|
|
2014-11-20 16:21:17 +00:00
|
|
|
maEndDockIdle.Stop();
|
2004-07-06 12:48:09 +00:00
|
|
|
PointerState aState = GetPointerState();
|
|
|
|
if( ! ( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) )
|
|
|
|
{
|
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->HideTracking();
|
2014-02-21 12:53:51 +01:00
|
|
|
mpDockWin->EndDocking( maDockRect, true );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-11-20 16:21:17 +00:00
|
|
|
maEndDockIdle.Start();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-27 13:08:02 +02:00
|
|
|
IMPL_LINK_NOARG_TYPED(ImplDockFloatWin2, DockingHdl, void*, void)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
// called during move of a floating window
|
2015-11-10 10:28:29 +01:00
|
|
|
mnLastUserEvent = nullptr;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
vcl::Window *pDockingArea = mpDockWin->GetWindow()->GetParent();
|
2004-07-06 12:48:09 +00:00
|
|
|
PointerState aState = pDockingArea->GetPointerState();
|
|
|
|
|
2013-06-19 22:30:49 +09:00
|
|
|
bool bRealMove = true;
|
2004-09-09 15:21:03 +00:00
|
|
|
if( GetStyle() & WB_OWNERDRAWDECORATION )
|
|
|
|
{
|
|
|
|
// for windows with ownerdraw decoration
|
|
|
|
// we allow docking only when the window was moved
|
|
|
|
// by dragging its caption
|
|
|
|
// and ignore move request due to resizing
|
2015-05-21 15:52:27 +02:00
|
|
|
vcl::Window *pBorder = GetWindow( GetWindowType::Border );
|
2004-09-09 15:21:03 +00:00
|
|
|
if( pBorder != this )
|
|
|
|
{
|
|
|
|
Point aPt;
|
|
|
|
Rectangle aBorderRect( aPt, pBorder->GetSizePixel() );
|
2006-04-19 12:56:35 +00:00
|
|
|
sal_Int32 nLeft, nTop, nRight, nBottom;
|
2004-09-09 15:21:03 +00:00
|
|
|
GetBorder( nLeft, nTop, nRight, nBottom );
|
|
|
|
// limit borderrect to the caption part only and without the resizing borders
|
2012-10-28 23:23:53 +01:00
|
|
|
aBorderRect.Bottom() = aBorderRect.Top() + nTop;
|
|
|
|
aBorderRect.Left() += nLeft;
|
|
|
|
aBorderRect.Right() -= nRight;
|
2004-09-09 15:21:03 +00:00
|
|
|
|
|
|
|
PointerState aBorderState = pBorder->GetPointerState();
|
|
|
|
if( aBorderRect.IsInside( aBorderState.maPos ) )
|
2013-06-19 22:30:49 +09:00
|
|
|
bRealMove = true;
|
2004-09-09 15:21:03 +00:00
|
|
|
else
|
2013-06-19 22:30:49 +09:00
|
|
|
bRealMove = false;
|
2004-09-09 15:21:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
if( mpDockWin->IsDockable() &&
|
|
|
|
mpDockWin->GetWindow()->IsVisible() &&
|
2014-09-28 15:49:26 +02:00
|
|
|
(tools::Time::GetSystemTicks() - mnLastTicks > 500) &&
|
2004-09-09 15:21:03 +00:00
|
|
|
( aState.mnState & ( MOUSE_LEFT | MOUSE_MIDDLE | MOUSE_RIGHT ) ) &&
|
2005-03-30 08:07:31 +00:00
|
|
|
!(aState.mnState & KEY_MOD1) && // i43499 CTRL disables docking now
|
2004-09-09 15:21:03 +00:00
|
|
|
bRealMove )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
maDockPos = Point( pDockingArea->OutputToScreenPixel( pDockingArea->AbsoluteScreenToOutputPixel( OutputToAbsoluteScreenPixel( Point() ) ) ) );
|
|
|
|
maDockRect = Rectangle( maDockPos, mpDockWin->GetSizePixel() );
|
|
|
|
|
|
|
|
// mouse pos in screen pixels
|
|
|
|
Point aMousePos = pDockingArea->OutputToScreenPixel( aState.maPos );
|
|
|
|
|
|
|
|
if( ! mpDockWin->IsDocking() )
|
|
|
|
mpDockWin->StartDocking( aMousePos, maDockRect );
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool bFloatMode = mpDockWin->Docking( aMousePos, maDockRect );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
if( ! bFloatMode )
|
|
|
|
{
|
|
|
|
// indicates that the window could be docked at maDockRect
|
|
|
|
maDockRect.SetPos( mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->ScreenToOutputPixel(
|
|
|
|
maDockRect.TopLeft() ) );
|
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, SHOWTRACK_BIG | SHOWTRACK_WINDOW );
|
2014-11-20 16:21:17 +00:00
|
|
|
maEndDockIdle.Stop();
|
2015-05-05 09:59:27 +02:00
|
|
|
DockTimerHdl( nullptr );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->HideTracking();
|
2014-11-20 16:21:17 +00:00
|
|
|
maDockIdle.Stop();
|
2015-05-05 09:59:27 +02:00
|
|
|
EndDockTimerHdl( nullptr );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
2013-06-19 22:30:49 +09:00
|
|
|
mbInMove = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
2014-02-22 21:20:15 +01:00
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
void ImplDockFloatWin2::Move()
|
|
|
|
{
|
|
|
|
if( mbInMove )
|
|
|
|
return;
|
|
|
|
|
2013-06-19 22:30:49 +09:00
|
|
|
mbInMove = true;
|
2004-07-06 12:48:09 +00:00
|
|
|
FloatingWindow::Move();
|
|
|
|
mpDockWin->GetWindow()->Move();
|
|
|
|
|
|
|
|
/*
|
|
|
|
* note: the window should only dock if KEY_MOD1 is pressed
|
|
|
|
* and the user releases all mouse buttons. The real problem here
|
|
|
|
* is that we don't get mouse events (at least not on X)
|
|
|
|
* if the mouse is on the decoration. So we have to start an
|
|
|
|
* awkward timer based process that polls the modifier/buttons
|
|
|
|
* to see whether they are in the right condition shortly after the
|
|
|
|
* last Move message.
|
|
|
|
*/
|
|
|
|
if( ! mnLastUserEvent )
|
2015-11-10 10:28:29 +01:00
|
|
|
mnLastUserEvent = Application::PostUserEvent( LINK( this, ImplDockFloatWin2, DockingHdl ), nullptr, true );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockFloatWin2::Resize()
|
|
|
|
{
|
2004-09-09 15:21:03 +00:00
|
|
|
// forwarding of resize only required if we have no borderwindow ( GetWindow() then returns 'this' )
|
2015-05-21 15:52:27 +02:00
|
|
|
if( GetWindow( GetWindowType::Border ) == this )
|
2004-09-09 15:21:03 +00:00
|
|
|
{
|
|
|
|
FloatingWindow::Resize();
|
|
|
|
Size aSize( GetSizePixel() );
|
2015-05-22 10:37:31 +02:00
|
|
|
mpDockWin->GetWindow()->ImplPosSizeWindow( 0, 0, aSize.Width(), aSize.Height(), PosSizeFlags::PosSize ); // TODO: is this needed ???
|
2004-09-09 15:21:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-21 13:51:35 +02:00
|
|
|
void ImplDockFloatWin2::TitleButtonClick( TitleButton nButton )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
FloatingWindow::TitleButtonClick( nButton );
|
|
|
|
mpDockWin->TitleButtonClick( nButton );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockFloatWin2::Pin()
|
|
|
|
{
|
|
|
|
FloatingWindow::Pin();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockFloatWin2::Roll()
|
|
|
|
{
|
|
|
|
FloatingWindow::Roll();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockFloatWin2::PopupModeEnd()
|
|
|
|
{
|
|
|
|
FloatingWindow::PopupModeEnd();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockFloatWin2::Resizing( Size& rSize )
|
|
|
|
{
|
|
|
|
FloatingWindow::Resizing( rSize );
|
|
|
|
mpDockWin->Resizing( rSize );
|
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool ImplDockFloatWin2::Close()
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-03-02 10:43:28 +02:00
|
|
|
return true;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DockingManager::DockingManager()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
DockingManager::~DockingManager()
|
|
|
|
{
|
|
|
|
::std::vector< ImplDockingWindowWrapper* >::iterator p;
|
|
|
|
p = mDockingWindows.begin();
|
2006-02-09 16:12:43 +00:00
|
|
|
for(; p != mDockingWindows.end(); ++p )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
delete (*p);
|
|
|
|
}
|
2006-03-24 12:48:04 +00:00
|
|
|
mDockingWindows.clear();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplDockingWindowWrapper* DockingManager::GetDockingWindowWrapper( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
::std::vector< ImplDockingWindowWrapper* >::iterator p;
|
|
|
|
p = mDockingWindows.begin();
|
|
|
|
while( p != mDockingWindows.end() )
|
|
|
|
{
|
|
|
|
if( (*p)->mpDockingWindow == pWindow )
|
|
|
|
return (*p);
|
|
|
|
else
|
2011-05-08 17:04:25 +02:00
|
|
|
++p;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
2015-11-10 10:28:29 +01:00
|
|
|
return nullptr;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
bool DockingManager::IsDockable( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
|
|
|
|
/*
|
|
|
|
if( pWindow->HasDockingHandler() )
|
2014-02-24 01:53:13 +11:00
|
|
|
return true;
|
2004-07-06 12:48:09 +00:00
|
|
|
*/
|
2015-11-10 10:28:29 +01:00
|
|
|
return (pWrapper != nullptr);
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
bool DockingManager::IsFloating( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
return pWrapper->IsFloatingMode();
|
|
|
|
else
|
2014-02-21 12:53:51 +01:00
|
|
|
return false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
bool DockingManager::IsLocked( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper && pWrapper->IsLocked() )
|
2014-02-21 12:53:51 +01:00
|
|
|
return true;
|
2004-07-06 12:48:09 +00:00
|
|
|
else
|
2014-02-21 12:53:51 +01:00
|
|
|
return false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::Lock( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
pWrapper->Lock();
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::Unlock( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
pWrapper->Unlock();
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::SetFloatingMode( const vcl::Window *pWindow, bool bFloating )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
pWrapper->SetFloatingMode( bFloating );
|
|
|
|
}
|
|
|
|
|
2015-05-12 15:30:22 +02:00
|
|
|
void DockingManager::StartPopupMode( ToolBox *pParentToolBox, const vcl::Window *pWindow, FloatWinPopupFlags nFlags )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
2010-03-11 18:15:22 +01:00
|
|
|
pWrapper->StartPopupMode( pParentToolBox, nFlags );
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::StartPopupMode( ToolBox *pParentToolBox, const vcl::Window *pWindow )
|
2010-03-11 18:15:22 +01:00
|
|
|
{
|
2015-05-12 15:30:22 +02:00
|
|
|
StartPopupMode( pParentToolBox, pWindow, FloatWinPopupFlags::AllowTearOff |
|
|
|
|
FloatWinPopupFlags::NoFocusClose |
|
|
|
|
FloatWinPopupFlags::AllMouseButtonClose |
|
|
|
|
FloatWinPopupFlags::NoMouseUpClose );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
bool DockingManager::IsInPopupMode( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper && pWrapper->IsInPopupMode() )
|
2014-02-21 12:53:51 +01:00
|
|
|
return true;
|
2004-07-06 12:48:09 +00:00
|
|
|
else
|
2014-02-21 12:53:51 +01:00
|
|
|
return false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::EndPopupMode( const vcl::Window *pWin )
|
2010-01-17 18:15:22 +01:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper *pWrapper = GetDockingWindowWrapper( pWin );
|
|
|
|
if( pWrapper && pWrapper->GetFloatingWindow() && pWrapper->GetFloatingWindow()->IsInPopupMode() )
|
|
|
|
pWrapper->GetFloatingWindow()->EndPopupMode();
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::AddWindow( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
return;
|
|
|
|
else
|
|
|
|
pWrapper = new ImplDockingWindowWrapper( pWindow );
|
|
|
|
|
|
|
|
mDockingWindows.push_back( pWrapper );
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::RemoveWindow( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
::std::vector< ImplDockingWindowWrapper* >::iterator p;
|
|
|
|
p = mDockingWindows.begin();
|
|
|
|
while( p != mDockingWindows.end() )
|
|
|
|
{
|
|
|
|
if( (*p)->mpDockingWindow == pWindow )
|
|
|
|
{
|
|
|
|
delete (*p);
|
|
|
|
mDockingWindows.erase( p );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else
|
2011-05-08 17:04:25 +02:00
|
|
|
++p;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::SetPosSizePixel( vcl::Window *pWindow, long nX, long nY,
|
2004-07-06 12:48:09 +00:00
|
|
|
long nWidth, long nHeight,
|
2015-05-22 10:37:31 +02:00
|
|
|
PosSizeFlags nFlags )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
2012-08-24 12:34:22 +01:00
|
|
|
pWrapper->setPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
Rectangle DockingManager::GetPosSizePixel( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
Rectangle aRect;
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
aRect = Rectangle( pWrapper->GetPosPixel(), pWrapper->GetSizePixel() );
|
|
|
|
|
|
|
|
return aRect;
|
|
|
|
}
|
|
|
|
|
|
|
|
// special floating window for popup mode
|
|
|
|
// main purpose: provides tear-off area for undocking
|
2014-02-25 22:51:59 +01:00
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
// if TEAROFF_DASHED defined a single dashed line is used
|
|
|
|
// otherwise multiple smaller lines will be painted
|
|
|
|
//#define TEAROFF_DASHED
|
|
|
|
|
|
|
|
// size of the drag area
|
|
|
|
#ifdef TEAROFF_DASHED
|
|
|
|
#define POPUP_DRAGBORDER 2
|
|
|
|
#define POPUP_DRAGGRIP 5
|
|
|
|
#else
|
|
|
|
#define POPUP_DRAGBORDER 3
|
|
|
|
#define POPUP_DRAGGRIP 5
|
|
|
|
#endif
|
|
|
|
#define POPUP_DRAGHEIGHT (POPUP_DRAGGRIP+POPUP_DRAGBORDER+POPUP_DRAGBORDER)
|
|
|
|
#define POPUP_DRAGWIDTH 20
|
|
|
|
|
|
|
|
class ImplPopupFloatWin : public FloatingWindow
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
ImplDockingWindowWrapper* mpDockingWin;
|
2013-06-19 22:30:49 +09:00
|
|
|
bool mbHighlight;
|
|
|
|
bool mbMoving;
|
2009-12-06 19:11:23 +01:00
|
|
|
bool mbTrackingEnabled;
|
2004-07-06 12:48:09 +00:00
|
|
|
Point maDelta;
|
|
|
|
Point maTearOffPosition;
|
2010-01-18 20:46:53 +01:00
|
|
|
bool mbGripAtBottom;
|
2010-03-11 18:15:22 +01:00
|
|
|
bool mbHasGrip;
|
2004-09-09 15:21:03 +00:00
|
|
|
void ImplSetBorder();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
public:
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, bool bHasGrip );
|
2014-04-01 19:18:35 +02:00
|
|
|
virtual ~ImplPopupFloatWin();
|
2015-10-12 16:04:04 +02:00
|
|
|
virtual void dispose() override;
|
|
|
|
|
2015-11-18 10:11:06 +02:00
|
|
|
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override;
|
2015-10-12 16:04:04 +02:00
|
|
|
virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) override;
|
|
|
|
virtual void MouseMove( const MouseEvent& rMEvt ) override;
|
|
|
|
virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
|
|
|
|
virtual void MouseButtonUp( const MouseEvent& rMEvt ) override;
|
|
|
|
virtual void Tracking( const TrackingEvent& rTEvt ) override;
|
|
|
|
virtual void Resize() override;
|
|
|
|
virtual vcl::Window* GetPreferredKeyInputWindow() override;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
Rectangle GetDragRect() const;
|
|
|
|
Point GetToolboxPosition() const;
|
|
|
|
Point GetTearOffPosition() const;
|
2015-05-07 15:18:41 +09:00
|
|
|
void DrawGrip(vcl::RenderContext& rRenderContext);
|
|
|
|
void DrawBorder(vcl::RenderContext& rRenderContext);
|
2010-03-11 18:15:22 +01:00
|
|
|
|
|
|
|
bool hasGrip() const { return mbHasGrip; }
|
2004-07-06 12:48:09 +00:00
|
|
|
};
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, ImplDockingWindowWrapper* pDockingWin, bool bHasGrip ) :
|
2004-09-09 15:21:03 +00:00
|
|
|
FloatingWindow( pParent, WB_NOBORDER | WB_SYSTEMWINDOW | WB_NOSHADOW)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2014-01-28 19:59:13 +01:00
|
|
|
mpWindowImpl->mbToolbarFloatingWindow = true; // indicate window type, required for accessibility
|
2006-02-06 12:17:38 +00:00
|
|
|
// which should not see this window as a toplevel window
|
2004-07-06 12:48:09 +00:00
|
|
|
mpDockingWin = pDockingWin;
|
2013-06-19 22:30:49 +09:00
|
|
|
mbHighlight = false;
|
|
|
|
mbMoving = false;
|
2014-01-28 19:59:13 +01:00
|
|
|
mbTrackingEnabled = false;
|
|
|
|
mbGripAtBottom = true;
|
2010-03-11 18:15:22 +01:00
|
|
|
mbHasGrip = bHasGrip;
|
2004-09-09 15:21:03 +00:00
|
|
|
|
|
|
|
ImplSetBorder();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplPopupFloatWin::~ImplPopupFloatWin()
|
2015-01-12 11:38:12 +02:00
|
|
|
{
|
2015-03-10 09:07:06 +02:00
|
|
|
disposeOnce();
|
2015-01-12 11:38:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplPopupFloatWin::dispose()
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-11-10 10:28:29 +01:00
|
|
|
mpDockingWin = nullptr;
|
2015-01-12 11:38:12 +02:00
|
|
|
FloatingWindow::dispose();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
2004-09-09 15:21:03 +00:00
|
|
|
|
2015-11-18 10:11:06 +02:00
|
|
|
css::uno::Reference< css::accessibility::XAccessible > ImplPopupFloatWin::CreateAccessible()
|
2006-01-26 17:10:00 +00:00
|
|
|
{
|
|
|
|
// switch off direct accessibilty support for this window
|
|
|
|
|
|
|
|
// this is to avoid appearance of this window as standalone window in the accessibility hierarchy
|
|
|
|
// as this window is only used as a helper for subtoolbars that are not teared-off, the parent toolbar
|
|
|
|
// has to provide accessibility support (as implemented in the toolkit)
|
|
|
|
// so the contained toolbar should appear as child of the correponsing toolbar item of the parent toolbar
|
2015-11-18 10:11:06 +02:00
|
|
|
return css::uno::Reference< css::accessibility::XAccessible >();
|
2006-01-26 17:10:00 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
vcl::Window* ImplPopupFloatWin::GetPreferredKeyInputWindow()
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2005-01-13 17:03:21 +00:00
|
|
|
if( mpWindowImpl->mpClientWindow )
|
|
|
|
return mpWindowImpl->mpClientWindow;
|
2004-09-09 15:21:03 +00:00
|
|
|
else
|
|
|
|
return FloatingWindow::GetPreferredKeyInputWindow();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
void ImplPopupFloatWin::ImplSetBorder()
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2004-09-09 15:21:03 +00:00
|
|
|
// although we have no border in the sense of a borderwindow
|
|
|
|
// we're using a special border for the grip
|
|
|
|
// by setting those members the method SetOutputSizePixel() can
|
|
|
|
// be used to set the proper window size
|
2010-03-11 18:15:22 +01:00
|
|
|
mpWindowImpl->mnTopBorder = 1;
|
|
|
|
if( hasGrip() )
|
|
|
|
mpWindowImpl->mnTopBorder += POPUP_DRAGHEIGHT+2;
|
2005-01-13 17:03:21 +00:00
|
|
|
mpWindowImpl->mnBottomBorder = 1;
|
|
|
|
mpWindowImpl->mnLeftBorder = 1;
|
|
|
|
mpWindowImpl->mnRightBorder = 1;
|
2004-09-09 15:21:03 +00:00
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
void ImplPopupFloatWin::Resize()
|
|
|
|
{
|
|
|
|
// the borderview overwrites the border during resize so restore it
|
|
|
|
ImplSetBorder();
|
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
Rectangle ImplPopupFloatWin::GetDragRect() const
|
|
|
|
{
|
2010-03-11 18:15:22 +01:00
|
|
|
Rectangle aRect;
|
|
|
|
if( hasGrip() )
|
2010-01-18 20:46:53 +01:00
|
|
|
{
|
2010-03-11 18:15:22 +01:00
|
|
|
aRect = Rectangle( 1,1, GetOutputSizePixel().Width()-1, 2+POPUP_DRAGHEIGHT );
|
|
|
|
if( mbGripAtBottom )
|
|
|
|
{
|
|
|
|
int height = GetOutputSizePixel().Height();
|
|
|
|
aRect.Top() = height - 3 - POPUP_DRAGHEIGHT;
|
|
|
|
aRect.Bottom() = aRect.Top() + 1 + POPUP_DRAGHEIGHT;
|
|
|
|
}
|
2010-01-18 20:46:53 +01:00
|
|
|
}
|
|
|
|
return aRect;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Point ImplPopupFloatWin::GetToolboxPosition() const
|
|
|
|
{
|
|
|
|
// return inner position where a toolbox could be placed
|
2010-03-11 18:15:22 +01:00
|
|
|
Point aPt( 1, 1 + ((mbGripAtBottom || !hasGrip()) ? 0 : GetDragRect().getHeight()) ); // grip + border
|
2010-01-18 20:46:53 +01:00
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
return aPt;
|
|
|
|
}
|
|
|
|
|
|
|
|
Point ImplPopupFloatWin::GetTearOffPosition() const
|
|
|
|
{
|
|
|
|
Point aPt( maTearOffPosition );
|
2004-09-09 15:21:03 +00:00
|
|
|
//aPt += GetToolboxPosition(); // remove 'decoration'
|
2004-07-06 12:48:09 +00:00
|
|
|
return aPt;
|
|
|
|
}
|
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
void ImplPopupFloatWin::DrawBorder(vcl::RenderContext& rRenderContext)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetFillColor();
|
2004-07-06 12:48:09 +00:00
|
|
|
Point aPt;
|
|
|
|
Rectangle aRect( aPt, GetOutputSizePixel() );
|
2004-09-09 15:21:03 +00:00
|
|
|
|
2014-09-27 14:52:40 +02:00
|
|
|
vcl::Region oldClipRgn( GetClipRegion( ) );
|
|
|
|
vcl::Region aClipRgn( aRect );
|
2004-09-09 15:21:03 +00:00
|
|
|
Rectangle aItemClipRect( ImplGetItemEdgeClipRect() );
|
|
|
|
if( !aItemClipRect.IsEmpty() )
|
|
|
|
{
|
|
|
|
aItemClipRect.SetPos( AbsoluteScreenToOutputPixel( aItemClipRect.TopLeft() ) );
|
2010-03-11 18:15:22 +01:00
|
|
|
|
|
|
|
// draw the excluded border part with the background color of a toolbox
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetClipRegion( vcl::Region( aItemClipRect ) );
|
|
|
|
rRenderContext.SetLineColor( GetSettings().GetStyleSettings().GetFaceColor() );
|
|
|
|
rRenderContext.DrawRect( aRect );
|
2010-03-11 18:15:22 +01:00
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
aClipRgn.Exclude( aItemClipRect );
|
|
|
|
SetClipRegion( aClipRgn );
|
|
|
|
}
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetLineColor( rRenderContext.GetSettings().GetStyleSettings().GetShadowColor() );
|
|
|
|
rRenderContext.DrawRect( aRect );
|
|
|
|
rRenderContext.SetClipRegion( oldClipRgn );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
void ImplPopupFloatWin::DrawGrip(vcl::RenderContext& rRenderContext)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-05-07 15:18:41 +09:00
|
|
|
bool bLinecolor = rRenderContext.IsLineColor();
|
|
|
|
Color aLinecolor = rRenderContext.GetLineColor();
|
|
|
|
bool bFillcolor = rRenderContext.IsFillColor();
|
|
|
|
Color aFillcolor = rRenderContext.GetFillColor();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// draw background
|
2015-05-07 15:18:41 +09:00
|
|
|
Rectangle aRect(GetDragRect());
|
|
|
|
aRect.Top() += POPUP_DRAGBORDER;
|
|
|
|
aRect.Bottom() -= POPUP_DRAGBORDER;
|
|
|
|
aRect.Left() += 3;
|
|
|
|
aRect.Right() -= 3;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
if (mbHighlight)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.Erase(aRect);
|
2015-05-18 11:17:49 +09:00
|
|
|
vcl::RenderTools::DrawSelectionBackground(rRenderContext, *this, aRect, 2, false, true, false);
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetFaceColor());
|
|
|
|
rRenderContext.SetLineColor();
|
|
|
|
rRenderContext.DrawRect(aRect);
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
if (!ToolBox::AlwaysLocked()) // no grip if toolboxes are locked
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
2004-07-06 12:48:09 +00:00
|
|
|
#ifdef TEAROFF_DASHED
|
2005-11-11 10:54:40 +00:00
|
|
|
// draw single dashed line
|
2015-05-07 15:18:41 +09:00
|
|
|
LineInfo aLineInfo(LINE_DASH);
|
|
|
|
aLineInfo.SetDistance(4);
|
|
|
|
aLineInfo.SetDashLen(12);
|
|
|
|
aLineInfo.SetDashCount(1);
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
aRect.Left() += 2;
|
|
|
|
aRect.Right()-= 2;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
aRect.Top() += 2;
|
2012-10-28 23:23:53 +01:00
|
|
|
aRect.Bottom() = aRect.Top();
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetDarkShadowColor());
|
|
|
|
rRenderContext.DrawLine(aRect.TopLeft(), aRect.TopRight(), aLineInfo);
|
2005-11-11 10:54:40 +00:00
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
if (!mbHighlight)
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
2012-10-28 23:23:53 +01:00
|
|
|
++aRect.Top();
|
|
|
|
++aRect.Bottom();
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetLineColor(rRenderContext.GetSettings().GetStyleSettings().GetLightColor());
|
|
|
|
rRenderContext.DrawLine(aRect.TopLeft(), aRect.TopRight(), aLineInfo);
|
2005-11-11 10:54:40 +00:00
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
#else
|
2005-11-11 10:54:40 +00:00
|
|
|
// draw several grip lines
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetShadowColor());
|
2012-10-28 23:23:53 +01:00
|
|
|
aRect.Top()++;
|
|
|
|
aRect.Bottom() = aRect.Top();
|
2005-11-11 10:54:40 +00:00
|
|
|
|
|
|
|
int width = POPUP_DRAGWIDTH;
|
2015-05-07 15:18:41 +09:00
|
|
|
while(width >= aRect.getWidth())
|
|
|
|
{
|
2005-11-11 10:54:40 +00:00
|
|
|
width -= 4;
|
2015-05-07 15:18:41 +09:00
|
|
|
}
|
|
|
|
if (width <= 0)
|
2005-11-11 10:54:40 +00:00
|
|
|
width = aRect.getWidth();
|
|
|
|
//aRect.nLeft = aRect.nLeft + (aRect.getWidth() - width) / 2;
|
2012-10-28 23:23:53 +01:00
|
|
|
aRect.Left() = (aRect.Left() + aRect.Right() - width) / 2;
|
|
|
|
aRect.Right() = aRect.Left() + width;
|
2005-11-11 10:54:40 +00:00
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
int i = 0;
|
|
|
|
while (i < POPUP_DRAGGRIP)
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.DrawRect(aRect);
|
|
|
|
aRect.Top() += 2;
|
|
|
|
aRect.Bottom() += 2;
|
|
|
|
i += 2;
|
2005-11-11 10:54:40 +00:00
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
#endif
|
2005-11-11 10:54:40 +00:00
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
if (bLinecolor)
|
|
|
|
rRenderContext.SetLineColor(aLinecolor);
|
2004-07-06 12:48:09 +00:00
|
|
|
else
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetLineColor();
|
|
|
|
if (bFillcolor)
|
|
|
|
rRenderContext.SetFillColor(aFillcolor);
|
2004-07-06 12:48:09 +00:00
|
|
|
else
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.SetFillColor();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-05-07 15:18:41 +09:00
|
|
|
void ImplPopupFloatWin::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-06-23 10:29:48 +02:00
|
|
|
Rectangle aRect(Point(), GetOutputSizePixel());
|
2015-05-07 15:18:41 +09:00
|
|
|
rRenderContext.DrawWallpaper(aRect, Wallpaper(rRenderContext.GetSettings().GetStyleSettings().GetFaceGradientColor()));
|
|
|
|
DrawBorder(rRenderContext);
|
|
|
|
if (hasGrip())
|
|
|
|
DrawGrip(rRenderContext);
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplPopupFloatWin::MouseMove( const MouseEvent& rMEvt )
|
|
|
|
{
|
|
|
|
Point aMousePos = rMEvt.GetPosPixel();
|
|
|
|
|
2005-11-11 10:54:40 +00:00
|
|
|
if( !ToolBox::AlwaysLocked() ) // no tear off if locking is enabled
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2009-12-06 19:11:23 +01:00
|
|
|
if( mbTrackingEnabled && rMEvt.IsLeft() && GetDragRect().IsInside( aMousePos ) )
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
|
|
|
// start window move
|
2013-06-19 22:30:49 +09:00
|
|
|
mbMoving = true;
|
2015-05-27 15:09:52 +02:00
|
|
|
StartTracking( StartTrackingFlags::NoKeyCancel );
|
2005-11-11 10:54:40 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
if( !mbHighlight && GetDragRect().IsInside( aMousePos ) )
|
|
|
|
{
|
2013-06-19 22:30:49 +09:00
|
|
|
mbHighlight = true;
|
2015-05-07 15:18:41 +09:00
|
|
|
Invalidate();
|
2005-11-11 10:54:40 +00:00
|
|
|
}
|
2015-05-07 15:18:41 +09:00
|
|
|
if (mbHighlight && ( rMEvt.IsLeaveWindow() || !GetDragRect().IsInside( aMousePos ) ) )
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
2013-06-19 22:30:49 +09:00
|
|
|
mbHighlight = false;
|
2015-05-07 15:18:41 +09:00
|
|
|
Invalidate();
|
2005-11-11 10:54:40 +00:00
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplPopupFloatWin::MouseButtonUp( const MouseEvent& rMEvt )
|
|
|
|
{
|
2009-12-06 19:11:23 +01:00
|
|
|
mbTrackingEnabled = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
FloatingWindow::MouseButtonUp( rMEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplPopupFloatWin::MouseButtonDown( const MouseEvent& rMEvt )
|
|
|
|
{
|
|
|
|
Point aMousePos = rMEvt.GetPosPixel();
|
|
|
|
if( GetDragRect().IsInside( aMousePos ) )
|
|
|
|
{
|
|
|
|
// get mouse pos at a static window to have a fixed reference point
|
|
|
|
PointerState aState = GetParent()->GetPointerState();
|
2014-02-07 22:32:58 +11:00
|
|
|
if (HasMirroredGraphics() && IsRTLEnabled())
|
2008-12-01 13:29:22 +00:00
|
|
|
ImplMirrorFramePos(aState.maPos);
|
2015-05-21 15:52:27 +02:00
|
|
|
maTearOffPosition = GetWindow( GetWindowType::Border )->GetPosPixel();
|
2004-07-06 12:48:09 +00:00
|
|
|
maDelta = aState.maPos - maTearOffPosition;
|
2009-12-06 19:11:23 +01:00
|
|
|
mbTrackingEnabled = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mbTrackingEnabled = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplPopupFloatWin::Tracking( const TrackingEvent& rTEvt )
|
|
|
|
{
|
|
|
|
if( mbMoving )
|
|
|
|
{
|
|
|
|
if ( rTEvt.IsTrackingEnded() )
|
|
|
|
{
|
2013-06-19 22:30:49 +09:00
|
|
|
mbMoving = false;
|
2015-05-13 08:44:58 +02:00
|
|
|
EndPopupMode( FloatWinPopupEndFlags::TearOff );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
else if ( !rTEvt.GetMouseEvent().IsSynthetic() )
|
|
|
|
{
|
|
|
|
// move the window according to mouse pos
|
|
|
|
PointerState aState = GetParent()->GetPointerState();
|
2014-02-03 19:11:40 +11:00
|
|
|
const OutputDevice *pOutDev = GetOutDev();
|
2014-02-07 22:10:11 +11:00
|
|
|
if (pOutDev->HasMirroredGraphics() && IsRTLEnabled())
|
2008-12-01 13:29:22 +00:00
|
|
|
ImplMirrorFramePos(aState.maPos);
|
2004-07-06 12:48:09 +00:00
|
|
|
maTearOffPosition = aState.maPos - maDelta;
|
2015-05-21 15:52:27 +02:00
|
|
|
GetWindow( GetWindowType::Border )->SetPosPixel( maTearOffPosition );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplDockingWindowWrapper::ImplDockingWindowWrapper( const vcl::Window *pWindow )
|
|
|
|
: mpDockingWindow(const_cast<vcl::Window*>(pWindow))
|
2015-11-10 10:28:29 +01:00
|
|
|
, mpFloatWin(nullptr)
|
|
|
|
, mpOldBorderWin(nullptr)
|
2014-04-17 13:24:29 +01:00
|
|
|
, mpParent(pWindow->GetParent())
|
|
|
|
, maMaxOutSize( SHRT_MAX, SHRT_MAX )
|
|
|
|
, mnTrackX(0)
|
|
|
|
, mnTrackY(0)
|
|
|
|
, mnTrackWidth(0)
|
|
|
|
, mnTrackHeight(0)
|
|
|
|
, mnDockLeft(0)
|
|
|
|
, mnDockTop(0)
|
|
|
|
, mnDockRight(0)
|
|
|
|
, mnDockBottom(0)
|
|
|
|
, mnFloatBits(WB_BORDER | WB_CLOSEABLE | WB_SIZEABLE | (pWindow->GetStyle() & DOCKWIN_FLOATSTYLES))
|
|
|
|
, mbDockCanceled(false)
|
|
|
|
, mbFloatPrevented(false)
|
|
|
|
, mbDockable(true)
|
|
|
|
, mbDocking(false)
|
|
|
|
, mbLastFloatMode(false)
|
|
|
|
, mbStartFloat(false)
|
|
|
|
, mbPinned(false)
|
|
|
|
, mbRollUp(false)
|
|
|
|
, mbDockBtn(false)
|
|
|
|
, mbHideBtn(false)
|
|
|
|
// must be enabled in Window::Notify to prevent permanent docking during mouse move
|
|
|
|
, mbStartDockingEnabled(false)
|
|
|
|
, mbLocked(false)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-03-09 14:29:30 +02:00
|
|
|
DockingWindow *pDockWin = dynamic_cast< DockingWindow* > ( mpDockingWindow.get() );
|
2004-11-26 19:16:42 +00:00
|
|
|
if( pDockWin )
|
|
|
|
mnFloatBits = pDockWin->GetFloatStyle();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ImplDockingWindowWrapper::~ImplDockingWindowWrapper()
|
|
|
|
{
|
|
|
|
if ( IsFloatingMode() )
|
|
|
|
{
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( false, ShowFlags::NoFocusChange );
|
2015-09-01 14:21:06 +02:00
|
|
|
SetFloatingMode(false);
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool ImplDockingWindowWrapper::ImplStartDocking( const Point& rPos )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
if ( !mbDockable )
|
2014-02-21 12:53:51 +01:00
|
|
|
return false;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
if( !mbStartDockingEnabled )
|
2014-02-21 12:53:51 +01:00
|
|
|
return false;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
maMouseOff = rPos;
|
|
|
|
maMouseStart = maMouseOff;
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDocking = true;
|
2004-07-06 12:48:09 +00:00
|
|
|
mbLastFloatMode = IsFloatingMode();
|
|
|
|
mbStartFloat = mbLastFloatMode;
|
|
|
|
|
2014-02-22 07:46:15 -05:00
|
|
|
// calculate FloatingBorder
|
2015-03-18 08:33:14 +02:00
|
|
|
VclPtr<FloatingWindow> pWin;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( mpFloatWin )
|
|
|
|
pWin = mpFloatWin;
|
|
|
|
else
|
2015-04-20 15:35:54 +01:00
|
|
|
pWin = VclPtr<ImplDockFloatWin2>::Create( mpParent, mnFloatBits, nullptr );
|
2004-07-06 12:48:09 +00:00
|
|
|
pWin->GetBorder( mnDockLeft, mnDockTop, mnDockRight, mnDockBottom );
|
|
|
|
if ( !mpFloatWin )
|
2015-03-18 08:33:14 +02:00
|
|
|
pWin.disposeAndClear();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
Point aPos = GetWindow()->ImplOutputToFrame( Point() );
|
|
|
|
Size aSize = GetWindow()->GetOutputSizePixel();
|
|
|
|
mnTrackX = aPos.X();
|
|
|
|
mnTrackY = aPos.Y();
|
|
|
|
mnTrackWidth = aSize.Width();
|
|
|
|
mnTrackHeight = aSize.Height();
|
|
|
|
|
|
|
|
if ( mbLastFloatMode )
|
|
|
|
{
|
|
|
|
maMouseOff.X() += mnDockLeft;
|
|
|
|
maMouseOff.Y() += mnDockTop;
|
|
|
|
mnTrackX -= mnDockLeft;
|
|
|
|
mnTrackY -= mnDockTop;
|
|
|
|
mnTrackWidth += mnDockLeft+mnDockRight;
|
|
|
|
mnTrackHeight += mnDockTop+mnDockBottom;
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
vcl::Window *pDockingArea = GetWindow()->GetParent();
|
|
|
|
vcl::Window::PointerState aState = pDockingArea->GetPointerState();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// mouse pos in screen pixels
|
|
|
|
Point aMousePos = pDockingArea->OutputToScreenPixel( aState.maPos );
|
|
|
|
Point aDockPos = Point( pDockingArea->AbsoluteScreenToOutputPixel( GetWindow()->OutputToAbsoluteScreenPixel( GetWindow()->GetPosPixel() ) ) );
|
|
|
|
Rectangle aDockRect( aDockPos, GetWindow()->GetSizePixel() );
|
|
|
|
StartDocking( aMousePos, aDockRect );
|
|
|
|
|
|
|
|
GetWindow()->ImplUpdateAll();
|
|
|
|
GetWindow()->ImplGetFrameWindow()->ImplUpdateAll();
|
|
|
|
|
2015-05-27 15:09:52 +02:00
|
|
|
GetWindow()->StartTracking( StartTrackingFlags::KeyMod );
|
2014-02-21 12:53:51 +01:00
|
|
|
return true;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::Tracking( const TrackingEvent& rTEvt )
|
|
|
|
{
|
|
|
|
// used during docking of a currently docked window
|
|
|
|
if ( mbDocking )
|
|
|
|
{
|
|
|
|
if ( rTEvt.IsTrackingEnded() )
|
|
|
|
{
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDocking = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
GetWindow()->HideTracking();
|
|
|
|
if ( rTEvt.IsTrackingCanceled() )
|
|
|
|
{
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDockCanceled = true;
|
2004-07-06 12:48:09 +00:00
|
|
|
EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDockCanceled = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
EndDocking( Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
|
|
|
|
}
|
|
|
|
// Docking only upon non-synthetic MouseEvents
|
|
|
|
else if ( !rTEvt.GetMouseEvent().IsSynthetic() || rTEvt.GetMouseEvent().IsModifierChanged() )
|
|
|
|
{
|
|
|
|
Point aMousePos = rTEvt.GetMouseEvent().GetPosPixel();
|
|
|
|
Point aFrameMousePos = GetWindow()->ImplOutputToFrame( aMousePos );
|
|
|
|
Size aFrameSize = GetWindow()->ImplGetFrameWindow()->GetOutputSizePixel();
|
|
|
|
if ( aFrameMousePos.X() < 0 )
|
|
|
|
aFrameMousePos.X() = 0;
|
|
|
|
if ( aFrameMousePos.Y() < 0 )
|
|
|
|
aFrameMousePos.Y() = 0;
|
|
|
|
if ( aFrameMousePos.X() > aFrameSize.Width()-1 )
|
|
|
|
aFrameMousePos.X() = aFrameSize.Width()-1;
|
|
|
|
if ( aFrameMousePos.Y() > aFrameSize.Height()-1 )
|
|
|
|
aFrameMousePos.Y() = aFrameSize.Height()-1;
|
|
|
|
aMousePos = GetWindow()->ImplFrameToOutput( aFrameMousePos );
|
|
|
|
aMousePos.X() -= maMouseOff.X();
|
|
|
|
aMousePos.Y() -= maMouseOff.Y();
|
|
|
|
Point aPos = GetWindow()->ImplOutputToFrame( aMousePos );
|
|
|
|
Rectangle aTrackRect( aPos, Size( mnTrackWidth, mnTrackHeight ) );
|
|
|
|
Rectangle aCompRect = aTrackRect;
|
|
|
|
aPos.X() += maMouseOff.X();
|
|
|
|
aPos.Y() += maMouseOff.Y();
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool bFloatMode = Docking( aPos, aTrackRect );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
mbFloatPrevented = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( mbLastFloatMode != bFloatMode )
|
|
|
|
{
|
|
|
|
if ( bFloatMode )
|
|
|
|
{
|
|
|
|
aTrackRect.Left() -= mnDockLeft;
|
|
|
|
aTrackRect.Top() -= mnDockTop;
|
|
|
|
aTrackRect.Right() += mnDockRight;
|
|
|
|
aTrackRect.Bottom() += mnDockBottom;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( aCompRect == aTrackRect )
|
|
|
|
{
|
|
|
|
aTrackRect.Left() += mnDockLeft;
|
|
|
|
aTrackRect.Top() += mnDockTop;
|
|
|
|
aTrackRect.Right() -= mnDockRight;
|
|
|
|
aTrackRect.Bottom() -= mnDockBottom;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mbLastFloatMode = bFloatMode;
|
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 nTrackStyle;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( bFloatMode )
|
|
|
|
nTrackStyle = SHOWTRACK_OBJECT;
|
|
|
|
else
|
|
|
|
nTrackStyle = SHOWTRACK_BIG;
|
|
|
|
Rectangle aShowTrackRect = aTrackRect;
|
|
|
|
aShowTrackRect.SetPos( GetWindow()->ImplFrameToOutput( aShowTrackRect.TopLeft() ) );
|
2011-08-13 07:54:47 +02:00
|
|
|
|
|
|
|
GetWindow()->ShowTracking( aShowTrackRect, nTrackStyle );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-02-22 07:46:15 -05:00
|
|
|
// calculate mouse offset again, as the rectangle was changed
|
2004-07-06 12:48:09 +00:00
|
|
|
maMouseOff.X() = aPos.X() - aTrackRect.Left();
|
|
|
|
maMouseOff.Y() = aPos.Y() - aTrackRect.Top();
|
|
|
|
|
|
|
|
mnTrackX = aTrackRect.Left();
|
|
|
|
mnTrackY = aTrackRect.Top();
|
|
|
|
mnTrackWidth = aTrackRect.GetWidth();
|
|
|
|
mnTrackHeight = aTrackRect.GetHeight();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::StartDocking( const Point& rPoint, Rectangle& rRect )
|
|
|
|
{
|
|
|
|
DockingData data( rPoint, rRect, IsFloatingMode() );
|
|
|
|
|
2015-01-14 14:52:04 +00:00
|
|
|
GetWindow()->CallEventListeners( VCLEVENT_WINDOW_STARTDOCKING, &data );
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDocking = true;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool ImplDockingWindowWrapper::Docking( const Point& rPoint, Rectangle& rRect )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
DockingData data( rPoint, rRect, IsFloatingMode() );
|
|
|
|
|
2015-01-14 14:52:04 +00:00
|
|
|
GetWindow()->CallEventListeners( VCLEVENT_WINDOW_DOCKING, &data );
|
2004-07-06 12:48:09 +00:00
|
|
|
rRect = data.maTrackRect;
|
|
|
|
return data.mbFloating;
|
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
void ImplDockingWindowWrapper::EndDocking( const Rectangle& rRect, bool bFloatMode )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
Rectangle aRect( rRect );
|
|
|
|
|
|
|
|
if ( !IsDockingCanceled() )
|
|
|
|
{
|
2013-06-19 22:30:49 +09:00
|
|
|
bool bShow = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( bFloatMode != IsFloatingMode() )
|
|
|
|
{
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( false, ShowFlags::NoFocusChange );
|
2004-07-06 12:48:09 +00:00
|
|
|
SetFloatingMode( bFloatMode );
|
2013-06-19 22:30:49 +09:00
|
|
|
bShow = true;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( bFloatMode )
|
2005-03-30 08:07:31 +00:00
|
|
|
{
|
|
|
|
// #i44800# always use outputsize - as in all other places
|
|
|
|
mpFloatWin->SetOutputSizePixel( aRect.GetSize() );
|
|
|
|
mpFloatWin->SetPosPixel( aRect.TopLeft() );
|
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
if ( !bFloatMode )
|
|
|
|
{
|
|
|
|
Point aPos = aRect.TopLeft();
|
|
|
|
aPos = GetWindow()->GetParent()->ScreenToOutputPixel( aPos );
|
|
|
|
GetWindow()->SetPosSizePixel( aPos, aRect.GetSize() );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bShow )
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( true, ShowFlags::NoFocusChange | ShowFlags::NoActivate );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
EndDockingData data( aRect, IsFloatingMode(), IsDockingCanceled() );
|
2015-01-14 14:52:04 +00:00
|
|
|
GetWindow()->CallEventListeners( VCLEVENT_WINDOW_ENDDOCKING, &data );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDocking = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// must be enabled in Window::Notify to prevent permanent docking during mouse move
|
2014-02-21 12:53:51 +01:00
|
|
|
mbStartDockingEnabled = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool ImplDockingWindowWrapper::PrepareToggleFloatingMode()
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2014-02-24 01:53:13 +11:00
|
|
|
bool bFloating = true;
|
2015-01-14 14:52:04 +00:00
|
|
|
GetWindow()->CallEventListeners( VCLEVENT_WINDOW_PREPARETOGGLEFLOATING, &bFloating );
|
2004-07-06 12:48:09 +00:00
|
|
|
return bFloating;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::ToggleFloatingMode()
|
|
|
|
{
|
|
|
|
// notify dockingwindow/toolbox
|
2005-01-31 08:19:27 +00:00
|
|
|
// note: this must be done *before* notifying the
|
2004-11-26 15:21:59 +00:00
|
|
|
// listeners to have the toolbox in the proper state
|
2014-12-16 14:07:08 +00:00
|
|
|
if( GetWindow()->IsDockingWindow() )
|
2014-09-19 15:17:37 +02:00
|
|
|
static_cast<DockingWindow*>(GetWindow())->ToggleFloatingMode();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2005-01-31 08:19:27 +00:00
|
|
|
// now notify listeners
|
2015-01-14 14:52:04 +00:00
|
|
|
GetWindow()->CallEventListeners( VCLEVENT_WINDOW_TOGGLEFLOATING );
|
2004-11-26 15:21:59 +00:00
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
// must be enabled in Window::Notify to prevent permanent docking during mouse move
|
2014-02-21 12:53:51 +01:00
|
|
|
mbStartDockingEnabled = false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-05-21 13:51:35 +02:00
|
|
|
void ImplDockingWindowWrapper::TitleButtonClick( TitleButton nType )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-05-21 13:51:35 +02:00
|
|
|
if( nType == TitleButton::Menu )
|
2004-09-09 15:21:03 +00:00
|
|
|
{
|
|
|
|
ToolBox *pToolBox = dynamic_cast< ToolBox* >( GetWindow() );
|
|
|
|
if( pToolBox )
|
|
|
|
{
|
|
|
|
pToolBox->ExecuteCustomMenu();
|
|
|
|
}
|
|
|
|
}
|
2015-05-21 13:51:35 +02:00
|
|
|
if( nType == TitleButton::Docking )
|
2004-09-09 15:21:03 +00:00
|
|
|
{
|
|
|
|
SetFloatingMode( !IsFloatingMode() );
|
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2004-11-26 15:21:59 +00:00
|
|
|
void ImplDockingWindowWrapper::Resizing( Size& rSize )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2004-11-26 15:21:59 +00:00
|
|
|
// TODO: add virtual Resizing() to class Window, so we can get rid of class DockingWindow
|
|
|
|
DockingWindow *pDockingWindow = dynamic_cast< DockingWindow* >( GetWindow() );
|
|
|
|
if( pDockingWindow )
|
|
|
|
pDockingWindow->Resizing( rSize );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-05-21 13:51:35 +02:00
|
|
|
void ImplDockingWindowWrapper::ShowTitleButton( TitleButton nButton, bool bVisible )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
if ( mpFloatWin )
|
|
|
|
mpFloatWin->ShowTitleButton( nButton, bVisible );
|
|
|
|
else
|
|
|
|
{
|
2015-05-21 13:51:35 +02:00
|
|
|
if ( nButton == TitleButton::Docking )
|
2004-07-06 12:48:09 +00:00
|
|
|
mbDockBtn = bVisible;
|
2015-05-21 13:51:35 +02:00
|
|
|
else // if ( nButton == TitleButton::Hide )
|
2004-07-06 12:48:09 +00:00
|
|
|
mbHideBtn = bVisible;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-12 15:30:22 +02:00
|
|
|
void ImplDockingWindowWrapper::StartPopupMode( ToolBox *pParentToolBox, FloatWinPopupFlags nFlags )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
// do nothing if window is floating
|
|
|
|
if( IsFloatingMode() )
|
|
|
|
return;
|
|
|
|
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( false, ShowFlags::NoFocusChange );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// prepare reparenting
|
2015-05-21 15:52:27 +02:00
|
|
|
vcl::Window* pRealParent = GetWindow()->GetWindow( GetWindowType::Parent );
|
|
|
|
mpOldBorderWin = GetWindow()->GetWindow( GetWindowType::Border );
|
2015-03-09 14:29:30 +02:00
|
|
|
if( mpOldBorderWin.get() == GetWindow() )
|
2015-11-10 10:28:29 +01:00
|
|
|
mpOldBorderWin = nullptr; // no border window found
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// the new parent for popup mode
|
2015-05-12 15:30:22 +02:00
|
|
|
VclPtrInstance<ImplPopupFloatWin> pWin( mpParent, this, bool(nFlags & FloatWinPopupFlags::AllowTearOff) );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
pWin->SetPopupModeEndHdl( LINK( this, ImplDockingWindowWrapper, PopupModeEnd ) );
|
|
|
|
pWin->SetText( GetWindow()->GetText() );
|
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
pWin->SetOutputSizePixel( GetWindow()->GetSizePixel() );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-11-10 10:28:29 +01:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = nullptr;
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mnLeftBorder = 0;
|
|
|
|
GetWindow()->mpWindowImpl->mnTopBorder = 0;
|
|
|
|
GetWindow()->mpWindowImpl->mnRightBorder = 0;
|
|
|
|
GetWindow()->mpWindowImpl->mnBottomBorder = 0;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-09-29 18:13:24 +02:00
|
|
|
// position toolbox below DragRect
|
2004-07-06 12:48:09 +00:00
|
|
|
GetWindow()->SetPosPixel( pWin->GetToolboxPosition() );
|
|
|
|
|
|
|
|
// reparent borderwindow and window
|
|
|
|
if ( mpOldBorderWin )
|
|
|
|
mpOldBorderWin->SetParent( pWin );
|
|
|
|
GetWindow()->SetParent( pWin );
|
|
|
|
|
|
|
|
// correct border window pointers
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = pWin;
|
|
|
|
pWin->mpWindowImpl->mpClientWindow = GetWindow();
|
|
|
|
GetWindow()->mpWindowImpl->mpRealParent = pRealParent;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// set mpFloatWin not until all window positioning is done !!!
|
|
|
|
// (SetPosPixel etc. check for valid mpFloatWin pointer)
|
|
|
|
mpFloatWin = pWin;
|
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
// if the subtoolbar was opened via keyboard make sure that key events
|
|
|
|
// will go into subtoolbar
|
|
|
|
if( pParentToolBox->IsKeyEvent() )
|
2015-05-12 15:30:22 +02:00
|
|
|
nFlags |= FloatWinPopupFlags::GrabFocus;
|
2004-09-09 15:21:03 +00:00
|
|
|
|
|
|
|
mpFloatWin->StartPopupMode( pParentToolBox, nFlags );
|
2004-07-06 12:48:09 +00:00
|
|
|
GetWindow()->Show();
|
2004-09-09 15:21:03 +00:00
|
|
|
|
|
|
|
if( pParentToolBox->IsKeyEvent() )
|
|
|
|
{
|
|
|
|
// send HOME key to subtoolbar in order to select first item
|
2014-08-23 22:22:32 +03:00
|
|
|
KeyEvent aEvent( 0, vcl::KeyCode( KEY_HOME ) );
|
2004-09-09 15:21:03 +00:00
|
|
|
mpFloatWin->GetPreferredKeyInputWindow()->KeyInput( aEvent );
|
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2015-09-09 07:23:12 +02:00
|
|
|
IMPL_LINK_NOARG_TYPED(ImplDockingWindowWrapper, PopupModeEnd, FloatingWindow*, void)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( false, ShowFlags::NoFocusChange );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// set parameter for handler before destroying floating window
|
2015-03-09 14:29:30 +02:00
|
|
|
ImplPopupFloatWin *pPopupFloatWin = static_cast<ImplPopupFloatWin*>(mpFloatWin.get());
|
2004-07-06 12:48:09 +00:00
|
|
|
EndPopupModeData aData( pPopupFloatWin->GetTearOffPosition(), mpFloatWin->IsPopupModeTearOff() );
|
|
|
|
|
|
|
|
// before deleting change parent back, so we can delete the floating window alone
|
2015-05-21 15:52:27 +02:00
|
|
|
vcl::Window* pRealParent = GetWindow()->GetWindow( GetWindowType::Parent );
|
2015-11-10 10:28:29 +01:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = nullptr;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( mpOldBorderWin )
|
|
|
|
{
|
|
|
|
GetWindow()->SetParent( mpOldBorderWin );
|
2015-03-09 14:29:30 +02:00
|
|
|
static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder(
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mnLeftBorder, GetWindow()->mpWindowImpl->mnTopBorder,
|
|
|
|
GetWindow()->mpWindowImpl->mnRightBorder, GetWindow()->mpWindowImpl->mnBottomBorder );
|
2004-07-06 12:48:09 +00:00
|
|
|
mpOldBorderWin->Resize();
|
|
|
|
}
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = mpOldBorderWin;
|
2004-07-06 12:48:09 +00:00
|
|
|
GetWindow()->SetParent( pRealParent );
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mpRealParent = pRealParent;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-04-10 10:44:13 +01:00
|
|
|
mpFloatWin.disposeAndClear();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// call handler - which will destroy the window and thus the wrapper as well !
|
2015-01-14 14:52:04 +00:00
|
|
|
GetWindow()->CallEventListeners( VCLEVENT_WINDOW_ENDPOPUPMODE, &aData );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool ImplDockingWindowWrapper::IsInPopupMode() const
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
if( GetFloatingWindow() )
|
|
|
|
return GetFloatingWindow()->IsInPopupMode();
|
|
|
|
else
|
2014-02-21 12:53:51 +01:00
|
|
|
return false;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
void ImplDockingWindowWrapper::SetFloatingMode( bool bFloatMode )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
// do nothing if window is docked and locked
|
|
|
|
if( !IsFloatingMode() && IsLocked() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( IsFloatingMode() != bFloatMode )
|
|
|
|
{
|
|
|
|
if ( PrepareToggleFloatingMode() )
|
|
|
|
{
|
2014-02-21 12:53:51 +01:00
|
|
|
bool bVisible = GetWindow()->IsVisible();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
if ( bFloatMode )
|
|
|
|
{
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( false, ShowFlags::NoFocusChange );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
maDockPos = GetWindow()->GetPosPixel();
|
|
|
|
|
2015-05-21 15:52:27 +02:00
|
|
|
vcl::Window* pRealParent = GetWindow()->GetWindow( GetWindowType::Parent );
|
|
|
|
mpOldBorderWin = GetWindow()->GetWindow( GetWindowType::Border );
|
2004-07-06 12:48:09 +00:00
|
|
|
if( mpOldBorderWin == mpDockingWindow )
|
2015-11-10 10:28:29 +01:00
|
|
|
mpOldBorderWin = nullptr; // no border window found
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
ImplDockFloatWin2* pWin =
|
2015-04-20 15:35:54 +01:00
|
|
|
VclPtr<ImplDockFloatWin2>::Create(
|
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
mpParent,
|
2004-09-09 15:21:03 +00:00
|
|
|
mnFloatBits & ( WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE ) ?
|
|
|
|
mnFloatBits | WB_SYSTEMWINDOW
|
|
|
|
| WB_OWNERDRAWDECORATION
|
|
|
|
: mnFloatBits,
|
2004-07-06 12:48:09 +00:00
|
|
|
this );
|
2004-11-16 14:10:51 +00:00
|
|
|
|
2015-11-10 10:28:29 +01:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = nullptr;
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mnLeftBorder = 0;
|
|
|
|
GetWindow()->mpWindowImpl->mnTopBorder = 0;
|
|
|
|
GetWindow()->mpWindowImpl->mnRightBorder = 0;
|
|
|
|
GetWindow()->mpWindowImpl->mnBottomBorder = 0;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-02-22 07:46:15 -05:00
|
|
|
// if the parent gets destroyed, we also have to reset the parent of the BorderWindow
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( mpOldBorderWin )
|
|
|
|
mpOldBorderWin->SetParent( pWin );
|
|
|
|
GetWindow()->SetParent( pWin );
|
|
|
|
pWin->SetPosPixel( Point() );
|
|
|
|
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = pWin;
|
|
|
|
pWin->mpWindowImpl->mpClientWindow = mpDockingWindow;
|
|
|
|
GetWindow()->mpWindowImpl->mpRealParent = pRealParent;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
pWin->SetText( GetWindow()->GetText() );
|
|
|
|
pWin->SetOutputSizePixel( GetWindow()->GetSizePixel() );
|
|
|
|
pWin->SetPosPixel( maFloatPos );
|
2014-02-22 07:46:15 -05:00
|
|
|
// pass on DockingData to FloatingWindow
|
2015-05-21 13:51:35 +02:00
|
|
|
pWin->ShowTitleButton( TitleButton::Docking, mbDockBtn );
|
|
|
|
pWin->ShowTitleButton( TitleButton::Hide, mbHideBtn );
|
2014-03-12 16:34:21 +02:00
|
|
|
pWin->SetPin( mbPinned );
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( mbRollUp )
|
|
|
|
pWin->RollUp();
|
|
|
|
else
|
|
|
|
pWin->RollDown();
|
|
|
|
pWin->SetRollUpOutputSizePixel( maRollUpOutSize );
|
|
|
|
pWin->SetMinOutputSizePixel( maMinOutSize );
|
2004-09-09 15:21:03 +00:00
|
|
|
pWin->SetMaxOutputSizePixel( maMaxOutSize );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2010-01-17 18:15:22 +01:00
|
|
|
mpFloatWin = pWin;
|
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( bVisible )
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( true, ShowFlags::NoFocusChange | ShowFlags::NoActivate );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
ToggleFloatingMode();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-22 12:49:04 +02:00
|
|
|
GetWindow()->Show( false, ShowFlags::NoFocusChange );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2014-02-22 07:46:15 -05:00
|
|
|
// store FloatingData in FloatingWindow
|
2004-07-06 12:48:09 +00:00
|
|
|
maFloatPos = mpFloatWin->GetPosPixel();
|
2015-05-21 13:51:35 +02:00
|
|
|
mbDockBtn = mpFloatWin->IsTitleButtonVisible( TitleButton::Docking );
|
|
|
|
mbHideBtn = mpFloatWin->IsTitleButtonVisible( TitleButton::Hide );
|
2014-03-12 16:34:21 +02:00
|
|
|
mbPinned = mpFloatWin->IsPinned();
|
2004-07-06 12:48:09 +00:00
|
|
|
mbRollUp = mpFloatWin->IsRollUp();
|
|
|
|
maRollUpOutSize = mpFloatWin->GetRollUpOutputSizePixel();
|
|
|
|
maMinOutSize = mpFloatWin->GetMinOutputSizePixel();
|
2004-09-09 15:21:03 +00:00
|
|
|
maMaxOutSize = mpFloatWin->GetMaxOutputSizePixel();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-05-21 15:52:27 +02:00
|
|
|
vcl::Window* pRealParent = GetWindow()->GetWindow( GetWindowType::Parent ); //mpWindowImpl->mpRealParent;
|
2015-11-10 10:28:29 +01:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = nullptr;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( mpOldBorderWin )
|
|
|
|
{
|
|
|
|
GetWindow()->SetParent( mpOldBorderWin );
|
2015-03-09 14:29:30 +02:00
|
|
|
static_cast<ImplBorderWindow*>(mpOldBorderWin.get())->GetBorder(
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mnLeftBorder, GetWindow()->mpWindowImpl->mnTopBorder,
|
|
|
|
GetWindow()->mpWindowImpl->mnRightBorder, GetWindow()->mpWindowImpl->mnBottomBorder );
|
2004-07-06 12:48:09 +00:00
|
|
|
mpOldBorderWin->Resize();
|
|
|
|
}
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mpBorderWindow = mpOldBorderWin;
|
2004-07-06 12:48:09 +00:00
|
|
|
GetWindow()->SetParent( pRealParent );
|
2005-01-13 17:03:21 +00:00
|
|
|
GetWindow()->mpWindowImpl->mpRealParent = pRealParent;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2015-03-18 08:33:14 +02:00
|
|
|
mpFloatWin.disposeAndClear();
|
2004-07-06 12:48:09 +00:00
|
|
|
GetWindow()->SetPosPixel( maDockPos );
|
|
|
|
|
|
|
|
if ( bVisible )
|
|
|
|
GetWindow()->Show();
|
|
|
|
|
|
|
|
ToggleFloatingMode();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::SetFloatStyle( WinBits nStyle )
|
|
|
|
{
|
|
|
|
mnFloatBits = nStyle;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-08-24 12:34:22 +01:00
|
|
|
void ImplDockingWindowWrapper::setPosSizePixel( long nX, long nY,
|
2004-07-06 12:48:09 +00:00
|
|
|
long nWidth, long nHeight,
|
2015-05-22 10:37:31 +02:00
|
|
|
PosSizeFlags nFlags )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
if ( mpFloatWin )
|
2012-08-24 12:34:22 +01:00
|
|
|
mpFloatWin->setPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
|
2004-07-06 12:48:09 +00:00
|
|
|
else
|
2012-08-24 12:34:22 +01:00
|
|
|
GetWindow()->setPosSizePixel( nX, nY, nWidth, nHeight, nFlags );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Point ImplDockingWindowWrapper::GetPosPixel() const
|
|
|
|
{
|
|
|
|
if ( mpFloatWin )
|
|
|
|
return mpFloatWin->GetPosPixel();
|
|
|
|
else
|
|
|
|
return mpDockingWindow->GetPosPixel();
|
|
|
|
}
|
|
|
|
|
|
|
|
Size ImplDockingWindowWrapper::GetSizePixel() const
|
|
|
|
{
|
|
|
|
if ( mpFloatWin )
|
|
|
|
return mpFloatWin->GetSizePixel();
|
|
|
|
else
|
|
|
|
return mpDockingWindow->GetSizePixel();
|
|
|
|
}
|
|
|
|
|
|
|
|
// old inlines from DockingWindow
|
2014-02-22 21:20:15 +01:00
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
void ImplDockingWindowWrapper::SetMinOutputSizePixel( const Size& rSize )
|
|
|
|
{
|
|
|
|
if ( mpFloatWin )
|
|
|
|
mpFloatWin->SetMinOutputSizePixel( rSize );
|
|
|
|
maMinOutSize = rSize;
|
|
|
|
}
|
|
|
|
|
2004-09-09 15:21:03 +00:00
|
|
|
void ImplDockingWindowWrapper::SetMaxOutputSizePixel( const Size& rSize )
|
|
|
|
{
|
|
|
|
if ( mpFloatWin )
|
|
|
|
mpFloatWin->SetMaxOutputSizePixel( rSize );
|
|
|
|
maMaxOutSize = rSize;
|
|
|
|
}
|
|
|
|
|
2014-02-21 12:53:51 +01:00
|
|
|
bool ImplDockingWindowWrapper::IsFloatingMode() const
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2015-03-09 14:29:30 +02:00
|
|
|
return (mpFloatWin != nullptr);
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::SetDragArea( const Rectangle& rRect )
|
|
|
|
{
|
|
|
|
maDragArea = rRect;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::Lock()
|
|
|
|
{
|
2014-02-21 12:53:51 +01:00
|
|
|
mbLocked = true;
|
2004-08-11 15:52:45 +00:00
|
|
|
// only toolbars support locking
|
|
|
|
ToolBox *pToolBox = dynamic_cast< ToolBox * >( GetWindow() );
|
|
|
|
if( pToolBox )
|
|
|
|
pToolBox->Lock( mbLocked );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::Unlock()
|
|
|
|
{
|
2014-02-21 12:53:51 +01:00
|
|
|
mbLocked = false;
|
2004-08-11 15:52:45 +00:00
|
|
|
// only toolbars support locking
|
|
|
|
ToolBox *pToolBox = dynamic_cast< ToolBox * >( GetWindow() );
|
|
|
|
if( pToolBox )
|
|
|
|
pToolBox->Lock( mbLocked );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2010-10-14 08:27:31 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|