Files
libreoffice/dbaccess/source/ui/control/FieldDescControl.cxx
Thomas Arnhold ba0a57702c remove OUString wrap for string literals
For some functions and all kinds of Exceptions.

CannotConvertException
CloseVetoException
DisposedException
EmptyUndoStackException
ErrorCodeIOException
Exception
GridInvalidDataException
GridInvalidModelException
IOException
IllegalAccessException
IllegalArgumentException
IllegalTypeException
IndexOutOfBoundsException
NoMasterException
NoSuchElementException
NoSupportException
PropertyVetoException
RuntimeException
SAXException
ScannerException
StorageWrappedTargetException
UnsupportedFlavorException
VetoException
WrappedTargetException
ZipIOException
throwGenericSQLException
throwIllegallArgumentException

createInstance
createInstanceWithContext
forName
getByName
getPackageManager
getPropertyValue
getUnpackedValueOrDefault
getValueByName
hasPropertyByName
openKey
setName
setPropertyValue
supportsService

bash command:

for i in `cat list`; do git grep "$i\s*(\s*OUString(\s*\"" -- '*.[hc]xx'
	| cut -d ':' -f1 | sort -u
	| xargs sed -i
		-e "s/\(\<$i\s*(\)\s*OUString(\s*\(\"[^\")\\]*\"\)\s*)\s*/\1\2/g"
		-e "s/\($i.*\)\"+ /\1\" + /g";
done

Change-Id: Iaf8e641b0abf28c082906014f87a183517630535
Reviewed-on: https://gerrit.libreoffice.org/4624
Tested-by: LibreOffice gerrit bot <gerrit@libreoffice.org>
Reviewed-by: Thomas Arnhold <thomas@arnhold.org>
Tested-by: Thomas Arnhold <thomas@arnhold.org>
2013-06-29 21:52:54 +00:00

