summaryrefslogtreecommitdiffstats
path: root/dbaccess/source/ui/inc/JoinTableView.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ui/inc/JoinTableView.hxx')
-rw-r--r--dbaccess/source/ui/inc/JoinTableView.hxx325
1 files changed, 325 insertions, 0 deletions
diff --git a/dbaccess/source/ui/inc/JoinTableView.hxx b/dbaccess/source/ui/inc/JoinTableView.hxx
new file mode 100644
index 000000000..80de958ea
--- /dev/null
+++ b/dbaccess/source/ui/inc/JoinTableView.hxx
@@ -0,0 +1,325 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * 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 .
+ */
+#pragma once
+
+#include <vcl/window.hxx>
+#include <vcl/timer.hxx>
+#include <vcl/idle.hxx>
+#include <vcl/scrbar.hxx>
+#include <vcl/vclptr.hxx>
+#include <vcl/transfer.hxx>
+
+#include "callbacks.hxx"
+#include "TableConnectionData.hxx"
+#include "TableWindowData.hxx"
+
+#include <map>
+#include <vector>
+
+struct AcceptDropEvent;
+struct ExecuteDropEvent;
+class SfxUndoAction;
+
+namespace dbaui
+{
+ class OTableConnection;
+ class OTableWindow;
+ struct OJoinExchangeData;
+ class OJoinDesignView;
+ class OTableWindowData;
+ class OJoinDesignViewAccess;
+
+ // this class contains only the scrollbars to avoid that
+ // the tablewindows clip the scrollbars
+ class OJoinTableView;
+ class OScrollWindowHelper : public vcl::Window
+ {
+ VclPtr<ScrollBar> m_aHScrollBar;
+ VclPtr<ScrollBar> m_aVScrollBar;
+ VclPtr<vcl::Window> m_pCornerWindow;
+ VclPtr<OJoinTableView> m_pTableView;
+
+ protected:
+ virtual void Resize() override;
+
+ public:
+ OScrollWindowHelper( vcl::Window* pParent);
+ virtual ~OScrollWindowHelper() override;
+ virtual void dispose() override;
+
+ void setTableView(OJoinTableView* _pTableView);
+
+ void resetRange(const Point& _aSize);
+
+ // own methods
+ ScrollBar& GetHScrollBar() { return *m_aHScrollBar; }
+ ScrollBar& GetVScrollBar() { return *m_aVScrollBar; }
+ };
+
+
+ class OJoinTableView : public vcl::Window,
+ public IDragTransferableListener,
+ public DropTargetHelper
+ {
+ friend class OJoinMoveTabWinUndoAct;
+
+ public:
+ typedef std::map<OUString, VclPtr<OTableWindow> > OTableWindowMap;
+
+ private:
+ OTableWindowMap m_aTableMap;
+ std::vector<VclPtr<OTableConnection> > m_vTableConnection;
+
+ Idle m_aDragScrollIdle;
+ tools::Rectangle m_aDragRect;
+ tools::Rectangle m_aSizingRect;
+ Point m_aDragOffset;
+ Point m_aScrollOffset;
+ Point m_ptPrevDraggingPos;
+ Size m_aOutputSize;
+
+
+ VclPtr<OTableWindow> m_pDragWin;
+ VclPtr<OTableWindow> m_pSizingWin;
+ VclPtr<OTableConnection> m_pSelectedConn;
+
+
+ DECL_LINK(OnDragScrollTimer, Timer*, void);
+
+ protected:
+ VclPtr<OTableWindow> m_pLastFocusTabWin;
+ VclPtr<OJoinDesignView> m_pView;
+ rtl::Reference<OJoinDesignViewAccess> m_pAccessible;
+
+ public:
+ OJoinTableView( vcl::Window* pParent, OJoinDesignView* pView );
+ virtual ~OJoinTableView() override;
+ virtual void dispose() override;
+
+ // window override
+ virtual void StateChanged( StateChangedType nStateChange ) override;
+ virtual void GetFocus() override;
+ virtual void LoseFocus() override;
+ virtual void KeyInput( const KeyEvent& rEvt ) override;
+ // Accessibility
+ virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override;
+
+ // own methods
+ ScrollBar& GetHScrollBar() { return static_cast<OScrollWindowHelper*>(GetParent())->GetHScrollBar(); }
+ ScrollBar& GetVScrollBar() { return static_cast<OScrollWindowHelper*>(GetParent())->GetVScrollBar(); }
+ DECL_LINK( ScrollHdl, ScrollBar*, void );
+
+ void DrawConnections(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect);
+ void InvalidateConnections();
+
+ void BeginChildMove( OTableWindow* pTabWin, const Point& rMousePos );
+ void BeginChildSizing( OTableWindow* pTabWin, PointerStyle nPointer );
+
+ void NotifyTitleClicked( OTableWindow* pTabWin, const Point& rMousePos );
+
+ virtual void AddTabWin(const OUString& _rComposedName, const OUString& rWinName, bool bNewTable = false);
+ virtual void RemoveTabWin( OTableWindow* pTabWin );
+
+ // hide all TabWins (does NOT delete them; they are put in an UNDO action)
+ void HideTabWins();
+
+ virtual void AddConnection(const OJoinExchangeData& jxdSource, const OJoinExchangeData& jxdDest) = 0;
+
+ /** RemoveConnection allows to remove connections from join table view
+
+ it implies that the same as addConnection
+
+ @param rConnection the connection which should be removed
+ @param bDelete when true then the connection will be deleted
+
+ @return an iterator to next valid connection, so it can be used in any loop
+ */
+ virtual bool RemoveConnection(VclPtr<OTableConnection>& rConnection, bool bDelete);
+
+ /** allows to add new connections to join table view
+
+ it implies an invalidation of the features ID_BROWSER_ADDTABLE and
+ SID_RELATION_ADD_RELATION also the modified flag will be set to true
+
+ @param _pConnection the connection which should be added
+ @param _bAddData when true then the data should also be appended
+ */
+ void addConnection(OTableConnection* _pConnection,bool _bAddData = true);
+
+ bool ScrollPane( tools::Long nDelta, bool bHoriz, bool bPaintScrollBars );
+ sal_uLong GetTabWinCount() const;
+ const Point& GetScrollOffset() const { return m_aScrollOffset; }
+
+ OJoinDesignView* getDesignView() const { return m_pView; }
+ OTableWindow* GetTabWindow( const OUString& rName );
+
+ VclPtr<OTableConnection>& GetSelectedConn() { return m_pSelectedConn; }
+ /** @note NULL is explicitly allowed (then no-op) */
+ void DeselectConn(OTableConnection* pConn);
+ void SelectConn(OTableConnection* pConn);
+
+ OTableWindowMap& GetTabWinMap() { return m_aTableMap; }
+
+ /** gives a read only access to the connection vector
+ */
+ const std::vector<VclPtr<OTableConnection> >& getTableConnections() const { return m_vTableConnection; }
+
+ bool ExistsAConn(const OTableWindow* pFromWin) const;
+
+ /** search for all connections of a table
+
+ @param _pFromWin the table for which connections should be found
+ @return an iterator which can be used to travel all connections of the table
+ */
+ std::vector<VclPtr<OTableConnection> >::const_iterator getTableConnections(const OTableWindow* _pFromWin) const;
+
+ /** how many connection belongs to single table
+
+ @param _pFromWin the table for which connections should be found
+ @return the count of connections which belongs to this table
+ */
+ sal_Int32 getConnectionCount(const OTableWindow* _pFromWin) const;
+
+ OTableConnection* GetTabConn(const OTableWindow* pLhs,const OTableWindow* pRhs,bool _bSuppressCrossOrNaturalJoin = false) const;
+
+ /** clear the window map and connection vector without destroying it
+
+ that means that the data of the windows and connection will be
+ untouched
+ */
+ void clearLayoutInformation();
+
+ /** set the focus to that tab win which most recently had it
+ (or to the first available one) **/
+ void GrabTabWinFocus();
+
+ /** take all WinData and ConnData from the document and create the
+ corresponding Wins and Conns */
+ virtual void ReSync() { }
+
+ /** Hard deletion
+
+ That means that all Conns and Wins are deleted from their respective
+ lists and the corresponding Data removed from the document */
+ virtual void ClearAll();
+
+ /** @note used by AddTabDlg to see if more tables can be added */
+ virtual bool IsAddAllowed();
+ virtual bool PreNotify(NotifyEvent& rNEvt) override;
+
+ // DnD stuff
+ virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt ) override;
+ virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt ) override;
+
+ /** @note can be used for special ui handling after d&d */
+ virtual void lookForUiActivities();
+
+ /** Hook that is called after moving/resizing TabWins
+
+ The position is 'virtual': the container has a virtual area of
+ which only a part - changeable by scroll bar - is visible.
+ Therefore: ptOldPosition is always positive, even if it represents
+ a point with a negative physical ordinate above the visible area
+
+ @note The standard implementation just passes the new data to the
+ Wins
+ */
+ void TabWinMoved(OTableWindow* ptWhich, const Point& ptOldPosition);
+
+ void TabWinSized(OTableWindow* ptWhich, const Point& ptOldPosition, const Size& szOldSize);
+
+ void modified();
+
+ /** check if the given window is visible.
+
+ @param _rPoint The Point to check
+ @param _rSize The Size to be check as well
+ @return true if the area is visible, false otherwise
+ */
+ bool isMovementAllowed(const Point& _rPoint,const Size& _rSize);
+
+ const Size& getRealOutputSize() const { return m_aOutputSize; }
+
+ virtual void EnsureVisible(const OTableWindow* _pWin);
+ void EnsureVisible(const Point& _rPoint,const Size& _rSize);
+
+ TTableWindowData::value_type createTableWindowData(const OUString& _rComposedName
+ ,const OUString& _sTableName
+ ,const OUString& _rWinName);
+
+ protected:
+ virtual void MouseButtonUp( const MouseEvent& rEvt ) override;
+ virtual void MouseButtonDown( const MouseEvent& rEvt ) override;
+ virtual void Tracking( const TrackingEvent& rTEvt ) override;
+ virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
+ virtual void ConnDoubleClicked(VclPtr<OTableConnection>& rConnection);
+ void SetDefaultTabWinPosSize( OTableWindow* pTabWin );
+ virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
+
+ virtual void Resize() override;
+
+ virtual void dragFinished( ) override;
+ /// @note here the physical position (that can be changed while
+ /// resizing) is used, as no scrolling can take place while resizing
+ virtual void Command(const CommandEvent& rEvt) override;
+
+ virtual std::shared_ptr<OTableWindowData> CreateImpl(const OUString& _rComposedName
+ ,const OUString& _sTableName
+ ,const OUString& _rWinName);
+
+ /** factory method to create table windows
+
+ @param _pData The data corresponding to the window.
+ @return The new TableWindow
+ */
+ virtual VclPtr<OTableWindow> createWindow(const TTableWindowData::value_type& _pData) = 0;
+
+ /** determines whether the classes Init method should accept a query
+ name, or only table names */
+ virtual bool allowQueries() const;
+
+ /** called when init fails at the tablewindowdata because the m_xTable
+ object could not provide columns, but no exception was thrown.
+ Expected to throw. */
+ virtual void onNoColumns_throw();
+
+ virtual bool suppressCrossNaturalJoin(const TTableConnectionData::value_type& _pData) const;
+
+ private:
+ void InitColors();
+ void ScrollWhileDragging();
+
+ /** opens the context menu to delete a connection
+ @param _aPos the position where the popup menu should appear
+ @param _pSelConnection the connection which should be deleted
+ */
+ void executePopup(const Point& _aPos, VclPtr<OTableConnection>& rSelConnection);
+
+ /** invalidates this window without children and set the controller
+ modified
+ @param _pAction a possible undo action to add at the controller
+ */
+ void invalidateAndModify(std::unique_ptr<SfxUndoAction> _pAction);
+
+ private:
+ using Window::Scroll;
+ };
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */