2001-02-05 08:26:47 +00:00
|
|
|
|
/*************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* $RCSfile: SelectionBrowseBox.cxx,v $
|
|
|
|
|
*
|
2001-08-30 12:35:38 +00:00
|
|
|
|
* $Revision: 1.30 $
|
2001-02-05 08:26:47 +00:00
|
|
|
|
*
|
2001-08-30 12:35:38 +00:00
|
|
|
|
* last change: $Author: oj $ $Date: 2001-08-30 13:35:38 $
|
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
|
|
|
|
|
#include "dbaccess_helpid.hrc"
|
|
|
|
|
#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
|
2001-03-15 07:29:16 +00:00
|
|
|
|
#ifndef _COMPHELPER_EXTRACT_HXX_
|
|
|
|
|
#include <comphelper/extract.hxx>
|
2001-02-14 13:54:12 +00:00
|
|
|
|
#endif
|
2001-03-20 07:12:13 +00:00
|
|
|
|
#ifndef _DBAUI_SQLMESSAGE_HXX_
|
|
|
|
|
#include "sqlmessage.hxx"
|
|
|
|
|
#endif
|
2001-02-14 13:54:12 +00:00
|
|
|
|
|
2001-06-29 07:45:10 +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 )
|
2001-06-29 07:45:10 +00:00
|
|
|
|
: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-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);
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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 );
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
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);
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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);
|
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-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()));
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>::iterator aIter = getFields()->begin();
|
|
|
|
|
for(;aIter != getFields()->end();++aIter)
|
2001-02-05 08:26:47 +00:00
|
|
|
|
delete *aIter;
|
2001-04-30 12:02:01 +00:00
|
|
|
|
getFields()->clear();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
sal_uInt16 nCurCol = GetCurColumnId();
|
|
|
|
|
long nCurRow = GetCurRow();
|
|
|
|
|
DeactivateCell();
|
|
|
|
|
|
|
|
|
|
RemoveColumns();
|
|
|
|
|
InsertHandleColumn( 70 );
|
|
|
|
|
SetUpdateMode(sal_True);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (OS2)
|
|
|
|
|
Invalidate();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
}
|
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
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>::reverse_iterator aIter = getFields()->rbegin();
|
|
|
|
|
for(sal_uInt16 nId=getFields()->size();aIter != getFields()->rend();++aIter,--nId)
|
|
|
|
|
{
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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()));
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[nColId-1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
DBG_ASSERT(pEntry, "OSelectionBrowseBox::GetController : keine FieldDescription !");
|
|
|
|
|
|
|
|
|
|
if (!pEntry)
|
|
|
|
|
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:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
return new ComboBoxCellController(m_pFieldCell);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
case BROW_TABLE_ROW:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
return new ListBoxCellController(m_pTableCell);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
case BROW_VIS_ROW:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
return new CheckBoxCellController(m_pVisibleCell);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
case BROW_ORDER_ROW:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
return new ListBoxCellController(m_pOrderCell);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
case BROW_FUNCTION_ROW:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
return new ListBoxCellController(m_pFunctionCell);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
default:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
return new EditCellController(m_pTextCell);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
2001-06-29 07:45:10 +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()));
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OSL_ENSURE(getFields()->size() > sal_uInt16(nColId-1),"ColID is to great!");
|
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[nColId-1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
DBG_ASSERT(pEntry, "OSelectionBrowseBox::InitController : keine FieldDescription !");
|
|
|
|
|
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();
|
|
|
|
|
if(pEntry->GetFunctionType() != FKT_CONDITION)
|
|
|
|
|
{
|
|
|
|
|
m_pTableCell->Enable();
|
|
|
|
|
m_pTableCell->EnableInput(sal_True);
|
|
|
|
|
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)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_pTableCell->Disable();
|
|
|
|
|
m_pTableCell->EnableInput(sal_False);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} break;
|
|
|
|
|
case BROW_VIS_ROW:
|
|
|
|
|
{
|
|
|
|
|
m_pVisibleCell->GetBox().Check(pEntry->IsVisible());
|
|
|
|
|
m_pVisibleCell->GetBox().SaveValue();
|
|
|
|
|
|
|
|
|
|
if(pEntry->GetFunctionType() == FKT_CONDITION)
|
|
|
|
|
{
|
|
|
|
|
m_pTextCell->Disable();
|
|
|
|
|
m_pTextCell->EnableInput(sal_False);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_pTextCell->Enable();
|
|
|
|
|
m_pTextCell->EnableInput(sal_True);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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);
|
2001-02-07 11:44:13 +00:00
|
|
|
|
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());
|
|
|
|
|
if(pEntry->GetFunctionType() == FKT_CONDITION)
|
|
|
|
|
{
|
|
|
|
|
m_pOrderCell->Disable();
|
|
|
|
|
m_pOrderCell->EnableInput(sal_False);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_pOrderCell->Enable();
|
|
|
|
|
m_pOrderCell->EnableInput(sal_True);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
case BROW_COLUMNALIAS_ROW:
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
m_pTextCell->SetText(pEntry->GetFieldAlias());
|
|
|
|
|
m_pTextCell->ClearModifyFlag();
|
|
|
|
|
if (!m_pTextCell->HasFocus())
|
|
|
|
|
m_pTextCell->GrabFocus();
|
|
|
|
|
|
|
|
|
|
if(pEntry->GetFunctionType() == FKT_CONDITION)
|
|
|
|
|
{
|
|
|
|
|
m_pTextCell->Disable();
|
|
|
|
|
m_pTextCell->EnableInput(sal_False);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_pTextCell->Enable();
|
|
|
|
|
m_pTextCell->EnableInput(sal_True);
|
|
|
|
|
}
|
|
|
|
|
if (m_pTextCell->GetHelpId() != HID_QRYDGN_ROW_ALIAS)
|
|
|
|
|
// da TextCell in verschiedenen Kontexten verwendet wird, muss ich den gecachten HelpText loeschen
|
|
|
|
|
m_pTextCell->SetHelpText(String());
|
|
|
|
|
m_pTextCell->SetHelpId(HID_QRYDGN_ROW_ALIAS);
|
|
|
|
|
}
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
if(pEntry->GetFunctionType() == FKT_CONDITION)
|
|
|
|
|
{
|
|
|
|
|
m_pFunctionCell->Disable();
|
|
|
|
|
m_pFunctionCell->EnableInput(sal_False);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_pFunctionCell->Enable();
|
|
|
|
|
m_pFunctionCell->EnableInput(sal_True);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
String aText( pEntry->GetCriteria( nIdx ) );
|
|
|
|
|
|
|
|
|
|
m_pTextCell->SetText(aText);
|
|
|
|
|
m_pTextCell->ClearModifyFlag();
|
|
|
|
|
if (!m_pTextCell->HasFocus())
|
|
|
|
|
m_pTextCell->GrabFocus();
|
|
|
|
|
|
2001-08-13 07:34:13 +00:00
|
|
|
|
BOOL bDisable = pEntry->GetFunctionType() == FKT_CONDITION;
|
|
|
|
|
m_pTextCell->Enable(bDisable);
|
|
|
|
|
m_pTextCell->EnableInput(!bDisable);
|
|
|
|
|
|
2001-02-05 08:26:47 +00:00
|
|
|
|
if (m_pTextCell->GetHelpId() != HID_QRYDGN_ROW_CRIT)
|
|
|
|
|
// da TextCell in verschiedenen Kontexten verwendet wird, muss ich den gecachten HelpText loeschen
|
|
|
|
|
m_pTextCell->SetHelpText(String());
|
|
|
|
|
m_pTextCell->SetHelpId(HID_QRYDGN_ROW_CRIT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Controller()->ClearModified();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
sal_Bool OSelectionBrowseBox::SaveModified()
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
|
|
|
|
OTableFieldDesc* pEntry = NULL;
|
2001-02-28 09:18:26 +00:00
|
|
|
|
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
|
2001-04-30 12:02:01 +00:00
|
|
|
|
if(getFields()->size() > sal_uInt16(GetCurColumnId() - 1))
|
|
|
|
|
pEntry = (*getFields())[GetCurColumnId() - 1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
sal_Bool bWasEmpty = pEntry ? 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 && Controller().Is() && Controller()->IsModified())
|
|
|
|
|
{
|
|
|
|
|
// 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());
|
|
|
|
|
|
|
|
|
|
sal_Bool bIsPredicate = sal_False;
|
|
|
|
|
// wenn das Ergebnis ein Praedikat -> OK
|
|
|
|
|
String aTest(aFieldName);
|
|
|
|
|
|
|
|
|
|
OQueryTableWindow* pWin = static_cast<OQueryTableWindow*>(pEntry->GetTabWindow());
|
|
|
|
|
|
|
|
|
|
if (!pWin && (aFieldName.GetTokenCount('.') == 2))
|
2001-04-06 12:47:18 +00:00
|
|
|
|
pWin = static_cast<OQueryTableWindow*>(getDesignView()->getTableView()->GetWindow(aFieldName.GetToken(0, '.')));
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
Reference<XPropertySet> xColumn;
|
2001-04-06 12:47:18 +00:00
|
|
|
|
sal_Bool bAsterix = sal_False;
|
2001-02-05 08:26:47 +00:00
|
|
|
|
if (pWin)
|
|
|
|
|
{
|
|
|
|
|
Reference<XNameAccess> xColumns = pWin->GetOriginalColumns();
|
2001-06-28 13:22:47 +00:00
|
|
|
|
if(xColumns.is())
|
|
|
|
|
{
|
|
|
|
|
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-04-06 12:47:18 +00:00
|
|
|
|
if(!xColumn.is() && !bAsterix) // only when text not a column of the table
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
::rtl::OUString aErrorMsg;
|
|
|
|
|
bIsPredicate = sal_True; // #72670#
|
2001-02-28 09:18:26 +00:00
|
|
|
|
OQueryController* pController = static_cast<OQueryController*>(static_cast<OQueryController*>(getDesignView()->getController()));
|
|
|
|
|
|
|
|
|
|
::connectivity::OSQLParser* pParser = pController->getParser();
|
2001-02-14 13:54:12 +00:00
|
|
|
|
OSQLParseNode* pParseNode = pParser->predicateTree(aErrorMsg, aTest,
|
2001-02-28 09:18:26 +00:00
|
|
|
|
pController->getNumberFormatter(),
|
2001-02-14 13:54:12 +00:00
|
|
|
|
xColumn);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
if (pParseNode)
|
|
|
|
|
{
|
2001-04-18 10:44:59 +00:00
|
|
|
|
|
|
|
|
|
bListAction = sal_True;
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
|
|
|
|
|
appendUndoAction(pEntry->IsVisible() ? g_strOne : g_strZero,g_strZero,BROW_VIS_ROW);
|
|
|
|
|
|
2001-02-05 08:26:47 +00:00
|
|
|
|
pEntry->SetVisible(sal_False);
|
|
|
|
|
bWasEmpty = sal_False; // XXXXX
|
|
|
|
|
delete pParseNode;
|
|
|
|
|
pEntry->SetFunctionType(FKT_CONDITION);
|
|
|
|
|
RowModified(GetBrowseRow(BROW_VIS_ROW), GetCurColumnId());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
pEntry->SetFunctionType(FKT_OTHER);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
xub_StrLen nCount(aFieldName.GetTokenCount('('));
|
|
|
|
|
if(nCount < 2 && !bIsPredicate) // keine Funktion
|
|
|
|
|
{
|
|
|
|
|
if (aFieldName.GetTokenCount('.') == 2) // falls alias.Feld angegeben
|
|
|
|
|
{
|
|
|
|
|
String sTableAlias(aFieldName.GetToken(0, '.'));
|
|
|
|
|
aFieldName = aFieldName.GetToken(1,'.');
|
|
|
|
|
|
|
|
|
|
// 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-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);
|
|
|
|
|
if (pEntryTab)
|
|
|
|
|
{
|
2001-04-18 10:44:59 +00:00
|
|
|
|
// appendUndoAction(pEntry->GetDatabase(),sTableAlias,GetBrowseRow(BROW_TABLE_ROW));
|
2001-02-05 08:26:47 +00:00
|
|
|
|
pEntry->SetDatabase(pEntryTab->GetComposedName());
|
|
|
|
|
pEntry->SetTable(pEntryTab->GetTableName());
|
2001-04-18 10:44:59 +00:00
|
|
|
|
pEntry->SetTabWindow(pEntryTab);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
strOldCellContents = pEntry->GetField();
|
|
|
|
|
pEntry->SetField(aFieldName);
|
2001-04-18 10:44:59 +00:00
|
|
|
|
sNewValue = aFieldName;
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
// Falls nur COUNT(*) erlaubt wird
|
2001-03-01 14:45:02 +00:00
|
|
|
|
Reference< XConnection> xConnection = static_cast<OQueryController*>(getDesignView()->getController())->getConnection();
|
|
|
|
|
if(!xConnection.is())
|
|
|
|
|
break;
|
2001-04-18 10:44:59 +00:00
|
|
|
|
|
2001-03-01 14:45:02 +00:00
|
|
|
|
Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData();
|
2001-04-06 12:47:18 +00:00
|
|
|
|
if(aFieldName.GetChar(0) != '*' && pEntry->GetFunction().getLength())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
2001-04-18 10:44:59 +00:00
|
|
|
|
if(!bListAction)
|
|
|
|
|
{
|
|
|
|
|
bListAction = sal_True;
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
|
|
|
|
|
}
|
|
|
|
|
appendUndoAction(pEntry->GetFunction(),String(),BROW_FUNCTION_ROW);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
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
|
|
|
|
|
{
|
|
|
|
|
String sTableAlias(aParameter.GetToken(0, '.'));
|
|
|
|
|
aParameter = aParameter.GetToken(1,'.');
|
|
|
|
|
|
|
|
|
|
// 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-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);
|
|
|
|
|
pEntry->SetDatabase(pEntryTab->GetComposedName());
|
|
|
|
|
pEntry->SetTable(pEntryTab->GetTableName());
|
2001-04-18 10:44:59 +00:00
|
|
|
|
pEntry->SetTabWindow(pEntryTab);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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());
|
2001-04-18 10:44:59 +00:00
|
|
|
|
if(!bListAction)
|
|
|
|
|
{
|
|
|
|
|
bListAction = sal_True;
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
|
|
|
|
|
}
|
|
|
|
|
appendUndoAction(pEntry->GetTable(),pEntryTab->GetTableName(),BROW_TABLE_ROW);
|
|
|
|
|
|
2001-02-05 08:26:47 +00:00
|
|
|
|
pEntry->SetTable(pEntryTab->GetTableName());
|
|
|
|
|
pEntry->SetAlias(pEntry->GetTable());
|
2001-04-18 10:44:59 +00:00
|
|
|
|
pEntry->SetTabWindow(pEntryTab);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-18 10:44:59 +00:00
|
|
|
|
if(!bListAction)
|
|
|
|
|
{
|
|
|
|
|
bListAction = sal_True;
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
|
|
|
|
|
}
|
|
|
|
|
appendUndoAction(pEntry->GetFunction(),aFkt,BROW_FUNCTION_ROW);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
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-02-05 08:26:47 +00:00
|
|
|
|
RowModified(GetBrowseRow(BROW_FUNCTION_ROW), GetCurColumnId());
|
|
|
|
|
RowModified(GetBrowseRow(BROW_TABLE_ROW), GetCurColumnId());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pEntry->SetField(aFieldName);
|
|
|
|
|
pEntry->SetAlias(String());
|
2001-04-18 10:44:59 +00:00
|
|
|
|
if(!bListAction)
|
|
|
|
|
{
|
|
|
|
|
bListAction = sal_True;
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->EnterListAction(String(),String());
|
|
|
|
|
}
|
|
|
|
|
appendUndoAction(pEntry->GetTable(),String(),BROW_TABLE_ROW);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
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());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!aFieldName.Len())
|
|
|
|
|
{
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::replace(getFields()->begin(),getFields()->end(),pEntry,new OTableFieldDesc);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
sal_uInt16 nCol = GetCurColumnId();
|
|
|
|
|
for (int i = 0; i < m_nVisibleCount; i++) // Spalte neu zeichnen
|
|
|
|
|
RowModified(i,nCol);
|
|
|
|
|
}
|
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:
|
|
|
|
|
{
|
2001-03-02 13:56:02 +00:00
|
|
|
|
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-02-28 09:18:26 +00:00
|
|
|
|
::connectivity::OSQLParser* pParser = static_cast<OQueryController*>(getDesignView()->getController())->getParser();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
OQueryTableWindow* pWin = static_cast<OQueryTableWindow*>(pEntry->GetTabWindow());
|
|
|
|
|
|
|
|
|
|
String aTest(aText);
|
|
|
|
|
|
|
|
|
|
Reference<XPropertySet> xColumn;
|
|
|
|
|
if (pWin)
|
|
|
|
|
{
|
|
|
|
|
Reference<XNameAccess> xColumns = pWin->GetOriginalColumns();
|
2001-06-28 13:22:47 +00:00
|
|
|
|
if (xColumns.is() && xColumns->hasByName(pEntry->GetField()))
|
2001-02-14 13:54:12 +00:00
|
|
|
|
::cppu::extractInterface(xColumn,xColumns->getByName(pEntry->GetField()));
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::rtl::OUString aErrorMsg;
|
2001-02-28 09:18:26 +00:00
|
|
|
|
OSQLParseNode* pParseNode = pParser->predicateTree(aErrorMsg, aTest, 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
|
|
|
|
|
{
|
|
|
|
|
if(xColumn.is())
|
|
|
|
|
{
|
|
|
|
|
sal_Int32 nType = 0;
|
|
|
|
|
xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType;
|
|
|
|
|
switch(nType)
|
|
|
|
|
{
|
|
|
|
|
case DataType::CHAR:
|
|
|
|
|
case DataType::VARCHAR:
|
|
|
|
|
case DataType::LONGVARCHAR:
|
|
|
|
|
if(aTest.GetChar(0) != '\'' || aTest.GetChar(aTest.Len() -1) != '\'')
|
|
|
|
|
{
|
|
|
|
|
aTest.SearchAndReplaceAll(String::CreateFromAscii("'"),String::CreateFromAscii("''"));
|
|
|
|
|
String aTmp(String::CreateFromAscii("'"));
|
|
|
|
|
(aTmp += aTest) += String::CreateFromAscii("'");
|
|
|
|
|
aTest = aTmp;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
;
|
|
|
|
|
}
|
2001-02-28 09:18:26 +00:00
|
|
|
|
pParseNode = pParser->predicateTree(aErrorMsg, aTest, 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
|
|
|
|
|
{
|
2001-03-20 07:12:13 +00:00
|
|
|
|
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
|
|
|
|
|
{
|
2001-03-20 07:12:13 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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());
|
|
|
|
|
|
2001-03-20 07:12:13 +00:00
|
|
|
|
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-03-20 07:12:13 +00:00
|
|
|
|
}
|
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 && bWasEmpty && !pEntry->IsEmpty() && !bError)
|
|
|
|
|
{
|
|
|
|
|
// 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 );
|
|
|
|
|
OTableFieldDesc* pEntry = NULL;
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
if(getFields()->size() > sal_uInt16(nColumnId - 1))
|
|
|
|
|
pEntry = (*getFields())[nColumnId - 1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
if (!pEntry)
|
|
|
|
|
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
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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)
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* 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
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
pController->InvalidateFeature( ID_BROWSER_UNDO );
|
|
|
|
|
pController->InvalidateFeature( ID_BROWSER_REDO );
|
|
|
|
|
pController->InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
|
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
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OSL_ENSURE(getFields()->size() > sal_uInt16(nId-1),"ID is to great!");
|
|
|
|
|
|
|
|
|
|
OTableFieldDesc* pDesc = (*getFields())[(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);
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
pController->InvalidateFeature(ID_BROWSER_UNDO);
|
|
|
|
|
pController->InvalidateFeature(ID_BROWSER_REDO);
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-06-29 07:45:10 +00:00
|
|
|
|
EditBrowseBox::MouseButtonDown(rEvt);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::MouseButtonUp(const BrowserMouseEvent& rEvt)
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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)
|
|
|
|
|
#if SUPD>627 || FS_PRIV_DEBUG
|
|
|
|
|
&& OJoinExchObj::isFormatAvailable(GetDataFlavors())
|
|
|
|
|
#else
|
|
|
|
|
&& sal_False
|
|
|
|
|
#endif
|
|
|
|
|
)
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
OTableFieldDesc* OSelectionBrowseBox::AppendNewCol( sal_uInt16 nCnt )
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
|
|
|
|
// es koennen mehrere angelegt werden, aber der Erste
|
|
|
|
|
// wird returnt
|
2001-04-30 12:02:01 +00:00
|
|
|
|
sal_uInt32 nCount = getFields()->size();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
OTableFieldDesc* pNewDesc;
|
|
|
|
|
for (sal_uInt16 i=0 ; i<nCnt ; i++)
|
|
|
|
|
{
|
|
|
|
|
pNewDesc = new OTableFieldDesc;
|
|
|
|
|
pNewDesc->SetColWidth(DEFAULT_SIZE);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
getFields()->push_back(pNewDesc);
|
|
|
|
|
InsertDataColumn((sal_uInt16)getFields()->size(), String(), DEFAULT_SIZE, HIB_STDSTYLE, HEADERBAR_APPEND);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
return (*getFields())[nCount];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::DeleteFields(const String& rAliasName)
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
if (getFields()->size())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
sal_uInt16 nColId = GetCurColumnId();
|
|
|
|
|
sal_uInt32 nRow = GetCurRow();
|
|
|
|
|
|
|
|
|
|
sal_Bool bWasEditing = IsEditing();
|
|
|
|
|
if (bWasEditing)
|
|
|
|
|
DeactivateCell();
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>::reverse_iterator aIter = getFields()->rbegin();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
OTableFieldDesc* pEntry = NULL;
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bWasEditing)
|
|
|
|
|
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);
|
|
|
|
|
sal_Bool bWasEditing = IsEditing();
|
|
|
|
|
if (bWasEditing)
|
|
|
|
|
DeactivateCell();
|
|
|
|
|
|
|
|
|
|
// die Basisklasse machen lassen
|
|
|
|
|
SetColumnWidth(nColId, nNewWidth);
|
|
|
|
|
|
|
|
|
|
// der FieldDescription Bescheid sagen
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[nColId - 1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
if (pEntry)
|
2001-02-23 14:04:37 +00:00
|
|
|
|
pEntry->SetColWidth(sal_uInt16(GetColumnWidth(nColId)));
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
if (bWasEditing)
|
|
|
|
|
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(OTableFieldDesc* pEntry, long& 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
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
nColId = getFields()->size();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
nColId++; // innerhalb der vorgegebenen Liste
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// in Liste der Spaltenbeschreibungen neues Element
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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)
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
delete (*getFields())[(sal_uInt16)nFirstFreeCol];
|
|
|
|
|
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
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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
|
|
|
|
|
2001-02-28 09:18:26 +00:00
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_UNDO );
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_REDO );
|
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->InvalidateFeature( ID_BROWSER_QUERY_EXECUTE );
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
OTableFieldDesc* OSelectionBrowseBox::InsertField(const OJoinExchangeData& jxdSource, long nColId, sal_Bool bVis, sal_Bool bActivate)
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
|
OTableFieldDesc aInfo;
|
|
|
|
|
aInfo.SetTabWindow(pSourceWin);
|
|
|
|
|
aInfo.SetFieldIndex(nFieldIndex);
|
|
|
|
|
aInfo.SetFieldType(pInf->GetKeyType());
|
|
|
|
|
aInfo.SetField(aFieldName);
|
|
|
|
|
aInfo.SetTable(pSourceWin->GetTableName());
|
|
|
|
|
aInfo.SetAlias(pSourceWin->GetAliasName());
|
|
|
|
|
aInfo.SetDatabase(pSourceWin->GetComposedName());
|
|
|
|
|
|
|
|
|
|
aInfo.SetDataType(pInf->GetDataType());
|
|
|
|
|
aInfo.SetVisible(bVis);
|
|
|
|
|
|
|
|
|
|
return InsertField(aInfo, nColId, bVis, bActivate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
OTableFieldDesc* OSelectionBrowseBox::InsertField(const OTableFieldDesc& rInfo, long nColId, sal_Bool bVis, sal_Bool bActivate)
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
|
|
|
|
|
|
|
|
|
if(m_nMaxColumns && m_nMaxColumns <= FieldsCount())
|
|
|
|
|
return NULL;
|
|
|
|
|
if (bActivate)
|
|
|
|
|
SaveModified();
|
|
|
|
|
|
|
|
|
|
// Neue Spaltenbeschreibung
|
|
|
|
|
OTableFieldDesc* pEntry = new OTableFieldDesc(rInfo);
|
|
|
|
|
pEntry->SetVisible(bVis);
|
|
|
|
|
sal_uInt32 nColWidth;
|
|
|
|
|
if( getDesignView()->getColWidth(rInfo.GetAlias(), rInfo.GetField(), nColWidth) )
|
|
|
|
|
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());
|
|
|
|
|
|
|
|
|
|
::std::vector<OTableFieldDesc*>::iterator aIter = getFields()->begin();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
sal_uInt16 nCount = 0;
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
while (aIter != getFields()->end())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
if ((*aIter) && !(*aIter)->IsEmpty())
|
|
|
|
|
nCount++;
|
|
|
|
|
++aIter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nCount;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
OTableFieldDesc* OSelectionBrowseBox::FindFirstFreeCol( long& rCol )
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OQueryController* pController = static_cast<OQueryController*>(getDesignView()->getController());
|
|
|
|
|
|
|
|
|
|
::std::vector<OTableFieldDesc*>::iterator aIter = getFields()->begin();
|
2001-02-05 08:26:47 +00:00
|
|
|
|
rCol = -1;
|
2001-04-30 12:02:01 +00:00
|
|
|
|
while (aIter != getFields()->end())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
++rCol;
|
|
|
|
|
if ((*aIter) && (*aIter)->IsEmpty())
|
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::AddGroupBy( const OTableFieldDesc& rInfo )
|
|
|
|
|
{
|
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:: OTableFieldDesc sollte nicht Empty sein!");
|
|
|
|
|
OTableFieldDesc* pEntry;
|
2001-03-01 14:45:02 +00:00
|
|
|
|
::comphelper::UStringMixEqual bCase(xConnection->getMetaData()->storesMixedCaseQuotedIdentifiers());
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>::iterator aIter = getFields()->begin();
|
|
|
|
|
for(;aIter != getFields()->end();++aIter)
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
pEntry = *aIter;
|
|
|
|
|
OSL_ENSURE(pEntry,"OTableFieldDesc was null!");
|
|
|
|
|
|
|
|
|
|
::rtl::OUString aField = pEntry->GetField();
|
|
|
|
|
::rtl::OUString aAlias = pEntry->GetAlias();
|
|
|
|
|
|
|
|
|
|
if (bCase(aField,rInfo.GetField()) &&
|
|
|
|
|
bCase(aAlias,rInfo.GetAlias()) &&
|
|
|
|
|
pEntry->GetFunctionType() == rInfo.GetFunctionType())
|
|
|
|
|
{
|
|
|
|
|
if((pEntry->GetFunctionType() == FKT_AGGREGATE && rInfo.IsGroupBy()))
|
|
|
|
|
pEntry->SetGroupBy(sal_False);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pEntry->SetGroupBy(rInfo.IsGroupBy());
|
2001-03-20 09:56:40 +00:00
|
|
|
|
if(!m_bGroupByUnRelated && pEntry->IsGroupBy())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
pEntry->SetVisible(sal_True);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
if (aIter == getFields()->end())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
OTableFieldDesc* pTmp = InsertField(rInfo, -1, sal_False, sal_False );
|
|
|
|
|
if((pTmp->GetFunctionType() == FKT_AGGREGATE && rInfo.IsGroupBy())) // das GroupBy wird bereits von rInfo "ubernommen
|
|
|
|
|
pTmp->SetGroupBy(sal_False);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::AddCondition( const OTableFieldDesc& rInfo, const String& rValue, const sal_uInt16 nLevel, const char* pOp )
|
|
|
|
|
{
|
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(),"AddCondition:: OTableFieldDesc sollte nicht Empty sein!");
|
|
|
|
|
OTableFieldDesc* pEntry;
|
2001-03-01 14:45:02 +00:00
|
|
|
|
::comphelper::UStringMixEqual bCase(xConnection->getMetaData()->storesMixedCaseQuotedIdentifiers());
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>::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())
|
|
|
|
|
{
|
|
|
|
|
if((pEntry->GetFunctionType() == FKT_AGGREGATE && rInfo.IsGroupBy()))
|
|
|
|
|
pEntry->SetGroupBy(sal_False);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pEntry->SetGroupBy(rInfo.IsGroupBy());
|
2001-03-20 09:56:40 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
if (aIter == getFields()->end())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
OTableFieldDesc* pTmp = InsertField(rInfo, -1, sal_False, sal_False );
|
|
|
|
|
if((pTmp->GetFunctionType() == FKT_AGGREGATE && rInfo.IsGroupBy())) // das GroupBy wird bereits von rInfo "ubernommen
|
|
|
|
|
pTmp->SetGroupBy(sal_False);
|
|
|
|
|
if(pTmp)
|
|
|
|
|
{
|
|
|
|
|
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 OTableFieldDesc& rInfo, const EOrderDir eDir, sal_uInt16& nPos )
|
|
|
|
|
{
|
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:: OTableFieldDesc sollte nicht Empty sein!");
|
|
|
|
|
// nPos merkt sich die Spalte in die Sortierung eingetragen wird,
|
|
|
|
|
// da weitere Sortierungen nur dahinter abgelegt werden duerfen
|
|
|
|
|
OTableFieldDesc* pEntry;
|
2001-03-01 14:45:02 +00:00
|
|
|
|
::comphelper::UStringMixEqual bCase(xConnection->getMetaData()->storesMixedCaseQuotedIdentifiers());
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>::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()))
|
|
|
|
|
{
|
|
|
|
|
if(!m_bOrderByUnRelated)
|
|
|
|
|
pEntry->SetVisible(sal_True);
|
|
|
|
|
pEntry->SetOrderDir( eDir );
|
2001-04-30 12:02:01 +00:00
|
|
|
|
nPos = getFields()->end() - aIter;
|
2001-02-05 08:26:47 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
if (aIter == getFields()->end())
|
2001-02-05 08:26:47 +00:00
|
|
|
|
{
|
|
|
|
|
OTableFieldDesc* pTmp = InsertField(rInfo, -1, sal_False, sal_False );
|
|
|
|
|
if(pTmp)
|
|
|
|
|
{
|
|
|
|
|
if(!m_bOrderByUnRelated)
|
2001-03-20 09:56:40 +00:00
|
|
|
|
pTmp->SetVisible(sal_True);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
pTmp->SetOrderDir( eDir );
|
|
|
|
|
}
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
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);
|
2001-06-29 07:45:10 +00:00
|
|
|
|
EditBrowseBox::ArrangeControls(nX, nY);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::Save()
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
|
|
|
|
if (IsModified())
|
|
|
|
|
SaveModified();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::CellModified()
|
|
|
|
|
{
|
|
|
|
|
DBG_CHKTHIS(OSelectionBrowseBox,NULL);
|
|
|
|
|
long nRow = GetRealRow(GetCurRow());
|
|
|
|
|
switch (nRow)
|
|
|
|
|
{
|
|
|
|
|
case BROW_VIS_ROW:
|
|
|
|
|
{
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[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();
|
2001-03-20 09:56:40 +00:00
|
|
|
|
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());
|
2001-04-18 07:38:19 +00:00
|
|
|
|
// m_pVisibleCell->GetBox().SaveValue();
|
2001-04-18 06:02:22 +00:00
|
|
|
|
|
|
|
|
|
// if(bOldValue != pEntry->IsVisible())
|
|
|
|
|
// {
|
|
|
|
|
// String strOldCellContents = bOldValue ? g_strOne : g_strZero;
|
|
|
|
|
// // und noch die Undo-Action fuer das Ganze
|
|
|
|
|
// OTabFieldCellModifiedUndoAct* pUndoAct = new OTabFieldCellModifiedUndoAct(this);
|
|
|
|
|
// pUndoAct->SetCellIndex(GetCurRow());
|
|
|
|
|
// pUndoAct->SetColId(GetCurColumnId());
|
|
|
|
|
// pUndoAct->SetCellContents(strOldCellContents);
|
|
|
|
|
// static_cast<OQueryController*>(getDesignView()->getController())->getUndoMgr()->AddUndoAction(pUndoAct);
|
|
|
|
|
// }
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
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())
|
|
|
|
|
{
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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
|
|
|
|
|
{
|
2001-06-29 07:45:10 +00:00
|
|
|
|
EditBrowseBox::Command(rEvt);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
default:
|
2001-06-29 07:45:10 +00:00
|
|
|
|
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 !");
|
|
|
|
|
|
|
|
|
|
sal_Bool bWasEditing = IsEditing();
|
|
|
|
|
if (bWasEditing)
|
|
|
|
|
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);
|
|
|
|
|
m_nVisibleCount++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
RowRemoved(nId,1);
|
|
|
|
|
m_nVisibleCount--;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bWasEditing)
|
|
|
|
|
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);
|
|
|
|
|
// only the foirst 11 row are interesting
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
// only the foirst 11 row are interesting
|
|
|
|
|
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);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* 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();
|
2001-04-06 12:47:18 +00:00
|
|
|
|
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();
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* 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-04-18 10:44:59 +00:00
|
|
|
|
sal_Bool bWasEditing = IsEditing() && (GetCurColumnId() == nColId) && IsRowVisible(nRow) && (GetCurRow() == GetBrowseRow(nRow));
|
2001-02-05 08:26:47 +00:00
|
|
|
|
if (bWasEditing)
|
|
|
|
|
DeactivateCell();
|
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[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);
|
|
|
|
|
|
|
|
|
|
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);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[nColId-1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
if (!pEntry)
|
|
|
|
|
return DEFAULT_SIZE;
|
|
|
|
|
|
|
|
|
|
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);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
DBG_ASSERT(nColId <= getFields()->size(),"ColumnResized:: nColId sollte nicht groesser als List::count sein!");
|
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[nColId-1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
DBG_ASSERT(pEntry, "OSelectionBrowseBox::ColumnResized : keine FieldDescription !");
|
2001-02-28 09:18:26 +00:00
|
|
|
|
static_cast<OQueryController*>(getDesignView()->getController())->setModified();
|
2001-06-29 07:45:10 +00:00
|
|
|
|
EditBrowseBox::ColumnResized(nColId);
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
|
|
|
|
if (pEntry)
|
|
|
|
|
{
|
|
|
|
|
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);
|
2001-04-30 12:02:01 +00:00
|
|
|
|
DBG_ASSERT((nColId == 0) || (nColId <= getFields()->size()), "OSelectionBrowseBox::GetTotalCellWidth : invalid parameter nColId");
|
2001-02-05 08:26:47 +00:00
|
|
|
|
|
2001-04-30 12:02:01 +00:00
|
|
|
|
OTableFieldDesc* pEntry = (*getFields())[nColId-1];
|
2001-02-05 08:26:47 +00:00
|
|
|
|
DBG_ASSERT(pEntry!=NULL, "OSelectionBrowseBox::GetTotalCellWidth : invalid FieldDescription !");
|
|
|
|
|
|
|
|
|
|
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();
|
2001-08-13 07:34:13 +00:00
|
|
|
|
m_pFieldCell->SetModifyFlag();
|
2001-04-18 10:44:59 +00:00
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
m_pTextCell->Cut();
|
2001-08-13 07:34:13 +00:00
|
|
|
|
m_pTextCell->SetModifyFlag();
|
2001-04-18 10:44:59 +00:00
|
|
|
|
}
|
2001-08-13 07:34:13 +00:00
|
|
|
|
SaveModified();
|
2001-04-18 10:44:59 +00:00
|
|
|
|
RowModified(GetBrowseRow(nRow), GetCurColumnId());
|
|
|
|
|
|
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
void OSelectionBrowseBox::paste()
|
|
|
|
|
{
|
|
|
|
|
long nRow = GetRealRow(GetCurRow());
|
|
|
|
|
switch (nRow)
|
|
|
|
|
{
|
|
|
|
|
case BROW_FIELD_ROW:
|
|
|
|
|
m_pFieldCell->Paste();
|
2001-08-30 12:35:38 +00:00
|
|
|
|
m_pTextCell->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());
|
|
|
|
|
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 );
|
|
|
|
|
}
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-04-30 12:02:01 +00:00
|
|
|
|
::std::vector<OTableFieldDesc*>* OSelectionBrowseBox::getFields() const
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-04-18 12:20:48 +00:00
|
|
|
|
|
2001-04-18 10:44:59 +00:00
|
|
|
|
|