blob: db6397b294a3cca5077189b763b83e4934a27c0d [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbaccess.hxx"
#ifndef DBAUI_WIZ_TYPESELECT_HXX
#include "WTypeSelect.hxx"
#endif
#ifndef DBAUI_WIZARD_PAGES_HRC
#include "WizardPages.hrc"
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef TOOLS_DIAGNOSE_EX_H
#include <tools/diagnose_ex.h>
#endif
#ifndef DBAUI_FIELDDESCRIPTIONS_HXX
#include "FieldDescriptions.hxx"
#endif
#ifndef DBAUI_WIZ_COPYTABLEDIALOG_HXX
#include "WCopyTable.hxx"
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif
#ifndef _DBU_MISC_HRC_
#include "dbu_misc.hrc"
#endif
#ifndef _STREAM_HXX
#include <tools/stream.hxx>
#endif
#ifndef _SVPARSER_HXX
#include <svtools/svparser.hxx>
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
#ifndef _DBAUI_SQLMESSAGE_HXX_
#include "sqlmessage.hxx"
#endif
#ifndef DBAUI_FIELDCONTROLS_HXX
#include "FieldControls.hxx"
#endif
#include "dbaccess_slotid.hrc"
using namespace ::dbaui;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::sdbc;
// using namespace ::com::sun::star::sdbcx;
//========================================================================
// OWizTypeSelectControl
DBG_NAME(OWizTypeSelectControl)
//========================================================================
OWizTypeSelectControl::OWizTypeSelectControl(Window* pParent, const ResId& rResId,OTableDesignHelpBar* pHelpBar)
: OFieldDescControl(pParent,rResId,pHelpBar)
{
DBG_CTOR(OWizTypeSelectControl,NULL);
}
// -----------------------------------------------------------------------------
OWizTypeSelectControl::~OWizTypeSelectControl()
{
DBG_DTOR(OWizTypeSelectControl,NULL);
}
// -----------------------------------------------------------------------
void OWizTypeSelectControl::ActivateAggregate( EControlType eType )
{
switch(eType )
{
case tpFormat:
case tpDefault:
case tpAutoIncrement:
case tpAutoIncrementValue:
break;
default:
OFieldDescControl::ActivateAggregate( eType );
}
}
// -----------------------------------------------------------------------
void OWizTypeSelectControl::DeactivateAggregate( EControlType eType )
{
switch(eType )
{
case tpFormat:
case tpDefault:
case tpAutoIncrement:
case tpAutoIncrementValue:
break;
default:
OFieldDescControl::DeactivateAggregate( eType );
}
}
// -----------------------------------------------------------------------
void OWizTypeSelectControl::CellModified(long nRow, sal_uInt16 nColId )
{
DBG_ASSERT(nRow == -1,"nRow muss -1 sein!");
(void)nRow;
MultiListBox &aListBox = ((OWizTypeSelect*)GetParent())->m_lbColumnNames;
OFieldDescription* pCurFieldDescr = getCurrentFieldDescData();
sal_uInt16 nPos = aListBox.GetEntryPos( String( pCurFieldDescr->GetName() ) );
pCurFieldDescr = static_cast< OFieldDescription* >( aListBox.GetEntryData( nPos ) );
OSL_ENSURE( pCurFieldDescr, "OWizTypeSelectControl::CellModified: Columnname/type not found in the listbox!" );
if ( !pCurFieldDescr )
return;
setCurrentFieldDescData( pCurFieldDescr );
::rtl::OUString sName = pCurFieldDescr->GetName();
::rtl::OUString sNewName;
const OPropColumnEditCtrl* pColumnName = getColumnCtrl();
if ( pColumnName )
sNewName = pColumnName->GetText();
switch(nColId)
{
case FIELD_PRPOERTY_COLUMNNAME:
{
OCopyTableWizard* pWiz = static_cast<OCopyTableWizard*>(GetParent()->GetParent());
// first we have to check if this name already exists
sal_Bool bDoubleName = sal_False;
sal_Bool bCase = sal_True;
if ( getMetaData().is() && !getMetaData()->supportsMixedCaseQuotedIdentifiers() )
{
bCase = sal_False;
sal_uInt16 nCount = aListBox.GetEntryCount();
for (sal_uInt16 i=0 ; !bDoubleName && i < nCount ; ++i)
{
::rtl::OUString sEntry(aListBox.GetEntry(i));
bDoubleName = sNewName.equalsIgnoreAsciiCase(sEntry);
}
if ( !bDoubleName && pWiz->shouldCreatePrimaryKey() )
bDoubleName = sNewName.equalsIgnoreAsciiCase(pWiz->getPrimaryKeyName());
}
else
bDoubleName = ((aListBox.GetEntryPos(String(sNewName)) != LISTBOX_ENTRY_NOTFOUND)
|| ( pWiz->shouldCreatePrimaryKey()
&& pWiz->getPrimaryKeyName() == sNewName) );
if ( bDoubleName )
{
String strMessage = String(ModuleRes(STR_TABLEDESIGN_DUPLICATE_NAME));
strMessage.SearchAndReplaceAscii("$column$", sNewName);
pWiz->showError(strMessage);
pCurFieldDescr->SetName(sName);
DisplayData(pCurFieldDescr);
static_cast<OWizTypeSelect*>(GetParent())->setDuplicateName(sal_True);
return;
}
::rtl::OUString sOldName = pCurFieldDescr->GetName();
pCurFieldDescr->SetName(sNewName);
static_cast<OWizTypeSelect*>(GetParent())->setDuplicateName(sal_False);
// now we change the name
OCopyTableWizard::TNameMapping::iterator aIter = pWiz->m_mNameMapping.begin();
OCopyTableWizard::TNameMapping::iterator aEnd = pWiz->m_mNameMapping.end();
::comphelper::UStringMixEqual aCase(bCase);
for(;aIter != aEnd;++aIter)
{
if ( aCase(aIter->second,sName) )
{
aIter->second = sNewName;
break;
}
}
aListBox.RemoveEntry(nPos);
aListBox.InsertEntry(pCurFieldDescr->GetName(),nPos);
aListBox.SetEntryData(nPos,pCurFieldDescr);
pWiz->replaceColumn(nPos,pCurFieldDescr,sOldName);
}
break;
}
saveCurrentFieldDescData();
}
// -----------------------------------------------------------------------------
::com::sun::star::lang::Locale OWizTypeSelectControl::GetLocale() const
{
return static_cast<OWizTypeSelect*>(GetParent())->m_pParent->GetLocale();
}
// -----------------------------------------------------------------------------
Reference< XNumberFormatter > OWizTypeSelectControl::GetFormatter() const
{
return static_cast<OWizTypeSelect*>(GetParent())->m_pParent->GetFormatter();
}
// -----------------------------------------------------------------------------
TOTypeInfoSP OWizTypeSelectControl::getTypeInfo(sal_Int32 _nPos)
{
return static_cast<OWizTypeSelect*>(GetParent())->m_pParent->getDestTypeInfo(_nPos);
}
// -----------------------------------------------------------------------------
const OTypeInfoMap* OWizTypeSelectControl::getTypeInfo() const
{
return static_cast<OWizTypeSelect*>(GetParent())->m_pParent->getDestTypeInfo();
}
// -----------------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> OWizTypeSelectControl::getMetaData()
{
return ((OWizTypeSelect*)GetParent())->m_pParent->m_xDestConnection->getMetaData();
}
// -----------------------------------------------------------------------------
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection> OWizTypeSelectControl::getConnection()
{
return ((OWizTypeSelect*)GetParent())->m_pParent->m_xDestConnection;
}
// -----------------------------------------------------------------------------
sal_Bool OWizTypeSelectControl::isAutoIncrementValueEnabled() const
{
return ((OWizTypeSelect*)GetParent())->m_bAutoIncrementEnabled;
}
// -----------------------------------------------------------------------------
::rtl::OUString OWizTypeSelectControl::getAutoIncrementValue() const
{
return ((OWizTypeSelect*)GetParent())->m_sAutoIncrementValue;
}
// -----------------------------------------------------------------------------
//========================================================================
DBG_NAME(OWizTypeSelect);
#define IMG_PRIMARY_KEY 1
//========================================================================
OWizTypeSelect::OWizTypeSelect( Window* pParent, SvStream* _pStream )
:OWizardPage( pParent, ModuleRes( TAB_WIZ_TYPE_SELECT ))
,m_lbColumnNames( this, ModuleRes( LB_NEW_COLUMN_NAMES ) )
,m_flColumns( this, ModuleRes( FL_COLUMN_NAME ) )
,m_aTypeControl( this, ModuleRes( CONTROL_CONTAINER ))
,m_flAutoType( this, ModuleRes( FL_AUTO_TYPE ) )
,m_ftAuto( this, ModuleRes( FT_AUTO ) )
,m_etAuto( this, ModuleRes( ET_AUTO ) )
,m_pbAuto( this, ModuleRes( PB_AUTO ) )
,m_pParserStream( _pStream )
,m_nDisplayRow(0)
,m_bAutoIncrementEnabled(sal_False)
,m_bDuplicateName(sal_False)
{
DBG_CTOR(OWizTypeSelect,NULL);
m_lbColumnNames.SetSelectHdl(LINK(this,OWizTypeSelect,ColumnSelectHdl));
ModuleRes aModuleRes(isHiContrast(&m_lbColumnNames) ? IMG_JOINS_H : IMG_JOINS);
ImageList aImageList(aModuleRes);
m_imgPKey = aImageList.GetImage(IMG_PRIMARY_KEY);
m_aTypeControl.Show();
m_aTypeControl.Init();
m_etAuto.SetText(String::CreateFromAscii("10"));
m_etAuto.SetDecimalDigits(0);
m_pbAuto.SetClickHdl(LINK(this,OWizTypeSelect,ButtonClickHdl));
m_lbColumnNames.EnableMultiSelection(sal_True);
try
{
m_lbColumnNames.SetPKey( m_pParent->supportsPrimaryKey() );
::dbaui::fillAutoIncrementValue( m_pParent->m_xDestConnection, m_bAutoIncrementEnabled, m_sAutoIncrementValue );
}
catch(const Exception&)
{
DBG_UNHANDLED_EXCEPTION();
}
FreeResource();
}
// -----------------------------------------------------------------------
OWizTypeSelect::~OWizTypeSelect()
{
DBG_DTOR(OWizTypeSelect,NULL);
}
// -----------------------------------------------------------------------------
String OWizTypeSelect::GetTitle() const
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
return String(ModuleRes(STR_WIZ_TYPE_SELECT_TITEL));
}
// -----------------------------------------------------------------------
void OWizTypeSelect::Resize()
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
}
// -----------------------------------------------------------------------
IMPL_LINK( OWizTypeSelect, ColumnSelectHdl, MultiListBox *, /*pListBox*/ )
{
String aColumnName( m_lbColumnNames.GetSelectEntry() );
OFieldDescription* pField = static_cast<OFieldDescription*>(m_lbColumnNames.GetEntryData(m_lbColumnNames.GetEntryPos(aColumnName)));
if(pField)
m_aTypeControl.DisplayData(pField);
m_aTypeControl.Enable(m_lbColumnNames.GetSelectEntryCount() == 1 );
return 0;
}
// -----------------------------------------------------------------------
void OWizTypeSelect::Reset()
{
// urspr"unglichen zustand wiederherstellen
DBG_CHKTHIS(OWizTypeSelect,NULL);
while(m_lbColumnNames.GetEntryCount())
m_lbColumnNames.RemoveEntry(0);
m_lbColumnNames.Clear();
sal_Int32 nBreakPos;
m_pParent->CheckColumns(nBreakPos);
const ODatabaseExport::TColumnVector* pDestColumns = m_pParent->getDestVector();
ODatabaseExport::TColumnVector::const_iterator aIter = pDestColumns->begin();
ODatabaseExport::TColumnVector::const_iterator aEnd = pDestColumns->end();
for(;aIter != aEnd;++aIter)
{
sal_uInt16 nPos;
if((*aIter)->second->IsPrimaryKey())
nPos = m_lbColumnNames.InsertEntry((*aIter)->first, m_imgPKey );
else
nPos = m_lbColumnNames.InsertEntry((*aIter)->first);
m_lbColumnNames.SetEntryData(nPos,(*aIter)->second);
}
m_bFirstTime = sal_False;
}
// -----------------------------------------------------------------------
void OWizTypeSelect::ActivatePage( )
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
sal_Bool bOldFirstTime = m_bFirstTime;
Reset();
m_bFirstTime = bOldFirstTime;
m_lbColumnNames.SelectEntryPos(static_cast<sal_uInt16>(m_nDisplayRow));
m_nDisplayRow = 0;
m_lbColumnNames.GetSelectHdl().Call(&m_lbColumnNames);
}
// -----------------------------------------------------------------------
sal_Bool OWizTypeSelect::LeavePage()
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
String aColumnName( m_lbColumnNames.GetSelectEntry() );
sal_Bool bDuplicateName = sal_False;
OFieldDescription* pField = static_cast<OFieldDescription*>(m_lbColumnNames.GetEntryData(m_lbColumnNames.GetEntryPos(aColumnName)));
if ( pField )
{
m_aTypeControl.SaveData(pField);
bDuplicateName = m_bDuplicateName;
}
return !bDuplicateName;
}
//------------------------------------------------------------------------------
void OWizTypeSelect::EnableAuto(sal_Bool bEnable)
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
m_ftAuto.Show(bEnable);
m_etAuto.Show(bEnable);
m_pbAuto.Show(bEnable);
m_flAutoType.Show(bEnable);
}
//------------------------------------------------------------------------------
IMPL_LINK( OWizTypeSelect, ButtonClickHdl, Button *, /*pButton*/ )
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
sal_Int32 nBreakPos;
m_pParent->CheckColumns(nBreakPos);
fillColumnList(m_etAuto.GetText().ToInt32());
ActivatePage();
return 0;
}
//------------------------------------------------------------------------
sal_Bool OWizTypeSelectList::IsPrimaryKeyAllowed() const
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
sal_uInt16 nCount = GetSelectEntryCount();
sal_uInt16 j;
for( j = 0; m_bPKey && j < nCount; ++j )
{
OFieldDescription* pField = static_cast<OFieldDescription*>(GetEntryData(GetSelectEntryPos(j)));
if(!pField || pField->getTypeInfo()->nSearchType == ColumnSearch::NONE)
break;
}
return j == nCount;
}
// -----------------------------------------------------------------------------
void OWizTypeSelectList::setPrimaryKey(OFieldDescription* _pFieldDescr,sal_uInt16 _nPos,sal_Bool _bSet)
{
String sColumnName = GetEntry(_nPos);
RemoveEntry(_nPos);
_pFieldDescr->SetPrimaryKey(_bSet);
if( _bSet )
InsertEntry(sColumnName,((OWizTypeSelect*)GetParent())->m_imgPKey,_nPos);
else if( _pFieldDescr->getTypeInfo()->bNullable )
{
_pFieldDescr->SetControlDefault(Any());
InsertEntry(sColumnName,_nPos);
}
SetEntryData(_nPos,_pFieldDescr);
}
//------------------------------------------------------------------------
long OWizTypeSelectList::PreNotify( NotifyEvent& rEvt )
{
long nDone = 0;
switch( rEvt.GetType() )
{
case EVENT_MOUSEBUTTONDOWN:
{
const MouseEvent* pMEvt = rEvt.GetMouseEvent();
if(pMEvt->IsRight() && !pMEvt->GetModifier())
nDone = 1;
}
break;
case EVENT_COMMAND:
{
if(!IsPrimaryKeyAllowed())
break;
const CommandEvent* pComEvt = rEvt.GetCommandEvent();
if(pComEvt->GetCommand() != COMMAND_CONTEXTMENU)
break;
// die Stelle, an der geklickt wurde
Point ptWhere(0,0);
if (pComEvt->IsMouseEvent())
ptWhere = pComEvt->GetMousePosPixel();
PopupMenu aContextMenu(ModuleRes(RID_SBA_RTF_PKEYPOPUP));
switch( aContextMenu.Execute( this, ptWhere ) )
{
case SID_TABLEDESIGN_TABED_PRIMARYKEY:
{
String sColumnName;
sal_uInt16 nCount = GetEntryCount();
for(sal_uInt16 j = 0 ; j < nCount ; ++j)
{
OFieldDescription* pFieldDescr = static_cast<OFieldDescription*>(GetEntryData(j));
if( pFieldDescr )
{
if(pFieldDescr->IsPrimaryKey() && !IsEntryPosSelected(j))
setPrimaryKey(pFieldDescr,j);
else if(IsEntryPosSelected(j))
{
setPrimaryKey(pFieldDescr,j,!pFieldDescr->IsPrimaryKey());
SelectEntryPos(j);
}
}
}
GetSelectHdl().Call(this);
}
break;
}
nDone = 1;
}
break;
}
return nDone ? nDone : MultiListBox::PreNotify(rEvt);
}
// -----------------------------------------------------------------------------
void OWizTypeSelect::fillColumnList(sal_uInt32 nRows)
{
DBG_CHKTHIS(OWizTypeSelect,NULL);
if(m_pParserStream)
{
sal_uInt32 nTell = m_pParserStream->Tell(); // verändert vielleicht die Position des Streams
SvParser *pReader = createReader(nRows);
if(pReader)
{
pReader->AddRef();
pReader->CallParser();
pReader->ReleaseRef();
}
m_pParserStream->Seek(nTell);
}
}
// -----------------------------------------------------------------------------