Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "RelationDlg.hrc"
21 : #include "RelationDlg.hxx"
22 :
23 : #include <vcl/wrkwin.hxx>
24 :
25 : #include <vcl/svapp.hxx>
26 : #include "dbu_dlg.hrc"
27 : #include "dbaccess_helpid.hrc"
28 : #include <com/sun/star/sdbc/KeyRule.hpp>
29 :
30 : #include <tools/debug.hxx>
31 : #include <tools/diagnose_ex.h>
32 : #include "UITools.hxx"
33 : #include "JoinDesignView.hxx"
34 : #include "JoinController.hxx"
35 : #include <connectivity/dbexception.hxx>
36 : #include "RTableConnectionData.hxx"
37 : #include "RelationControl.hxx"
38 : #include <cppuhelper/exc_hlp.hxx>
39 : #include <comphelper/processfactory.hxx>
40 :
41 : #include <algorithm>
42 :
43 : using namespace ::com::sun::star::uno;
44 : using namespace ::com::sun::star::sdbc;
45 : using namespace ::com::sun::star::container;
46 : using namespace ::com::sun::star::beans;
47 : using namespace ::dbaui;
48 : using namespace ::dbtools;
49 :
50 : // class ORelationDialog
51 0 : ORelationDialog::ORelationDialog( OJoinTableView* pParent,
52 : const TTableConnectionData::value_type& pConnectionData,
53 : sal_Bool bAllowTableSelect )
54 : : ModalDialog(pParent, "RelationDialog",
55 : "dbaccess/ui/relationdialog.ui")
56 0 : , m_pTableMap(pParent->GetTabWinMap())
57 : , m_pOrigConnData(pConnectionData)
58 0 : , m_bTriedOneUpdate(false)
59 : {
60 0 : get(m_pRB_NoCascUpd, "addaction");
61 0 : get(m_pRB_CascUpd, "addcascade");
62 0 : get(m_pRB_CascUpdNull, "addnull");
63 0 : get(m_pRB_CascUpdDefault, "adddefault");
64 0 : get(m_pRB_NoCascDel, "delaction");
65 0 : get(m_pRB_CascDel, "delcascade");
66 0 : get(m_pRB_CascDelNull, "delnull");
67 0 : get(m_pRB_CascDelDefault, "deldefault");
68 0 : get(m_pPB_OK, "ok");
69 :
70 0 : m_xConnection = pParent->getDesignView()->getController().getConnection();
71 :
72 : // Connection kopieren
73 0 : m_pConnData.reset( static_cast<ORelationTableConnectionData*>(pConnectionData->NewInstance()) );
74 0 : m_pConnData->CopyFrom( *pConnectionData );
75 :
76 0 : Init(m_pConnData);
77 0 : m_xTableControl.reset( new OTableListBoxControl(this, m_pTableMap, this) );
78 :
79 0 : m_pPB_OK->SetClickHdl( LINK(this, ORelationDialog, OKClickHdl) );
80 :
81 0 : m_xTableControl->Init( m_pConnData );
82 0 : if ( bAllowTableSelect )
83 0 : m_xTableControl->fillListBoxes();
84 : else
85 0 : m_xTableControl->fillAndDisable(pConnectionData);
86 :
87 0 : m_xTableControl->lateInit();
88 :
89 0 : m_xTableControl->NotifyCellChange();
90 0 : }
91 :
92 0 : void ORelationDialog::Init(const TTableConnectionData::value_type& _pConnectionData)
93 : {
94 0 : ORelationTableConnectionData* pConnData = static_cast<ORelationTableConnectionData*>(_pConnectionData.get());
95 : // Update Rules
96 0 : switch (pConnData->GetUpdateRules())
97 : {
98 : case KeyRule::NO_ACTION:
99 : case KeyRule::RESTRICT:
100 0 : m_pRB_NoCascUpd->Check( true );
101 0 : break;
102 :
103 : case KeyRule::CASCADE:
104 0 : m_pRB_CascUpd->Check( true );
105 0 : break;
106 :
107 : case KeyRule::SET_NULL:
108 0 : m_pRB_CascUpdNull->Check( true );
109 0 : break;
110 : case KeyRule::SET_DEFAULT:
111 0 : m_pRB_CascUpdDefault->Check( true );
112 0 : break;
113 : }
114 :
115 : // Delete Rules
116 0 : switch (pConnData->GetDeleteRules())
117 : {
118 : case KeyRule::NO_ACTION:
119 : case KeyRule::RESTRICT:
120 0 : m_pRB_NoCascDel->Check( true );
121 0 : break;
122 :
123 : case KeyRule::CASCADE:
124 0 : m_pRB_CascDel->Check( true );
125 0 : break;
126 :
127 : case KeyRule::SET_NULL:
128 0 : m_pRB_CascDelNull->Check( true );
129 0 : break;
130 : case KeyRule::SET_DEFAULT:
131 0 : m_pRB_CascDelDefault->Check( true );
132 0 : break;
133 : }
134 0 : }
135 :
136 0 : ORelationDialog::~ORelationDialog()
137 : {
138 0 : }
139 :
140 0 : IMPL_LINK( ORelationDialog, OKClickHdl, Button*, /*pButton*/ )
141 : {
142 : // RadioButtons auslesen
143 0 : sal_uInt16 nAttrib = 0;
144 :
145 : // Delete Rules
146 0 : if( m_pRB_NoCascDel->IsChecked() )
147 0 : nAttrib |= KeyRule::NO_ACTION;
148 0 : if( m_pRB_CascDel->IsChecked() )
149 0 : nAttrib |= KeyRule::CASCADE;
150 0 : if( m_pRB_CascDelNull->IsChecked() )
151 0 : nAttrib |= KeyRule::SET_NULL;
152 0 : if( m_pRB_CascDelDefault->IsChecked() )
153 0 : nAttrib |= KeyRule::SET_DEFAULT;
154 :
155 0 : ORelationTableConnectionData* pConnData = static_cast<ORelationTableConnectionData*>(m_pConnData.get());
156 0 : pConnData->SetDeleteRules( nAttrib );
157 :
158 : // Update Rules
159 0 : nAttrib = 0;
160 0 : if( m_pRB_NoCascUpd->IsChecked() )
161 0 : nAttrib |= KeyRule::NO_ACTION;
162 0 : if( m_pRB_CascUpd->IsChecked() )
163 0 : nAttrib |= KeyRule::CASCADE;
164 0 : if( m_pRB_CascUpdNull->IsChecked() )
165 0 : nAttrib |= KeyRule::SET_NULL;
166 0 : if( m_pRB_CascUpdDefault->IsChecked() )
167 0 : nAttrib |= KeyRule::SET_DEFAULT;
168 0 : pConnData->SetUpdateRules( nAttrib );
169 :
170 0 : m_xTableControl->SaveModified();
171 :
172 : //// wenn die ComboBoxen fuer die Tabellenauswahl enabled sind (Constructor mit bAllowTableSelect==sal_True), dann muss ich in die
173 : //// Connection auch die Tabellennamen stecken
174 : //m_pConnData->SetSourceWinName(m_xTableControl->getSourceWinName());
175 : //m_pConnData->SetDestWinName(m_xTableControl->getDestWinName());
176 :
177 : // try to create the relation
178 : try
179 : {
180 0 : ORelationTableConnectionData* pOrigConnData = static_cast<ORelationTableConnectionData*>(m_pOrigConnData.get());
181 0 : if ( *pConnData == *pOrigConnData || pConnData->Update())
182 : {
183 0 : m_pOrigConnData->CopyFrom( *m_pConnData );
184 0 : EndDialog( RET_OK );
185 0 : return 0L;
186 : }
187 : }
188 0 : catch( const SQLException& )
189 : {
190 : ::dbaui::showError( SQLExceptionInfo( ::cppu::getCaughtException() ),
191 : this,
192 0 : static_cast<OJoinTableView*>(GetParent())->getDesignView()->getController().getORB());
193 : }
194 0 : catch( const Exception& )
195 : {
196 : DBG_UNHANDLED_EXCEPTION();
197 : }
198 :
199 0 : m_bTriedOneUpdate = sal_True;
200 : // this means that the original connection may be lost (if m_pConnData was not a newly created but an
201 : // existent conn to be modified), which we reflect by returning RET_NO (see ::Execute)
202 :
203 : // try again
204 0 : Init(m_pConnData);
205 0 : m_xTableControl->Init( m_pConnData );
206 0 : m_xTableControl->lateInit();
207 :
208 0 : return 0;
209 : }
210 :
211 0 : short ORelationDialog::Execute()
212 : {
213 0 : short nResult = ModalDialog::Execute();
214 0 : if ((nResult != RET_OK) && m_bTriedOneUpdate)
215 0 : return RET_NO;
216 :
217 0 : return nResult;
218 : }
219 :
220 0 : TTableConnectionData::value_type ORelationDialog::getConnectionData() const
221 : {
222 0 : return m_pConnData;
223 : }
224 :
225 0 : void ORelationDialog::setValid(sal_Bool _bValid)
226 : {
227 0 : m_pPB_OK->Enable(_bValid);
228 0 : }
229 :
230 0 : void ORelationDialog::notifyConnectionChange()
231 : {
232 0 : Init(m_pConnData);
233 0 : }
234 :
235 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|