1859 lines
65 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include "FieldDescControl.hxx"
#include "FieldControls.hxx"
#include <tools/diagnose_ex.h>
#include "TableDesignHelpBar.hxx"
#include <vcl/scrbar.hxx>
#include <vcl/button.hxx>
#include <vcl/svapp.hxx>
#include <vcl/fixed.hxx>
#include <vcl/msgbox.hxx>
#include <vector>
#include "FieldDescriptions.hxx"
#include "dlgattr.hxx"
#include <svx/numfmtsh.hxx>
#include <svx/svxids.hrc>
#include <svx/algitem.hxx>
#include <svl/itempool.hxx>
#include <svl/zforlist.hxx>
#include <svl/rngitem.hxx>
#include <svl/intitem.hxx>
#include <svl/numuno.hxx>
#include <svtools/transfer.hxx>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include <com/sun/star/util/NumberFormat.hpp>
#include <com/sun/star/util/XNumberFormatPreviewer.hpp>
#include <com/sun/star/util/XNumberFormatTypes.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include "QEnumTypes.hxx"
#include "dbaccess_helpid.hrc"
#include <connectivity/dbtools.hxx>
#include <connectivity/dbconversion.hxx>
#include <comphelper/numbers.hxx>
#include <comphelper/string.hxx>
#include "UITools.hxx"
#include <memory>
#include "dbu_control.hrc"
#include "dbu_tbl.hrc"
#include <osl/diagnose.h>
using namespace dbaui;
using namespace dbtools;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::util;
//==================================================================
// For the Controls on the OFieldDescGenPage
#define CONTROL_SPACING_X 18 // 6
#define CONTROL_SPACING_Y 4
#define CONTROL_WIDTH_1 160 // 100
#define CONTROL_WIDTH_2 100 // 60
#define CONTROL_WIDTH_3 250
#define CONTROL_WIDTH_4 (CONTROL_WIDTH_3 - 20 - 5)
#define HSCROLL_STEP 20
namespace
{
template< typename T1, typename T2> void lcl_HideAndDeleteControl(short& _nPos,T1** _pControl,T2** _pControlText)
{
if ( *_pControl )
{
--_nPos;
(*_pControl)->Hide();
(*_pControlText)->Hide();
delete *_pControl;
delete *_pControlText;
(*_pControl) = NULL;
(*_pControlText) = NULL;
}
}
}
//==================================================================
// class OFieldDescControl
//==================================================================
DBG_NAME(OFieldDescControl)
//==================================================================
OFieldDescControl::OFieldDescControl( Window* pParent, const ResId& rResId, OTableDesignHelpBar* pHelpBar)
:TabPage( pParent, rResId )
,pHelp( pHelpBar )
,pLastFocusWindow(NULL)
,m_pActFocusWindow(NULL)
,pDefaultText(NULL)
,pRequiredText(NULL)
,pAutoIncrementText(NULL)
,pTextLenText(NULL)
,pNumTypeText(NULL)
,pLengthText(NULL)
,pScaleText(NULL)
,pFormatText(NULL)
,pBoolDefaultText(NULL)
,m_pColumnNameText(NULL)
,m_pTypeText(NULL)
,m_pAutoIncrementValueText(NULL)
,pRequired(NULL)
,pNumType(NULL)
,pAutoIncrement(NULL)
,pDefault(NULL)
,pTextLen(NULL)
,pLength(NULL)
,pScale(NULL)
,pFormatSample(NULL)
,pBoolDefault(NULL)
,m_pColumnName(NULL)
,m_pType(NULL)
,m_pAutoIncrementValue(NULL)
,pFormat(NULL)
,m_pVertScroll( NULL )
,m_pHorzScroll( NULL )
,m_pPreviousType()
,m_nPos(-1)
,aYes(ModuleRes(STR_VALUE_YES))
,aNo(ModuleRes(STR_VALUE_NO))
,m_nOldVThumb( 0 )
,m_nOldHThumb( 0 )
,m_nWidth(50)
,m_bAdded(sal_False)
,m_bRightAligned(false)
,pActFieldDescr(NULL)
{
DBG_CTOR(OFieldDescControl,NULL);
Contruct();
}
//------------------------------------------------------------------------------
OFieldDescControl::OFieldDescControl( Window* pParent, OTableDesignHelpBar* pHelpBar )
:TabPage( pParent, WB_3DLOOK | WB_DIALOGCONTROL )
,pHelp( pHelpBar )
,pLastFocusWindow(NULL)
,m_pActFocusWindow(NULL)
,pDefaultText(NULL)
,pRequiredText(NULL)
,pAutoIncrementText(NULL)
,pTextLenText(NULL)
,pNumTypeText(NULL)
,pLengthText(NULL)
,pScaleText(NULL)
,pFormatText(NULL)
,pBoolDefaultText(NULL)
,m_pColumnNameText(NULL)
,m_pTypeText(NULL)
,m_pAutoIncrementValueText(NULL)
,pRequired(NULL)
,pNumType(NULL)
,pAutoIncrement(NULL)
,pDefault(NULL)
,pTextLen(NULL)
,pLength(NULL)
,pScale(NULL)
,pFormatSample(NULL)
,pBoolDefault(NULL)
,m_pColumnName(NULL)
,m_pType(NULL)
,m_pAutoIncrementValue(NULL)
,pFormat(NULL)
,m_pVertScroll( NULL )
,m_pHorzScroll( NULL )
,m_pPreviousType()
,m_nPos(-1)
,aYes(ModuleRes(STR_VALUE_YES))
,aNo(ModuleRes(STR_VALUE_NO))
,m_nOldVThumb( 0 )
,m_nOldHThumb( 0 )
,m_nWidth(50)
,m_bAdded(sal_False)
,m_bRightAligned(false)
,pActFieldDescr(NULL)
{
DBG_CTOR(OFieldDescControl,NULL);
Contruct();
}
// -----------------------------------------------------------------------------
void OFieldDescControl::Contruct()
{
m_pVertScroll = new ScrollBar(this, WB_VSCROLL | WB_REPEAT | WB_DRAG);
m_pHorzScroll = new ScrollBar(this, WB_HSCROLL | WB_REPEAT | WB_DRAG);
m_pVertScroll->SetScrollHdl(LINK(this, OFieldDescControl, OnScroll));
m_pHorzScroll->SetScrollHdl(LINK(this, OFieldDescControl, OnScroll));
m_pVertScroll->Show();
m_pHorzScroll->Show();
m_pVertScroll->EnableClipSiblings();
m_pHorzScroll->EnableClipSiblings();
m_pVertScroll->SetLineSize(1);
m_pVertScroll->SetPageSize(1);
m_pHorzScroll->SetLineSize(1);
m_pHorzScroll->SetPageSize(1);
m_nOldVThumb = m_nOldHThumb = 0;
}
//------------------------------------------------------------------------------
OFieldDescControl::~OFieldDescControl()
{
DBG_DTOR(OFieldDescControl,NULL);
{
SAL_WNODEPRECATED_DECLARATIONS_PUSH
::std::auto_ptr<Window> aTemp(m_pVertScroll);
SAL_WNODEPRECATED_DECLARATIONS_POP
m_pVertScroll = NULL;
}
{
SAL_WNODEPRECATED_DECLARATIONS_PUSH
::std::auto_ptr<Window> aTemp(m_pHorzScroll);
SAL_WNODEPRECATED_DECLARATIONS_POP
m_pHorzScroll = NULL;
}
if ( m_bAdded )
::dbaui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
pLastFocusWindow = NULL;
//////////////////////////////////////////////////////////////////////
// Destroy children
DeactivateAggregate( tpDefault );
DeactivateAggregate( tpRequired );
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpNumType );
DeactivateAggregate( tpScale );
DeactivateAggregate( tpLength );
DeactivateAggregate( tpFormat );
DeactivateAggregate( tpAutoIncrement );
DeactivateAggregate( tpBoolDefault );
DeactivateAggregate( tpColumnName );
DeactivateAggregate( tpType );
DeactivateAggregate( tpAutoIncrementValue );
}
//------------------------------------------------------------------------------
String OFieldDescControl::BoolStringPersistent(const String& rUIString) const
{
if (rUIString == aNo)
return OUString('0');
if (rUIString == aYes)
return OUString('1');
return OUString();
}
//------------------------------------------------------------------------------
String OFieldDescControl::BoolStringUI(const String& rPersistentString) const
{
// Older versions may store a language dependend string as a default
if (rPersistentString.Equals(aYes) || rPersistentString.Equals(aNo))
return rPersistentString;
if (comphelper::string::equals(rPersistentString, '0'))
return aNo;
if (comphelper::string::equals(rPersistentString, '1'))
return aYes;
return ModuleRes(STR_VALUE_NONE).toString();
}
//------------------------------------------------------------------------------
void OFieldDescControl::Init()
{
Reference< ::com::sun::star::util::XNumberFormatter > xFormatter = GetFormatter();
::dbaui::setEvalDateFormatForFormatter(xFormatter);
}
//------------------------------------------------------------------------------
IMPL_LINK(OFieldDescControl, OnScroll, ScrollBar*, /*pBar*/)
{
ScrollAllAggregates();
return 0;
}
// -----------------------------------------------------------------------------
namespace
{
void getMaxXPosition(Window* _pWindow,long& _rnMaxXPosition)
{
if (_pWindow)
{
long nTemp = _pWindow->GetSizePixel().Width() + _pWindow->GetPosPixel().X();
_rnMaxXPosition = ::std::max(_rnMaxXPosition, nTemp);
}
}
}
//------------------------------------------------------------------------------
void OFieldDescControl::CheckScrollBars()
{
// Calculate the ScrollBars' new position
Size szOverallSize = GetSizePixel();
long nHScrollHeight = m_pHorzScroll->GetSizePixel().Height();
long nVScrollWidth = m_pVertScroll->GetSizePixel().Width();
long nNewHWidth = szOverallSize.Width() - nVScrollWidth;
long nNewVHeight = szOverallSize.Height() - nHScrollHeight;
sal_Bool bNeedHScrollBar(sal_False), bNeedVScrollBar(sal_False);
// Adjust the areas
// Do I actually need ScrollBars?
// horizontal :
long lMaxXPosition = 0;
Control* ppAggregates[] = { pRequired, pNumType, pAutoIncrement, pDefault, pTextLen, pLength, pScale, pFormat, m_pColumnName, m_pType,m_pAutoIncrementValue};
for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
getMaxXPosition(ppAggregates[i],lMaxXPosition);
if (m_pHorzScroll)
lMaxXPosition += m_pHorzScroll->GetThumbPos() * HSCROLL_STEP;
long lMaxXAvailable = szOverallSize.Width();
bNeedHScrollBar = lMaxXPosition > lMaxXAvailable;
// Might change
// Vertical
// How many Controls do I have?
sal_uInt16 nActive = CountActiveAggregates();
// Which one is the last one that fits?
sal_uInt16 nLastVisible;
const sal_Int32 nControlHeight = GetMaxControlHeight();
const sal_Int32 nControl_Spacing_y = LogicToPixel(Size(0, CONTROL_SPACING_Y),MAP_APPFONT).Height();
if (bNeedHScrollBar)
nLastVisible = static_cast<sal_uInt16>((szOverallSize.Height() - nControl_Spacing_y - nHScrollHeight) / (nControl_Spacing_y + nControlHeight));
else
nLastVisible = static_cast<sal_uInt16>((szOverallSize.Height() - nControl_Spacing_y) / (nControl_Spacing_y + nControlHeight));
bNeedVScrollBar = nActive>nLastVisible;
if (bNeedVScrollBar)
{
// When originally calculating lMaxXAvailable we did not take into account that we have a VScrollBar, so we need to do that now
lMaxXAvailable -= nVScrollWidth;
if (!bNeedHScrollBar && (lMaxXPosition > lMaxXAvailable))
{
// The vertical one now necessitates a horizontal one
bNeedHScrollBar = sal_True;
// Adjust nLastVisible
nLastVisible = static_cast<sal_uInt16>((szOverallSize.Height() - nControl_Spacing_y - nHScrollHeight) / (nControl_Spacing_y + nControlHeight));
// bNeedVScrollBar does NOT change: it's already set to sal_True and nLastVisible will only decrease
}
}
// Now we can really position them and set their parameters
if (bNeedVScrollBar)
{
m_pVertScroll->Show();
m_pVertScroll->SetRangeMax(nActive - nLastVisible);
m_pVertScroll->SetPosSizePixel( Point(nNewHWidth, 0), Size(nVScrollWidth, szOverallSize.Height()) );
}
else
{
m_pVertScroll->Hide();
m_pVertScroll->SetRangeMax(0);
m_pVertScroll->SetThumbPos(0);
}
if (bNeedHScrollBar)
{
m_pHorzScroll->Show();
m_pHorzScroll->SetRangeMax((lMaxXPosition - lMaxXAvailable + HSCROLL_STEP - 1 )/HSCROLL_STEP);
m_pHorzScroll->SetPosSizePixel( Point(0, nNewVHeight), Size(bNeedVScrollBar ? nNewHWidth : szOverallSize.Width(), nHScrollHeight) );
}
else
{
m_pHorzScroll->Hide();
m_pHorzScroll->SetRangeMax(0);
m_pHorzScroll->SetThumbPos(0);
}
}
//------------------------------------------------------------------------------
void OFieldDescControl::Resize()
{
CheckScrollBars();
ScrollAllAggregates();
}
//------------------------------------------------------------------------------
inline void OFieldDescControl::ScrollAggregate(Control* pText, Control* pInput, Control* pButton, long nDeltaX, long nDeltaY)
{
if (!pText)
return;
pText->SetPosPixel(pText->GetPosPixel() + Point(nDeltaX, nDeltaY));
pInput->SetPosPixel(pInput->GetPosPixel() + Point(nDeltaX, nDeltaY));
if (pButton)
pButton->SetPosPixel(pButton->GetPosPixel() + Point(nDeltaX, nDeltaY));
}
//------------------------------------------------------------------------------
void OFieldDescControl::ScrollAllAggregates()
{
long nDeltaX = 0, nDeltaY = 0;
if (m_nOldHThumb != m_pHorzScroll->GetThumbPos())
{
nDeltaX = (m_nOldHThumb - m_pHorzScroll->GetThumbPos()) * HSCROLL_STEP;
m_nOldHThumb = m_pHorzScroll->GetThumbPos();
}
if (m_nOldVThumb != m_pVertScroll->GetThumbPos())
{
const sal_Int32 nControlHeight = GetMaxControlHeight();
const sal_Int32 nControl_Spacing_y = LogicToPixel(Size(0, CONTROL_SPACING_Y),MAP_APPFONT).Height();
nDeltaY = (m_nOldVThumb - m_pVertScroll->GetThumbPos()) * (nControl_Spacing_y + nControlHeight);
m_nOldVThumb = m_pVertScroll->GetThumbPos();
}
if (nDeltaX || nDeltaY)
{
Control* ppAggregates[] = { pRequired, pNumType
, pAutoIncrement, pDefault
, pTextLen, pLength
, pScale, m_pColumnName
, m_pType, m_pAutoIncrementValue};
Control* ppAggregatesText[] = { pRequiredText, pNumTypeText
, pAutoIncrementText, pDefaultText
, pTextLenText, pLengthText
, pScaleText, m_pColumnNameText
, m_pTypeText, m_pAutoIncrementValueText};
OSL_ENSURE(sizeof(ppAggregates)/sizeof(ppAggregates[0]) == sizeof(ppAggregatesText)/sizeof(ppAggregatesText[0]),"Lists are not identical!");
for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
ScrollAggregate(ppAggregatesText[i],ppAggregates[i],NULL,nDeltaX, nDeltaY);
ScrollAggregate(pFormatText,pFormatSample,pFormat,nDeltaX, nDeltaY);
}
}
//------------------------------------------------------------------------------
sal_uInt16 OFieldDescControl::CountActiveAggregates() const
{
Control* ppAggregates[] = { pRequired, pNumType, pAutoIncrement, pDefault, pTextLen, pLength, pScale, pFormat, m_pColumnName, m_pType,m_pAutoIncrementValue};
sal_uInt16 nVisibleAggregates = 0;
for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
if (ppAggregates[i])
++nVisibleAggregates;
return nVisibleAggregates;
}
//------------------------------------------------------------------------------
sal_Int32 OFieldDescControl::GetMaxControlHeight() const
{
Size aHeight;
Control* ppAggregates[] = { pRequired, pNumType, pAutoIncrement, pDefault, pTextLen, pLength, pScale, pFormat, m_pColumnName, m_pType,m_pAutoIncrementValue};
for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
{
if ( ppAggregates[i] )
{
const Size aTemp(ppAggregates[i]->GetOptimalSize());
if ( aTemp.Height() > aHeight.Height() )
aHeight.Height() = aTemp.Height();
}
}
return aHeight.Height();
}
//------------------------------------------------------------------------------
void OFieldDescControl::SetReadOnly( sal_Bool bReadOnly )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Enable/disable Controls
Control* ppAggregates[] = { pRequired, pNumType
, pAutoIncrement, pDefault
, pTextLen, pLength
, pScale, m_pColumnName
, m_pType, m_pAutoIncrementValue
, pFormat};
Control* ppAggregatesText[] = { pRequiredText, pNumTypeText
, pAutoIncrementText, pDefaultText
, pTextLenText, pLengthText
, pScaleText, m_pColumnNameText
, m_pTypeText, m_pAutoIncrementValueText
, pFormatText};
OSL_ENSURE(sizeof(ppAggregates)/sizeof(ppAggregates[0]) == sizeof(ppAggregatesText)/sizeof(ppAggregatesText[0]),"Lists are not identical!");
for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
{
if ( ppAggregatesText[i] )
ppAggregatesText[i]->Enable( !bReadOnly );
if ( ppAggregates[i] )
ppAggregates[i]->Enable( !bReadOnly );
}
}
//------------------------------------------------------------------------------
String OFieldDescControl::GetControlText( sal_uInt16 nControlId )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Read out the Controls' texts
switch( nControlId )
{
case FIELD_PROPERTY_BOOL_DEFAULT:
if (pBoolDefault)
return pBoolDefault->GetSelectEntry();
break;
case FIELD_PROPERTY_DEFAULT:
if (pDefault)
return pDefault->GetText();
break;
case FIELD_PROPERTY_REQUIRED:
if (pRequired)
return pRequired->GetSelectEntry();
break;
case FIELD_PROPERTY_TEXTLEN:
if (pTextLen)
return OUString::valueOf(static_cast<sal_Int64>(pTextLen->GetValue()));
case FIELD_PROPERTY_NUMTYPE:
if (pNumType)
return pNumType->GetSelectEntry();
break;
case FIELD_PROPERTY_AUTOINC:
if (pAutoIncrement)
return pAutoIncrement->GetSelectEntry();
break;
case FIELD_PROPERTY_LENGTH:
if (pLength)
return pLength->GetText();
break;
case FIELD_PROPERTY_SCALE:
if (pScale)
return pScale->GetText();
break;
case FIELD_PROPERTY_FORMAT:
if (pFormatSample)
return pFormatSample->GetText();
break;
case FIELD_PRPOERTY_COLUMNNAME:
if(m_pColumnName)
return m_pColumnName->GetText();
case FIELD_PRPOERTY_TYPE:
if(m_pType)
return m_pType->GetSelectEntry();
break;
case FIELD_PRPOERTY_AUTOINCREMENT:
if(m_pAutoIncrementValue)
return m_pAutoIncrementValue->GetText();
}
return String();
}
//------------------------------------------------------------------------------
void OFieldDescControl::SetControlText( sal_uInt16 nControlId, const String& rText )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Set the Controls' texts
switch( nControlId )
{
case FIELD_PROPERTY_BOOL_DEFAULT:
if (pBoolDefault)
{
String sOld = pBoolDefault->GetSelectEntry();
pBoolDefault->SelectEntry(rText);
if (!sOld.Equals(rText))
LINK(this, OFieldDescControl, ChangeHdl).Call(pBoolDefault);
}
break;
case FIELD_PROPERTY_DEFAULT:
if (pDefault)
{
pDefault->SetText(rText);
UpdateFormatSample(pActFieldDescr);
}
break;
case FIELD_PROPERTY_REQUIRED:
if (pRequired)
pRequired->SelectEntry(rText);
break;
case FIELD_PROPERTY_TEXTLEN:
if (pTextLen)
pTextLen->SetText(rText);
break;
case FIELD_PROPERTY_NUMTYPE:
if (pNumType)
pNumType->SelectEntry(rText);
break;
case FIELD_PROPERTY_AUTOINC:
if (pAutoIncrement)
{
String sOld = pAutoIncrement->GetSelectEntry();
pAutoIncrement->SelectEntry(rText);
if (!sOld.Equals(rText))
LINK(this, OFieldDescControl, ChangeHdl).Call(pAutoIncrement);
}
break;
case FIELD_PROPERTY_LENGTH:
if (pLength)
pLength->SetText(rText);
break;
case FIELD_PROPERTY_SCALE:
if (pScale)
pScale->SetText(rText);
break;
case FIELD_PROPERTY_FORMAT:
if (pActFieldDescr)
UpdateFormatSample(pActFieldDescr);
break;
case FIELD_PRPOERTY_COLUMNNAME:
if(m_pColumnName)
m_pColumnName->SetText(rText);
break;
case FIELD_PRPOERTY_TYPE:
if(m_pType)
m_pType->SelectEntry(rText);
break;
case FIELD_PRPOERTY_AUTOINCREMENT:
if(m_pAutoIncrementValue)
m_pAutoIncrementValue->SetText(rText);
break;
}
}
//------------------------------------------------------------------------
IMPL_LINK( OFieldDescControl, FormatClickHdl, Button *, /*pButton*/ )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Create temporary Column, which is used for data exchange with Dialog
if( !pActFieldDescr )
return 0;
sal_Int32 nOldFormatKey(pActFieldDescr->GetFormatKey());
SvxCellHorJustify rOldJustify = pActFieldDescr->GetHorJustify();
Reference< XNumberFormatsSupplier > xSupplier = GetFormatter()->getNumberFormatsSupplier();
SvNumberFormatsSupplierObj* pSupplierImpl = SvNumberFormatsSupplierObj::getImplementation( xSupplier );
SvNumberFormatter* pFormatter = pSupplierImpl->GetNumberFormatter();
sal_uInt16 nFlags;
if(::dbaui::callColumnFormatDialog(this,pFormatter,pActFieldDescr->GetType(),nOldFormatKey,rOldJustify,nFlags,sal_True))
{
sal_Bool bModified = sal_False;
if(nOldFormatKey != pActFieldDescr->GetFormatKey())
{
pActFieldDescr->SetFormatKey( nOldFormatKey );
bModified = sal_True;
}
if(rOldJustify != pActFieldDescr->GetHorJustify())
{
pActFieldDescr->SetHorJustify( rOldJustify );
bModified = sal_True;
}
if(bModified)
{
SetModified(sal_True);
UpdateFormatSample(pActFieldDescr);
}
}
return 0;
}
// -----------------------------------------------------------------------
void OFieldDescControl::SetModified(sal_Bool /*bModified*/)
{
}
//------------------------------------------------------------------------
IMPL_LINK( OFieldDescControl, ChangeHdl, ListBox *, pListBox )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
if ( !pActFieldDescr )
return 0;
if ( pListBox->GetSavedValue() != pListBox->GetSelectEntryPos() )
SetModified(sal_True);
// Special treatment for Boold fields
if(pListBox == pRequired && pBoolDefault )
{
// If pRequired = sal_True then the sal_Bool field must NOT contain <<none>>
String sDef = BoolStringUI(::comphelper::getString(pActFieldDescr->GetControlDefault()));
if(pRequired->GetSelectEntryPos() == 0) // Yes
{
pBoolDefault->RemoveEntry(String(ModuleRes(STR_VALUE_NONE)));
if (!sDef.Equals(aYes) && !sDef.Equals(aNo))
pBoolDefault->SelectEntryPos(1); // No as a default
else
pBoolDefault->SelectEntry(sDef);
}
else if(pBoolDefault->GetEntryCount() < 3)
{
pBoolDefault->InsertEntry(String(ModuleRes(STR_VALUE_NONE)));
pBoolDefault->SelectEntry(sDef);
}
}
// A special treatment only for AutoIncrement
if (pListBox == pAutoIncrement)
{
if(pListBox->GetSelectEntryPos() == 1)
{ // no
DeactivateAggregate( tpAutoIncrementValue );
if(pActFieldDescr->IsPrimaryKey())
DeactivateAggregate( tpRequired );
else if( pActFieldDescr->getTypeInfo()->bNullable )
{
ActivateAggregate( tpRequired );
if(pRequired)
{
if( pActFieldDescr->IsNullable() )
pRequired->SelectEntryPos( 1 ); // no
else
pRequired->SelectEntryPos( 0 ); // yes
}
}
ActivateAggregate( tpDefault );
}
else
{
DeactivateAggregate( tpRequired );
DeactivateAggregate( tpDefault );
ActivateAggregate( tpAutoIncrementValue );
}
// Move all up
ArrangeAggregates();
}
if(pListBox == m_pType)
{
TOTypeInfoSP pTypeInfo = getTypeInfo(m_pType->GetSelectEntryPos());
pActFieldDescr->FillFromTypeInfo(pTypeInfo,sal_True,sal_False); // SetType(pTypeInfo);
DisplayData(pActFieldDescr);
CellModified(-1, m_pType->GetPos());
}
return 0;
}
//------------------------------------------------------------------------------
// Rearrange all Controls, such that they are in fixed order and really on top
// of the DescriptionPage
void OFieldDescControl::ArrangeAggregates()
{
DBG_CHKTHIS(OFieldDescControl,NULL);
// A Control's description
struct AGGREGATE_DESCRIPTION
{
Control* pctrlInputControl; // The actual Control for input
Control* pctrlTextControl; // The corresponding Label
sal_uInt16 nPosSizeArgument; // The second argument for SetPosSize
};
AGGREGATE_DESCRIPTION adAggregates[] = {
{ m_pColumnName, m_pColumnNameText, 1},
{ m_pType, m_pTypeText, 1},
{ pAutoIncrement, pAutoIncrementText, 1 },
{ m_pAutoIncrementValue, m_pAutoIncrementValueText, 3 },
{ pNumType, pNumTypeText, 1 },
{ pRequired, pRequiredText, 1 },
{ pTextLen, pTextLenText, 1 },
{ pLength, pLengthText, 1 },
{ pScale, pScaleText, 1 },
{ pDefault, pDefaultText, 3 },
{ pFormatSample, pFormatText, 4 },
{ pBoolDefault, pBoolDefaultText, 1 },
};
long nMaxWidth = 0;
for (size_t i=0; i<sizeof(adAggregates)/sizeof(adAggregates[0]); i++)
{
if (adAggregates[i].pctrlTextControl)
{
nMaxWidth = ::std::max<long>(OutputDevice::GetTextWidth(adAggregates[i].pctrlTextControl->GetText()),nMaxWidth);
}
}
OSL_ENSURE(nMaxWidth != 0,"Invalid width!");
// And go ...
int nCurrentControlPos = 0;
Control* pZOrderPredecessor = NULL;
for (size_t i=0; i<sizeof(adAggregates)/sizeof(adAggregates[0]); i++)
{
if (adAggregates[i].pctrlInputControl)
{
SetPosSize(&adAggregates[i].pctrlTextControl, nCurrentControlPos, 0);
SetPosSize(&adAggregates[i].pctrlInputControl, nCurrentControlPos, adAggregates[i].nPosSizeArgument);
// Set the z-order in a way such that the Controls can be traversed in the same sequence in which they have been arranged here
adAggregates[i].pctrlTextControl->SetZOrder(pZOrderPredecessor, pZOrderPredecessor ? WINDOW_ZORDER_BEHIND : WINDOW_ZORDER_FIRST);
adAggregates[i].pctrlInputControl->SetZOrder(adAggregates[i].pctrlTextControl, WINDOW_ZORDER_BEHIND );
pZOrderPredecessor = adAggregates[i].pctrlInputControl;
if (adAggregates[i].pctrlInputControl == pFormatSample)
{
pFormat->SetZOrder(pZOrderPredecessor, WINDOW_ZORDER_BEHIND);
pZOrderPredecessor = pFormat;
}
++nCurrentControlPos;
}
}
// Special treatment for the Format Controls
if (pFormat)
{
Point ptSamplePos(pFormatSample->GetPosPixel());
Size szSampleSize(pFormatSample->GetSizePixel());
pFormat->SetPosPixel(Point(ptSamplePos.X() + szSampleSize.Width() + 5, ptSamplePos.Y()));
}
// Finally, put the ScrollBars at the top of the z-order
m_pVertScroll->SetZOrder(NULL, WINDOW_ZORDER_FIRST);
m_pHorzScroll->SetZOrder(NULL, WINDOW_ZORDER_FIRST);
}
//------------------------------------------------------------------------------
void OFieldDescControl::ActivateAggregate( EControlType eType )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Create Controls
switch( eType )
{
case tpDefault:
if( pDefault )
return;
m_nPos++;
pDefaultText = CreateText(STR_DEFAULT_VALUE);
pDefault = new OPropEditCtrl( this, STR_HELP_DEFAULT_VALUE, FIELD_PROPERTY_DEFAULT, WB_BORDER );
InitializeControl(pDefault,HID_TAB_ENT_DEFAULT,false);
break;
case tpAutoIncrementValue:
if( m_pAutoIncrementValue || !isAutoIncrementValueEnabled() )
return;
m_nPos++;
m_pAutoIncrementValueText = CreateText(STR_AUTOINCREMENT_VALUE);
m_pAutoIncrementValue = new OPropEditCtrl( this, STR_HELP_AUTOINCREMENT_VALUE, FIELD_PRPOERTY_AUTOINCREMENT, WB_BORDER );
m_pAutoIncrementValue->SetText( getAutoIncrementValue() );
InitializeControl(m_pAutoIncrementValue,HID_TAB_AUTOINCREMENTVALUE,false);
break;
case tpRequired:
{
if( pRequired )
return;
Reference< XDatabaseMetaData> xMetaData = getMetaData();
if(xMetaData.is() && xMetaData->supportsNonNullableColumns())
{
m_nPos++;
pRequiredText = CreateText(STR_FIELD_REQUIRED);
pRequired = new OPropListBoxCtrl( this, STR_HELP_FIELD_REQUIRED, FIELD_PROPERTY_REQUIRED, WB_DROPDOWN);
pRequired->InsertEntry( aYes );
pRequired->InsertEntry( aNo );
pRequired->SelectEntryPos(1);
InitializeControl(pRequired,HID_TAB_ENT_REQUIRED,true);
}
}
break;
case tpAutoIncrement:
{
if( pAutoIncrement )
return;
m_nPos++;
pAutoIncrementText = CreateText(STR_FIELD_AUTOINCREMENT);
pAutoIncrement = new OPropListBoxCtrl( this, STR_HELP_AUTOINCREMENT, FIELD_PROPERTY_AUTOINC, WB_DROPDOWN );
pAutoIncrement->InsertEntry( aYes );
pAutoIncrement->InsertEntry( aNo );
pAutoIncrement->SelectEntryPos(0);
InitializeControl(pAutoIncrement,HID_TAB_ENT_AUTOINCREMENT,true);
}
break;
case tpTextLen:
if( pTextLen )
return;
m_nPos++;
pTextLenText = CreateText(STR_TEXT_LENGTH);
pTextLen = CreateNumericControl(STR_HELP_TEXT_LENGTH, FIELD_PROPERTY_TEXTLEN,HID_TAB_ENT_TEXT_LEN);
break;
case tpType:
if( m_pType)
return;
m_nPos++;
m_pTypeText = CreateText(STR_TAB_FIELD_DATATYPE);
m_pType = new OPropListBoxCtrl( this, STR_HELP_AUTOINCREMENT, FIELD_PRPOERTY_TYPE, WB_DROPDOWN );
m_pType->SetDropDownLineCount(20);
{
const OTypeInfoMap* pTypeInfo = getTypeInfo();
OTypeInfoMap::const_iterator aIter = pTypeInfo->begin();
OTypeInfoMap::const_iterator aEnd = pTypeInfo->end();
for(;aIter != aEnd;++aIter)
m_pType->InsertEntry( aIter->second->aUIName );
}
m_pType->SelectEntryPos(0);
InitializeControl(m_pType,HID_TAB_ENT_TYPE,true);
break;
case tpColumnName:
if( m_pColumnName )
return;
m_nPos++;
{
sal_uInt32 nMax = EDIT_NOLIMIT;
OUString aTmpString;
try
{
Reference< XDatabaseMetaData> xMetaData = getMetaData();
if ( xMetaData.is() )
{
nMax = xMetaData->getMaxColumnNameLength();
aTmpString = xMetaData->getExtraNameCharacters();
}
}
catch(Exception&)
{
DBG_UNHANDLED_EXCEPTION();
}
m_pColumnNameText = CreateText(STR_TAB_FIELD_NAME);
m_pColumnName = new OPropColumnEditCtrl( this,
aTmpString,
STR_HELP_DEFAULT_VALUE,
FIELD_PRPOERTY_COLUMNNAME,
WB_BORDER );
m_pColumnName->SetMaxTextLen(xub_StrLen( nMax ? nMax : EDIT_NOLIMIT));
m_pColumnName->setCheck( isSQL92CheckEnabled(getConnection()) );
}
InitializeControl(m_pColumnName,HID_TAB_ENT_COLUMNNAME,false);
break;
case tpNumType:
if( pNumType )
return;
m_nPos++;
pNumTypeText = CreateText(STR_NUMERIC_TYPE);
pNumType = new OPropListBoxCtrl( this, STR_HELP_NUMERIC_TYPE, FIELD_PROPERTY_NUMTYPE, WB_DROPDOWN );
pNumType->SetDropDownLineCount(5);
pNumType->InsertEntry( OUString("Byte") );
pNumType->InsertEntry( OUString("SmallInt") );
pNumType->InsertEntry( OUString("Integer") );
pNumType->InsertEntry( OUString("Single") );
pNumType->InsertEntry( OUString("Double") );
pNumType->SelectEntryPos(2);
InitializeControl(pNumType,HID_TAB_ENT_NUMTYP,true);
break;
case tpLength:
if( pLength )
return;
m_nPos++;
pLengthText = CreateText(STR_LENGTH);
pLength = CreateNumericControl(STR_HELP_LENGTH, FIELD_PROPERTY_LENGTH,HID_TAB_ENT_LEN);
break;
case tpScale:
if( pScale )
return;
m_nPos++;
pScaleText = CreateText(STR_SCALE);
pScale = CreateNumericControl(STR_HELP_SCALE, FIELD_PROPERTY_SCALE,HID_TAB_ENT_SCALE);
break;
case tpFormat:
if (!pFormat)
{
m_nPos++;
pFormatText = CreateText(STR_FORMAT);
pFormatSample = new OPropEditCtrl( this, STR_HELP_FORMAT_CODE, -1, WB_BORDER );
pFormatSample->SetReadOnly(sal_True);
pFormatSample->Enable(sal_False);
InitializeControl(pFormatSample,HID_TAB_ENT_FORMAT_SAMPLE,false);
pFormat = new PushButton( this, ModuleRes(PB_FORMAT) );
const sal_Int32 nControlHeight = GetMaxControlHeight();
pFormat->SetSizePixel(Size(nControlHeight, nControlHeight));
pFormat->SetClickHdl( LINK( this, OFieldDescControl, FormatClickHdl ) );
InitializeControl(pFormat,HID_TAB_ENT_FORMAT,false);
}
UpdateFormatSample(pActFieldDescr);
break;
case tpBoolDefault:
if (pBoolDefault)
return;
m_nPos++;
pBoolDefaultText = CreateText(STR_DEFAULT_VALUE);
pBoolDefault = new OPropListBoxCtrl( this, STR_HELP_BOOL_DEFAULT, FIELD_PROPERTY_BOOL_DEFAULT, WB_DROPDOWN );
pBoolDefault->SetDropDownLineCount(3);
pBoolDefault->InsertEntry(String(ModuleRes(STR_VALUE_NONE)));
pBoolDefault->InsertEntry(aYes);
pBoolDefault->InsertEntry(aNo);
InitializeControl(pBoolDefault,HID_TAB_ENT_BOOL_DEFAULT,false);
break;
}
}
// -----------------------------------------------------------------------------
void OFieldDescControl::InitializeControl(Control* _pControl,const OString& _sHelpId,bool _bAddChangeHandler)
{
_pControl->SetHelpId(_sHelpId);
if ( _bAddChangeHandler )
((OPropListBoxCtrl*)_pControl)->SetSelectHdl(LINK(this,OFieldDescControl,ChangeHdl));
_pControl->SetGetFocusHdl(LINK(this, OFieldDescControl, OnControlFocusGot));
_pControl->SetLoseFocusHdl(LINK(this, OFieldDescControl, OnControlFocusLost));
_pControl->EnableClipSiblings();
}
// -----------------------------------------------------------------------------
FixedText* OFieldDescControl::CreateText(sal_uInt16 _nTextRes)
{
FixedText* pFixedText = new FixedText( this );
pFixedText->SetText( ModuleRes(_nTextRes) );
pFixedText->EnableClipSiblings();
return pFixedText;
}
// -----------------------------------------------------------------------------
OPropNumericEditCtrl* OFieldDescControl::CreateNumericControl(sal_uInt16 _nHelpStr,short _nProperty,const OString& _sHelpId)
{
OPropNumericEditCtrl* pControl = new OPropNumericEditCtrl( this, _nHelpStr, _nProperty, WB_BORDER );
pControl->SetDecimalDigits(0);
pControl->SetMin(0);
pControl->SetMax(0x7FFFFFFF); // Should be changed outside, if needed
pControl->SetStrictFormat(sal_True);
InitializeControl(pControl,_sHelpId,false);
return pControl;
}
//------------------------------------------------------------------------------
void OFieldDescControl::DeactivateAggregate( EControlType eType )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
pLastFocusWindow = NULL;
//////////////////////////////////////////////////////////////////////
// Destroy Controls
switch( eType )
{
case tpDefault:
lcl_HideAndDeleteControl(m_nPos,&pDefault,&pDefaultText);
break;
case tpAutoIncrementValue:
lcl_HideAndDeleteControl(m_nPos,&m_pAutoIncrementValue,&m_pAutoIncrementValueText);
break;
case tpColumnName:
lcl_HideAndDeleteControl(m_nPos,&m_pColumnName,&m_pColumnNameText);
break;
case tpType:
lcl_HideAndDeleteControl(m_nPos,&m_pType,&m_pTypeText);
break;
case tpAutoIncrement:
lcl_HideAndDeleteControl(m_nPos,&pAutoIncrement,&pAutoIncrementText);
break;
case tpRequired:
lcl_HideAndDeleteControl(m_nPos,&pRequired,&pRequiredText);
break;
case tpTextLen:
lcl_HideAndDeleteControl(m_nPos,&pTextLen,&pTextLenText);
break;
case tpNumType:
lcl_HideAndDeleteControl(m_nPos,&pNumType,&pNumTypeText);
break;
case tpLength:
lcl_HideAndDeleteControl(m_nPos,&pLength,&pLengthText);
break;
case tpScale:
lcl_HideAndDeleteControl(m_nPos,&pScale,&pScaleText);
break;
case tpFormat:
// TODO: we have to check if we have to increment m_nPos again
lcl_HideAndDeleteControl(m_nPos,&pFormat,&pFormatText);
if ( pFormatSample )
{
pFormatSample->Hide();
delete pFormatSample;
pFormatSample = NULL;
}
break;
case tpBoolDefault:
lcl_HideAndDeleteControl(m_nPos,&pBoolDefault,&pBoolDefaultText);
break;
}
}
//------------------------------------------------------------------------------
void OFieldDescControl::SetPosSize( Control** ppControl, long nRow, sal_uInt16 nCol )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Calculate size
const sal_Int32 nControlHeight = GetMaxControlHeight();
Size aSize(0,nControlHeight);
if ( isRightAligned() && nCol )
aSize.Width() = LogicToPixel(Size(m_nWidth, 0),MAP_APPFONT).Width();
else
{
switch( nCol )
{
case 0:
default:
aSize.Width() = CONTROL_WIDTH_1;
break;
case 1:
aSize.Width() = CONTROL_WIDTH_2;
break;
case 3:
aSize.Width() = CONTROL_WIDTH_3;
break;
case 4:
aSize.Width() = CONTROL_WIDTH_4;
break;
}
}
//////////////////////////////////////////////////////////////////////
// Calculate Position
Point aPosition;
switch( nCol )
{
case 0:
aPosition.X() = 0;
aPosition.Y() = 1;
break;
case 1:
case 3:
case 4:
if ( isRightAligned() )
{
Size aOwnSize = GetSizePixel();
aPosition.X() = aOwnSize.Width() - aSize.Width();
}
else
aPosition.X() = CONTROL_WIDTH_1 + CONTROL_SPACING_X;
break;
default:
aPosition.X() = 0;
}
(*ppControl)->SetSizePixel( aSize );
aSize = (*ppControl)->GetSizePixel( );
const sal_Int32 nControl_Spacing_y = LogicToPixel(Size(0, CONTROL_SPACING_Y),MAP_APPFONT).Height();
aPosition.Y() += ((nRow+1)*nControl_Spacing_y) +
(nRow*nControlHeight);
//////////////////////////////////////////////////////////////////////
// Display Control
(*ppControl)->SetPosSizePixel( aPosition, aSize );
aSize = (*ppControl)->GetSizePixel();
(*ppControl)->Show();
}
//------------------------------------------------------------------------------
void OFieldDescControl::DisplayData(OFieldDescription* pFieldDescr )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
pActFieldDescr = pFieldDescr;
if(!pFieldDescr)
{
DeactivateAggregate( tpDefault );
DeactivateAggregate( tpRequired );
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpNumType );
DeactivateAggregate( tpScale );
DeactivateAggregate( tpLength );
DeactivateAggregate( tpFormat );
DeactivateAggregate( tpAutoIncrement );
DeactivateAggregate( tpBoolDefault );
DeactivateAggregate( tpColumnName );
DeactivateAggregate( tpType );
DeactivateAggregate( tpAutoIncrementValue );
m_pPreviousType = TOTypeInfoSP();
//////////////////////////////////////////////////////////////////////
// Reset the saved focus' pointer
pLastFocusWindow = NULL;
if ( m_bAdded )
{
::dbaui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
m_bAdded = sal_False;
}
return;
}
if ( !m_bAdded )
{
::dbaui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::AddWindow));
m_bAdded = sal_True;
}
TOTypeInfoSP pFieldType;
if( pFieldDescr )
pFieldType = pFieldDescr->getTypeInfo();
ActivateAggregate( tpColumnName );
ActivateAggregate( tpType );
OSL_ENSURE(pFieldType.get(),"We need a type information here!");
//////////////////////////////////////////////////////////////////////
// If the type has changed, subsitute Controls
if( m_pPreviousType != pFieldType )
{
//////////////////////////////////////////////////////////////////////
// Reset the saved focus' pointer
pLastFocusWindow = NULL;
//////////////////////////////////////////////////////////////////////
// Controls, which must NOT be displayed again
DeactivateAggregate( tpNumType );
//////////////////////////////////////////////////////////////////////
// determine which controls we should show and which not
// 1. the required control
if ( pFieldType->bNullable )
ActivateAggregate( tpRequired );
else
DeactivateAggregate( tpRequired );
// 2. the autoincrement
if ( pFieldType->bAutoIncrement )
{
DeactivateAggregate( tpRequired );
DeactivateAggregate( tpDefault );
ActivateAggregate( tpAutoIncrement );
ActivateAggregate( tpAutoIncrementValue );
}
else
{
DeactivateAggregate( tpAutoIncrement );
DeactivateAggregate( tpAutoIncrementValue );
if(pFieldType->bNullable)
ActivateAggregate( tpRequired );
else
DeactivateAggregate( tpRequired );
ActivateAggregate( tpDefault );
}
// 3. the scale and precision
if (pFieldType->nPrecision)
{
ActivateAggregate( tpLength );
pLength->SetMax(::std::max<sal_Int32>(pFieldType->nPrecision,pFieldDescr->GetPrecision()));
pLength->SetSpecialReadOnly(pFieldType->aCreateParams.isEmpty());
}
else
DeactivateAggregate( tpLength );
if (pFieldType->nMaximumScale)
{
ActivateAggregate( tpScale );
pScale->SetMax(::std::max<sal_Int32>(pFieldType->nMaximumScale,pFieldDescr->GetScale()));
pScale->SetMin(pFieldType->nMinimumScale);
static const OUString s_sPRECISION("PRECISION");
pScale->SetSpecialReadOnly(pFieldType->aCreateParams.isEmpty() || pFieldType->aCreateParams == s_sPRECISION);
}
else
DeactivateAggregate( tpScale );
// and now look for type specific things
switch( pFieldType->nType )
{
case DataType::CHAR:
case DataType::VARCHAR:
case DataType::LONGVARCHAR:
DeactivateAggregate( tpLength );
DeactivateAggregate( tpBoolDefault );
ActivateAggregate( tpDefault );
ActivateAggregate( tpFormat );
if (pFieldType->nPrecision)
{
ActivateAggregate( tpTextLen );
pTextLen->SetMax(::std::max<sal_Int32>(pFieldType->nPrecision,pFieldDescr->GetPrecision()));
pTextLen->SetSpecialReadOnly(pFieldType->aCreateParams.isEmpty());
}
else
DeactivateAggregate( tpTextLen );
break;
case DataType::DATE:
case DataType::TIME:
case DataType::TIMESTAMP:
DeactivateAggregate( tpLength ); // we don't need a length for date types
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpBoolDefault );
ActivateAggregate( tpDefault );
ActivateAggregate( tpFormat );
break;
case DataType::BIT:
if ( !pFieldType->aCreateParams.isEmpty() )
{
DeactivateAggregate( tpFormat );
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpBoolDefault );
break;
}
// run through
case DataType::BOOLEAN:
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpFormat );
DeactivateAggregate( tpDefault );
ActivateAggregate( tpBoolDefault );
break;
case DataType::DECIMAL:
case DataType::NUMERIC:
case DataType::BIGINT:
case DataType::FLOAT:
case DataType::DOUBLE:
case DataType::TINYINT:
case DataType::SMALLINT:
case DataType::INTEGER:
case DataType::REAL:
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpBoolDefault );
ActivateAggregate( tpFormat );
break;
case DataType::BINARY:
case DataType::VARBINARY:
DeactivateAggregate( tpDefault );
DeactivateAggregate( tpRequired );
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpBoolDefault );
ActivateAggregate( tpFormat );
break;
case DataType::LONGVARBINARY:
case DataType::SQLNULL:
case DataType::OBJECT:
case DataType::DISTINCT:
case DataType::STRUCT:
case DataType::ARRAY:
case DataType::BLOB:
case DataType::CLOB:
case DataType::REF:
case DataType::OTHER:
DeactivateAggregate( tpFormat );
DeactivateAggregate( tpTextLen );
DeactivateAggregate( tpBoolDefault );
break;
default:
OSL_FAIL("Unknown type");
}
m_pPreviousType = pFieldType;
}
if(pFieldDescr)
{
if(pFieldDescr->IsPrimaryKey())
{
DeactivateAggregate( tpRequired );
}
else if ( !pAutoIncrement && pFieldType.get() )
{
if ( pFieldType->bNullable )
ActivateAggregate( tpRequired );
else
DeactivateAggregate( tpRequired );
}
}
//////////////////////////////////////////////////////////////////////
// Initialize Controls
if( pAutoIncrement )
{
if ( pFieldDescr->IsAutoIncrement() )
{
pAutoIncrement->SelectEntryPos( 0 ); // yes
ActivateAggregate( tpAutoIncrementValue );
if ( m_pAutoIncrementValue )
m_pAutoIncrementValue->SetText(pFieldDescr->GetAutoIncrementValue());
DeactivateAggregate( tpRequired );
DeactivateAggregate( tpDefault );
}
else
{
// disable autoincrement value because it should only be visible when autoincrement is to true
DeactivateAggregate( tpAutoIncrementValue );
pAutoIncrement->SelectEntryPos( 1 ); // no
ActivateAggregate( tpDefault );
// Affects pRequired
if(!pFieldDescr->IsPrimaryKey())
ActivateAggregate( tpRequired );
}
}
if( pDefault )
{
pDefault->SetText( getControlDefault(pFieldDescr) );
pDefault->ClearModifyFlag();
}
if( pBoolDefault )
{
// If pRequired = sal_True then the sal_Bool field must NOT contain <<none>>
OUString sValue;
pFieldDescr->GetControlDefault() >>= sValue;
String sDef = BoolStringUI(sValue);
// Make sure that <<none>> is only present if the field can be NULL
if ( ( pFieldType.get() && !pFieldType->bNullable ) || !pFieldDescr->IsNullable() )
{
pFieldDescr->SetIsNullable(ColumnValue::NO_NULLS); // The type says so
pBoolDefault->RemoveEntry(String(ModuleRes(STR_VALUE_NONE)));
if ( !sDef.Equals(aYes) && !sDef.Equals(aNo) )
pBoolDefault->SelectEntryPos(1); // No as a default
else
pBoolDefault->SelectEntry(sDef);
pFieldDescr->SetControlDefault(makeAny(OUString(BoolStringPersistent(pBoolDefault->GetSelectEntry()))));
}
else if(pBoolDefault->GetEntryCount() < 3)
{
pBoolDefault->InsertEntry(String(ModuleRes(STR_VALUE_NONE)));
pBoolDefault->SelectEntry(sDef);
}
else
pBoolDefault->SelectEntry(sDef);
}
if( pRequired )
{
if( pFieldDescr->IsNullable() )
pRequired->SelectEntryPos( 1 ); // no
else
pRequired->SelectEntryPos( 0 ); // yes
}
if( pTextLen )
{
pTextLen->SetText( OUString::number(pFieldDescr->GetPrecision()) );
pTextLen->ClearModifyFlag();
}
if( pNumType )
{
OSL_FAIL("OFieldDescControl::DisplayData: invalid num type!");
}
if( pLength )
pLength->SetText( OUString::number(pFieldDescr->GetPrecision()) );
if( pScale )
pScale->SetText( OUString::number(pFieldDescr->GetScale()) );
if( pFormat )
UpdateFormatSample(pFieldDescr);
if(m_pColumnName)
m_pColumnName->SetText(pFieldDescr->GetName());
if(m_pType)
{
sal_uInt16 nPos = pFieldType.get() ? m_pType->GetEntryPos(String(pFieldDescr->getTypeInfo()->aUIName)) : LISTBOX_ENTRY_NOTFOUND;
if(nPos == LISTBOX_ENTRY_NOTFOUND)
{
const OTypeInfoMap* pMap = getTypeInfo();
OTypeInfoMap::const_iterator aIter = pMap->find(pFieldType.get() ? pFieldDescr->getTypeInfo()->nType : pFieldDescr->GetType());
if(aIter == pMap->end() && !pMap->empty())
{
aIter = pMap->begin();
if(pFieldDescr->GetPrecision() > aIter->second->nPrecision)
pFieldDescr->SetPrecision(aIter->second->nPrecision);
if(pFieldDescr->GetScale() > aIter->second->nMaximumScale)
pFieldDescr->SetScale(0);
if(!aIter->second->bNullable && pFieldDescr->IsNullable())
pFieldDescr->SetIsNullable(ColumnValue::NO_NULLS);
if(!aIter->second->bAutoIncrement && pFieldDescr->IsAutoIncrement())
pFieldDescr->SetAutoIncrement(sal_False);
}
if ( aIter != pMap->end() )
{
pFieldDescr->SetType(aIter->second);
}
}
m_pType->SelectEntry(pFieldDescr->getTypeInfo()->aUIName);
}
//////////////////////////////////////////////////////////////////////
// Enable/disable Controls
sal_Bool bRead(IsReadOnly());
ArrangeAggregates();
CheckScrollBars();
ScrollAllAggregates();
SetReadOnly( bRead );
}
//------------------------------------------------------------------------------
IMPL_LINK(OFieldDescControl, OnControlFocusGot, Control*, pControl )
{
String strHelpText;
OPropNumericEditCtrl* pNumeric = dynamic_cast< OPropNumericEditCtrl* >( pControl );
if ( pNumeric )
{
pNumeric->SaveValue();
strHelpText = pNumeric->GetHelp();
}
OPropColumnEditCtrl* pColumn = dynamic_cast< OPropColumnEditCtrl* >( pControl );
if ( pColumn )
{
pColumn->SaveValue();
strHelpText = pColumn->GetHelp();
}
OPropEditCtrl* pEdit = dynamic_cast< OPropEditCtrl* >( pControl );
if ( pEdit )
{
pEdit->SaveValue();
strHelpText = pEdit->GetHelp();
}
OPropListBoxCtrl* pListBox = dynamic_cast< OPropListBoxCtrl* >( pControl );
if ( pListBox )
{
pListBox->SaveValue();
strHelpText = pListBox->GetHelp();
}
if (pControl == pFormat)
strHelpText =String(ModuleRes(STR_HELP_FORMAT_BUTTON));
if (strHelpText.Len() && (pHelp != NULL))
pHelp->SetHelpText(strHelpText);
m_pActFocusWindow = pControl;
return 0L;
}
//------------------------------------------------------------------------------
IMPL_LINK(OFieldDescControl, OnControlFocusLost, Control*, pControl )
{
if ((pControl == pLength) || (pControl == pTextLen) || (pControl == pScale))
{
OPropNumericEditCtrl* pConverted = (OPropNumericEditCtrl*)pControl;
if (pConverted->IsModified())
CellModified(-1, pConverted->GetPos());
}
if(pControl == m_pColumnName)
{
OPropColumnEditCtrl* pConverted = (OPropColumnEditCtrl*)pControl;
if (pConverted->IsModified())
CellModified(-1, pConverted->GetPos());
}
else if ((pControl == pDefault) || (pControl == pFormatSample) || (pControl == m_pAutoIncrementValue) )
{
OPropEditCtrl* pConverted = (OPropEditCtrl*)pControl;
if (pConverted->IsModified())
CellModified(-1, pConverted->GetPos());
}
else if ((pControl == pRequired) || (pControl == pNumType) || (pControl == pAutoIncrement) || (pControl == pBoolDefault) || (pControl == m_pType))
{
OPropListBoxCtrl* pConverted = (OPropListBoxCtrl*)pControl;
if (pConverted->IsModified())
CellModified(-1, pConverted->GetPos());
}
if (pControl == pDefault)
UpdateFormatSample(pActFieldDescr);
implFocusLost(pControl);
return 0L;
}
//------------------------------------------------------------------------------
void OFieldDescControl::SaveData( OFieldDescription* pFieldDescr )
{
DBG_CHKTHIS(OFieldDescControl,NULL);
if( !pFieldDescr )
return;
//////////////////////////////////////////////////////////////////////
// Read out Controls
OUString sDefault;
if (pDefault)
{
sDefault = pDefault->GetText();
}
else if (pBoolDefault)
{
sDefault = BoolStringPersistent(pBoolDefault->GetSelectEntry());
}
if ( !sDefault.isEmpty() )
pFieldDescr->SetControlDefault(makeAny(sDefault));
else
pFieldDescr->SetControlDefault(Any());
if((pRequired && pRequired->GetSelectEntryPos() == 0) || pFieldDescr->IsPrimaryKey() || (pBoolDefault && pBoolDefault->GetEntryCount() == 2)) // yes
pFieldDescr->SetIsNullable( ColumnValue::NO_NULLS );
else
pFieldDescr->SetIsNullable( ColumnValue::NULLABLE );
if ( pAutoIncrement )
pFieldDescr->SetAutoIncrement( pAutoIncrement->GetSelectEntryPos() == 0 );
if( pTextLen )
pFieldDescr->SetPrecision( static_cast<sal_Int32>(pTextLen->GetValue()) );
else if( pLength )
pFieldDescr->SetPrecision( static_cast<sal_Int32>(pLength->GetValue()) );
if( pScale )
pFieldDescr->SetScale( static_cast<sal_Int32>(pScale->GetValue()) );
if(m_pColumnName)
pFieldDescr->SetName(m_pColumnName->GetText());
if ( m_pAutoIncrementValue && isAutoIncrementValueEnabled() )
pFieldDescr->SetAutoIncrementValue(m_pAutoIncrementValue->GetText());
}
//------------------------------------------------------------------------------
void OFieldDescControl::UpdateFormatSample(OFieldDescription* pFieldDescr)
{
if ( pFieldDescr && pFormatSample )
pFormatSample->SetText(getControlDefault(pFieldDescr,sal_False));
}
//------------------------------------------------------------------------------
void OFieldDescControl::GetFocus()
{
DBG_CHKTHIS(OFieldDescControl,NULL);
//////////////////////////////////////////////////////////////////////
// Set the Focus to the Control that has been active last
TabPage::GetFocus();
if( pLastFocusWindow )
{
pLastFocusWindow->GrabFocus();
pLastFocusWindow = NULL;
}
}
//------------------------------------------------------------------------------
void OFieldDescControl::implFocusLost(Window* _pWhich)
{
DBG_CHKTHIS(OFieldDescControl,NULL);
OSL_ENSURE(!_pWhich || IsChild(_pWhich), "OFieldDescControl::implFocusLost : invalid window !");
//////////////////////////////////////////////////////////////////////
// Remember the active Control
if (!pLastFocusWindow)
pLastFocusWindow = _pWhich;
//////////////////////////////////////////////////////////////////////
// Reset HelpText
if (pHelp && !pHelp->HasChildPathFocus())
pHelp->SetHelpText( String() );
}
//------------------------------------------------------------------------------
void OFieldDescControl::LoseFocus()
{
DBG_CHKTHIS(OFieldDescControl,NULL);
implFocusLost(NULL);
TabPage::LoseFocus();
}
// -----------------------------------------------------------------------------
sal_Bool OFieldDescControl::isCopyAllowed()
{
sal_Bool bAllowed = (m_pActFocusWindow != NULL) &&
(m_pActFocusWindow == pDefault || m_pActFocusWindow == pFormatSample ||
m_pActFocusWindow == pTextLen || m_pActFocusWindow == pLength ||
m_pActFocusWindow == pScale || m_pActFocusWindow == m_pColumnName ||
m_pActFocusWindow == m_pAutoIncrementValue) &&
!static_cast<Edit*>(m_pActFocusWindow)->GetSelected().isEmpty();
return bAllowed;
}
// -----------------------------------------------------------------------------
sal_Bool OFieldDescControl::isCutAllowed()
{
sal_Bool bAllowed = (m_pActFocusWindow != NULL) &&
(m_pActFocusWindow == pDefault || m_pActFocusWindow == pFormatSample ||
m_pActFocusWindow == pTextLen || m_pActFocusWindow == pLength ||
m_pActFocusWindow == pScale || m_pActFocusWindow == m_pColumnName ||
m_pActFocusWindow == m_pAutoIncrementValue) &&
!static_cast<Edit*>(m_pActFocusWindow)->GetSelected().isEmpty();
return bAllowed;
}
// -----------------------------------------------------------------------------
sal_Bool OFieldDescControl::isPasteAllowed()
{
sal_Bool bAllowed = (m_pActFocusWindow != NULL) &&
(m_pActFocusWindow == pDefault || m_pActFocusWindow == pFormatSample ||
m_pActFocusWindow == pTextLen || m_pActFocusWindow == pLength ||
m_pActFocusWindow == pScale || m_pActFocusWindow == m_pColumnName ||
m_pActFocusWindow == m_pAutoIncrementValue);
if ( bAllowed )
{
TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
bAllowed = aTransferData.HasFormat(SOT_FORMAT_STRING);
}
return bAllowed;
}
// -----------------------------------------------------------------------------
void OFieldDescControl::cut()
{
if(isCutAllowed())
static_cast<Edit*>(m_pActFocusWindow)->Cut();
}
// -----------------------------------------------------------------------------
void OFieldDescControl::copy()
{
if(isCopyAllowed()) // this only checks if the focus window is valid
static_cast<Edit*>(m_pActFocusWindow)->Copy();
}
// -----------------------------------------------------------------------------
void OFieldDescControl::paste()
{
if(m_pActFocusWindow) // this only checks if the focus window is valid
static_cast<Edit*>(m_pActFocusWindow)->Paste();
}
// -----------------------------------------------------------------------------
sal_Bool OFieldDescControl::isTextFormat(const OFieldDescription* _pFieldDescr,sal_uInt32& _nFormatKey) const
{
_nFormatKey = _pFieldDescr->GetFormatKey();
sal_Bool bTextFormat = sal_True;
try
{
if (!_nFormatKey)
{
Reference< ::com::sun::star::util::XNumberFormatTypes> xNumberTypes(GetFormatter()->getNumberFormatsSupplier()->getNumberFormats(),UNO_QUERY);
OSL_ENSURE(xNumberTypes.is(),"XNumberFormatTypes is null!");
_nFormatKey = ::dbtools::getDefaultNumberFormat( _pFieldDescr->GetType(),
_pFieldDescr->GetScale(),
_pFieldDescr->IsCurrency(),
xNumberTypes,
GetLocale());
}
sal_Int32 nNumberFormat = ::comphelper::getNumberFormatType(GetFormatter(),_nFormatKey);
bTextFormat = (nNumberFormat == ::com::sun::star::util::NumberFormat::TEXT);
}
catch(const Exception&)
{
}
return bTextFormat;
}
// -----------------------------------------------------------------------------
String OFieldDescControl::getControlDefault( const OFieldDescription* _pFieldDescr ,sal_Bool _bCheck) const
{
OUString sDefault;
sal_Bool bCheck = !_bCheck || _pFieldDescr->GetControlDefault().hasValue();
if ( bCheck )
{
sal_uInt32 nFormatKey;
sal_Bool bTextFormat = sal_False;
try
{
double nValue = 0.0;
bTextFormat = isTextFormat(_pFieldDescr,nFormatKey);
if ( _pFieldDescr->GetControlDefault() >>= sDefault )
{
if ( !bTextFormat )
{
if ( !sDefault.isEmpty() )
{
try
{
nValue = GetFormatter()->convertStringToNumber(nFormatKey,sDefault);
}
catch(const Exception&)
{
return OUString(); // return empty string for format example
}
}
}
}
else
_pFieldDescr->GetControlDefault() >>= nValue;
Reference< ::com::sun::star::util::XNumberFormatter> xNumberFormatter = GetFormatter();
Reference<XPropertySet> xFormSet = xNumberFormatter->getNumberFormatsSupplier()->getNumberFormats()->getByKey(nFormatKey);
OSL_ENSURE(xFormSet.is(),"XPropertySet is null!");
OUString sFormat;
xFormSet->getPropertyValue("FormatString") >>= sFormat;
if ( !bTextFormat )
{
Locale aLocale;
::comphelper::getNumberFormatProperty(xNumberFormatter,nFormatKey,OUString("Locale")) >>= aLocale;
sal_Int32 nNumberFormat = ::comphelper::getNumberFormatType(xNumberFormatter,nFormatKey);
if( (nNumberFormat & ::com::sun::star::util::NumberFormat::DATE) == ::com::sun::star::util::NumberFormat::DATE
|| (nNumberFormat & ::com::sun::star::util::NumberFormat::DATETIME) == ::com::sun::star::util::NumberFormat::DATETIME )
{
nValue = DBTypeConversion::toNullDate(DBTypeConversion::getNULLDate(xNumberFormatter->getNumberFormatsSupplier()),nValue);
}
Reference< ::com::sun::star::util::XNumberFormatPreviewer> xPreViewer(xNumberFormatter,UNO_QUERY);
OSL_ENSURE(xPreViewer.is(),"XNumberFormatPreviewer is null!");
sDefault = xPreViewer->convertNumberToPreviewString(sFormat,nValue,aLocale,sal_True);
}
else if ( !(_bCheck && sDefault.isEmpty()) )
sDefault = xNumberFormatter->formatString(nFormatKey, sDefault.isEmpty() ? sFormat : sDefault);
}
catch(const Exception&)
{
}
}
return sDefault;
}
// -----------------------------------------------------------------------------
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */