summaryrefslogtreecommitdiff
path: root/svx/source/form/tabwin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/form/tabwin.cxx')
-rw-r--r--svx/source/form/tabwin.cxx542
1 files changed, 542 insertions, 0 deletions
diff --git a/svx/source/form/tabwin.cxx b/svx/source/form/tabwin.cxx
new file mode 100644
index 0000000000..e326a14757
--- /dev/null
+++ b/svx/source/form/tabwin.cxx
@@ -0,0 +1,542 @@
+/*************************************************************************
+ *
+ * $RCSfile: tabwin.cxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 17:01:17 $
+ *
+ * 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 _SVX_TABWIN_HXX
+#include "tabwin.hxx"
+#endif
+#ifndef _SVX_FMTOOLS_HXX
+#include "fmtools.hxx"
+#endif
+#ifndef _SVX_SVXIDS_HRC
+#include "svxids.hrc"
+#endif
+#ifndef _SVX_FMSERVS_HXX
+#include "fmservs.hxx"
+#endif
+
+#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
+#include <com/sun/star/sdb/CommandType.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
+#include <com/sun/star/sdb/XQueriesSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XPREPAREDSTATEMENT_HPP_
+#include <com/sun/star/sdbc/XPreparedStatement.hpp>
+#endif
+#ifndef _COM_SUN_STAR_AWT_XCONTROLCONTAINER_HPP_
+#include <com/sun/star/awt/XControlContainer.hpp>
+#endif
+#ifndef _COM_SUN_STAR_UTIL_XLOCALIZEDALIASES_HPP_
+#include <com/sun/star/util/XLocalizedAliases.hpp>
+#endif
+
+#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
+#include <unotools/processfactory.hxx>
+#endif
+
+#ifndef _UTL_STLTYPES_HXX_
+#include "unotools/stl_types.hxx"
+#endif
+#ifndef _UTL_UNO3_DB_TOOLS_HXX_
+#include "unotools/dbtools.hxx"
+#endif
+#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_
+#include "unotools/processfactory.hxx"
+#endif
+
+#ifndef _SVX_FMHELP_HRC
+#include "fmhelp.hrc"
+#endif
+
+#ifndef _SVX_FMSHELL_HXX
+#include "fmshell.hxx"
+#endif
+
+#ifndef _SVX_FMEXCH_HXX
+#include "fmexch.hxx"
+#endif
+
+#ifndef _SVX_FMPAGE_HXX
+#include "fmpage.hxx"
+#endif
+
+#ifndef _SVX_FMPGEIMP_HXX
+#include "fmpgeimp.hxx"
+#endif
+
+#ifndef _SVX_FMPROP_HXX
+#include "fmprop.hxx"
+#endif
+
+#ifndef _SVX_FMPROP_HRC
+#include "fmprop.hrc"
+#endif
+
+#ifndef _SVX_FMRESIDS_HRC
+#include "fmresids.hrc"
+#endif
+
+#ifndef _SVX_DIALMGR_HXX
+#include "dialmgr.hxx"
+#endif
+
+#ifndef _SHL_HXX
+#include <tools/shl.hxx>
+#endif
+
+#ifndef _SV_DRAG_HXX //autogen
+#include <vcl/drag.hxx>
+#endif
+
+#ifndef _SVDPAGV_HXX
+#include <svdpagv.hxx>
+#endif
+
+#ifndef _SFX_OBJITEM_HXX //autogen
+#include <sfx2/objitem.hxx>
+#endif
+
+#ifndef _SFXDISPATCH_HXX //autogen
+#include <sfx2/dispatch.hxx>
+#endif
+
+#ifndef _ISOLANG_HXX
+#include <tools/isolang.hxx>
+#endif
+#ifndef _UTL_PROPERTY_HXX_
+#include <unotools/property.hxx>
+#endif
+
+const long STD_WIN_POS_X = 50;
+const long STD_WIN_POS_Y = 50;
+
+const long STD_WIN_SIZE_X = 120;
+const long STD_WIN_SIZE_Y = 150;
+
+const long MIN_WIN_SIZE_X = 50;
+const long MIN_WIN_SIZE_Y = 50;
+
+const long LISTBOX_BORDER = 2;
+
+//==================================================================
+// class FmFieldWinListBox
+//==================================================================
+DBG_NAME(FmFieldWinListBox);
+//------------------------------------------------------------------------------
+FmFieldWinListBox::FmFieldWinListBox( FmFieldWin* pParent )
+ :SvTreeListBox( pParent, WB_HASBUTTONS|WB_BORDER )
+ ,pTabWin( pParent )
+{
+ DBG_CTOR(FmFieldWinListBox,NULL);
+ SetHelpId( HID_FIELD_SEL );
+
+ ::rtl::OUString aString;
+ for( sal_Int32 i=1; i<11; i++ )
+ {
+ aString = ::rtl::OUString::createFromAscii("Feld ");
+ aString += ::rtl::OUString::valueOf(i);
+ InsertEntry( aString );
+ }
+}
+
+//------------------------------------------------------------------------------
+FmFieldWinListBox::~FmFieldWinListBox()
+{
+ DBG_DTOR(FmFieldWinListBox,NULL);
+}
+
+//------------------------------------------------------------------------------
+void FmFieldWinListBox::Command(const CommandEvent& rEvt)
+{
+ switch (rEvt.GetCommand())
+ {
+ case COMMAND_STARTDRAG:
+ {
+ EndSelection();
+ Pointer aMovePtr( POINTER_COPYDATA ),
+ aCopyPtr( POINTER_COPYDATA ),
+ aLinkPtr( POINTER_LINKDATA );
+
+ UniString aCopyData = pTabWin->GetDatabaseName();
+ aCopyData += char(11);
+ aCopyData += pTabWin->GetObjectName().getStr();
+ aCopyData += char(11);
+ aCopyData += ::rtl::OUString::valueOf((sal_Int32)pTabWin->GetObjectType()).getStr();
+ aCopyData += char(11);
+
+ SvLBoxEntry* pFirstSelected = FirstSelected();
+ if( pFirstSelected )
+ aCopyData += UniString(GetEntryText( pFirstSelected ));
+
+ SvxFmFieldExchRef xFieldExch = new SvxFmFieldExch(aCopyData);
+ DragManager::ExecuteDrag( xFieldExch, DRAG_LINKABLE | DRAG_COPYABLE );
+ } break;
+ default:
+ Window::Command( rEvt );
+ }
+}
+
+
+//========================================================================
+// class FmFieldWinData
+//========================================================================
+DBG_NAME(FmFieldWinData);
+//-----------------------------------------------------------------------
+FmFieldWinData::FmFieldWinData()
+{
+ DBG_CTOR(FmFieldWinData,NULL);
+}
+
+//-----------------------------------------------------------------------
+FmFieldWinData::~FmFieldWinData()
+{
+ DBG_DTOR(FmFieldWinData,NULL);
+}
+
+//========================================================================
+// class FmFieldWin
+//========================================================================
+DBG_NAME(FmFieldWin);
+//-----------------------------------------------------------------------
+FmFieldWin::FmFieldWin(SfxBindings *pBindings, SfxChildWindow *pMgr, Window* pParent)
+ :SfxFloatingWindow(pBindings, pMgr, pParent, WinBits(WB_STDMODELESS|WB_SIZEABLE))
+ ,SfxControllerItem(SID_FM_FIELDS_CONTROL, *pBindings)
+ ,::utl::OPropertyChangeListener(m_aMutex)
+ ,pData(new FmFieldWinData)
+ ,m_nObjectType(0)
+ ,m_pChangeListener(NULL)
+{
+ DBG_CTOR(FmFieldWin,NULL);
+ SetHelpId( HID_FIELD_SEL_WIN );
+
+ SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetFaceColor()) );
+ pListBox = new FmFieldWinListBox( this );
+ pListBox->Show();
+ Update(NULL);
+ SetSizePixel(Size(STD_WIN_SIZE_X,STD_WIN_SIZE_Y));
+}
+
+//-----------------------------------------------------------------------
+FmFieldWin::~FmFieldWin()
+{
+ if (m_pChangeListener)
+ {
+ m_pChangeListener->dispose();
+ m_pChangeListener->release();
+ // delete m_pChangeListener;
+ }
+ delete pListBox;
+ delete pData;
+ DBG_DTOR(FmFieldWin,NULL);
+}
+
+//-----------------------------------------------------------------------
+sal_Bool FmFieldWin::Close()
+{
+ return SfxFloatingWindow::Close();
+}
+
+//-----------------------------------------------------------------------
+void FmFieldWin::_propertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw( ::com::sun::star::uno::RuntimeException )
+{
+ ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > xForm(evt.Source, ::com::sun::star::uno::UNO_QUERY);
+ Update(xForm);
+}
+
+//-----------------------------------------------------------------------
+void FmFieldWin::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
+{
+ if (!pState || SID_FM_FIELDS_CONTROL != nSID)
+ return;
+
+ if (eState >= SFX_ITEM_AVAILABLE)
+ {
+ FmFormShell* pShell = PTR_CAST(FmFormShell,((SfxObjectItem*)pState)->GetShell());
+ Update(pShell);
+ }
+ else
+ Update(NULL);
+}
+
+//-----------------------------------------------------------------------
+sal_Bool FmFieldWin::Update(FmFormShell* pShell)
+{
+ // ::com::sun::star::form::ListBox loeschen
+ pListBox->Clear();
+ ::rtl::OUString aTitle(SVX_RES(RID_STR_FIELDSELECTION));
+ SetText(aTitle);
+
+ if (!pShell || !pShell->GetFormView())
+ return sal_False;
+
+ SdrPageView* pPageView = pShell->GetFormView()->GetPageViewPvNum(0);
+ if( !pPageView )
+ return sal_False;
+
+ FmFormPage* pPage = PTR_CAST( FmFormPage, pPageView->GetPage() );
+ ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > xForm = pPage->GetImpl()->getCurForm();
+ if (!xForm.is())
+ return sal_False;
+
+ return Update(xForm);
+}
+
+//-----------------------------------------------------------------------
+sal_Bool FmFieldWin::Update(const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm > & xForm)
+{
+ // ::com::sun::star::form::ListBox loeschen
+ pListBox->Clear();
+ UniString aTitle(SVX_RES(RID_STR_FIELDSELECTION));
+ SetText(aTitle);
+
+ if (!xForm.is())
+ return sal_False;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > xStatement;
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xSet(xForm, ::com::sun::star::uno::UNO_QUERY);
+
+ m_aObjectName = ::utl::getString(xSet->getPropertyValue(FM_PROP_COMMAND));
+ m_aDatabaseName = ::utl::getString(xSet->getPropertyValue(FM_PROP_DATASOURCE));
+ m_nObjectType = ::utl::getINT32(xSet->getPropertyValue(FM_PROP_COMMANDTYPE));
+
+ // maybe the database name is empty. this is allowed by the service definition
+ // (the form will use a connection it finds in it's parent hierarchy as it's datasource,
+ // so it does not need a data source description)
+ // of course we want to have a data source name anyway (if such a connection exists)
+ // FS - 74645 - 07.04.00
+ if (!m_aDatabaseName.getLength())
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > xConnection = findConnection(xSet);
+ if (xConnection.is())
+ {
+ ::rtl::OUString sDisplayName;
+ try
+ {
+ // first find somebody who can give us an URL the connection is build upon
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xTitleSupplier(xConnection, ::com::sun::star::uno::UNO_QUERY);
+ if (!xTitleSupplier.is() || !::utl::hasProperty(FM_PROP_URL, xTitleSupplier))
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::container::XChild > xConnAsChild(xConnection, ::com::sun::star::uno::UNO_QUERY);
+ if (xConnAsChild.is())
+ xTitleSupplier = ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >::query(xConnAsChild->getParent());
+ }
+
+ if (xTitleSupplier.is() && ::utl::hasProperty(FM_PROP_URL, xTitleSupplier))
+ {
+ xTitleSupplier->getPropertyValue(FM_PROP_URL) >>= sDisplayName;
+ // then check if we have an alias for the URL
+ ::com::sun::star::uno::Reference< ::com::sun::star::util::XLocalizedAliases >
+ xAliases(::utl::getProcessServiceFactory()->createInstance(SRV_SDB_DATABASE_ACCESS_CONTEXT), ::com::sun::star::uno::UNO_QUERY);
+ if (xAliases.is())
+ {
+ // get the application language
+ XubString sLanguage, sCountry;
+ ConvertLanguageToIsoNames(Application::GetAppInternational().GetLanguage(), sLanguage, sCountry);
+ sDisplayName = xAliases->lookupProgrammatic(::com::sun::star::lang::Locale(sLanguage, sCountry, ::rtl::OUString()), sDisplayName);
+ }
+ }
+ }
+ catch(...)
+ {
+ }
+ m_aDatabaseName = sDisplayName;
+ }
+ }
+
+ // Festellen des Feldes
+ ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess > xFields;
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xField;
+ try
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > xConnection = ::utl::calcConnection(::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet > (xForm, ::com::sun::star::uno::UNO_QUERY),::utl::getProcessServiceFactory());
+ if (!xConnection.is())
+ return sal_True;
+
+ switch (m_nObjectType)
+ {
+ case 0:
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > xSupplyTables(xConnection, ::com::sun::star::uno::UNO_QUERY);
+ if (xSupplyTables.is() && xSupplyTables->getTables().is() && xSupplyTables->getTables()->hasByName(m_aObjectName))
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier > xSupplyColumns(*(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > *)xSupplyTables->getTables()->getByName(m_aObjectName).getValue(), ::com::sun::star::uno::UNO_QUERY);
+ xFields = xSupplyColumns->getColumns();
+ }
+ }
+ break;
+ case 1:
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XQueriesSupplier > xSupplyQueries(xConnection, ::com::sun::star::uno::UNO_QUERY);
+ if (xSupplyQueries.is() && xSupplyQueries->getQueries().is() && xSupplyQueries->getQueries()->hasByName(m_aObjectName))
+ {
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier > xSupplyColumns(*(::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > *)xSupplyQueries->getQueries()->getByName(m_aObjectName).getValue(), ::com::sun::star::uno::UNO_QUERY);
+ xFields = xSupplyColumns->getColumns();
+ }
+ }
+ break;
+ default:
+ {
+ xStatement = xConnection->prepareStatement(m_aObjectName);
+ // not interested in any results
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > (xStatement,::com::sun::star::uno::UNO_QUERY)->setPropertyValue(::rtl::OUString::createFromAscii("MaxRows"),::com::sun::star::uno::makeAny(sal_Int32(0)));
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XColumnsSupplier > xSupplyCols(xStatement->executeQuery(), ::com::sun::star::uno::UNO_QUERY);
+ if (xSupplyCols.is())
+ xFields = xSupplyCols->getColumns();
+ }
+ }
+ }
+ catch(...)
+ {
+ DBG_WARNING("FmFieldWin::Update(::com::sun::star::form::XForm) : could not collect the fields of the current data source !");
+ }
+
+
+ if (xFields.is())
+ {
+ ::com::sun::star::uno::Sequence< ::rtl::OUString> aNames(xFields->getElementNames());
+ sal_Int32 nFieldsCount = aNames.getLength();
+ const ::rtl::OUString* pNames = aNames.getConstArray();
+
+ for (sal_Int32 i=0; i<nFieldsCount; i++)
+ pListBox->InsertEntry(pNames[i]);
+ }
+
+ // Prefix setzen
+ UniString aPrefix;
+ UniString aPrefixes( SVX_RES(RID_STR_TABWIN_PREFIX) );
+
+ switch (m_nObjectType)
+ {
+ case ::com::sun::star::sdb::CommandType::TABLE:
+ aPrefix = aPrefixes.GetToken(0);
+ break;
+ case ::com::sun::star::sdb::CommandType::QUERY:
+ aPrefix = aPrefixes.GetToken(1);
+ break;
+ default:
+ aPrefix = aPrefixes.GetToken(2);
+ break;
+ }
+
+ // an dem PropertySet nach Aenderungen der ControlSource lauschen
+ if (m_pChangeListener)
+ {
+ m_pChangeListener->dispose();
+ m_pChangeListener->release();
+ }
+ m_pChangeListener = new ::utl::OPropertyChangeMultiplexer(this, xSet);
+ m_pChangeListener->acquire();
+ m_pChangeListener->addProperty(FM_PROP_DATASOURCE);
+ m_pChangeListener->addProperty(FM_PROP_COMMAND);
+ m_pChangeListener->addProperty(FM_PROP_COMMANDTYPE);
+
+ // Titel setzen
+ aTitle.AppendAscii(" ");
+ aTitle += aPrefix;
+ aTitle.AppendAscii(" ");
+ aTitle += m_aObjectName.getStr();
+ SetText( aTitle );
+
+ return sal_True;
+}
+
+//-----------------------------------------------------------------------
+void FmFieldWin::Resize()
+{
+ SfxFloatingWindow::Resize();
+
+ Point aPos(GetPosPixel());
+ Size aSize( GetOutputSizePixel() );
+
+ //////////////////////////////////////////////////////////////////////
+
+ // Groesse der ::com::sun::star::form::ListBox anpassen
+ Point aLBPos( LISTBOX_BORDER, LISTBOX_BORDER );
+ Size aLBSize( aSize );
+ aLBSize.Width() -= (2*LISTBOX_BORDER);
+ aLBSize.Height() -= (2*LISTBOX_BORDER);
+
+ pListBox->SetPosSizePixel( aLBPos, aLBSize );
+}
+
+//-----------------------------------------------------------------------
+void FmFieldWin::FillInfo( SfxChildWinInfo& rInfo ) const
+{
+ rInfo.bVisible = sal_False;
+}
+
+//-----------------------------------------------------------------------
+SFX_IMPL_FLOATINGWINDOW(FmFieldWinMgr, SID_FM_ADD_FIELD)
+
+//-----------------------------------------------------------------------
+FmFieldWinMgr::FmFieldWinMgr(Window *pParent, sal_uInt16 nId,
+ SfxBindings *pBindings, SfxChildWinInfo* pInfo)
+ :SfxChildWindow(pParent, nId)
+{
+ pWindow = new FmFieldWin(pBindings, this, pParent);
+ SetHideNotDelete(sal_True);
+ eChildAlignment = SFX_ALIGN_NOALIGNMENT;
+ ((SfxFloatingWindow*)pWindow)->Initialize( pInfo );
+}
+
+