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