Files
libreoffice/dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx

2275 lines
91 KiB
C++
Raw Normal View History

2001-02-05 08:26:47 +00:00
/*************************************************************************
*
* $RCSfile: SelectionBrowseBox.cxx,v $
*
2001-10-26 06:49:36 +00:00
* $Revision: 1.37 $
2001-02-05 08:26:47 +00:00
*
2001-10-26 06:49:36 +00:00
* last change: $Author: oj $ $Date: 2001-10-26 07:49:36 $
2001-02-05 08:26:47 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an AS IS basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef DBAUI_QUERYDESIGN_OSELECTIONBROWSEBOX_HXX
#include "SelectionBrowseBox.hxx"
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
#ifndef DBAUI_QUERYDESIGNVIEW_HXX
#include "QueryDesignView.hxx"
#endif
#ifndef DBAUI_QUERYCONTROLLER_HXX
#include "querycontroller.hxx"
#endif
#ifndef DBAUI_QUERYTABLEVIEW_HXX
#include "QueryTableView.hxx"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef DBAUI_TABLEFIELDINFO_HXX
#include "TableFieldInfo.hxx"
#endif
#ifndef _DBU_RESOURCE_HRC_
#include "dbu_resource.hrc"
#endif
2001-09-27 05:19:05 +00:00
#ifndef _DBA_DBACCESS_HELPID_HRC_
2001-02-05 08:26:47 +00:00
#include "dbaccess_helpid.hrc"
2001-09-27 05:19:05 +00:00
#endif
2001-02-05 08:26:47 +00:00
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef _SV_SYSTEM_HXX
#include <vcl/system.hxx>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_
#include <com/sun/star/container/XNameAccess.hpp>
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef DBAUI_QUERY_TABLEWINDOW_HXX
#include "QTableWindow.hxx"
#endif
#ifndef DBAUI_QUERYTABLEVIEW_HXX
#include "QueryTableView.hxx"
#endif
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef __SGI_STL_ROPE
#include <rope>
#endif
#ifndef DBAUI_QUERYDESIGNFIELDUNDOACT_HXX
#include "QueryDesignFieldUndoAct.hxx"
#endif
#ifndef _SVX_DBEXCH_HRC
#include <svx/dbexch.hrc>
#endif
#ifndef _COMPHELPER_STLTYPES_HXX_
#include <comphelper/stl_types.hxx>
#endif
#ifndef _COMPHELPER_EXTRACT_HXX_
#include <comphelper/extract.hxx>
2001-02-14 13:54:12 +00:00
#endif
#ifndef _DBAUI_SQLMESSAGE_HXX_
#include "sqlmessage.hxx"
#endif
2001-02-14 13:54:12 +00:00
using namespace ::svt;
2001-02-05 08:26:47 +00:00
using namespace ::dbaui;
using namespace ::connectivity;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::util;
const String g_strOne = String::CreateFromAscii("1");
const String g_strZero = String::CreateFromAscii("0");
#define DEFAULT_QUERY_COLS 20
#define DEFAULT_SIZE GetTextWidth(g_strZero) * 30
#define CHECKBOX_SIZE 10
#define HANDLE_ID 0
DBG_NAME(OSelectionBrowseBox);
//------------------------------------------------------------------------------
OSelectionBrowseBox::OSelectionBrowseBox( Window* pParent )
:EditBrowseBox( pParent,EBBF_NOROWPICTURE, WB_3DLOOK, BROWSER_COLUMNSELECTION | BROWSER_HIDESELECT | BROWSER_KEEPSELECTION |
2001-02-05 08:26:47 +00:00
BROWSER_HIDECURSOR | BROWSER_HLINESFULL | BROWSER_VLINESFULL)
,m_nVisibleCount(0)
,m_aFunctionStrings(ModuleRes(STR_QUERY_FUNCTIONS))
,m_bOrderByUnRelated(sal_True)
,m_bGroupByUnRelated(sal_True)
2001-04-18 12:20:48 +00:00
,m_bStopTimer(sal_False)
2001-10-23 11:30:27 +00:00
,m_bWasEditing(sal_False)
2001-02-05 08:26:47 +00:00
{
DBG_CTOR(OSelectionBrowseBox,NULL);
SetHelpId(HID_CTL_QRYDGNCRIT);
m_nMode = BROWSER_COLUMNSELECTION | BROWSER_HIDESELECT | BROWSER_KEEPSELECTION | BROWSER_HIDECURSOR | BROWSER_HLINESFULL | BROWSER_VLINESFULL;
2001-03-07 08:27:45 +00:00
m_pTextCell = new Edit(&GetDataWindow(), 0);
2001-02-05 08:26:47 +00:00
// m_pTextCell->EnableSpecialCheck(sal_False);
m_pVisibleCell = new CheckBoxControl(&GetDataWindow());
m_pTableCell = new ListBoxControl(&GetDataWindow());
m_pFieldCell = new ComboBoxControl(&GetDataWindow());
m_pOrderCell = new ListBoxControl(&GetDataWindow());
m_pFunctionCell = new ListBoxControl(&GetDataWindow());
2001-02-05 08:26:47 +00:00
m_pVisibleCell->SetHelpId(HID_QRYDGN_ROW_VISIBLE);
m_pTableCell->SetHelpId(HID_QRYDGN_ROW_TABLE);
m_pFieldCell->SetHelpId(HID_QRYDGN_ROW_FIELD);
m_pOrderCell->SetHelpId(HID_QRYDGN_ROW_ORDER);
m_pFunctionCell->SetHelpId(HID_QRYDGN_ROW_FUNCTION);
//////////////////////////////////////////////////////////////////////
// TriState der ::com::sun::star::form::CheckBox abschalten
m_pVisibleCell->GetBox().EnableTriState( sal_False );
m_pEmptyEntry = new OTableFieldDesc();
m_pEmptyEntry->SetColWidth(DEFAULT_SIZE);
2001-07-12 11:23:31 +00:00
Font aTitleFont = OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE,Window::GetSettings().GetLanguage(),DEFAULTFONT_FLAGS_ONLYONE);
2001-02-05 08:26:47 +00:00
aTitleFont.SetSize(Size(0, 6));
SetTitleFont(aTitleFont);
String aTxt(ModuleRes(STR_QUERY_SORTTEXT));
xub_StrLen nCount = aTxt.GetTokenCount();
xub_StrLen nIdx = 0;
for (; nIdx < nCount; nIdx++)
m_pOrderCell->InsertEntry(aTxt.GetToken(nIdx));
for(long i=0;i < BROW_ROW_CNT;i++)
m_bVisibleRow.push_back(sal_True);
m_bVisibleRow[BROW_FUNCTION_ROW] = sal_False; // zuerst ausblenden
2001-04-18 12:20:48 +00:00
m_timerInvalidate.SetTimeout(200);
m_timerInvalidate.SetTimeoutHdl(LINK(this, OSelectionBrowseBox, OnInvalidateTimer));
m_timerInvalidate.Start();
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
OSelectionBrowseBox::~OSelectionBrowseBox()
{
DBG_DTOR(OSelectionBrowseBox,NULL);
delete m_pTextCell;
delete m_pVisibleCell;
delete m_pFieldCell;
delete m_pTableCell;
delete m_pOrderCell;
delete m_pFunctionCell;
m_pEmptyEntry = NULL;
2001-02-05 08:26:47 +00:00
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::initialize()
{
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
2001-07-12 11:14:47 +00:00
try
2001-02-05 08:26:47 +00:00
{
2001-07-12 11:14:47 +00:00
if(xConnection.is())
2001-03-01 14:45:02 +00:00
{
2001-07-12 11:14:47 +00:00
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
// Diese Funktionen stehen nur unter CORE zur Verf<72>gung
if(xMetaData->supportsCoreSQLGrammar())
{
xub_StrLen nCount = m_aFunctionStrings.GetTokenCount();
for (xub_StrLen nIdx = 0; nIdx < nCount; nIdx++)
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(nIdx));
}
else // sonst nur COUNT(*)
{
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(0));
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
}
m_bOrderByUnRelated = xMetaData->supportsOrderByUnrelated();
m_bGroupByUnRelated = xMetaData->supportsGroupByUnrelated();
2001-03-01 14:45:02 +00:00
}
2001-07-12 11:14:47 +00:00
}
catch(const SQLException&)
{
OSL_ENSURE(0,"Catched Exception when asking for database metadata options!");
2001-02-05 08:26:47 +00:00
}
Init();
}
//==============================================================================
OQueryDesignView* OSelectionBrowseBox::getDesignView()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!");
return static_cast<OQueryDesignView*>(GetParent());
}
// -----------------------------------------------------------------------------
OQueryDesignView* OSelectionBrowseBox::getDesignView() const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OSL_ENSURE(static_cast<const OQueryDesignView*>(GetParent()),"Parent isn't an OQueryDesignView!");
return static_cast<OQueryDesignView*>(GetParent());
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::Init()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
EditBrowseBox::Init();
2001-02-05 08:26:47 +00:00
SetMapMode( MapMode(MAP_TWIP) );
GetDataWindow().SetMapMode( GetMapMode() );
Font aFont( GetDataWindow().GetFont() );
aFont.SetWeight( WEIGHT_NORMAL );
GetDataWindow().SetFont( aFont );
//xxx richtige Zeilenhoehe fuer EditEng ???
2001-02-14 13:54:12 +00:00
long nLSize = GetDataWindow().GetTextHeight() + 4;
2001-02-05 08:26:47 +00:00
SetDataRowHeight(nLSize);
SetTitleLines(1);
// Anzahl der sichtbaren Zeilen ermitteln
for(long i=0;i<BROW_ROW_CNT;i++)
{
if(m_bVisibleRow[i])
m_nVisibleCount++;
}
RowInserted(0, m_nVisibleCount, sal_False);
try
2001-03-01 14:45:02 +00:00
{
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(xConnection.is())
{
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
m_nMaxColumns = xMetaData->getMaxColumnsInSelect();
}
else
m_nMaxColumns = 0;
2001-03-01 14:45:02 +00:00
}
catch(const SQLException&)
{
OSL_ENSURE(0,"Catched Exception when asking for database metadata options!");
2001-03-01 14:45:02 +00:00
m_nMaxColumns = 0;
}
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
2001-04-30 12:02:01 +00:00
void OSelectionBrowseBox::PreFill()
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
SetUpdateMode(sal_False);
if (GetCurRow() != 0)
GoToRow(0);
2001-04-30 12:02:01 +00:00
2001-02-28 09:18:26 +00:00
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
pController->clearFields();
2001-02-05 08:26:47 +00:00
sal_uInt16 nCurCol = GetCurColumnId();
long nCurRow = GetCurRow();
DeactivateCell();
RemoveColumns();
InsertHandleColumn( 70 );
SetUpdateMode(sal_True);
}
2001-04-30 12:02:01 +00:00
//------------------------------------------------------------------------------
void OSelectionBrowseBox::ClearAll()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
SetUpdateMode(sal_False);
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
2001-02-05 08:26:47 +00:00
OTableFields::reverse_iterator aIter = getFields().rbegin();
for(sal_uInt16 nId=getFields().size();aIter != getFields().rend();++aIter,--nId)
2001-04-30 12:02:01 +00:00
{
if(!(*aIter)->IsEmpty())
RemoveField(nId);
}
SetUpdateMode(sal_True);
}
2001-02-05 08:26:47 +00:00
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetReadOnly(sal_Bool bRO)
{
if (bRO)
{
DeactivateCell();
m_nMode &= ~BROWSER_HIDECURSOR;
SetMode(m_nMode);
}
else
{
m_nMode |= BROWSER_HIDECURSOR;
SetMode(m_nMode);
ActivateCell();
}
}
//------------------------------------------------------------------------------
CellController* OSelectionBrowseBox::GetController(long nRow, sal_uInt16 nColId)
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-02-28 09:18:26 +00:00
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
OTableFieldDescRef pEntry = getFields()[nColId-1];
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::GetController : keine FieldDescription !");
2001-02-05 08:26:47 +00:00
if (!pEntry.isValid())
2001-02-05 08:26:47 +00:00
return NULL;
2001-02-28 09:18:26 +00:00
if (static_cast<OQueryController*>(getDesignView()->getController())->isReadOnly())
2001-02-05 08:26:47 +00:00
return NULL;
long nCellIndex = GetRealRow(nRow);
switch (nCellIndex)
{
case BROW_FIELD_ROW:
return new ComboBoxCellController(m_pFieldCell);
2001-02-05 08:26:47 +00:00
case BROW_TABLE_ROW:
return new ListBoxCellController(m_pTableCell);
2001-02-05 08:26:47 +00:00
case BROW_VIS_ROW:
return new CheckBoxCellController(m_pVisibleCell);
2001-02-05 08:26:47 +00:00
case BROW_ORDER_ROW:
return new ListBoxCellController(m_pOrderCell);
2001-02-05 08:26:47 +00:00
case BROW_FUNCTION_ROW:
return new ListBoxCellController(m_pFunctionCell);
2001-02-05 08:26:47 +00:00
default:
return new EditCellController(m_pTextCell);
2001-02-05 08:26:47 +00:00
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::InitController(CellControllerRef& rController, long nRow, sal_uInt16 nColId)
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-02-28 09:18:26 +00:00
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
OTableFieldDescRef pEntry = getFields()[nColId-1];
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::InitController : keine FieldDescription !");
2001-02-05 08:26:47 +00:00
long nCellIndex = GetRealRow(nRow);
switch (nCellIndex)
{
case BROW_FIELD_ROW:
{
m_pFieldCell->Clear();
m_pFieldCell->SetText(String());
String aField(pEntry->GetField());
String aTable(pEntry->GetAlias());
getDesignView()->fillValidFields(aTable, m_pFieldCell);
// * durch alias.* ersetzen
if ((aField.GetChar(0) == '*') && aTable.Len())
{
aField = aTable;
aField.AppendAscii(".*");
}
m_pFieldCell->SetText(aField);
} break;
case BROW_TABLE_ROW:
{
m_pTableCell->Clear();
enableControl(pEntry,m_pTableCell);
2001-02-05 08:26:47 +00:00
if(pEntry->GetFunctionType() != FKT_CONDITION)
{
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMap::iterator aIter = pTabWinList->begin();
for(;aIter != pTabWinList->end();++aIter)
m_pTableCell->InsertEntry(static_cast<OQueryTableWindow*>(aIter->second)->GetAliasName());
m_pTableCell->InsertEntry(String(ModuleRes(STR_QUERY_NOTABLE)), 0);
if (pEntry->GetAlias().getLength())
m_pTableCell->SelectEntry(pEntry->GetAlias());
else
m_pTableCell->SelectEntry(String(ModuleRes(STR_QUERY_NOTABLE)));
}
}
} break;
case BROW_VIS_ROW:
{
m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
m_pVisibleCell->GetBox().SaveValue();
enableControl(pEntry,m_pTextCell);
2001-02-05 08:26:47 +00:00
if(!pEntry->IsVisible() && pEntry->GetOrderDir() != ORDER_NONE && !m_bOrderByUnRelated)
{
// Spalte muss sichtbar sein, um im ORDER BY aufzutauchen
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
m_pVisibleCell->GetBox().SaveValue();
m_pVisibleCell->GetBox().Disable();
m_pVisibleCell->GetBox().EnableInput(sal_False);
String aMessage(ModuleRes(STR_QRY_ORDERBY_UNRELATED));
2001-02-08 14:33:28 +00:00
OQueryDesignView* paDView = getDesignView();
InfoBox(paDView, aMessage).Execute();
2001-02-05 08:26:47 +00:00
}
} break;
case BROW_ORDER_ROW:
m_pOrderCell->SelectEntryPos(pEntry->GetOrderDir());
enableControl(pEntry,m_pOrderCell);
break;
2001-02-05 08:26:47 +00:00
case BROW_COLUMNALIAS_ROW:
setTextCellContext(pEntry,pEntry->GetFieldAlias(),HID_QRYDGN_ROW_ALIAS);
2001-02-05 08:26:47 +00:00
break;
case BROW_FUNCTION_ROW:
{
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
break;
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
2001-02-05 08:26:47 +00:00
// Diese Funktionen stehen nur unter CORE zur Verf<72>gung
if(xMetaData->supportsCoreSQLGrammar())
{
if(pEntry->IsGroupBy())
{
m_pFunctionCell->SelectEntry(m_pFunctionCell->GetEntry(m_pFunctionCell->GetEntryCount()-1));
}
else if(m_pFunctionCell->GetEntryPos(String(pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND)
m_pFunctionCell->SelectEntry(String(pEntry->GetFunction()));
else
m_pFunctionCell->SelectEntryPos(0);
enableControl(pEntry,m_pFunctionCell);
2001-02-05 08:26:47 +00:00
}
else
{
// nur COUNT(*) erlaubt
if(pEntry->GetField().getLength() && pEntry->GetField().toChar() != '*')
m_pFunctionCell->RemoveEntry(1);
else if(m_pFunctionCell->GetEntryCount() < 2)
m_pFunctionCell->InsertEntry(m_aFunctionStrings.GetToken(2)); // 2 -> COUNT
if(m_pFunctionCell->GetEntryPos(String(pEntry->GetFunction())) != COMBOBOX_ENTRY_NOTFOUND)
m_pFunctionCell->SelectEntry(pEntry->GetFunction());
else
m_pFunctionCell->SelectEntryPos(0);
}
}
break;
default:
{
sal_uInt16 nIdx = nCellIndex-BROW_CRIT1_ROW;
setTextCellContext(pEntry,pEntry->GetCriteria( nIdx ),HID_QRYDGN_ROW_CRIT);
2001-02-05 08:26:47 +00:00
}
}
Controller()->ClearModified();
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::SaveModified()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OTableFieldDescRef pEntry = NULL;
2001-02-28 09:18:26 +00:00
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
if(getFields().size() > sal_uInt16(GetCurColumnId() - 1))
pEntry = getEntry(GetCurColumnId() - 1);
2001-02-05 08:26:47 +00:00
sal_Bool bWasEmpty = pEntry.isValid() ? pEntry->IsEmpty() : sal_False;
2001-04-18 10:44:59 +00:00
sal_Bool bError = sal_False;
sal_Bool bListAction = sal_False;
2001-02-05 08:26:47 +00:00
if (pEntry.isValid() && Controller().Is() && Controller()->IsModified())
2001-02-05 08:26:47 +00:00
{
// fuer die Undo-Action
2001-04-18 10:44:59 +00:00
String strOldCellContents,sNewValue;
2001-02-05 08:26:47 +00:00
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_VIS_ROW:
{
2001-04-18 06:02:22 +00:00
sal_Bool bOldValue = m_pVisibleCell->GetBox().GetSavedValue();
2001-04-18 07:38:19 +00:00
strOldCellContents = bOldValue ? g_strOne : g_strZero;
2001-04-18 10:44:59 +00:00
sNewValue = !bOldValue ? g_strOne : g_strZero;
}
if((m_bOrderByUnRelated || pEntry->GetOrderDir() == ORDER_NONE) &&
(m_bGroupByUnRelated || !pEntry->IsGroupBy()))
{
2001-02-05 08:26:47 +00:00
pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked());
}
else
{
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check();
}
break;
case BROW_FIELD_ROW:
{
String aFieldName(m_pFieldCell->GetText());
2001-09-27 05:19:05 +00:00
if (!aFieldName.Len())
2001-02-05 08:26:47 +00:00
{
OTableFieldDescRef aRef = new OTableFieldDesc();
::std::replace(getFields().begin(),getFields().end(),pEntry,aRef);
2001-09-27 05:19:05 +00:00
sal_uInt16 nCol = GetCurColumnId();
for (int i = 0; i < m_nVisibleCount; i++) // Spalte neu zeichnen
RowModified(i,nCol);
2001-02-05 08:26:47 +00:00
}
2001-09-27 05:19:05 +00:00
else
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
sal_Bool bIsPredicate = sal_False;
// wenn das Ergebnis ein Praedikat -> OK
String aTest(aFieldName);
2001-02-28 09:18:26 +00:00
2001-09-27 05:19:05 +00:00
OQueryTableWindow* pWin = static_cast<OQueryTableWindow*>(pEntry->GetTabWindow());
2001-04-18 10:44:59 +00:00
2001-09-27 05:19:05 +00:00
if (!pWin && (aFieldName.GetTokenCount('.') == 2))
pWin = static_cast<OQueryTableWindow*>(getDesignView()->getTableView()->GetWindow(aFieldName.GetToken(0, '.')));
2001-02-05 08:26:47 +00:00
2001-09-27 05:19:05 +00:00
Reference<XPropertySet> xColumn;
sal_Bool bAsterix = sal_False;
if (pWin)
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
Reference<XNameAccess> xColumns = pWin->GetOriginalColumns();
if(xColumns.is())
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
if (aFieldName.GetTokenCount('.') == 2 && xColumns->hasByName(aFieldName.GetToken(1,'.'))) // falls alias.Feld angegeben
::cppu::extractInterface(xColumn,xColumns->getByName(aFieldName.GetToken(1,'.')));
else if(xColumns->hasByName(aFieldName))
::cppu::extractInterface(xColumn,xColumns->getByName(aFieldName));
else if(aFieldName.GetTokenCount('.') == 2 && aFieldName.GetToken(1,'.').GetChar(0) == '*')
bAsterix = sal_True;
2001-02-05 08:26:47 +00:00
}
}
2001-09-27 05:19:05 +00:00
if(!xColumn.is() && !bAsterix) // only when text not a column of the table
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
::rtl::OUString aErrorMsg;
bIsPredicate = sal_True; // #72670#
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
::connectivity::OSQLParser* pParser = pController->getParser();
OSQLParseNode* pParseNode = pParser->predicateTree(aErrorMsg, aTest,
pController->getNumberFormatter(),
xColumn);
if (pParseNode)
2001-04-18 10:44:59 +00:00
{
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
2001-09-27 05:19:05 +00:00
appendUndoAction(pEntry->IsVisible() ? g_strOne : g_strZero,g_strZero,BROW_VIS_ROW);
pEntry->SetVisible(sal_False);
bWasEmpty = sal_False; // XXXXX
delete pParseNode;
pEntry->SetFunctionType(FKT_CONDITION);
RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
2001-04-18 10:44:59 +00:00
}
2001-09-27 05:19:05 +00:00
else
pEntry->SetFunctionType(FKT_OTHER);
2001-02-05 08:26:47 +00:00
}
2001-09-27 05:19:05 +00:00
xub_StrLen nCount(aFieldName.GetTokenCount('('));
if(nCount < 2 && !bIsPredicate) // keine Funktion
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
if (aFieldName.GetTokenCount('.') == 2) // falls alias.Feld angegeben
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
String sTableAlias(aFieldName.GetToken(0, '.'));
aFieldName = aFieldName.GetToken(1,'.');
2001-02-05 08:26:47 +00:00
// das erste Token in das Tabellenfeld eintragen (und entsprechend den Entry anpassen)
2001-04-18 10:44:59 +00:00
if(!bListAction)
{
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(pEntry->GetAlias(),sTableAlias,BROW_TABLE_ROW);
2001-09-27 05:19:05 +00:00
2001-02-05 08:26:47 +00:00
pEntry->SetAlias(sTableAlias);
if(m_bVisibleRow[BROW_TABLE_ROW])
RowModified(GetBrowseRow(BROW_TABLE_ROW), GetCurColumnId());
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(sTableAlias);
if(aIter != pTabWinList->end())
{
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
2001-09-27 05:19:05 +00:00
if (pEntryTab)
{
// appendUndoAction(pEntry->GetDatabase(),sTableAlias,GetBrowseRow(BROW_TABLE_ROW));
pEntry->SetDatabase(pEntryTab->GetComposedName());
pEntry->SetTable(pEntryTab->GetTableName());
pEntry->SetTabWindow(pEntryTab);
}
2001-02-05 08:26:47 +00:00
}
}
}
2001-09-27 05:19:05 +00:00
strOldCellContents = pEntry->GetField();
pEntry->SetField(aFieldName);
sNewValue = aFieldName;
// Falls nur COUNT(*) erlaubt wird
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
break;
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
if(aFieldName.GetChar(0) != '*' && pEntry->GetFunction().getLength())
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
if(!bListAction)
{
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(pEntry->GetFunction(),String(),BROW_FUNCTION_ROW);
pEntry->SetFunction(::rtl::OUString());
m_pFunctionCell->SelectEntryPos(0);
if(!m_bVisibleRow[BROW_FUNCTION_ROW])
{
SetRowVisible(BROW_FUNCTION_ROW, sal_True);
}
RowModified(GetBrowseRow(BROW_FUNCTION_ROW), GetCurColumnId());
}
pEntry->SetFunctionType(FKT_NONE);
}
else
{ // Funktion eingegeben
// m_pFieldCell auf Inhalt der Funktion setzen und pEntry mit ganzem Wert setzen
// BROW_FUNCTION_ROW setzen
strOldCellContents = pEntry->GetField();
String aFkt(aFieldName.GetToken(0,'('));
if(pEntry->GetFunctionType() != FKT_CONDITION && GetFunktionName(aFkt))
{
// ist Aggregatefuntkion
pEntry->SetFunction(aFkt);
String aParameter(aFieldName.GetToken(1,'('));
aParameter = aParameter.GetToken(aParameter.GetTokenCount()-1,')');
pEntry->SetField(aParameter); // nur die Parameter einf"ugen
pEntry->SetFunctionType(FKT_AGGREGATE);
if (aParameter.GetTokenCount('.') == 2) // falls alias.Feld angegeben
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
String sTableAlias(aParameter.GetToken(0, '.'));
aParameter = aParameter.GetToken(1,'.');
// das erste Token in das Tabellenfeld eintragen (und entsprechend den Entry anpassen)
if(!bListAction)
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(pEntry->GetAlias(),sTableAlias,BROW_TABLE_ROW);
pEntry->SetAlias(sTableAlias);
if(m_bVisibleRow[BROW_TABLE_ROW])
RowModified(GetBrowseRow(BROW_TABLE_ROW), GetCurColumnId());
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(sTableAlias);
if(aIter != pTabWinList->end())
2001-04-18 10:44:59 +00:00
{
2001-09-27 05:19:05 +00:00
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
pEntry->SetDatabase(pEntryTab->GetComposedName());
pEntry->SetTable(pEntryTab->GetTableName());
pEntry->SetTabWindow(pEntryTab);
}
}
}
else
{
// nur eine Tabelle vorhanden oder der Benutzer hat vergessen diese anzugeben
// also einfach die erst beste nehmen
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if(pTabWinList)
{
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(pTabWinList->begin()->second);
if (pEntryTab)
{
pEntry->SetDatabase(pEntryTab->GetComposedName());
if(!bListAction)
{
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(pEntry->GetTable(),pEntryTab->GetTableName(),BROW_TABLE_ROW);
pEntry->SetTable(pEntryTab->GetTableName());
pEntry->SetAlias(pEntry->GetTable());
pEntry->SetTabWindow(pEntryTab);
2001-04-18 10:44:59 +00:00
}
2001-02-05 08:26:47 +00:00
}
}
2001-09-27 05:19:05 +00:00
if(!bListAction)
{
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(pEntry->GetFunction(),aFkt,BROW_FUNCTION_ROW);
m_pFieldCell->SetText(aParameter);
m_pFunctionCell->SelectEntry(aFkt);
if(!m_bVisibleRow[BROW_FUNCTION_ROW])
SetRowVisible(BROW_FUNCTION_ROW, sal_True);
2001-04-18 10:44:59 +00:00
2001-09-27 05:19:05 +00:00
RowModified(GetBrowseRow(BROW_FUNCTION_ROW), GetCurColumnId());
RowModified(GetBrowseRow(BROW_TABLE_ROW), GetCurColumnId());
}
else
2001-04-18 10:44:59 +00:00
{
2001-09-27 05:19:05 +00:00
pEntry->SetField(aFieldName);
pEntry->SetAlias(String());
if(!bListAction)
{
bListAction = sal_True;
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
}
appendUndoAction(pEntry->GetTable(),String(),BROW_TABLE_ROW);
pEntry->SetTable(String());
pEntry->SetTabWindow(NULL);
m_pFieldCell->SetText(aFieldName);
m_pFunctionCell->SelectEntryPos(0);
if(m_bVisibleRow[BROW_TABLE_ROW])
RowModified(GetBrowseRow(BROW_TABLE_ROW), GetCurColumnId());
2001-04-18 10:44:59 +00:00
}
2001-02-05 08:26:47 +00:00
}
}
2001-04-18 10:44:59 +00:00
sNewValue = pEntry->GetField();
2001-02-28 09:18:26 +00:00
pController->InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
2001-02-05 08:26:47 +00:00
}
break;
case BROW_TABLE_ROW:
{
String aAliasName = m_pTableCell->GetSelectEntry();
strOldCellContents = pEntry->GetAlias();
if (m_pTableCell->GetSelectEntryPos() != 0)
pEntry->SetAlias(aAliasName);
else
pEntry->SetAlias(String());
2001-04-18 10:44:59 +00:00
sNewValue = pEntry->GetAlias();
2001-02-05 08:26:47 +00:00
// jetzt noch ::com::sun::star::data::Database und Tabelle uebernehmen
OJoinTableView::OTableWindowMap* pTabWinList = getDesignView()->getTableView()->GetTabWinMap();
if (pTabWinList)
{
OJoinTableView::OTableWindowMapIterator aIter = pTabWinList->find(aAliasName);
if(aIter != pTabWinList->end())
{
OQueryTableWindow* pEntryTab = static_cast<OQueryTableWindow*>(aIter->second);
if (pEntryTab)
{
pEntry->SetDatabase(pEntryTab->GetComposedName());
pEntry->SetTable(pEntryTab->GetTableName());
2001-04-18 07:46:16 +00:00
pEntry->SetTabWindow(pEntryTab);
2001-02-05 08:26:47 +00:00
}
}
}
} break;
case BROW_ORDER_ROW:
{
strOldCellContents = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir());
2001-02-05 08:26:47 +00:00
sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
if (nIdx == sal_uInt16(-1))
nIdx = 0;
pEntry->SetOrderDir(EOrderDir(nIdx));
if(!m_bOrderByUnRelated)
{
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check();
RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
}
2001-04-18 10:44:59 +00:00
sNewValue = String::CreateFromInt32((sal_uInt16)pEntry->GetOrderDir());
2001-02-05 08:26:47 +00:00
} break;
case BROW_COLUMNALIAS_ROW:
strOldCellContents = pEntry->GetFieldAlias();
pEntry->SetFieldAlias(m_pTextCell->GetText());
2001-04-18 10:44:59 +00:00
sNewValue = pEntry->GetFieldAlias();
2001-02-05 08:26:47 +00:00
break;
case BROW_FUNCTION_ROW:
{
strOldCellContents = pEntry->GetFunction();
sal_uInt16 nPos = m_pFunctionCell->GetSelectEntryPos();
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
break;
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
2001-02-05 08:26:47 +00:00
// Diese Funktionen stehen nur unter CORE zur Verf<72>gung
sal_uInt16 nFunctionCount =
xMetaData->supportsCoreSQLGrammar()
?
m_pFunctionCell->GetEntryCount()-1
:
m_pFunctionCell->GetEntryCount();
if(nPos >= 1 && nPos < nFunctionCount)
{
pEntry->SetFunctionType(FKT_AGGREGATE);
pEntry->SetFunction(m_pFunctionCell->GetEntry(nPos));
pEntry->SetGroupBy(sal_False);
}
else
{
pEntry->SetFunctionType(FKT_NONE);
if(nPos > 1)
{
pEntry->SetGroupBy(sal_True);
if(!m_bGroupByUnRelated)
{
pEntry->SetVisible(sal_True);
m_pVisibleCell->GetBox().Check();
RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
}
}
else
pEntry->SetGroupBy(sal_False);
pEntry->SetFunction(String());
}
2001-04-18 10:44:59 +00:00
sNewValue = pEntry->GetFunction();
2001-02-05 08:26:47 +00:00
}
break;
default:
{
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
break;
2001-02-05 08:26:47 +00:00
sal_uInt16 nIdx = nRow - BROW_CRIT1_ROW;
String aText = m_pTextCell->GetText();
aText.EraseLeadingChars();
::rtl::OUString aCrit;
if(aText.Len())
{
2001-09-27 05:19:05 +00:00
::rtl::OUString aErrorMsg;
2001-02-05 08:26:47 +00:00
Reference<XPropertySet> xColumn;
2001-09-27 05:19:05 +00:00
OSQLParseNode* pParseNode = getDesignView()->getPredicateTreeFromEntry(pEntry,aText,aErrorMsg,xColumn);
2001-02-05 08:26:47 +00:00
if (pParseNode)
{
pParseNode->parseNodeToPredicateStr(aCrit,
2001-03-01 14:45:02 +00:00
xConnection->getMetaData(),
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->getNumberFormatter(),
2001-02-05 08:26:47 +00:00
xColumn,
getDesignView()->getLocale(),
2001-02-14 13:54:12 +00:00
getDesignView()->getDecimalSeparator().toChar(),
2001-02-28 09:18:26 +00:00
&(static_cast<OQueryController*>(getDesignView()->getController())->getParser()->getContext()));
2001-02-05 08:26:47 +00:00
delete pParseNode;
}
else
{
if(xColumn.is())
{
sal_Int32 nType = 0;
xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType;
switch(nType)
{
case DataType::CHAR:
case DataType::VARCHAR:
case DataType::LONGVARCHAR:
2001-09-27 05:19:05 +00:00
if(aText.GetChar(0) != '\'' || aText.GetChar(aText.Len() -1) != '\'')
2001-02-05 08:26:47 +00:00
{
2001-09-27 05:19:05 +00:00
aText.SearchAndReplaceAll(String::CreateFromAscii("'"),String::CreateFromAscii("''"));
2001-02-05 08:26:47 +00:00
String aTmp(String::CreateFromAscii("'"));
2001-09-27 05:19:05 +00:00
(aTmp += aText) += String::CreateFromAscii("'");
aText = aTmp;
2001-02-05 08:26:47 +00:00
}
break;
default:
;
}
2001-09-27 05:19:05 +00:00
::connectivity::OSQLParser* pParser = static_cast<OQueryController*>(getDesignView()->getController())->getParser();
pParseNode = pParser->predicateTree(aErrorMsg,
aText,
static_cast<OQueryController*>(getDesignView()->getController())->getNumberFormatter(),
xColumn);
2001-02-05 08:26:47 +00:00
if (pParseNode)
{
pParseNode->parseNodeToPredicateStr(aCrit,
2001-03-01 14:45:02 +00:00
xConnection->getMetaData(),
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->getNumberFormatter(),
2001-02-05 08:26:47 +00:00
xColumn,
getDesignView()->getLocale(),
2001-02-14 13:54:12 +00:00
getDesignView()->getDecimalSeparator().toChar(),
2001-02-28 09:18:26 +00:00
&(static_cast<OQueryController*>(getDesignView()->getController())->getParser()->getContext()));
2001-02-05 08:26:47 +00:00
delete pParseNode;
}
else
{
String sTitle(ModuleRes(STR_STAT_WARNING));
OSQLMessageBox aDlg(this,sTitle,aErrorMsg,WB_OK | WB_DEF_OK,OSQLMessageBox::Warning);
aDlg.Execute();
2001-02-05 08:26:47 +00:00
bError = sal_True;
}
}
else
{
String sTitle(ModuleRes(STR_STAT_WARNING));
OSQLMessageBox aDlg(this,sTitle,aErrorMsg,WB_OK | WB_DEF_OK,OSQLMessageBox::Warning);
aDlg.Execute();
2001-02-05 08:26:47 +00:00
bError = sal_True;
}
}
2001-09-27 05:19:05 +00:00
// }
2001-02-05 08:26:47 +00:00
}
strOldCellContents = pEntry->GetCriteria(nIdx);
pEntry->SetCriteria(nIdx, aCrit);
2001-04-18 10:44:59 +00:00
sNewValue = pEntry->GetCriteria(nIdx);
2001-02-05 08:26:47 +00:00
if(aCrit.getLength() && nRow >= (GetRowCount()-1))
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
}
}
if(!bError && Controller())
Controller()->ClearModified();
RowModified(GetCurRow(), GetCurColumnId());
if(!bError)
{
// und noch die Undo-Action fuer das Ganze
2001-04-18 10:44:59 +00:00
appendUndoAction(strOldCellContents,sNewValue,nRow);
if(bListAction)
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->LeaveListAction();
}
2001-02-05 08:26:47 +00:00
}
// habe ich Daten in einer FieldDescription gespeichert, die vorher leer war und es nach den Aenderungen nicht mehr ist ?
if (pEntry.isValid() && bWasEmpty && !pEntry->IsEmpty() && !bError)
2001-02-05 08:26:47 +00:00
{
// Default auf sichtbar
pEntry->SetVisible(sal_True);
RowModified(BROW_VIS_ROW, GetCurColumnId());
// wenn noetig neue freie Spalten anlegen
long nDummy;
CheckFreeColumns(nDummy);
}
return pEntry != NULL && !bError;
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::SeekRow(long nRow)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bRet = sal_False;
m_nSeekRow = nRow;
if (nRow < m_nVisibleCount )
bRet = sal_True;
return bRet;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::PaintCell(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
rDev.SetClipRegion( rRect );
OTableFieldDescRef pEntry = NULL;
if(getFields().size() > sal_uInt16(nColumnId - 1))
pEntry = getFields()[nColumnId - 1];
2001-02-05 08:26:47 +00:00
if (!pEntry.isValid())
2001-02-05 08:26:47 +00:00
return;
long nRow = GetRealRow(m_nSeekRow);
if (nRow == BROW_VIS_ROW)
PaintTristate(rDev, rRect, pEntry->IsVisible() ? STATE_CHECK : STATE_NOCHECK);
else
rDev.DrawText(rRect.TopLeft(), GetCellText(nRow, nColumnId));
rDev.SetClipRegion( );
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::PaintStatusCell(OutputDevice& rDev, const Rectangle& rRect) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
Point aPos(rRect.TopLeft());
aPos.Y() -= 2;
String aLabel(ModuleRes(STR_QUERY_HANDLETEXT));
// ab BROW_CRIT2_ROW werden alle Zeilen mit "oder" angegeben
2001-02-23 14:04:37 +00:00
xub_StrLen nToken = (xub_StrLen) (m_nSeekRow >= GetBrowseRow(BROW_CRIT2_ROW))
2001-02-05 08:26:47 +00:00
?
2001-02-23 14:04:37 +00:00
xub_StrLen(BROW_CRIT2_ROW) : xub_StrLen(GetRealRow(m_nSeekRow));
2001-02-05 08:26:47 +00:00
rDev.DrawText(aPos, aLabel.GetToken(nToken));
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::RemoveColumn(sal_uInt16 nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-04-30 12:02:01 +00:00
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
2001-02-05 08:26:47 +00:00
// das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn
DBG_ASSERT((nColId == 0) || (nColId <= getFields().size()), "OSelectionBrowseBox::RemoveColumn : invalid parameter nColId");
2001-02-05 08:26:47 +00:00
// ColId ist bei mir gleichbedeutend mit Position, und da sollte die Bedingung natuerlich zutreffen
sal_uInt16 nCurCol = GetCurColumnId();
long nCurRow = GetCurRow();
DeactivateCell();
// Spalteninfo rausnehmen und am Ende neues Info einfuegen
getFields().erase( getFields().begin() + ((sal_uInt32)nColId - 1) );
2001-02-05 08:26:47 +00:00
// der Aufrufer ist dafuer verantwortlich, sich vorher die Description zu besorgen und die irgendwie aufzuraeumen
// (im Normalfall wohl erst mal in ein Undo zu schieben)
OTableFieldDescRef pNew = new OTableFieldDesc();
getFields().push_back(pNew);
2001-02-05 08:26:47 +00:00
// Nachfolgende Spalten optisch verschieben
sal_uInt16 nCount = (sal_uInt16)ColCount();
// (das funktioniert nur, weil hier Column-Id gleich Column-Pos ist)
for (sal_uInt16 i = nColId; i < nCount; i++)
SetColumnWidth(i, GetColumnWidth(i + 1));
// letzte Spalte erhaelt den default Wert
SetColumnWidth(nCount-1, DEFAULT_SIZE);
pNew->SetColWidth(DEFAULT_SIZE);
// Neuzeichnen
Rectangle aInvalidRect = GetInvalidRect( nColId );
Invalidate( aInvalidRect );
ActivateCell( nCurRow, nCurCol );
2001-04-30 12:02:01 +00:00
pController->setModified();
2001-02-05 08:26:47 +00:00
invalidateUndoRedo();
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::RemoveField(sal_uInt16 nId, sal_Bool bActivate)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-04-30 12:02:01 +00:00
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
2001-02-05 08:26:47 +00:00
OSL_ENSURE(getFields().size() > sal_uInt16(nId-1),"ID is to great!");
2001-04-30 12:02:01 +00:00
OTableFieldDescRef pDesc = getEntry((sal_uInt32)(nId - 1)) ;
2001-02-05 08:26:47 +00:00
pDesc->SetColWidth( (sal_uInt16)GetColumnWidth(nId) ); // hat er sich vorher leider nicht gemerkt
// UndoAction erzeugen
OTabFieldDelUndoAct* pUndoAction = new OTabFieldDelUndoAct( this );
pUndoAction->SetTabFieldDescr(pDesc);
pUndoAction->SetOwnership(sal_True);
pUndoAction->SetColId( nId );
2001-04-30 12:02:01 +00:00
pController->getUndoMgr()->AddUndoAction( pUndoAction );
2001-02-05 08:26:47 +00:00
RemoveColumn(nId);
invalidateUndoRedo();
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::MouseButtonDown(const BrowserMouseEvent& rEvt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if( rEvt.IsLeft() )
{
sal_Bool bOnHeader = rEvt.GetRow() < 0 && rEvt.GetColumnId() != HANDLE_ID;
// wenn ein Header selectiert wird, mu<6D> die selection angezeigt werden, sonst nicht)
if (bOnHeader)
{
if (GetSelectColumnCount() == 0)
// wenn es schon eine selektierte Spalte gibt, bin ich schon im richtigen Modus
if ((m_nMode & BROWSER_HIDESELECT) == BROWSER_HIDESELECT)
{
m_nMode &= ~BROWSER_HIDESELECT;
m_nMode |= BROWSER_MULTISELECTION;
SetMode(m_nMode);
}
}
else if (!((m_nMode & BROWSER_HIDESELECT) == BROWSER_HIDESELECT))
{
if (GetSelectColumnCount() != 0)
SetNoSelection();
if (rEvt.GetColumnId() == HANDLE_ID)
{
m_nMode |= BROWSER_HIDESELECT;
m_nMode &= ~BROWSER_MULTISELECTION;
SetMode(m_nMode);
}
}
}
EditBrowseBox::MouseButtonDown(rEvt);
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::MouseButtonUp(const BrowserMouseEvent& rEvt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
EditBrowseBox::MouseButtonUp( rEvt );
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::KeyInput( const KeyEvent& rEvt )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if (IsColumnSelected(GetCurColumnId()))
{
if (rEvt.GetKeyCode().GetCode() == KEY_DELETE && // Delete rows
!rEvt.GetKeyCode().IsShift() &&
!rEvt.GetKeyCode().IsMod1())
{
RemoveField(GetCurColumnId());
return;
}
}
EditBrowseBox::KeyInput(rEvt);
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
2001-03-30 12:06:46 +00:00
sal_Int8 OSelectionBrowseBox::AcceptDrop( const BrowserAcceptDropEvent& rEvt )
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-03-30 12:06:46 +00:00
if ( (rEvt.GetColumnId() >= 0)
&& (rEvt.GetRow() >= -1)
&& OJoinExchObj::isFormatAvailable(GetDataFlavors())
)
return DND_ACTION_LINK;
return DND_ACTION_NONE;
}
//------------------------------------------------------------------------------
sal_Int8 OSelectionBrowseBox::ExecuteDrop( const BrowserExecuteDropEvent& _rEvt )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
TransferableDataHelper aDropped(_rEvt.maDropEvent.Transferable);
if (!OJoinExchObj::isFormatAvailable(aDropped.GetDataFlavorExVector()))
2001-02-05 08:26:47 +00:00
{
2001-03-30 12:06:46 +00:00
DBG_ERROR("OSelectionBrowseBox::ExecuteDrop: this should never have passed AcceptDrop!");
return DND_ACTION_NONE;
2001-02-05 08:26:47 +00:00
}
2001-03-30 12:06:46 +00:00
OTableFieldDesc aInfo;
// Einfuegen des Feldes an der gewuenschten Position
OJoinExchangeData jxdSource = OJoinExchObj::GetSourceDescription(_rEvt.maDropEvent.Transferable);
InsertField(jxdSource);
return DND_ACTION_LINK;
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::AppendNewCol( sal_uInt16 nCnt )
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// es koennen mehrere angelegt werden, aber der Erste
// wird returnt
sal_uInt32 nCount = getFields().size();
2001-02-05 08:26:47 +00:00
for (sal_uInt16 i=0 ; i<nCnt ; i++)
{
// pNewDesc = new OTableFieldDesc();
// pNewDesc->SetColWidth(DEFAULT_SIZE);
getFields().push_back(m_pEmptyEntry);
InsertDataColumn((sal_uInt16)getFields().size(), String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND);
2001-02-05 08:26:47 +00:00
}
return getFields()[nCount];
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::DeleteFields(const String& rAliasName)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if (!getFields().empty())
2001-02-05 08:26:47 +00:00
{
sal_uInt16 nColId = GetCurColumnId();
sal_uInt32 nRow = GetCurRow();
2001-10-26 06:49:36 +00:00
sal_Bool bWasEditing = IsEditing();
if (bWasEditing)
2001-02-05 08:26:47 +00:00
DeactivateCell();
OTableFields::reverse_iterator aIter = getFields().rbegin();
OTableFieldDescRef pEntry = NULL;
for(sal_Int32 nPos=getFields().size();aIter != getFields().rend();++aIter,--nPos)
2001-02-05 08:26:47 +00:00
{
pEntry = *aIter;
if (pEntry->GetAlias() == ::rtl::OUString(rAliasName) )
RemoveField((sal_uInt16)nPos, sal_False);
}
2001-10-26 06:49:36 +00:00
if (bWasEditing)
2001-02-05 08:26:47 +00:00
ActivateCell(nRow , nColId);
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetColWidth()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// Spaltenbreite ermitteln
sal_uInt16 nColCount = ColCount();
sal_uInt32 nColWidth = 0;
for( sal_uInt16 nColId=1; nColId<=nColCount; nColId++ )
{
2001-02-28 09:18:26 +00:00
nColWidth = static_cast<OQueryController*>(getDesignView()->getController())->getColWidth( nColId );
2001-02-05 08:26:47 +00:00
if( nColWidth == 0)
nColWidth = DEFAULT_SIZE;
SetColumnWidth( nColId, nColWidth );
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetColWidth(sal_uInt16 nColId, long nNewWidth)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-10-26 06:49:36 +00:00
sal_Bool bWasEditing = IsEditing();
if (bWasEditing)
2001-02-05 08:26:47 +00:00
DeactivateCell();
// die Basisklasse machen lassen
SetColumnWidth(nColId, nNewWidth);
// der FieldDescription Bescheid sagen
OTableFieldDescRef pEntry = getEntry(nColId - 1);
if (pEntry.isValid())
2001-02-23 14:04:37 +00:00
pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
2001-02-05 08:26:47 +00:00
2001-10-26 06:49:36 +00:00
if (bWasEditing)
2001-02-05 08:26:47 +00:00
ActivateCell(GetCurRow(), GetCurColumnId());
}
//------------------------------------------------------------------------------
Rectangle OSelectionBrowseBox::GetInvalidRect( sal_uInt16 nColId )
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
//////////////////////////////////////////////////////////////////////
// Rechteck ist erst einmal der gesamte Outputbereich des Fensters
Rectangle aInvalidRect( Point(0,0), GetOutputSizePixel() );
//////////////////////////////////////////////////////////////////////
// Dann wird die linke Seite angepasst
2001-02-14 13:54:12 +00:00
Rectangle aFieldRect(GetCellRect( 0, nColId )); // used instead of GetFieldRectPixel
2001-02-05 08:26:47 +00:00
aInvalidRect.Left() = aFieldRect.Left();
return aInvalidRect;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::InsertColumn(OTableFieldDescRef pEntry, long& nColId)
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-04-30 12:02:01 +00:00
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
2001-02-05 08:26:47 +00:00
// das Control sollte immer genau eine Spalte mehr haben, naemlich die HandleColumn
DBG_ASSERT(sal_uInt16(nColId == -1) || (nColId <= (long)getFields().size()), "OSelectionBrowseBox::InsertColumn : invalid parameter nColId.");
2001-02-05 08:26:47 +00:00
// -1 heisst ganz hinten, Count heisst ganz hinten, der Rest bezeichnet eine richtige Position
sal_uInt16 nCurCol = GetCurColumnId();
long nCurRow = GetCurRow();
DeactivateCell();
// Gueltigkeit von nColId pruefen (ColId von 1 bis ...)
// Wenn zu klein oder zu gross, auf Ende der Liste setzen
if ((nColId == -1) || (sal_uInt16(nColId) >= getFields().size())) // Anhaengen des Feldes
2001-02-05 08:26:47 +00:00
{
if (FindFirstFreeCol(nColId) == NULL) // keine freie Column mehr
{
AppendNewCol(1);
nColId = getFields().size();
2001-02-05 08:26:47 +00:00
}
else
++nColId; // innerhalb der vorgegebenen Liste
2001-02-05 08:26:47 +00:00
}
// in Liste der Spaltenbeschreibungen neues Element
getFields().insert( getFields().begin()+(sal_uInt32)nColId-1 ,pEntry);
2001-02-05 08:26:47 +00:00
// da ich meine Spaltenzahl immer auf dem selben Wert wie die Zahl der FieldDescriptions halten muss (plus 1, da es eine
// HandleClumn gibt), muss ich fuer diese gerade eingefuegte Description auch eine loeschen
long nFirstFreeCol = -1;
CheckFreeColumns(nFirstFreeCol);
// (es kann sein, dass es keine leere gab, dann erzwingt CheckFreeColumns das)
getFields().erase(getFields().begin()+(sal_uInt16)nFirstFreeCol);
2001-02-05 08:26:47 +00:00
// jetzt kann wieder keine leere Spalte vorhanden sein (falls naemlich die soeben geloeschte die einzige war) ...
CheckFreeColumns(nFirstFreeCol);
// Nachfolgende Spalten optisch verschieben
sal_uInt16 nCount = (sal_uInt16)getFields().size();
2001-02-05 08:26:47 +00:00
for (sal_uInt16 i = nCount-1; i > nColId; --i)
SetColumnWidth(i, GetColumnWidth(i - 1));
// Spaltenbreite setzen
SetColumnWidth((sal_uInt16)nColId, pEntry->GetColWidth() );
// Neuzeichnen
Rectangle aInvalidRect = GetInvalidRect( (sal_uInt16)nColId );
Invalidate( aInvalidRect );
ActivateCell( nCurRow, nCurCol );
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
2001-02-05 08:26:47 +00:00
invalidateUndoRedo();
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::InsertField(const OJoinExchangeData& jxdSource, long nColId, sal_Bool bVis, sal_Bool bActivate)
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OQueryTableWindow* pSourceWin = static_cast<OQueryTableWindow*>(jxdSource.pListBox->GetTabWin());
if (!pSourceWin)
return NULL;
// Namen/Position des selektierten Feldes
String aFieldName = jxdSource.pListBox->GetEntryText(jxdSource.pEntry);
sal_uInt32 nFieldIndex = jxdSource.pListBox->GetModel()->GetAbsPos(jxdSource.pEntry);
OTableFieldInfo* pInf = static_cast<OTableFieldInfo*>(jxdSource.pEntry->GetUserData());
// eine DragInfo aufbauen, damit ich mich auf das andere InsertField zurueckziehen kann
OTableFieldDescRef aInfo = new OTableFieldDesc(pSourceWin->GetTableName(),aFieldName);
aInfo->SetTabWindow(pSourceWin);
aInfo->SetFieldIndex(nFieldIndex);
aInfo->SetFieldType(pInf->GetKeyType());
aInfo->SetAlias(pSourceWin->GetAliasName());
aInfo->SetDatabase(pSourceWin->GetComposedName());
2001-02-05 08:26:47 +00:00
aInfo->SetDataType(pInf->GetDataType());
aInfo->SetVisible(bVis);
2001-02-05 08:26:47 +00:00
return InsertField(aInfo, nColId, bVis, bActivate);
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::InsertField(const OTableFieldDescRef& _rInfo, long nColId, sal_Bool bVis, sal_Bool bActivate)
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if(m_nMaxColumns && m_nMaxColumns <= FieldsCount())
return NULL;
if (bActivate)
SaveModified();
// Neue Spaltenbeschreibung
OTableFieldDescRef pEntry = _rInfo;//new OTableFieldDesc(*_rInfo);
2001-02-05 08:26:47 +00:00
pEntry->SetVisible(bVis);
sal_uInt32 nColWidth;
if( getDesignView()->getColWidth(_rInfo->GetAlias(), _rInfo->GetField(), nColWidth) )
2001-02-05 08:26:47 +00:00
pEntry->SetColWidth( (sal_uInt16)nColWidth );
else
pEntry->SetColWidth( (sal_uInt16)DEFAULT_SIZE );
// Spalte einfuegen
InsertColumn( pEntry, nColId );
// UndoAction erzeugen
OTabFieldCreateUndoAct* pUndoAction = new OTabFieldCreateUndoAct( this );
pUndoAction->SetTabFieldDescr( pEntry );
pUndoAction->SetOwnership(sal_False);
pUndoAction->SetColId( nColId );
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->AddUndoAction( pUndoAction );
2001-02-05 08:26:47 +00:00
return pEntry;
}
//------------------------------------------------------------------------------
sal_uInt16 OSelectionBrowseBox::FieldsCount()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-04-30 12:02:01 +00:00
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
OTableFields::iterator aIter = getFields().begin();
2001-02-05 08:26:47 +00:00
sal_uInt16 nCount = 0;
while (aIter != getFields().end())
2001-02-05 08:26:47 +00:00
{
if ((*aIter).isValid() && !(*aIter)->IsEmpty())
++nCount;
2001-02-05 08:26:47 +00:00
++aIter;
}
return nCount;
}
//------------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::FindFirstFreeCol( long& rCol )
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-04-30 12:02:01 +00:00
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
OTableFields::iterator aIter = getFields().begin();
2001-02-05 08:26:47 +00:00
rCol = -1;
while (aIter != getFields().end())
2001-02-05 08:26:47 +00:00
{
++rCol;
if ((*aIter).isValid() && (*aIter)->IsEmpty())
2001-02-05 08:26:47 +00:00
return *aIter;
++aIter;
}
return NULL;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::CheckFreeColumns(long& rCol)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
if (FindFirstFreeCol(rCol) == NULL)
{
// es ist voll, also einen Packen Spalten anhaengen
AppendNewCol(DEFAULT_QUERY_COLS);
OSL_VERIFY(FindFirstFreeCol(rCol).isValid());
2001-02-05 08:26:47 +00:00
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::AddGroupBy( const OTableFieldDescRef& rInfo )
2001-02-05 08:26:47 +00:00
{
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
return;
2001-02-05 08:26:47 +00:00
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(!rInfo->IsEmpty(),"AddGroupBy:: OTableFieldDescRef sollte nicht Empty sein!");
OTableFieldDescRef pEntry;
2001-03-01 14:45:02 +00:00
::comphelper::UStringMixEqual bCase(xConnection->getMetaData()->storesMixedCaseQuotedIdentifiers());
OTableFields::iterator aIter = getFields().begin();
for(;aIter != getFields().end();++aIter)
2001-02-05 08:26:47 +00:00
{
pEntry = *aIter;
OSL_ENSURE(pEntry.isValid(),"OTableFieldDescRef was null!");
2001-02-05 08:26:47 +00:00
::rtl::OUString aField = pEntry->GetField();
::rtl::OUString aAlias = pEntry->GetAlias();
if (bCase(aField,rInfo->GetField()) &&
bCase(aAlias,rInfo->GetAlias()) &&
pEntry->GetFunctionType() == rInfo->GetFunctionType())
2001-02-05 08:26:47 +00:00
{
if((pEntry->GetFunctionType() == FKT_AGGREGATE && rInfo->IsGroupBy()))
2001-02-05 08:26:47 +00:00
pEntry->SetGroupBy(sal_False);
else
{
pEntry->SetGroupBy(rInfo->IsGroupBy());
if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
2001-02-05 08:26:47 +00:00
pEntry->SetVisible(sal_True);
}
break;
}
}
if (aIter == getFields().end())
2001-02-05 08:26:47 +00:00
{
OTableFieldDescRef pTmp = InsertField(rInfo, -1, sal_False, sal_False );
if((pTmp->GetFunctionType() == FKT_AGGREGATE && rInfo->IsGroupBy())) // das GroupBy wird bereits von rInfo "ubernommen
2001-02-05 08:26:47 +00:00
pTmp->SetGroupBy(sal_False);
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::AddCondition( const OTableFieldDescRef& rInfo, const String& rValue, const sal_uInt16 nLevel, const char* pOp )
2001-02-05 08:26:47 +00:00
{
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
return;
2001-02-05 08:26:47 +00:00
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(rInfo.isValid() && !rInfo->IsEmpty(),"AddCondition:: OTableFieldDescRef sollte nicht Empty sein!");
OTableFieldDescRef pEntry;
2001-03-01 14:45:02 +00:00
::comphelper::UStringMixEqual bCase(xConnection->getMetaData()->storesMixedCaseQuotedIdentifiers());
2001-02-05 08:26:47 +00:00
OTableFields::iterator aIter = getFields().begin();
for(;aIter != getFields().end();++aIter)
2001-02-05 08:26:47 +00:00
{
pEntry = *aIter;
::rtl::OUString aField = pEntry->GetField();
::rtl::OUString aAlias = pEntry->GetAlias();
if (bCase(aField,rInfo->GetField()) &&
bCase(aAlias,rInfo->GetAlias()) &&
pEntry->GetFunctionType() == rInfo->GetFunctionType())
2001-02-05 08:26:47 +00:00
{
if((pEntry->GetFunctionType() == FKT_AGGREGATE && rInfo->IsGroupBy()))
2001-02-05 08:26:47 +00:00
pEntry->SetGroupBy(sal_False);
else
{
pEntry->SetGroupBy(rInfo->IsGroupBy());
if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
2001-02-05 08:26:47 +00:00
pEntry->SetVisible(sal_True);
}
if (!pEntry->GetCriteria(nLevel).getLength())
{
pEntry->SetCriteria( nLevel, rValue);
if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
break;
}
}
}
if (aIter == getFields().end())
2001-02-05 08:26:47 +00:00
{
OTableFieldDescRef pTmp = InsertField(rInfo, -1, sal_False, sal_False );
if((pTmp->GetFunctionType() == FKT_AGGREGATE && rInfo->IsGroupBy())) // das GroupBy wird bereits von rInfo "ubernommen
2001-02-05 08:26:47 +00:00
pTmp->SetGroupBy(sal_False);
if(pTmp.isValid())
2001-02-05 08:26:47 +00:00
{
pTmp->SetCriteria( nLevel, rValue);
if(nLevel == (m_nVisibleCount-BROW_CRIT1_ROW-1))
{
RowInserted( GetRowCount()-1, 1, TRUE );
m_bVisibleRow.push_back(sal_True);
++m_nVisibleCount;
}
}
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::AddOrder( const OTableFieldDescRef& rInfo, const EOrderDir eDir, sal_uInt16& nPos )
2001-02-05 08:26:47 +00:00
{
2001-03-01 14:45:02 +00:00
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
if(!xConnection.is())
return;
2001-02-05 08:26:47 +00:00
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(!rInfo->IsEmpty(),"AddOrder:: OTableFieldDescRef sollte nicht Empty sein!");
2001-02-05 08:26:47 +00:00
// nPos merkt sich die Spalte in die Sortierung eingetragen wird,
// da weitere Sortierungen nur dahinter abgelegt werden duerfen
OTableFieldDescRef pEntry;
2001-03-01 14:45:02 +00:00
::comphelper::UStringMixEqual bCase(xConnection->getMetaData()->storesMixedCaseQuotedIdentifiers());
2001-02-05 08:26:47 +00:00
OTableFields::iterator aIter = getFields().begin();
for(;aIter != getFields().end();++aIter)
2001-02-05 08:26:47 +00:00
{
pEntry = *aIter;
::rtl::OUString aField = pEntry->GetField();
::rtl::OUString aAlias = pEntry->GetAlias();
if (bCase(aField,rInfo->GetField()) &&
bCase(aAlias,rInfo->GetAlias()))
2001-02-05 08:26:47 +00:00
{
if(!m_bOrderByUnRelated)
pEntry->SetVisible(sal_True);
pEntry->SetOrderDir( eDir );
nPos = getFields().end() - aIter;
2001-02-05 08:26:47 +00:00
break;
}
}
if (aIter == getFields().end())
2001-02-05 08:26:47 +00:00
{
OTableFieldDescRef pTmp = InsertField(rInfo, -1, sal_False, sal_False );
if(pTmp.isValid())
2001-02-05 08:26:47 +00:00
{
if(!m_bOrderByUnRelated)
pTmp->SetVisible(sal_True);
2001-02-05 08:26:47 +00:00
pTmp->SetOrderDir( eDir );
}
nPos = (sal_uInt16)( getFields().size()-1 );
2001-02-05 08:26:47 +00:00
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::ArrangeControls(sal_uInt16& nX, sal_uInt16 nY)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
EditBrowseBox::ArrangeControls(nX, nY);
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
2001-09-27 05:19:05 +00:00
sal_Bool OSelectionBrowseBox::Save()
2001-02-05 08:26:47 +00:00
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-09-27 05:19:05 +00:00
sal_Bool bRet = sal_True;
2001-02-05 08:26:47 +00:00
if (IsModified())
2001-09-27 05:19:05 +00:00
bRet = SaveModified();
return bRet;
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::CellModified()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_VIS_ROW:
{
OTableFieldDescRef pEntry = getEntry(GetCurColumnId() - 1);
2001-04-18 06:02:22 +00:00
sal_Bool bOldValue = pEntry->IsVisible();
2001-02-05 08:26:47 +00:00
sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
if(!m_bOrderByUnRelated && nIdx > 0 &&
nIdx != sal_uInt16(-1) &&
!pEntry->IsEmpty() &&
pEntry->GetOrderDir() != ORDER_NONE)
2001-02-05 08:26:47 +00:00
{
m_pVisibleCell->GetBox().Check();
pEntry->SetVisible(sal_True);
}
else
pEntry->SetVisible(m_pVisibleCell->GetBox().IsChecked());
}
break;
}
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::Fill()
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(ColCount() >= 1, "OSelectionBrowseBox::Fill : please call only after inserting the handle column !");
sal_uInt16 nColCount = ColCount() - 1;
if (nColCount < DEFAULT_QUERY_COLS)
AppendNewCol(DEFAULT_QUERY_COLS - nColCount);
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::Command(const CommandEvent& rEvt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
switch (rEvt.GetCommand())
{
case COMMAND_CONTEXTMENU:
{
if (!rEvt.IsMouseEvent())
{
EditBrowseBox::Command(rEvt);
2001-02-05 08:26:47 +00:00
return;
}
Point aPoint(rEvt.GetMousePosPixel());
sal_uInt16 nColId = GetColumnAtXPosPixel(rEvt.GetMousePosPixel().X());
long nRow = GetRowAtYPosPixel(rEvt.GetMousePosPixel().Y());
if (nRow < 0 && nColId > HANDLE_ID && IsColumnSelected(nColId) )
{
2001-02-28 09:18:26 +00:00
if (!static_cast<OQueryController*>(getDesignView()->getController())->isReadOnly())
2001-02-05 08:26:47 +00:00
{
PopupMenu aContextMenu(ModuleRes(RID_QUERYCOLPOPUPMENU));
switch (aContextMenu.Execute(this, aPoint))
{
case SID_DELETE: // Aussch
RemoveField(nColId);
break;
}
}
}
else if(nRow >= 0 && nColId <= HANDLE_ID)
{
2001-02-28 09:18:26 +00:00
if (!static_cast<OQueryController*>(getDesignView()->getController())->isReadOnly())
2001-02-05 08:26:47 +00:00
{
PopupMenu aContextMenu(ModuleRes(RID_QUERYFUNCTION_POPUPMENU));
aContextMenu.CheckItem( ID_QUERY_FUNCTION, m_bVisibleRow[BROW_FUNCTION_ROW]);
aContextMenu.CheckItem( ID_QUERY_TABLENAME, m_bVisibleRow[BROW_TABLE_ROW]);
aContextMenu.CheckItem( ID_QUERY_ALIASNAME, m_bVisibleRow[BROW_COLUMNALIAS_ROW]);
2001-02-28 09:18:26 +00:00
aContextMenu.CheckItem( ID_QUERY_DISTINCT, static_cast<OQueryController*>(getDesignView()->getController())->isDistinct());
2001-02-05 08:26:47 +00:00
switch (aContextMenu.Execute(this, aPoint))
{
case ID_QUERY_FUNCTION:
SetRowVisible(BROW_FUNCTION_ROW, !IsRowVisible(BROW_FUNCTION_ROW));
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_QUERY_VIEW_FUNCTIONS );
2001-02-05 08:26:47 +00:00
break;
case ID_QUERY_TABLENAME:
SetRowVisible(BROW_TABLE_ROW, !IsRowVisible(BROW_TABLE_ROW));
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_QUERY_VIEW_TABLES );
2001-02-05 08:26:47 +00:00
break;
case ID_QUERY_ALIASNAME:
SetRowVisible(BROW_COLUMNALIAS_ROW, !IsRowVisible(BROW_COLUMNALIAS_ROW));
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_QUERY_VIEW_ALIASES );
2001-02-05 08:26:47 +00:00
break;
case ID_QUERY_DISTINCT:
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->setDistinct(!static_cast<OQueryController*>(getDesignView()->getController())->isDistinct());
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_QUERY_DISTINCT_VALUES );
2001-02-05 08:26:47 +00:00
break;
}
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
2001-02-05 08:26:47 +00:00
}
}
else
{
EditBrowseBox::Command(rEvt);
2001-02-05 08:26:47 +00:00
return;
}
}
default:
EditBrowseBox::Command(rEvt);
2001-02-05 08:26:47 +00:00
}
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::IsRowVisible(sal_uInt16 _nWhich) const
{
DBG_ASSERT(_nWhich>=0 && _nWhich<(m_bVisibleRow.size()), "OSelectionBrowseBox::IsRowVisible : invalid parameter !");
return m_bVisibleRow[_nWhich];
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetRowVisible(sal_uInt16 _nWhich, sal_Bool _bVis)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(_nWhich>=0 && _nWhich<m_bVisibleRow.size(), "OSelectionBrowseBox::SetRowVisible : invalid parameter !");
2001-10-26 06:49:36 +00:00
sal_Bool bWasEditing = IsEditing();
if (bWasEditing)
2001-02-05 08:26:47 +00:00
DeactivateCell();
// do this before removing or inserting rows, as this triggers ActivateCell-calls, which rely on m_bVisibleRow
m_bVisibleRow[_nWhich] = !m_bVisibleRow[_nWhich];
long nId = GetBrowseRow(_nWhich);
if (_bVis)
{
RowInserted(nId,1);
2001-10-23 11:30:27 +00:00
++m_nVisibleCount;
2001-02-05 08:26:47 +00:00
}
else
{
RowRemoved(nId,1);
2001-10-23 11:30:27 +00:00
--m_nVisibleCount;
2001-02-05 08:26:47 +00:00
}
2001-10-26 06:49:36 +00:00
if (bWasEditing)
2001-02-05 08:26:47 +00:00
ActivateCell();
}
//------------------------------------------------------------------------------
long OSelectionBrowseBox::GetBrowseRow(long nRowId) const
{
long nCount(0);
for(long i=0;i<nRowId;i++)
{
if(m_bVisibleRow[i])
nCount++;
}
return nCount;
}
//------------------------------------------------------------------------------
long OSelectionBrowseBox::GetRealRow(long nRowId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
long nErg=0,i;
2001-02-23 14:04:37 +00:00
for(i=0;i < (long)m_bVisibleRow.size(); i++)
2001-02-05 08:26:47 +00:00
{
if(m_bVisibleRow[i])
{
if(nErg++ == nRowId)
break;
}
}
2001-02-23 14:04:37 +00:00
DBG_ASSERT(nErg <= long(m_bVisibleRow.size()),"nErg kann nicht groesser als BROW_ROW_CNT sein!");
2001-02-05 08:26:47 +00:00
return i;
}
static long nVisibleRowMask[] =
{
0x0001,
0x0002,
0x0004,
0x0008,
0x0010,
0x0020,
0x0040,
0x0080,
0x0100,
0x0200,
0x0400,
0x0800
};
//------------------------------------------------------------------------------
sal_Int32 OSelectionBrowseBox::GetNoneVisibleRows() const
{
sal_Int32 nErg(0);
2001-10-23 11:30:27 +00:00
// only the first 11 row are interesting
2001-02-05 08:26:47 +00:00
sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]);
for(sal_Int32 i=0;i<nSize;i++)
{
if(!m_bVisibleRow[i])
nErg |= nVisibleRowMask[i];
}
return nErg;
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetNoneVisbleRow(long nRows)
{
2001-10-23 11:30:27 +00:00
// only the first 11 row are interesting
2001-02-05 08:26:47 +00:00
sal_Int32 nSize = sizeof(nVisibleRowMask) / sizeof(nVisibleRowMask[0]);
for(sal_Int32 i=0;i< nSize;i++)
m_bVisibleRow[i] = !(nRows & nVisibleRowMask[i]);
}
//------------------------------------------------------------------------------
String OSelectionBrowseBox::GetCellText(long nRow, sal_uInt16 nColId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
OTableFieldDescRef pEntry = getFields()[nColId-1];
2001-02-05 08:26:47 +00:00
DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::GetCellText : invalid column id, prepare for GPF ... ");
if(pEntry->IsEmpty())
return String();
//if (!pEntry)
// return String();
String aText;
switch (nRow)
{
case BROW_TABLE_ROW:
aText = pEntry->GetAlias();
break;
case BROW_FIELD_ROW:
{
String aField = pEntry->GetField();
if (aField.GetChar(0) == '*') // * durch alias.* ersetzen
{
aField = pEntry->GetAlias();
if(aField.Len())
aField += '.';
2001-02-05 08:26:47 +00:00
aField += '*';
}
aText = aField;
} break;
case BROW_ORDER_ROW:
if (pEntry->GetOrderDir() != ORDER_NONE)
aText = String(ModuleRes(STR_QUERY_SORTTEXT) ).GetToken(pEntry->GetOrderDir());
break;
case BROW_VIS_ROW:
break;
case BROW_COLUMNALIAS_ROW:
aText = pEntry->GetFieldAlias();
break;
case BROW_FUNCTION_ROW:
if(pEntry->GetFunctionType() == FKT_AGGREGATE)
aText = pEntry->GetFunction();
else if(pEntry->IsGroupBy())
aText = m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1);
break;
default:
aText = pEntry->GetCriteria(nRow - BROW_CRIT1_ROW);
}
return aText;
}
//------------------------------------------------------------------------------
sal_Bool OSelectionBrowseBox::GetFunktionName(String& rFkt)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
sal_Bool bErg=sal_True;
String aText;
if(rFkt.EqualsIgnoreCaseAscii("AVG"))
rFkt = m_pFunctionCell->GetEntry(1);
else if(rFkt.EqualsIgnoreCaseAscii("COUNT"))
rFkt = m_pFunctionCell->GetEntry(2);
else if(rFkt.EqualsIgnoreCaseAscii("MAX"))
rFkt = m_pFunctionCell->GetEntry(3);
else if(rFkt.EqualsIgnoreCaseAscii("MIN"))
rFkt = m_pFunctionCell->GetEntry(4);
else if(rFkt.EqualsIgnoreCaseAscii("SUM"))
rFkt = m_pFunctionCell->GetEntry(5);
else
{
xub_StrLen nCount = m_aFunctionStrings.GetTokenCount();
for (xub_StrLen i = 0; i < nCount-1; i++) // Gruppierung wird nicht mit gez"ahlt
{
if(rFkt.EqualsIgnoreCaseAscii(m_aFunctionStrings.GetToken(i)))
{
rFkt = m_aFunctionStrings.GetToken(i);
break;
}
}
if(i == nCount-1)
bErg = sal_False;
}
return bErg;
}
//------------------------------------------------------------------------------
String OSelectionBrowseBox::GetCellContents(sal_uInt16 nCellIndex, long nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-04-18 10:44:59 +00:00
// DBG_ASSERT(nCellIndex < (GetRowCount()-1),"CellIndex ist zu gross");
2001-02-05 08:26:47 +00:00
SaveModified();
OTableFieldDescRef pEntry = getFields()[nColId - 1];
2001-02-05 08:26:47 +00:00
DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::GetCellContents : invalid column id, prepare for GPF ... ");
2001-04-18 10:44:59 +00:00
switch (nCellIndex)
2001-02-05 08:26:47 +00:00
{
case BROW_VIS_ROW :
return pEntry->IsVisible() ? g_strOne : g_strZero;
case BROW_ORDER_ROW:
{
sal_uInt16 nIdx = m_pOrderCell->GetSelectEntryPos();
if (nIdx == sal_uInt16(-1))
nIdx = 0;
return String(nIdx);
}
default:
2001-04-18 10:44:59 +00:00
return GetCellText(nCellIndex, (sal_uInt16)nColId);
2001-02-05 08:26:47 +00:00
}
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::SetCellContents(sal_uInt16 nRow, long nColId, const String& strNewText)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
2001-10-26 06:49:36 +00:00
sal_Bool bWasEditing = IsEditing() && (GetCurColumnId() == nColId) && IsRowVisible(nRow) && (GetCurRow() == GetBrowseRow(nRow));
if (bWasEditing)
2001-02-05 08:26:47 +00:00
DeactivateCell();
OTableFieldDescRef pEntry = getEntry(nColId - 1);
2001-02-05 08:26:47 +00:00
DBG_ASSERT(pEntry != NULL, "OSelectionBrowseBox::SetCellContents : invalid column id, prepare for GPF ... ");
2001-04-18 10:44:59 +00:00
switch (nRow)
2001-02-05 08:26:47 +00:00
{
case BROW_VIS_ROW:
pEntry->SetVisible(strNewText == g_strOne);
break;
case BROW_FIELD_ROW:
pEntry->SetField(strNewText);
if (strNewText.Len() == 0) // bei leerem Feld auch den Tabellennamen loeschen
pEntry->SetAlias(strNewText);
break;
case BROW_TABLE_ROW:
pEntry->SetAlias(strNewText);
break;
case BROW_ORDER_ROW:
{
sal_uInt16 nIdx = (sal_uInt16)strNewText.ToInt32();
pEntry->SetOrderDir(EOrderDir(nIdx));
} break;
case BROW_COLUMNALIAS_ROW:
pEntry->SetFieldAlias(strNewText);
break;
case BROW_FUNCTION_ROW:
pEntry->SetFunction(strNewText);
if(m_aFunctionStrings.GetToken(m_aFunctionStrings.GetTokenCount()-1).EqualsIgnoreCaseAscii(strNewText))
pEntry->SetGroupBy(sal_True);
else
pEntry->SetFunctionType(FKT_AGGREGATE);
break;
default:
2001-04-18 10:44:59 +00:00
pEntry->SetCriteria(nRow - BROW_CRIT1_ROW, strNewText);
2001-02-05 08:26:47 +00:00
}
2001-04-18 10:44:59 +00:00
long nCellIndex = GetRealRow(nRow);
if(IsRowVisible(nRow))
RowModified(nCellIndex, (sal_uInt16)nColId);
2001-02-05 08:26:47 +00:00
// die entsprechende Feld-Beschreibung ist jetzt leer -> Visible auf sal_False (damit das konsistent mit normalen leeren Spalten ist)
if (pEntry->IsEmpty())
pEntry->SetVisible(sal_False);
2001-10-26 06:49:36 +00:00
if (bWasEditing)
2001-04-18 06:02:22 +00:00
ActivateCell(nCellIndex, (sal_uInt16)nColId);
2001-02-05 08:26:47 +00:00
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
2001-02-05 08:26:47 +00:00
}
//------------------------------------------------------------------------------
sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRow, sal_uInt16 nColId) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// OTableFieldDescRef pEntry = getFields()[nColId-1];
// if (!pEntry.isValid())
// return DEFAULT_SIZE;
2001-02-05 08:26:47 +00:00
long nRowId = GetRealRow(nRow);
if (nRowId == BROW_VIS_ROW)
return CHECKBOX_SIZE;
else
return GetDataWindow().GetTextWidth(GetCellText(nRowId, nColId));
}
//------------------------------------------------------------------------------
void OSelectionBrowseBox::ColumnResized(sal_uInt16 nColId)
{
2001-02-28 09:18:26 +00:00
if (static_cast<OQueryController*>(getDesignView()->getController())->isReadOnly())
2001-02-05 08:26:47 +00:00
return;
// The resizing of columns can't be suppressed (BrowseBox doesn't support that) so we have to do this
// fake. It's not _that_ bad : the user may change column widths while in read-only mode to see all details
// but the changes aren't permanent ...
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT(nColId <= getFields().size(),"ColumnResized:: nColId sollte nicht groesser als List::count sein!");
OTableFieldDescRef pEntry = getEntry(nColId-1);
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::ColumnResized : keine FieldDescription !");
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
EditBrowseBox::ColumnResized(nColId);
2001-02-05 08:26:47 +00:00
if (pEntry.isValid())
2001-02-05 08:26:47 +00:00
{
OTabFieldSizedUndoAct* pUndo = new OTabFieldSizedUndoAct(this);
pUndo->SetColId(nColId);
pUndo->SetOriginalWidth(pEntry->GetColWidth());
2001-02-28 09:18:26 +00:00
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->AddUndoAction(pUndo);
2001-02-23 14:04:37 +00:00
pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
2001-02-05 08:26:47 +00:00
}
}
//------------------------------------------------------------------------------
sal_uInt32 OSelectionBrowseBox::GetTotalCellWidth(long nRowId, sal_uInt16 nColId)
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
DBG_ASSERT((nColId == 0) || (nColId <= getFields().size()), "OSelectionBrowseBox::GetTotalCellWidth : invalid parameter nColId");
2001-02-05 08:26:47 +00:00
OTableFieldDescRef pEntry = getFields()[nColId-1];
DBG_ASSERT(pEntry.isValid(), "OSelectionBrowseBox::GetTotalCellWidth : invalid FieldDescription !");
2001-02-05 08:26:47 +00:00
long nRow = GetRealRow(nRowId);
String strText(GetCellText(nRow, nColId));
return GetDataWindow().LogicToPixel(Size(GetDataWindow().GetTextWidth(strText),0)).Width();
}
//------------------------------------------------------------------------------
sal_uInt16 OSelectionBrowseBox::GetDefaultColumnWidth(const String& rName) const
{
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
// die Baissklasse macht das von dem Text abhaengig, ich habe aber keine Spaltenueberschriften, daher haette ich
// hier gern einen anderen Default-Wert
return DEFAULT_SIZE;
}
//------------------------------------------------------------------------------
2001-04-18 10:44:59 +00:00
sal_Bool OSelectionBrowseBox::isCutAllowed()
{
sal_Bool bCutAllowed = sal_False;
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_VIS_ROW:
case BROW_ORDER_ROW:
case BROW_TABLE_ROW:
case BROW_FUNCTION_ROW:
break;
case BROW_FIELD_ROW:
bCutAllowed = m_pFieldCell->GetSelected().Len() != 0;
break;
default:
bCutAllowed = m_pTextCell->GetSelected().Len() != 0;
break;
}
return bCutAllowed;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::cut()
{
String sOldValue = GetCellContents(GetRealRow(GetCurRow()),GetCurColumnId());
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_FIELD_ROW:
m_pFieldCell->Cut();
m_pFieldCell->SetModifyFlag();
2001-04-18 10:44:59 +00:00
break;
default:
m_pTextCell->Cut();
m_pTextCell->SetModifyFlag();
2001-04-18 10:44:59 +00:00
}
SaveModified();
2001-04-18 10:44:59 +00:00
RowModified(GetBrowseRow(nRow), GetCurColumnId());
invalidateUndoRedo();
2001-04-18 10:44:59 +00:00
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::paste()
{
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_FIELD_ROW:
m_pFieldCell->Paste();
2001-08-30 12:35:55 +00:00
m_pFieldCell->SetModifyFlag();
2001-04-18 10:44:59 +00:00
break;
default:
m_pTextCell->Paste();
2001-08-30 12:35:38 +00:00
m_pTextCell->SetModifyFlag();
2001-04-18 10:44:59 +00:00
}
RowModified(GetBrowseRow(nRow), GetCurColumnId());
invalidateUndoRedo();
2001-04-18 10:44:59 +00:00
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::copy()
{
long nRow = GetRealRow(GetCurRow());
switch (nRow)
{
case BROW_FIELD_ROW:
m_pFieldCell->Copy();
break;
default:
m_pTextCell->Copy();
}
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::appendUndoAction(const String& _rOldValue,const String& _rNewValue,sal_Int32 _nRow)
{
if(_rNewValue != _rOldValue)
{
OTabFieldCellModifiedUndoAct* pUndoAct = new OTabFieldCellModifiedUndoAct(this);
pUndoAct->SetCellIndex(_nRow);
pUndoAct->SetColId(GetCurColumnId());
pUndoAct->SetCellContents(_rOldValue);
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->AddUndoAction(pUndoAct);
}
}
// -----------------------------------------------------------------------------
2001-04-18 12:20:48 +00:00
IMPL_LINK(OSelectionBrowseBox, OnInvalidateTimer, void*, EMPTYARG)
{
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature(SID_CUT);
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature(SID_COPY);
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature(SID_PASTE);
if(!m_bStopTimer)
m_timerInvalidate.Start();
return 0L;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::stopTimer()
{
m_bStopTimer = sal_True;
if (m_timerInvalidate.IsActive())
m_timerInvalidate.Stop();
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::startTimer()
{
m_bStopTimer = sal_False;
if (!m_timerInvalidate.IsActive())
m_timerInvalidate.Start();
}
// -----------------------------------------------------------------------------
OTableFields& OSelectionBrowseBox::getFields() const
2001-04-30 12:02:01 +00:00
{
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
2001-05-02 05:32:25 +00:00
return pController->getTableFieldDesc();
2001-04-30 12:02:01 +00:00
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::enableControl(const OTableFieldDescRef& _rEntry,Window* _pControl)
{
BOOL bEnable = _rEntry->GetFunctionType() != FKT_CONDITION;
_pControl->Enable(bEnable);
_pControl->EnableInput(bEnable);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::setTextCellContext(const OTableFieldDescRef& _rEntry,const String& _sText,ULONG _nHelpId)
{
m_pTextCell->SetText(_sText);
m_pTextCell->ClearModifyFlag();
if (!m_pTextCell->HasFocus())
m_pTextCell->GrabFocus();
enableControl(_rEntry,m_pTextCell);
if (m_pTextCell->GetHelpId() != _nHelpId)
// da TextCell in verschiedenen Kontexten verwendet wird, muss ich den gecachten HelpText loeschen
m_pTextCell->SetHelpText(String());
m_pTextCell->SetHelpId(_nHelpId);
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::invalidateUndoRedo()
{
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
pController->InvalidateFeature( ID_BROWSER_UNDO );
pController->InvalidateFeature( ID_BROWSER_REDO );
pController->InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
}
// -----------------------------------------------------------------------------
OTableFieldDescRef OSelectionBrowseBox::getEntry(OTableFields::size_type _nPos)
{
// we have to check if we need a new entry at this position
OTableFields& aFields = getFields();
OSL_ENSURE(aFields.size() > _nPos,"ColID is to great!");
2001-04-18 12:20:48 +00:00
OTableFieldDescRef pEntry = aFields[_nPos];
OSL_ENSURE(pEntry.isValid(),"Invalid entry!");
if(pEntry == m_pEmptyEntry)
{
pEntry = new OTableFieldDesc();
aFields[_nPos] = pEntry;
}
return pEntry;
}
// -----------------------------------------------------------------------------
void OSelectionBrowseBox::GetFocus()
{
2001-10-23 11:30:27 +00:00
if(!IsEditing() && !m_bWasEditing)
ActivateCell();
EditBrowseBox::GetFocus();
}
// -----------------------------------------------------------------------------
2001-10-26 06:49:36 +00:00
void OSelectionBrowseBox::DeactivateCell(sal_Bool _bUpdate)
{
m_bWasEditing = sal_True;
EditBrowseBox::DeactivateCell(_bUpdate);
m_bWasEditing = sal_False;
}
// -----------------------------------------------------------------------------