office-gobmx/dbaccess/source/ui/dlg/dlgsave.cxx
2010-04-16 13:55:24 +02:00

486 lines
19 KiB
C++

/*************************************************************************
*
* 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_DLGSAVE_HXX
#include "dlgsave.hxx"
#endif
#ifndef DBAUI_DLGSAVE_HRC
#include "dlgsave.hrc"
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _DBU_DLG_HRC_
#include "dbu_dlg.hrc"
#endif
#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
#include <com/sun/star/sdb/CommandType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
#include <com/sun/star/sdbc/XRow.hpp>
#endif
#ifndef _DBAUI_SQLMESSAGE_HXX_
#include "sqlmessage.hxx"
#endif
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
#include <connectivity/dbtools.hxx>
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
#include "dbaccess_helpid.hrc"
#endif
#ifndef DBAUI_SQLNAMEEDIT_HXX
#include "SqlNameEdit.hxx"
#endif
#ifndef _BUTTON_HXX //autogen
#include <vcl/button.hxx>
#endif
#ifndef _FIXED_HXX //autogen
#include <vcl/fixed.hxx>
#endif
#ifndef _EDIT_HXX //autogen
#include <vcl/edit.hxx>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XHIERARCHICALNAMEACCESS_HPP_
#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif
#ifndef DBACCESS_SOURCE_UI_INC_OBJECTNAMECHECK_HXX
#include "objectnamecheck.hxx"
#endif
#ifndef TOOLS_DIAGNOSE_EX_H
#include <tools/diagnose_ex.h>
#endif
using namespace dbaui;
using namespace dbtools;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbc;
namespace dbaui
{
class OSaveAsDlgImpl
{
public:
FixedText m_aDescription;
FixedText m_aCatalogLbl;
OSQLNameComboBox m_aCatalog;
FixedText m_aSchemaLbl;
OSQLNameComboBox m_aSchema;
FixedText m_aLabel;
OSQLNameEdit m_aTitle;
OKButton m_aPB_OK;
CancelButton m_aPB_CANCEL;
HelpButton m_aPB_HELP;
String m_aQryLabel;
String m_sTblLabel;
rtl::OUString m_sCatalog;
rtl::OUString m_sSchema;
String m_aName;
const IObjectNameCheck&
m_rObjectNameCheck;
String m_sParentURL;
::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> m_xMetaData;
sal_Int32 m_nType;
sal_Int32 m_nFlags;
OSaveAsDlgImpl( Window * pParent,const sal_Int32& _rType,
const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& _xConnection,
const String& rDefault,
const IObjectNameCheck& _rObjectNameCheck,
sal_Int32 _nFlags);
OSaveAsDlgImpl( Window * pParent,
const String& rDefault,
const IObjectNameCheck& _rObjectNameCheck,
sal_Int32 _nFlags);
};
// -----------------------------------------------------------------------------
} // dbaui
// -----------------------------------------------------------------------------
OSaveAsDlgImpl::OSaveAsDlgImpl( Window * _pParent,
const sal_Int32& _rType,
const Reference< XConnection>& _xConnection,
const String& rDefault,
const IObjectNameCheck& _rObjectNameCheck,
sal_Int32 _nFlags)
:m_aDescription(_pParent, ModuleRes (FT_DESCRIPTION))
,m_aCatalogLbl(_pParent, ModuleRes (FT_CATALOG))
,m_aCatalog(_pParent, ModuleRes (ET_CATALOG), ::rtl::OUString())
,m_aSchemaLbl(_pParent, ModuleRes (FT_SCHEMA))
,m_aSchema(_pParent, ModuleRes (ET_SCHEMA), ::rtl::OUString())
,m_aLabel(_pParent, ModuleRes (FT_TITLE))
,m_aTitle(_pParent, ModuleRes (ET_TITLE), ::rtl::OUString())
,m_aPB_OK(_pParent, ModuleRes( PB_OK ) )
,m_aPB_CANCEL(_pParent, ModuleRes( PB_CANCEL ))
,m_aPB_HELP(_pParent, ModuleRes( PB_HELP))
,m_aQryLabel(ModuleRes(STR_QRY_LABEL))
,m_sTblLabel(ModuleRes(STR_TBL_LABEL))
,m_aName(rDefault)
,m_rObjectNameCheck( _rObjectNameCheck )
,m_nType(_rType)
,m_nFlags(_nFlags)
{
if ( _xConnection.is() )
m_xMetaData = _xConnection->getMetaData();
if ( m_xMetaData.is() )
{
::rtl::OUString sExtraNameChars( m_xMetaData->getExtraNameCharacters() );
m_aCatalog.setAllowedChars( sExtraNameChars );
m_aSchema.setAllowedChars( sExtraNameChars );
m_aTitle.setAllowedChars( sExtraNameChars );
}
m_aCatalog.SetDropDownLineCount( 10 );
m_aSchema.SetDropDownLineCount( 10 );
}
// -----------------------------------------------------------------------------
OSaveAsDlgImpl::OSaveAsDlgImpl( Window * _pParent,
const String& rDefault,
const IObjectNameCheck& _rObjectNameCheck,
sal_Int32 _nFlags)
:m_aDescription(_pParent, ModuleRes (FT_DESCRIPTION))
,m_aCatalogLbl(_pParent, ModuleRes (FT_CATALOG))
,m_aCatalog(_pParent, ModuleRes (ET_CATALOG))
,m_aSchemaLbl(_pParent, ModuleRes (FT_SCHEMA))
,m_aSchema(_pParent, ModuleRes (ET_SCHEMA))
,m_aLabel(_pParent, ModuleRes (FT_TITLE))
,m_aTitle(_pParent, ModuleRes (ET_TITLE))
,m_aPB_OK(_pParent, ModuleRes( PB_OK ) )
,m_aPB_CANCEL(_pParent, ModuleRes( PB_CANCEL ))
,m_aPB_HELP(_pParent, ModuleRes( PB_HELP))
,m_aQryLabel(ModuleRes(STR_QRY_LABEL))
,m_sTblLabel(ModuleRes(STR_TBL_LABEL))
,m_aName(rDefault)
,m_rObjectNameCheck( _rObjectNameCheck )
,m_nType(CommandType::COMMAND)
,m_nFlags(_nFlags)
{
m_aCatalog.SetDropDownLineCount( 10 );
m_aSchema.SetDropDownLineCount( 10 );
}
// -----------------------------------------------------------------------------
using namespace ::com::sun::star::lang;
//==================================================================
namespace
{
typedef Reference< XResultSet > (SAL_CALL XDatabaseMetaData::*FGetMetaStrings)();
void lcl_fillComboList( ComboBox& _rList, const Reference< XConnection >& _rxConnection,
FGetMetaStrings _GetAll, const ::rtl::OUString& _rCurrent )
{
try
{
Reference< XDatabaseMetaData > xMetaData( _rxConnection->getMetaData(), UNO_QUERY_THROW );
Reference< XResultSet > xRes = (xMetaData.get()->*_GetAll)();
Reference< XRow > xRow( xRes, UNO_QUERY_THROW );
::rtl::OUString sValue;
while ( xRes->next() )
{
sValue = xRow->getString( 1 );
if ( !xRow->wasNull() )
_rList.InsertEntry( sValue );
}
USHORT nPos = _rList.GetEntryPos( String( _rCurrent ) );
if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
_rList.SelectEntryPos( nPos );
else
_rList.SelectEntryPos( 0 );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
//==================================================================
OSaveAsDlg::OSaveAsDlg( Window * pParent,
const sal_Int32& _rType,
const Reference< XMultiServiceFactory >& _rxORB,
const Reference< XConnection>& _xConnection,
const String& rDefault,
const IObjectNameCheck& _rObjectNameCheck,
sal_Int32 _nFlags)
:ModalDialog( pParent, ModuleRes(DLG_SAVE_AS))
,m_xORB( _rxORB )
{
m_pImpl = new OSaveAsDlgImpl(this,_rType,_xConnection,rDefault,_rObjectNameCheck,_nFlags);
switch (_rType)
{
case CommandType::QUERY:
implInitOnlyTitle(m_pImpl->m_aQryLabel);
break;
case CommandType::TABLE:
OSL_ENSURE( m_pImpl->m_xMetaData.is(), "OSaveAsDlg::OSaveAsDlg: no meta data for entering table names: this will crash!" );
{
m_pImpl->m_aLabel.SetText(m_pImpl->m_sTblLabel);
Point aPos(m_pImpl->m_aPB_OK.GetPosPixel());
if(m_pImpl->m_xMetaData.is() && !m_pImpl->m_xMetaData->supportsCatalogsInTableDefinitions())
{
m_pImpl->m_aCatalogLbl.Hide();
m_pImpl->m_aCatalog.Hide();
aPos = m_pImpl->m_aLabel.GetPosPixel();
m_pImpl->m_aLabel.SetPosPixel(m_pImpl->m_aSchemaLbl.GetPosPixel());
m_pImpl->m_aTitle.SetPosPixel(m_pImpl->m_aSchema.GetPosPixel());
m_pImpl->m_aSchemaLbl.SetPosPixel(m_pImpl->m_aCatalogLbl.GetPosPixel());
m_pImpl->m_aSchema.SetPosPixel(m_pImpl->m_aCatalog.GetPosPixel());
}
else
{
// now fill the catalogs
lcl_fillComboList( m_pImpl->m_aCatalog, _xConnection,
&XDatabaseMetaData::getCatalogs, _xConnection->getCatalog() );
}
if ( !m_pImpl->m_xMetaData->supportsSchemasInTableDefinitions())
{
m_pImpl->m_aSchemaLbl.Hide();
m_pImpl->m_aSchema.Hide();
aPos = m_pImpl->m_aLabel.GetPosPixel();
m_pImpl->m_aLabel.SetPosPixel(m_pImpl->m_aSchemaLbl.GetPosPixel());
m_pImpl->m_aTitle.SetPosPixel(m_pImpl->m_aSchema.GetPosPixel());
}
else
{
lcl_fillComboList( m_pImpl->m_aSchema, _xConnection,
&XDatabaseMetaData::getSchemas, m_pImpl->m_xMetaData->getUserName() );
}
OSL_ENSURE(m_pImpl->m_xMetaData.is(),"The metadata can not be null!");
if(m_pImpl->m_aName.Search('.') != STRING_NOTFOUND)
{
::rtl::OUString sCatalog,sSchema,sTable;
::dbtools::qualifiedNameComponents(m_pImpl->m_xMetaData,
m_pImpl->m_aName,
sCatalog,
sSchema,
sTable,
::dbtools::eInDataManipulation);
USHORT nPos = m_pImpl->m_aCatalog.GetEntryPos(String(sCatalog));
if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
m_pImpl->m_aCatalog.SelectEntryPos(nPos);
if ( sSchema.getLength() )
{
nPos = m_pImpl->m_aSchema.GetEntryPos(String(sSchema));
if ( nPos != COMBOBOX_ENTRY_NOTFOUND )
m_pImpl->m_aSchema.SelectEntryPos(nPos);
}
m_pImpl->m_aTitle.SetText(sTable);
}
else
m_pImpl->m_aTitle.SetText(m_pImpl->m_aName);
m_pImpl->m_aTitle.SetSelection( Selection( SELECTION_MIN, SELECTION_MAX ) );
m_pImpl->m_aPB_OK.SetPosPixel(Point(m_pImpl->m_aPB_OK.GetPosPixel().X(),aPos.Y()));
m_pImpl->m_aPB_CANCEL.SetPosPixel(Point(m_pImpl->m_aPB_CANCEL.GetPosPixel().X(),aPos.Y()));
m_pImpl->m_aPB_HELP.SetPosPixel(Point(m_pImpl->m_aPB_HELP.GetPosPixel().X(),aPos.Y()));
USHORT nLength = m_pImpl->m_xMetaData.is() ? static_cast<USHORT>(m_pImpl->m_xMetaData->getMaxTableNameLength()) : 0;
nLength = nLength ? nLength : EDIT_NOLIMIT;
m_pImpl->m_aTitle.SetMaxTextLen(nLength);
m_pImpl->m_aSchema.SetMaxTextLen(nLength);
m_pImpl->m_aCatalog.SetMaxTextLen(nLength);
sal_Bool bCheck = _xConnection.is() && isSQL92CheckEnabled(_xConnection);
m_pImpl->m_aTitle.setCheck(bCheck); // enable non valid sql chars as well
m_pImpl->m_aSchema.setCheck(bCheck); // enable non valid sql chars as well
m_pImpl->m_aCatalog.setCheck(bCheck); // enable non valid sql chars as well
Size aSize = GetSizePixel();
aSize.Height() =
aPos.Y() + m_pImpl->m_aPB_OK.GetSizePixel().Height() + m_pImpl->m_aTitle.GetSizePixel().Height() / 2;
SetSizePixel(aSize);
}
break;
default:
OSL_ENSURE( false, "OSaveAsDlg::OSaveAsDlg: Type not supported yet!" );
}
implInit();
}
// -----------------------------------------------------------------------------
OSaveAsDlg::OSaveAsDlg( Window * pParent,
const Reference< XMultiServiceFactory >& _rxORB,
const String& rDefault,
const String& _sLabel,
const IObjectNameCheck& _rObjectNameCheck,
sal_Int32 _nFlags)
:ModalDialog( pParent, ModuleRes(DLG_SAVE_AS))
,m_xORB( _rxORB )
{
m_pImpl = new OSaveAsDlgImpl(this,rDefault,_rObjectNameCheck,_nFlags);
implInitOnlyTitle(_sLabel);
implInit();
}
// -----------------------------------------------------------------------------
OSaveAsDlg::~OSaveAsDlg()
{
DELETEZ(m_pImpl);
}
// -----------------------------------------------------------------------------
IMPL_LINK(OSaveAsDlg, ButtonClickHdl, Button *, pButton)
{
if (pButton == &m_pImpl->m_aPB_OK)
{
m_pImpl->m_aName = m_pImpl->m_aTitle.GetText();
::rtl::OUString sNameToCheck( m_pImpl->m_aName );
if ( m_pImpl->m_nType == CommandType::TABLE )
{
sNameToCheck = ::dbtools::composeTableName(
m_pImpl->m_xMetaData,
getCatalog(),
getSchema(),
sNameToCheck,
sal_False, // no quoting
::dbtools::eInDataManipulation
);
}
SQLExceptionInfo aNameError;
if ( m_pImpl->m_rObjectNameCheck.isNameValid( sNameToCheck, aNameError ) )
EndDialog( RET_OK );
showError( aNameError, this, m_xORB );
m_pImpl->m_aTitle.GrabFocus();
}
return 0;
}
// -----------------------------------------------------------------------------
IMPL_LINK(OSaveAsDlg, EditModifyHdl, Edit *, pEdit )
{
if (pEdit == &m_pImpl->m_aTitle)
m_pImpl->m_aPB_OK.Enable(0 != m_pImpl->m_aTitle.GetText().Len());
return 0;
}
// -----------------------------------------------------------------------------
void OSaveAsDlg::implInitOnlyTitle(const String& _rLabel)
{
m_pImpl->m_aLabel.SetText(_rLabel);
m_pImpl->m_aCatalogLbl.Hide();
m_pImpl->m_aCatalog.Hide();
m_pImpl->m_aSchemaLbl.Hide();
m_pImpl->m_aSchema.Hide();
Point aPos(m_pImpl->m_aSchemaLbl.GetPosPixel());
m_pImpl->m_aLabel.SetPosPixel(m_pImpl->m_aCatalogLbl.GetPosPixel());
m_pImpl->m_aTitle.SetPosPixel(m_pImpl->m_aCatalog.GetPosPixel());
m_pImpl->m_aPB_OK.SetPosPixel(Point(m_pImpl->m_aPB_OK.GetPosPixel().X(),aPos.Y()));
m_pImpl->m_aPB_CANCEL.SetPosPixel(Point(m_pImpl->m_aPB_CANCEL.GetPosPixel().X(),aPos.Y()));
m_pImpl->m_aPB_HELP.SetPosPixel(Point(m_pImpl->m_aPB_HELP.GetPosPixel().X(),aPos.Y()));
sal_Int32 nNewHeight =
aPos.Y() + m_pImpl->m_aPB_OK.GetSizePixel().Height() + m_pImpl->m_aTitle.GetSizePixel().Height() / 2;
SetSizePixel(Size(GetSizePixel().Width(), nNewHeight));
m_pImpl->m_aTitle.SetText(m_pImpl->m_aName);
m_pImpl->m_aTitle.setCheck(sal_False); // enable non valid sql chars as well
}
// -----------------------------------------------------------------------------
void OSaveAsDlg::implInit()
{
if ( 0 == ( m_pImpl->m_nFlags & SAD_ADDITIONAL_DESCRIPTION ) )
{
// hide the description window
m_pImpl->m_aDescription.Hide();
// the number of pixels we have to move the other controls
sal_Int32 nMoveUp = m_pImpl->m_aCatalog.GetPosPixel().Y() - m_pImpl->m_aDescription.GetPosPixel().Y();
// loop to all controls and move them ...
for ( Window* pChildControl = GetWindow( WINDOW_FIRSTCHILD );
pChildControl;
pChildControl= pChildControl->GetWindow( WINDOW_NEXT )
)
{
if ( &m_pImpl->m_aDescription != pChildControl )
{
Point aPos = pChildControl->GetPosPixel();
aPos.Y() -= nMoveUp;
pChildControl->SetPosPixel(aPos);
}
}
// change our own size accordingly
Size aSize = GetSizePixel();
aSize.Height() -= nMoveUp;
SetSizePixel(aSize);
}
if ( SAD_TITLE_PASTE_AS == ( m_pImpl->m_nFlags & SAD_TITLE_PASTE_AS ) )
SetText( String( ModuleRes( STR_TITLE_PASTE_AS ) ) );
else if ( SAD_TITLE_RENAME == ( m_pImpl->m_nFlags & SAD_TITLE_RENAME ) )
{
SetText( String( ModuleRes( STR_TITLE_RENAME ) ) );
m_pImpl->m_aTitle.SetHelpId(HID_DLG_RENAME);
}
m_pImpl->m_aPB_OK.SetClickHdl(LINK(this,OSaveAsDlg,ButtonClickHdl));
m_pImpl->m_aTitle.SetModifyHdl(LINK(this,OSaveAsDlg,EditModifyHdl));
m_pImpl->m_aTitle.GrabFocus();
FreeResource();
}
// -----------------------------------------------------------------------------
String OSaveAsDlg::getName() const { return m_pImpl->m_aName; }
String OSaveAsDlg::getCatalog() const { return m_pImpl->m_aCatalog.IsVisible() ? m_pImpl->m_aCatalog.GetText() : String(); }
String OSaveAsDlg::getSchema() const { return m_pImpl->m_aSchema.IsVisible() ? m_pImpl->m_aSchema.GetText() : String(); }