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>
|
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
|
|
|
|
2017-01-03 11:18:39 +00:00
|
|
|
#define DOCKWIN_FLOATSTYLES (WB_SIZEABLE | WB_MOVEABLE | WB_CLOSEABLE | WB_STANDALONE | WB_ROLLABLE )
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
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;
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::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
|
|
|
|
2016-10-05 07:56:12 +02:00
|
|
|
DECL_LINK(DockingHdl, void *, void);
|
2017-01-23 19:37:51 +01:00
|
|
|
DECL_LINK(DockTimerHdl, Timer *, void);
|
|
|
|
DECL_LINK(EndDockTimerHdl, Timer *, 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 );
|
2016-09-13 13:09:01 +02:00
|
|
|
virtual ~ImplDockFloatWin2() override;
|
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 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
|
|
|
|
2017-01-23 19:37:51 +01:00
|
|
|
maDockIdle.SetInvokeHandler( LINK( this, ImplDockFloatWin2, DockTimerHdl ) );
|
Reorganize Scheduler priority classes
This is based on glibs classification of tasks, but while glib uses
an int for more fine grained priority, we stay with our enum.
1. Timers start with DEFAULT priority, which directly corresponds
with the previous HIGH priority
2. Idles start with DEFAULT_IDLE priority instead of the previous
HIGH priority, so idle default becomes "really run when idle".
As RESIZE and REPAINT are special, and the DEFAULTS are set, there
is just one primary decision for the programmer: should my idle
run before paint (AKA HIGH_IDLE)?
If we really need a more fine-grained classification, we can add it
later, or also switch to a real int. As a result, this drops many
classifications from the code and drastically changes behaviour,
AKA a mail merge from KDE is now as fast as Gtk+ again.
Change-Id: I498a73fd02d5fb6f5d7e9f742f3bce972de9b1f9
2016-08-10 12:00:53 +02:00
|
|
|
maDockIdle.SetPriority( TaskPriority::HIGH_IDLE );
|
2016-07-20 10:54:30 +02:00
|
|
|
maDockIdle.SetDebugName( "vcl::ImplDockFloatWin2 maDockIdle" );
|
|
|
|
|
2017-01-23 19:37:51 +01:00
|
|
|
maEndDockIdle.SetInvokeHandler( LINK( this, ImplDockFloatWin2, EndDockTimerHdl ) );
|
2017-08-31 15:53:46 +02:00
|
|
|
maEndDockIdle.SetPriority( TaskPriority::HIGH_IDLE );
|
2016-07-20 10:54:30 +02:00
|
|
|
maEndDockIdle.SetDebugName( "vcl::ImplDockFloatWin2 maEndDockIdle" );
|
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
|
|
|
}
|
|
|
|
|
2017-01-23 19:37:51 +01:00
|
|
|
IMPL_LINK_NOARG(ImplDockFloatWin2, DockTimerHdl, Timer *, void)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2016-06-12 20:11:20 +02:00
|
|
|
SAL_WARN_IF( !mpDockWin->IsFloatingMode(), "vcl", "docktimer called but not floating" );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
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
|
|
|
|
{
|
2016-05-11 16:57:46 +02:00
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, ShowTrackFlags::Big | ShowTrackFlags::TrackWindow );
|
2014-11-20 16:21:17 +00:00
|
|
|
maDockIdle.Start();
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-23 19:37:51 +01:00
|
|
|
IMPL_LINK_NOARG(ImplDockFloatWin2, EndDockTimerHdl, Timer *, void)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2016-06-12 20:11:20 +02:00
|
|
|
SAL_WARN_IF( !mpDockWin->IsFloatingMode(), "vcl", "enddocktimer called but not floating" );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-05 07:56:12 +02:00
|
|
|
IMPL_LINK_NOARG(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 )
|
|
|
|
{
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aBorderRect( Point(), 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();
|
2017-04-25 10:33:32 +02:00
|
|
|
bRealMove = aBorderRect.IsInside( aBorderState.maPos );
|
2004-09-09 15:21:03 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-23 13:13:28 +02:00
|
|
|
if( 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
|
|
|
{
|
2017-05-22 15:55:38 +02:00
|
|
|
maDockPos = pDockingArea->OutputToScreenPixel( pDockingArea->AbsoluteScreenToOutputPixel( OutputToAbsoluteScreenPixel( Point() ) ) );
|
2017-03-30 20:27:55 +02:00
|
|
|
maDockRect = tools::Rectangle( maDockPos, mpDockWin->GetSizePixel() );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// 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() ) );
|
2016-05-11 16:57:46 +02:00
|
|
|
mpDockWin->GetWindow()->GetParent()->ImplGetFrameWindow()->ShowTracking( maDockRect, ShowTrackFlags::Big | ShowTrackFlags::TrackWindow );
|
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::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()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
ImplDockingWindowWrapper* DockingManager::GetDockingWindowWrapper( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-08-16 23:04:39 +09:00
|
|
|
for( auto& xWrapper : mvDockingWindows )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-08-16 23:04:39 +09:00
|
|
|
if( xWrapper->mpDockingWindow == pWindow )
|
|
|
|
return xWrapper.get();
|
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 );
|
2017-04-25 10:33:32 +02:00
|
|
|
return pWrapper && pWrapper->IsLocked();
|
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 );
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:57:39 +03:00
|
|
|
void DockingManager::StartPopupMode( const vcl::Window *pWindow, const tools::Rectangle& rRect, FloatWinPopupFlags nFlags )
|
|
|
|
{
|
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
|
|
|
pWrapper->StartPopupMode( rRect, nFlags );
|
|
|
|
}
|
|
|
|
|
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::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 );
|
2017-04-25 10:33:32 +02:00
|
|
|
return pWrapper && pWrapper->IsInPopupMode();
|
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;
|
2017-08-16 23:04:39 +09:00
|
|
|
mvDockingWindows.emplace_back( new ImplDockingWindowWrapper( pWindow ) );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2014-09-23 11:20:40 +02:00
|
|
|
void DockingManager::RemoveWindow( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-08-16 23:04:39 +09:00
|
|
|
for( auto it = mvDockingWindows.begin(); it != mvDockingWindows.end(); ++it )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-08-16 23:04:39 +09:00
|
|
|
if( (*it)->mpDockingWindow == pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-08-16 23:04:39 +09:00
|
|
|
mvDockingWindows.erase( it );
|
2004-07-06 12:48:09 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-18 09:02:03 +02:00
|
|
|
void DockingManager::SetPosSizePixel( vcl::Window const *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
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle DockingManager::GetPosSizePixel( const vcl::Window *pWindow )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aRect;
|
2004-07-06 12:48:09 +00:00
|
|
|
ImplDockingWindowWrapper* pWrapper = GetDockingWindowWrapper( pWindow );
|
|
|
|
if( pWrapper )
|
2017-03-30 20:27:55 +02:00
|
|
|
aRect = tools::Rectangle( pWrapper->GetPosPixel(), pWrapper->GetSizePixel() );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
return aRect;
|
|
|
|
}
|
|
|
|
|
|
|
|
class ImplPopupFloatWin : public FloatingWindow
|
|
|
|
{
|
|
|
|
private:
|
2013-06-19 22:30:49 +09:00
|
|
|
bool mbMoving;
|
2009-12-06 19:11:23 +01:00
|
|
|
bool mbTrackingEnabled;
|
2004-07-06 12:48:09 +00:00
|
|
|
Point maDelta;
|
2016-10-08 21:59:02 +03:00
|
|
|
bool mbHasGrip;
|
2004-09-09 15:21:03 +00:00
|
|
|
void ImplSetBorder();
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
public:
|
2017-06-15 14:48:24 +02:00
|
|
|
ImplPopupFloatWin( vcl::Window* pParent, bool bHasGrip );
|
2016-09-13 13:09:01 +02:00
|
|
|
virtual ~ImplPopupFloatWin() override;
|
2015-10-12 16:04:04 +02:00
|
|
|
|
2015-11-18 10:11:06 +02:00
|
|
|
virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override;
|
2017-03-30 20:27:55 +02:00
|
|
|
virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override;
|
2015-10-12 16:04:04 +02:00
|
|
|
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;
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle GetDragRect() const;
|
2016-09-30 23:09:05 +02:00
|
|
|
Point GetToolboxPosition() const;
|
2015-05-07 15:18:41 +09:00
|
|
|
void DrawGrip(vcl::RenderContext& rRenderContext);
|
|
|
|
void DrawBorder(vcl::RenderContext& rRenderContext);
|
2016-10-08 21:59:02 +03:00
|
|
|
|
|
|
|
bool hasGrip() const { return mbHasGrip; }
|
2004-07-06 12:48:09 +00:00
|
|
|
};
|
|
|
|
|
2017-06-15 14:48:24 +02:00
|
|
|
ImplPopupFloatWin::ImplPopupFloatWin( vcl::Window* pParent, bool bHasGrip ) :
|
2016-12-21 04:42:34 +02: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
|
2013-06-19 22:30:49 +09:00
|
|
|
mbMoving = false;
|
2014-01-28 19:59:13 +01:00
|
|
|
mbTrackingEnabled = false;
|
2016-12-21 04:42:34 +02: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
|
|
|
}
|
|
|
|
|
2015-11-18 10:11:06 +02:00
|
|
|
css::uno::Reference< css::accessibility::XAccessible > ImplPopupFloatWin::CreateAccessible()
|
2006-01-26 17:10:00 +00:00
|
|
|
{
|
2017-03-24 15:31:29 +01:00
|
|
|
// switch off direct accessibility support for this window
|
2006-01-26 17:10:00 +00:00
|
|
|
|
|
|
|
// 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)
|
2016-01-09 22:55:28 +01:00
|
|
|
// so the contained toolbar should appear as child of the corresponding 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
|
|
|
}
|
|
|
|
|
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;
|
2016-10-08 21:59:02 +03:00
|
|
|
if( hasGrip() )
|
2016-12-21 04:08:23 +02:00
|
|
|
mpWindowImpl->mnTopBorder += 1 + ToolBox::ImplGetDragWidth( *this, false );
|
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
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle ImplPopupFloatWin::GetDragRect() const
|
2004-09-09 15:21:03 +00:00
|
|
|
{
|
2016-10-08 22:32:22 +03:00
|
|
|
if( !hasGrip() )
|
2017-03-30 20:27:55 +02:00
|
|
|
return tools::Rectangle();
|
|
|
|
return tools::Rectangle( 1, 1, GetOutputSizePixel().Width() - 1,
|
2016-09-30 23:09:05 +02:00
|
|
|
2 + ToolBox::ImplGetDragWidth( *this, false ) );
|
|
|
|
}
|
2010-01-18 20:46:53 +01:00
|
|
|
|
2016-09-30 23:09:05 +02:00
|
|
|
Point ImplPopupFloatWin::GetToolboxPosition() const
|
|
|
|
{
|
|
|
|
// return inner position where a toolbox could be placed
|
2016-12-21 03:42:22 +02:00
|
|
|
return Point( 1, 1 + ( hasGrip() ? GetDragRect().getHeight() : 0 ) ); // grip + border
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
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();
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aRect( Point(), 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 );
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aItemClipRect( ImplGetItemEdgeClipRect() );
|
2004-09-09 15:21:03 +00:00
|
|
|
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
|
|
|
|
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
|
|
|
{
|
2016-09-30 23:09:05 +02:00
|
|
|
ToolBox::ImplDrawGrip(rRenderContext, GetDragRect(),
|
|
|
|
ToolBox::ImplGetDragWidth( *this, false ), WindowAlign::Left, false );
|
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
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
void ImplPopupFloatWin::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle&)
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2016-09-29 23:07:35 +03:00
|
|
|
DrawBorder(rRenderContext);
|
2016-10-08 21:59:02 +03:00
|
|
|
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;
|
|
|
|
}
|
2016-09-30 23:09:05 +02:00
|
|
|
if( GetDragRect().IsInside( aMousePos ) )
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
2016-09-30 23:09:05 +02:00
|
|
|
if( GetPointer().GetStyle() != PointerStyle::Move )
|
|
|
|
SetPointer( Pointer( PointerStyle::Move ) );
|
2005-11-11 10:54:40 +00:00
|
|
|
}
|
2016-09-30 23:09:05 +02:00
|
|
|
if( rMEvt.IsLeaveWindow() || !GetDragRect().IsInside( aMousePos ) )
|
2005-11-11 10:54:40 +00:00
|
|
|
{
|
2016-09-30 23:09:05 +02:00
|
|
|
if( GetPointer().GetStyle() != PointerStyle::Arrow )
|
|
|
|
SetPointer( Pointer( PointerStyle::Arrow ) );
|
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);
|
2016-10-08 22:10:32 +03:00
|
|
|
maDelta = aState.maPos - GetWindow( GetWindowType::Border )->GetPosPixel();
|
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);
|
2016-10-08 22:10:32 +03:00
|
|
|
GetWindow( GetWindowType::Border )->SetPosPixel( aState.maPos - maDelta );
|
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)
|
|
|
|
, mbDocking(false)
|
|
|
|
, mbLastFloatMode(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( !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();
|
|
|
|
|
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 );
|
2017-05-22 15:55:38 +02:00
|
|
|
Point aDockPos = pDockingArea->AbsoluteScreenToOutputPixel( GetWindow()->OutputToAbsoluteScreenPixel( GetWindow()->GetPosPixel() ) );
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aDockRect( aDockPos, GetWindow()->GetSizePixel() );
|
2004-07-06 12:48:09 +00:00
|
|
|
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;
|
2017-03-30 20:27:55 +02:00
|
|
|
EndDocking( tools::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
|
2017-03-30 20:27:55 +02:00
|
|
|
EndDocking( tools::Rectangle( Point( mnTrackX, mnTrackY ), Size( mnTrackWidth, mnTrackHeight ) ), mbLastFloatMode );
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
// 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 );
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aTrackRect( aPos, Size( mnTrackWidth, mnTrackHeight ) );
|
|
|
|
tools::Rectangle aCompRect = aTrackRect;
|
2004-07-06 12:48:09 +00:00
|
|
|
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
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2016-05-11 16:57:46 +02:00
|
|
|
ShowTrackFlags nTrackStyle;
|
2004-07-06 12:48:09 +00:00
|
|
|
if ( bFloatMode )
|
2016-05-11 16:57:46 +02:00
|
|
|
nTrackStyle = ShowTrackFlags::Object;
|
2004-07-06 12:48:09 +00:00
|
|
|
else
|
2016-05-11 16:57:46 +02:00
|
|
|
nTrackStyle = ShowTrackFlags::Big;
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aShowTrackRect = aTrackRect;
|
2004-07-06 12:48:09 +00:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-07-18 09:02:03 +02:00
|
|
|
void ImplDockingWindowWrapper::StartDocking( const Point& rPoint, tools::Rectangle const & rRect )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
DockingData data( rPoint, rRect, IsFloatingMode() );
|
|
|
|
|
2016-12-06 13:26:09 +02:00
|
|
|
GetWindow()->CallEventListeners( VclEventId::WindowStartDocking, &data );
|
2014-02-21 12:53:51 +01:00
|
|
|
mbDocking = true;
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
bool ImplDockingWindowWrapper::Docking( const Point& rPoint, tools::Rectangle& rRect )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
DockingData data( rPoint, rRect, IsFloatingMode() );
|
|
|
|
|
2016-12-06 13:26:09 +02:00
|
|
|
GetWindow()->CallEventListeners( VclEventId::WindowDocking, &data );
|
2004-07-06 12:48:09 +00:00
|
|
|
rRect = data.maTrackRect;
|
|
|
|
return data.mbFloating;
|
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
void ImplDockingWindowWrapper::EndDocking( const tools::Rectangle& rRect, bool bFloatMode )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
2017-03-30 20:27:55 +02:00
|
|
|
tools::Rectangle aRect( rRect );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
2016-11-22 13:43:32 +00:00
|
|
|
bool bOrigDockCanceled = mbDockCanceled;
|
2016-11-10 13:20:34 +00:00
|
|
|
if (bFloatMode && !StyleSettings::GetDockingFloatsSupported())
|
|
|
|
mbDockCanceled = true;
|
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
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() );
|
2016-12-06 13:26:09 +02:00
|
|
|
GetWindow()->CallEventListeners( VclEventId::WindowEndDocking, &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;
|
2016-11-22 13:43:32 +00:00
|
|
|
|
|
|
|
mbDockCanceled = bOrigDockCanceled;
|
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;
|
2016-12-06 13:26:09 +02:00
|
|
|
GetWindow()->CallEventListeners( VclEventId::WindowPrepareToggleFloating, &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
|
2016-12-06 13:26:09 +02:00
|
|
|
GetWindow()->CallEventListeners( VclEventId::WindowToggleFloating );
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-09-18 09:57:39 +03:00
|
|
|
void ImplDockingWindowWrapper::ImplPreparePopupMode( FloatWinPopupFlags nFlags )
|
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
|
|
|
|
|
|
|
// 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
|
|
|
|
2016-10-09 10:13:12 +03:00
|
|
|
bool bAllowTearOff = bool( nFlags & FloatWinPopupFlags::AllowTearOff );
|
2017-02-13 19:08:14 +02:00
|
|
|
bool bUseStdPopup = bAllowTearOff && GetWindow()->GetType() != WindowType::TOOLBOX;
|
2016-10-09 10:13:12 +03:00
|
|
|
|
2004-07-06 12:48:09 +00:00
|
|
|
// the new parent for popup mode
|
2016-12-21 04:42:34 +02:00
|
|
|
VclPtr<FloatingWindow> pWin;
|
2016-12-22 02:01:59 +02:00
|
|
|
if ( bUseStdPopup )
|
2016-12-21 04:42:34 +02:00
|
|
|
pWin = VclPtr<FloatingWindow>::Create( mpParent, WB_STDPOPUP );
|
|
|
|
else
|
2017-06-15 14:48:24 +02:00
|
|
|
pWin = VclPtr<ImplPopupFloatWin>::Create( mpParent, bAllowTearOff );
|
2004-07-06 12:48:09 +00:00
|
|
|
pWin->SetPopupModeEndHdl( LINK( this, ImplDockingWindowWrapper, PopupModeEnd ) );
|
|
|
|
|
2017-09-26 23:31:58 +03:00
|
|
|
// At least for DockingWindow, GetText() has a side effect of setting deferred
|
|
|
|
// properties. This must be done before setting the border window (see below),
|
|
|
|
// so that the border width will end up in mpWindowImpl->mnBorderWidth, not in
|
|
|
|
// the border window (See DockingWindow::setPosSizeOnContainee() and
|
|
|
|
// DockingWindow::GetOptimalSize()).
|
|
|
|
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
|
|
|
|
2016-09-30 23:09:05 +02:00
|
|
|
// position toolbox below the drag grip
|
2016-12-22 02:01:59 +02:00
|
|
|
if ( !bUseStdPopup )
|
2016-12-21 04:42:34 +02:00
|
|
|
GetWindow()->SetPosPixel( static_cast<ImplPopupFloatWin*>( pWin.get() )->GetToolboxPosition() );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// 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;
|
2017-09-18 09:57:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void ImplDockingWindowWrapper::StartPopupMode( ToolBox *pParentToolBox, FloatWinPopupFlags nFlags )
|
|
|
|
{
|
|
|
|
// do nothing if window is floating
|
|
|
|
if( IsFloatingMode() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
ImplPreparePopupMode( nFlags );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
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
|
|
|
|
2016-10-30 16:43:41 +02:00
|
|
|
if( pParentToolBox->IsKeyEvent() )
|
2004-09-09 15:21:03 +00:00
|
|
|
{
|
|
|
|
// 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 ) );
|
2016-10-30 16:43:41 +02:00
|
|
|
GetWindow()->KeyInput(aEvent);
|
2004-09-09 15:21:03 +00:00
|
|
|
}
|
2004-07-06 12:48:09 +00:00
|
|
|
}
|
|
|
|
|
2017-09-18 09:57:39 +03:00
|
|
|
void ImplDockingWindowWrapper::StartPopupMode( const tools::Rectangle& rRect, FloatWinPopupFlags nFlags )
|
|
|
|
{
|
|
|
|
// do nothing if window is floating
|
|
|
|
if( IsFloatingMode() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
ImplPreparePopupMode( nFlags );
|
|
|
|
mpFloatWin->StartPopupMode( rRect, nFlags );
|
|
|
|
GetWindow()->Show();
|
|
|
|
}
|
|
|
|
|
2016-10-05 07:56:12 +02:00
|
|
|
IMPL_LINK_NOARG(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
|
2016-10-08 22:10:32 +03:00
|
|
|
EndPopupModeData aData( mpFloatWin->GetWindow( GetWindowType::Border )->GetPosPixel(), mpFloatWin->IsPopupModeTearOff() );
|
2004-07-06 12:48:09 +00:00
|
|
|
|
|
|
|
// 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 !
|
2016-12-06 13:26:09 +02:00
|
|
|
GetWindow()->CallEventListeners( VclEventId::WindowEndPopupMode, &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
|
|
|
|
2016-11-10 12:53:02 +02:00
|
|
|
VclPtrInstance<ImplDockFloatWin2> pWin(
|
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
|
|
|
|
2017-09-26 23:31:58 +03:00
|
|
|
// At least for DockingWindow, GetText() has a side effect of setting deferred
|
|
|
|
// properties. This must be done before setting the border window (see below),
|
|
|
|
// so that the border width will end up in mpWindowImpl->mnBorderWidth, not in
|
|
|
|
// the border window (See DockingWindow::setPosSizeOnContainee() and
|
|
|
|
// DockingWindow::GetOptimalSize()).
|
|
|
|
pWin->SetText( GetWindow()->GetText() );
|
|
|
|
|
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->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 );
|
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 );
|
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
|
|
|
}
|
|
|
|
|
2017-03-30 20:27:55 +02:00
|
|
|
void ImplDockingWindowWrapper::SetDragArea( const tools::Rectangle& rRect )
|
2004-07-06 12:48:09 +00:00
|
|
|
{
|
|
|
|
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: */
|