xref: /trunk/main/dbaccess/source/ui/dlg/RelationDlg.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_dbaccess.hxx"
30 //#ifndef _SVX_TABWIN_HXX
31 //#include "tabwin.hxx"
32 //#endif
33 #ifndef DBAUI_RELATIONDIALOG_HRC
34 #include "RelationDlg.hrc"
35 #endif
36 #ifndef DBAUI_RELATIONDIALOG_HXX
37 #include "RelationDlg.hxx"
38 #endif
39 
40 #ifndef _WRKWIN_HXX //autogen
41 #include <vcl/wrkwin.hxx>
42 #endif
43 
44 #ifndef _SV_SVAPP_HXX //autogen
45 #include <vcl/svapp.hxx>
46 #endif
47 #ifndef _DBU_DLG_HRC_
48 #include "dbu_dlg.hrc"
49 #endif
50 #ifndef _DBA_DBACCESS_HELPID_HRC_
51 #include "dbaccess_helpid.hrc"
52 #endif
53 #ifndef _COM_SUN_STAR_SDBC_KEYRULE_HPP_
54 #include <com/sun/star/sdbc/KeyRule.hpp>
55 #endif
56 
57 #ifndef _TOOLS_DEBUG_HXX
58 #include <tools/debug.hxx>
59 #endif
60 #ifndef TOOLS_DIAGNOSE_EX_H
61 #include <tools/diagnose_ex.h>
62 #endif
63 #ifndef DBAUI_TOOLS_HXX
64 #include "UITools.hxx"
65 #endif
66 #ifndef DBAUI_JOINDESIGNVIEW_HXX
67 #include "JoinDesignView.hxx"
68 #endif
69 #ifndef DBAUI_JOINCONTROLLER_HXX
70 #include "JoinController.hxx"
71 #endif
72 #ifndef _DBHELPER_DBEXCEPTION_HXX_
73 #include <connectivity/dbexception.hxx>
74 #endif
75 #ifndef DBAUI_RTABLECONNECTIONDATA_HXX
76 #include "RTableConnectionData.hxx"
77 #endif
78 #ifndef DBAUI_RELATIONCONTROL_HXX
79 #include "RelationControl.hxx"
80 #endif
81 #ifndef _CPPUHELPER_EXC_HLP_HXX_
82 #include <cppuhelper/exc_hlp.hxx>
83 #endif
84 
85 #include <algorithm>
86 
87 using namespace ::com::sun::star::uno;
88 using namespace ::com::sun::star::sdbc;
89 using namespace ::com::sun::star::container;
90 using namespace ::com::sun::star::beans;
91 using namespace ::dbaui;
92 using namespace ::dbtools;
93 
94 //========================================================================
95 // class ORelationDialog
96 DBG_NAME(ORelationDialog)
97 //========================================================================
98 ORelationDialog::ORelationDialog( OJoinTableView* pParent,
99                                  const TTableConnectionData::value_type& pConnectionData,
100                                  sal_Bool bAllowTableSelect )
101     :ModalDialog( pParent, ModuleRes(DLG_REL_PROPERTIES) )
102     ,m_pTableMap(pParent->GetTabWinMap())
103 
104     ,aFL_CascUpd(           this, ModuleRes(FL_CASC_UPD) )
105     ,aRB_NoCascUpd(         this, ModuleRes(RB_NO_CASC_UPD) )
106     ,aRB_CascUpd(           this, ModuleRes(RB_CASC_UPD) )
107     ,aRB_CascUpdNull(       this, ModuleRes(RB_CASC_UPD_NULL) )
108     ,aRB_CascUpdDefault(    this, ModuleRes(RB_CASC_UPD_DEFAULT) )
109     ,aFL_CascDel(           this, ModuleRes(FL_CASC_DEL) )
110     ,aRB_NoCascDel(         this, ModuleRes(RB_NO_CASC_DEL) )
111     ,aRB_CascDel(           this, ModuleRes(RB_CASC_DEL) )
112     ,aRB_CascDelNull(       this, ModuleRes(RB_CASC_DEL_NULL) )
113     ,aRB_CascDelDefault(    this, ModuleRes(RB_CASC_DEL_DEFAULT) )
114 
115     ,aPB_OK( this, ModuleRes( PB_OK ) )
116     ,aPB_CANCEL( this, ModuleRes( PB_CANCEL ) )
117     ,aPB_HELP( this, ModuleRes( PB_HELP ) )
118 
119     ,m_pOrigConnData( pConnectionData )
120     ,m_bTriedOneUpdate(sal_False)
121 {
122     DBG_CTOR(ORelationDialog,NULL);
123 
124     m_xConnection = pParent->getDesignView()->getController().getConnection();
125 
126     //////////////////////////////////////////////////////////////////////
127     // Connection kopieren
128     m_pConnData.reset( static_cast<ORelationTableConnectionData*>(pConnectionData->NewInstance()) );
129     m_pConnData->CopyFrom( *pConnectionData );
130 
131     Init(m_pConnData);
132     m_pTableControl.reset( new OTableListBoxControl(this,ModuleRes(WND_CONTROL),m_pTableMap,this) );
133 
134     aPB_OK.SetClickHdl( LINK(this, ORelationDialog, OKClickHdl) );
135 
136     m_pTableControl->Init( m_pConnData );
137     if ( bAllowTableSelect )
138         m_pTableControl->fillListBoxes();
139     else
140         m_pTableControl->fillAndDisable(pConnectionData);
141 
142     m_pTableControl->lateInit();
143 
144     m_pTableControl->NotifyCellChange();
145 
146     FreeResource();
147 }
148 
149 //------------------------------------------------------------------------
150 void ORelationDialog::Init(const TTableConnectionData::value_type& _pConnectionData)
151 {
152     ORelationTableConnectionData* pConnData = static_cast<ORelationTableConnectionData*>(_pConnectionData.get());
153     // Update Rules
154     switch (pConnData->GetUpdateRules())
155     {
156     case KeyRule::NO_ACTION:
157     case KeyRule::RESTRICT:
158         aRB_NoCascUpd.Check( sal_True );
159         break;
160 
161     case KeyRule::CASCADE:
162         aRB_CascUpd.Check( sal_True );
163         break;
164 
165     case KeyRule::SET_NULL:
166         aRB_CascUpdNull.Check( sal_True );
167         break;
168     case KeyRule::SET_DEFAULT:
169         aRB_CascUpdDefault.Check( sal_True );
170         break;
171     }
172 
173     // Delete Rules
174     switch (pConnData->GetDeleteRules())
175     {
176     case KeyRule::NO_ACTION:
177     case KeyRule::RESTRICT:
178         aRB_NoCascDel.Check( sal_True );
179         break;
180 
181     case KeyRule::CASCADE:
182         aRB_CascDel.Check( sal_True );
183         break;
184 
185     case KeyRule::SET_NULL:
186         aRB_CascDelNull.Check( sal_True );
187         break;
188     case KeyRule::SET_DEFAULT:
189         aRB_CascDelDefault.Check( sal_True );
190         break;
191     }
192 }
193 
194 //------------------------------------------------------------------------
195 ORelationDialog::~ORelationDialog()
196 {
197     DBG_DTOR(ORelationDialog,NULL);
198 }
199 
200 //------------------------------------------------------------------------
201 
202 
203 //------------------------------------------------------------------------
204 IMPL_LINK( ORelationDialog, OKClickHdl, Button*, /*pButton*/ )
205 {
206     //////////////////////////////////////////////////////////////////////
207     // RadioButtons auslesen
208     sal_uInt16 nAttrib = 0;
209 
210     // Delete Rules
211     if( aRB_NoCascDel.IsChecked() )
212         nAttrib |= KeyRule::NO_ACTION;
213     if( aRB_CascDel.IsChecked() )
214         nAttrib |= KeyRule::CASCADE;
215     if( aRB_CascDelNull.IsChecked() )
216         nAttrib |= KeyRule::SET_NULL;
217     if( aRB_CascDelDefault.IsChecked() )
218         nAttrib |= KeyRule::SET_DEFAULT;
219 
220     ORelationTableConnectionData* pConnData = static_cast<ORelationTableConnectionData*>(m_pConnData.get());
221     pConnData->SetDeleteRules( nAttrib );
222 
223     // Update Rules
224     nAttrib = 0;
225     if( aRB_NoCascUpd.IsChecked() )
226         nAttrib |= KeyRule::NO_ACTION;
227     if( aRB_CascUpd.IsChecked() )
228         nAttrib |= KeyRule::CASCADE;
229     if( aRB_CascUpdNull.IsChecked() )
230         nAttrib |= KeyRule::SET_NULL;
231     if( aRB_CascUpdDefault.IsChecked() )
232         nAttrib |= KeyRule::SET_DEFAULT;
233     pConnData->SetUpdateRules( nAttrib );
234 
235     m_pTableControl->SaveModified();
236 
237     //// wenn die ComboBoxen fuer die Tabellenauswahl enabled sind (Constructor mit bAllowTableSelect==sal_True), dann muss ich in die
238     //// Connection auch die Tabellennamen stecken
239     //m_pConnData->SetSourceWinName(m_pTableControl->getSourceWinName());
240     //m_pConnData->SetDestWinName(m_pTableControl->getDestWinName());
241 
242     // try to create the relation
243     try
244     {
245         ORelationTableConnectionData* pOrigConnData = static_cast<ORelationTableConnectionData*>(m_pOrigConnData.get());
246         if ( *pConnData == *pOrigConnData || pConnData->Update())
247         {
248             m_pOrigConnData->CopyFrom( *m_pConnData );
249             EndDialog( RET_OK );
250             return 0L;
251         }
252     }
253     catch( const SQLException& )
254     {
255         ::dbaui::showError( SQLExceptionInfo( ::cppu::getCaughtException() ),
256                             this,
257                             static_cast<OJoinTableView*>(GetParent())->getDesignView()->getController().getORB());
258     }
259     catch( const Exception& )
260     {
261         DBG_UNHANDLED_EXCEPTION();
262     }
263 
264     m_bTriedOneUpdate = sal_True;
265     // this means that the original connection may be lost (if m_pConnData was not a newly created but an
266     // existent conn to be modified), which we reflect by returning RET_NO (see ::Execute)
267 
268     // try again
269     Init(m_pConnData);
270     m_pTableControl->Init( m_pConnData );
271     m_pTableControl->lateInit();
272 
273     return 0;
274 }
275 
276 
277 //------------------------------------------------------------------------
278 short ORelationDialog::Execute()
279 {
280     short nResult = ModalDialog::Execute();
281     if ((nResult != RET_OK) && m_bTriedOneUpdate)
282         return RET_NO;
283 
284     return nResult;
285 }
286 // -----------------------------------------------------------------------------
287 TTableConnectionData::value_type ORelationDialog::getConnectionData() const
288 {
289     return m_pConnData;
290 }
291 // -----------------------------------------------------------------------------
292 void ORelationDialog::setValid(sal_Bool _bValid)
293 {
294     aPB_OK.Enable(_bValid);
295 }
296 // -----------------------------------------------------------------------------
297 void ORelationDialog::notifyConnectionChange()
298 {
299     Init(m_pConnData);
300 }
301 // -----------------------------------------------------------------------------
302 
303 
304