diff options
Diffstat (limited to 'dbaccess/source/ui/querydesign/querydlg.cxx')
-rw-r--r-- | dbaccess/source/ui/querydesign/querydlg.cxx | 399 |
1 files changed, 399 insertions, 0 deletions
diff --git a/dbaccess/source/ui/querydesign/querydlg.cxx b/dbaccess/source/ui/querydesign/querydlg.cxx new file mode 100644 index 000000000000..041faa5f9713 --- /dev/null +++ b/dbaccess/source/ui/querydesign/querydlg.cxx @@ -0,0 +1,399 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_dbaccess.hxx" +#ifndef DBAUI_QUERYDLG_HXX +#include "querydlg.hxx" +#endif +#ifndef _DBU_QRY_HRC_ +#include "dbu_qry.hrc" +#endif +#ifndef DBAUI_QUERYDLG_HRC +#include "querydlg.hrc" +#endif +#ifndef _TOOLS_DEBUG_HXX +#include <tools/debug.hxx> +#endif +#ifndef TOOLS_DIAGNOSE_EX_H +#include <tools/diagnose_ex.h> +#endif +#ifndef DBAUI_QTABLECONNECTIONDATA_HXX +#include "QTableConnectionData.hxx" +#endif +#ifndef DBAUI_QUERYCONTROLLER_HXX +#include "querycontroller.hxx" +#endif +#ifndef DBAUI_QUERYTABLEVIEW_HXX +#include "QueryTableView.hxx" +#endif +#ifndef DBAUI_QUERYDESIGNVIEW_HXX +#include "QueryDesignView.hxx" +#endif +#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_ +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#endif +#ifndef DBAUI_RELATIONCONTROL_HXX +#include "RelationControl.hxx" +#endif +#ifndef _SV_MSGBOX_HXX +#include <vcl/msgbox.hxx> +#endif + +using namespace dbaui; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sdbc; + +namespace dbaui +{ +class OJoinControl : public Window +{ +public: + FixedLine aFL_Join; + FixedText aFT_Title; + ListBox aLB_JoinType; + CheckBox m_aCBNatural; + + OJoinControl(Window* _pParent,const ResId& _rResId); +}; +OJoinControl::OJoinControl(Window* _pParent,const ResId& _rResId) + : Window(_pParent,_rResId) + ,aFL_Join( this, ResId( FL_JOIN,*_rResId.GetResMgr() ) ) + ,aFT_Title( this, ResId(FT_LISTBOXTITLE,*_rResId.GetResMgr()) ) + ,aLB_JoinType( this, ResId(LB_JOINTYPE,*_rResId.GetResMgr()) ) + ,m_aCBNatural( this, ResId(CB_NATURAL,*_rResId.GetResMgr()) ) +{ + FreeResource(); +} +// ----------------------------------------------------------------------------- +} // dbaui +// ----------------------------------------------------------------------------- +DBG_NAME(DlgQryJoin) +DlgQryJoin::DlgQryJoin( OQueryTableView * pParent, + const TTableConnectionData::value_type& _pData, + OJoinTableView::OTableWindowMap* _pTableMap, + const Reference< XConnection >& _xConnection, + BOOL _bAllowTableSelect) + :ModalDialog( pParent, ModuleRes(DLG_QRY_JOIN) ) + ,aML_HelpText( this, ModuleRes(ML_HELPTEXT) ) + ,aPB_OK( this, ModuleRes( PB_OK ) ) + ,aPB_CANCEL( this, ModuleRes( PB_CANCEL ) ) + ,aPB_HELP( this, ModuleRes( PB_HELP ) ) + ,m_pJoinControl( NULL ) + ,m_pTableControl( NULL ) + ,m_pTableMap(_pTableMap) + ,m_pTableView(pParent) + ,eJoinType(static_cast<OQueryTableConnectionData*>(_pData.get())->GetJoinType()) + ,m_pOrigConnData(_pData) + ,m_xConnection(_xConnection) +{ + DBG_CTOR(DlgQryJoin,NULL); + + aML_HelpText.SetControlBackground( GetSettings().GetStyleSettings().GetFaceColor() ); + ////////////////////////////////////////////////////////////////////// + // Connection kopieren + m_pConnData.reset(_pData->NewInstance()); + m_pConnData->CopyFrom(*_pData); + + m_pTableControl = new OTableListBoxControl(this,ModuleRes(WND_CONTROL),m_pTableMap,this); + + m_pJoinControl = new OJoinControl(m_pTableControl,ModuleRes(WND_JOIN_CONTROL)); + + m_pJoinControl->Show(); + m_pJoinControl->m_aCBNatural.Check(static_cast<OQueryTableConnectionData*>(m_pConnData.get())->isNatural()); + m_pTableControl->Show(); + + if( _bAllowTableSelect ) + { + m_pTableControl->Init( m_pConnData ); + m_pTableControl->fillListBoxes(); + } + else + { + m_pTableControl->fillAndDisable(m_pConnData); + m_pTableControl->Init( m_pConnData ); + } + + m_pTableControl->lateUIInit(m_pJoinControl); + + sal_Bool bSupportFullJoin = sal_False; + Reference<XDatabaseMetaData> xMeta; + try + { + xMeta = m_xConnection->getMetaData(); + if ( xMeta.is() ) + bSupportFullJoin = xMeta->supportsFullOuterJoins(); + } + catch(SQLException&) + { + } + sal_Bool bSupportOuterJoin = sal_False; + try + { + if ( xMeta.is() ) + bSupportOuterJoin= xMeta->supportsOuterJoins(); + } + catch(SQLException&) + { + } + + setJoinType(eJoinType); + + aPB_OK.SetClickHdl( LINK(this, DlgQryJoin, OKClickHdl) ); + + m_pJoinControl->aLB_JoinType.SetSelectHdl(LINK(this,DlgQryJoin,LBChangeHdl)); + m_pJoinControl->m_aCBNatural.SetToggleHdl(LINK(this,DlgQryJoin,NaturalToggleHdl)); + + if ( static_cast<OQueryTableView*>(pParent)->getDesignView()->getController().isReadOnly() ) + { + m_pJoinControl->aLB_JoinType.Disable(); + m_pJoinControl->m_aCBNatural.Disable(); + m_pTableControl->Disable(); + } + else + { + const USHORT nCount = m_pJoinControl->aLB_JoinType.GetEntryCount(); + for (USHORT i = 0; i < nCount; ++i) + { + const long nJoinTyp = reinterpret_cast<long>(m_pJoinControl->aLB_JoinType.GetEntryData(i)); + if ( !bSupportFullJoin && nJoinTyp == ID_FULL_JOIN ) + m_pJoinControl->aLB_JoinType.RemoveEntry(i); + else if ( !bSupportOuterJoin && (nJoinTyp == ID_LEFT_JOIN || nJoinTyp == ID_RIGHT_JOIN) ) + m_pJoinControl->aLB_JoinType.RemoveEntry(i); + } + + m_pTableControl->NotifyCellChange(); + m_pTableControl->enableRelation(!static_cast<OQueryTableConnectionData*>(m_pConnData.get())->isNatural() && eJoinType != CROSS_JOIN ); + } + + FreeResource(); +} + +//------------------------------------------------------------------------ +DlgQryJoin::~DlgQryJoin() +{ + DBG_DTOR(DlgQryJoin,NULL); + delete m_pJoinControl; + delete m_pTableControl; +} +// ----------------------------------------------------------------------------- +IMPL_LINK( DlgQryJoin, LBChangeHdl, ListBox*, /*pListBox*/ ) +{ + DBG_CHKTHIS(DlgQryJoin,NULL); + if (m_pJoinControl->aLB_JoinType.GetSelectEntryPos() == m_pJoinControl->aLB_JoinType.GetSavedValue() ) + return 1; + + m_pJoinControl->aLB_JoinType.SaveValue(); + aML_HelpText.SetText(String()); + + m_pTableControl->enableRelation(true); + + String sFirstWinName = m_pConnData->getReferencingTable()->GetWinName(); + String sSecondWinName = m_pConnData->getReferencedTable()->GetWinName(); + const EJoinType eOldJoinType = eJoinType; + USHORT nResId = 0; + const USHORT nPos = m_pJoinControl->aLB_JoinType.GetSelectEntryPos(); + const long nJoinType = reinterpret_cast<long>(m_pJoinControl->aLB_JoinType.GetEntryData(nPos)); + sal_Bool bAddHint = sal_True; + switch ( nJoinType ) + { + default: + case ID_INNER_JOIN: + nResId = STR_QUERY_INNER_JOIN; + bAddHint = sal_False; + eJoinType = INNER_JOIN; + break; + case ID_LEFT_JOIN: + nResId = STR_QUERY_LEFTRIGHT_JOIN; + eJoinType = LEFT_JOIN; + break; + case ID_RIGHT_JOIN: + { + nResId = STR_QUERY_LEFTRIGHT_JOIN; + eJoinType = RIGHT_JOIN; + String sTemp = sFirstWinName; + sFirstWinName = sSecondWinName; + sSecondWinName = sTemp; + } + break; + case ID_FULL_JOIN: + nResId = STR_QUERY_FULL_JOIN; + eJoinType = FULL_JOIN; + break; + case ID_CROSS_JOIN: + { + nResId = STR_QUERY_CROSS_JOIN; + eJoinType = CROSS_JOIN; + + m_pConnData->ResetConnLines(); + m_pTableControl->lateInit(); + m_pJoinControl->m_aCBNatural.Check(FALSE); + m_pTableControl->enableRelation(false); + ::rtl::OUString sEmpty; + m_pConnData->AppendConnLine(sEmpty,sEmpty); + aPB_OK.Enable(TRUE); + } + break; + } + + m_pJoinControl->m_aCBNatural.Enable(eJoinType != CROSS_JOIN); + + if ( eJoinType != eOldJoinType && eOldJoinType == CROSS_JOIN ) + { + m_pConnData->ResetConnLines(); + } + if ( eJoinType != CROSS_JOIN ) + { + m_pTableControl->NotifyCellChange(); + NaturalToggleHdl(&m_pJoinControl->m_aCBNatural); + } + + m_pTableControl->Invalidate(); + + String sHelpText = String( ModuleRes( nResId ) ); + if( nPos ) + { + sHelpText.SearchAndReplace( String( RTL_CONSTASCII_STRINGPARAM( "%1" ) ), sFirstWinName ); + sHelpText.SearchAndReplace( String( RTL_CONSTASCII_STRINGPARAM( "%2" ) ), sSecondWinName ); + } + if ( bAddHint ) + { + sHelpText += String( RTL_CONSTASCII_STRINGPARAM( "\n" ) ); + sHelpText += String( ModuleRes( STR_JOIN_TYPE_HINT ) ); + } + + aML_HelpText.SetText( sHelpText ); + return 1; +} +// ----------------------------------------------------------------------------- + +IMPL_LINK( DlgQryJoin, OKClickHdl, Button*, /*pButton*/ ) +{ + DBG_CHKTHIS(DlgQryJoin,NULL); + + m_pConnData->Update(); + m_pOrigConnData->CopyFrom( *m_pConnData ); + + EndDialog(RET_OK); + return 1; +} +// ----------------------------------------------------------------------------- + +IMPL_LINK( DlgQryJoin, NaturalToggleHdl, CheckBox*, /*pButton*/ ) +{ + DBG_CHKTHIS(DlgQryJoin,NULL); + BOOL bChecked = m_pJoinControl->m_aCBNatural.IsChecked(); + static_cast<OQueryTableConnectionData*>(m_pConnData.get())->setNatural(bChecked); + m_pTableControl->enableRelation(!bChecked); + if ( bChecked ) + { + m_pConnData->ResetConnLines(); + try + { + Reference<XNameAccess> xReferencedTableColumns(m_pConnData->getReferencedTable()->getColumns()); + Sequence< ::rtl::OUString> aSeq = m_pConnData->getReferencingTable()->getColumns()->getElementNames(); + const ::rtl::OUString* pIter = aSeq.getConstArray(); + const ::rtl::OUString* pEnd = pIter + aSeq.getLength(); + for(;pIter != pEnd;++pIter) + { + if ( xReferencedTableColumns->hasByName(*pIter) ) + m_pConnData->AppendConnLine(*pIter,*pIter); + } + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + m_pTableControl->NotifyCellChange(); + m_pTableControl->Invalidate(); + } + + return 1; +} +// ----------------------------------------------------------------------------- +TTableConnectionData::value_type DlgQryJoin::getConnectionData() const +{ + return m_pConnData; +} +// ----------------------------------------------------------------------------- +void DlgQryJoin::setValid(sal_Bool _bValid) +{ + //LBChangeHdl(&aLB_JoinType); + + aPB_OK.Enable(_bValid || eJoinType == CROSS_JOIN ); +} +// ----------------------------------------------------------------------------- +void DlgQryJoin::notifyConnectionChange( ) +{ + setJoinType( static_cast<OQueryTableConnectionData*>(m_pConnData.get())->GetJoinType() ); + m_pJoinControl->m_aCBNatural.Check(static_cast<OQueryTableConnectionData*>(m_pConnData.get())->isNatural()); + NaturalToggleHdl(&m_pJoinControl->m_aCBNatural); +} +// ----------------------------------------------------------------------------- +void DlgQryJoin::setJoinType(EJoinType _eNewJoinType) +{ + eJoinType = _eNewJoinType; + m_pJoinControl->m_aCBNatural.Enable(eJoinType != CROSS_JOIN); + + long nJoinType = 0; + switch ( eJoinType ) + { + default: + case INNER_JOIN: + nJoinType = ID_INNER_JOIN; + break; + case LEFT_JOIN: + nJoinType = ID_LEFT_JOIN; + break; + case RIGHT_JOIN: + nJoinType = ID_RIGHT_JOIN; + break; + case FULL_JOIN: + nJoinType = ID_FULL_JOIN; + break; + case CROSS_JOIN: + nJoinType = ID_CROSS_JOIN; + break; + } + + const USHORT nCount = m_pJoinControl->aLB_JoinType.GetEntryCount(); + for (USHORT i = 0; i < nCount; ++i) + { + if ( nJoinType == reinterpret_cast<long>(m_pJoinControl->aLB_JoinType.GetEntryData(i)) ) + { + m_pJoinControl->aLB_JoinType.SelectEntryPos(i); + break; + } + } + + LBChangeHdl(&m_pJoinControl->aLB_JoinType); +} +// ----------------------------------------------------------------------------- + + + |