forked from amazingfate/loongoffice
Set/GetStyle, with WB_* values which overlapped with existing (generic) WB_* bits. Since this overlapping has been removed, there's no need to have both Style and WindowBits at those classes. Should remove some source of confusion and error (and, well, perhaps introduce some new errors :) ).
314 lines
13 KiB
C++
314 lines
13 KiB
C++
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
#include "precompiled_extensions.hxx"
|
|
#include "selectlabeldialog.hxx"
|
|
#ifndef _EXTENSIONS_PROPCTRLR_FORMRESID_HRC_
|
|
#include "formresid.hrc"
|
|
#endif
|
|
#include "formbrowsertools.hxx"
|
|
#include "formstrings.hxx"
|
|
#include <com/sun/star/form/FormComponentType.hpp>
|
|
#include <com/sun/star/container/XChild.hpp>
|
|
#include <com/sun/star/container/XIndexAccess.hpp>
|
|
#include <com/sun/star/sdbc/XResultSet.hpp>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
#include <com/sun/star/lang/XServiceInfo.hpp>
|
|
#include <comphelper/property.hxx>
|
|
#include <comphelper/types.hxx>
|
|
|
|
//............................................................................
|
|
namespace pcr
|
|
{
|
|
//............................................................................
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::container;
|
|
using namespace ::com::sun::star::beans;
|
|
using namespace ::com::sun::star::form;
|
|
using namespace ::com::sun::star::sdbc;
|
|
using namespace ::com::sun::star::lang;
|
|
|
|
//========================================================================
|
|
// OSelectLabelDialog
|
|
//========================================================================
|
|
DBG_NAME(OSelectLabelDialog)
|
|
//------------------------------------------------------------------------
|
|
OSelectLabelDialog::OSelectLabelDialog( Window* pParent, Reference< XPropertySet > _xControlModel )
|
|
:ModalDialog(pParent, PcrRes(RID_DLG_SELECTLABELCONTROL))
|
|
,m_aMainDesc(this, PcrRes(1))
|
|
,m_aControlTree(this, PcrRes(1))
|
|
,m_aNoAssignment(this, PcrRes(1))
|
|
,m_aSeparator(this, PcrRes(1))
|
|
,m_aOk(this, PcrRes(1))
|
|
,m_aCancel(this, PcrRes(1))
|
|
,m_aModelImages(PcrRes(RID_IL_FORMEXPLORER))
|
|
,m_xControlModel(_xControlModel)
|
|
,m_pInitialSelection(NULL)
|
|
,m_pLastSelected(NULL)
|
|
,m_bHaveAssignableControl(sal_False)
|
|
{
|
|
DBG_CTOR(OSelectLabelDialog,NULL);
|
|
|
|
// initialize the TreeListBox
|
|
m_aControlTree.SetSelectionMode( SINGLE_SELECTION );
|
|
m_aControlTree.SetDragDropMode( 0 );
|
|
m_aControlTree.EnableInplaceEditing( sal_False );
|
|
m_aControlTree.SetStyle(m_aControlTree.GetStyle() | WB_BORDER | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONS | WB_HASBUTTONSATROOT | WB_HSCROLL);
|
|
|
|
m_aControlTree.SetNodeBitmaps( m_aModelImages.GetImage( RID_SVXIMG_COLLAPSEDNODE ), m_aModelImages.GetImage( RID_SVXIMG_EXPANDEDNODE ) );
|
|
m_aControlTree.SetSelectHdl(LINK(this, OSelectLabelDialog, OnEntrySelected));
|
|
m_aControlTree.SetDeselectHdl(LINK(this, OSelectLabelDialog, OnEntrySelected));
|
|
|
|
// fill the description
|
|
UniString sDescription = m_aMainDesc.GetText();
|
|
sal_Int16 nClassID = FormComponentType::CONTROL;
|
|
if (::comphelper::hasProperty(PROPERTY_CLASSID, m_xControlModel))
|
|
nClassID = ::comphelper::getINT16(m_xControlModel->getPropertyValue(PROPERTY_CLASSID));
|
|
|
|
sDescription.SearchAndReplace(String::CreateFromAscii("$control_class$"), GetUIHeadlineName(nClassID, makeAny(m_xControlModel)));
|
|
UniString sName = ::comphelper::getString(m_xControlModel->getPropertyValue(PROPERTY_NAME)).getStr();
|
|
sDescription.SearchAndReplace(String::CreateFromAscii("$control_name$"), sName);
|
|
m_aMainDesc.SetText(sDescription);
|
|
|
|
// search for the root of the form hierarchy
|
|
Reference< XChild > xCont(m_xControlModel, UNO_QUERY);
|
|
Reference< XInterface > xSearch( xCont.is() ? xCont->getParent() : Reference< XInterface > ());
|
|
Reference< XResultSet > xParentAsResultSet(xSearch, UNO_QUERY);
|
|
while (xParentAsResultSet.is())
|
|
{
|
|
xCont = Reference< XChild > (xSearch, UNO_QUERY);
|
|
xSearch = xCont.is() ? xCont->getParent() : Reference< XInterface > ();
|
|
xParentAsResultSet = Reference< XResultSet > (xSearch, UNO_QUERY);
|
|
}
|
|
|
|
// and insert all entries below this root into the listbox
|
|
if (xSearch.is())
|
|
{
|
|
// check wich service the allowed components must suppport
|
|
sal_Int16 nClassId = 0;
|
|
try { nClassId = ::comphelper::getINT16(m_xControlModel->getPropertyValue(PROPERTY_CLASSID)); } catch(...) { }
|
|
m_sRequiredService = (FormComponentType::RADIOBUTTON == nClassId) ? SERVICE_COMPONENT_GROUPBOX : SERVICE_COMPONENT_FIXEDTEXT;
|
|
m_aRequiredControlImage = m_aModelImages.GetImage((FormComponentType::RADIOBUTTON == nClassId) ? RID_SVXIMG_GROUPBOX : RID_SVXIMG_FIXEDTEXT);
|
|
|
|
// calc the currently set label control (so InsertEntries can calc m_pInitialSelection)
|
|
Any aCurrentLabelControl( m_xControlModel->getPropertyValue(PROPERTY_CONTROLLABEL) );
|
|
DBG_ASSERT((aCurrentLabelControl.getValueTypeClass() == TypeClass_INTERFACE) || !aCurrentLabelControl.hasValue(),
|
|
|
|
"OSelectLabelDialog::OSelectLabelDialog : invalid ControlLabel property !");
|
|
if (aCurrentLabelControl.hasValue())
|
|
aCurrentLabelControl >>= m_xInitialLabelControl;
|
|
|
|
// insert the root
|
|
Image aRootImage = m_aModelImages.GetImage(RID_SVXIMG_FORMS);
|
|
SvLBoxEntry* pRoot = m_aControlTree.InsertEntry(PcrRes(RID_STR_FORMS), aRootImage, aRootImage);
|
|
|
|
// build the tree
|
|
m_pInitialSelection = NULL;
|
|
m_bHaveAssignableControl = sal_False;
|
|
InsertEntries(xSearch, pRoot);
|
|
m_aControlTree.Expand(pRoot);
|
|
}
|
|
|
|
if (m_pInitialSelection)
|
|
{
|
|
m_aControlTree.MakeVisible(m_pInitialSelection, sal_True);
|
|
m_aControlTree.Select(m_pInitialSelection, sal_True);
|
|
}
|
|
else
|
|
{
|
|
m_aControlTree.MakeVisible(m_aControlTree.First(), sal_True);
|
|
if (m_aControlTree.FirstSelected())
|
|
m_aControlTree.Select(m_aControlTree.FirstSelected(), sal_False);
|
|
m_aNoAssignment.Check(sal_True);
|
|
}
|
|
|
|
if (!m_bHaveAssignableControl)
|
|
{ // no controls which can be assigned
|
|
m_aNoAssignment.Check(sal_True);
|
|
m_aNoAssignment.Enable(sal_False);
|
|
}
|
|
|
|
m_aNoAssignment.SetClickHdl(LINK(this, OSelectLabelDialog, OnNoAssignmentClicked));
|
|
m_aNoAssignment.GetClickHdl().Call(&m_aNoAssignment);
|
|
|
|
FreeResource();
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
OSelectLabelDialog::~OSelectLabelDialog()
|
|
{
|
|
// delete the entry datas of the listbox entries
|
|
SvLBoxEntry* pLoop = m_aControlTree.First();
|
|
while (pLoop)
|
|
{
|
|
void* pData = pLoop->GetUserData();
|
|
if (pData)
|
|
delete (Reference< XPropertySet > *)pData;
|
|
pLoop = m_aControlTree.Next(pLoop);
|
|
}
|
|
|
|
DBG_DTOR(OSelectLabelDialog,NULL);
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
sal_Int32 OSelectLabelDialog::InsertEntries(const Reference< XInterface > & _xContainer, SvLBoxEntry* pContainerEntry)
|
|
{
|
|
Reference< XIndexAccess > xContainer(_xContainer, UNO_QUERY);
|
|
if (!xContainer.is())
|
|
return 0;
|
|
|
|
sal_Int32 nChildren = 0;
|
|
UniString sName,sDisplayName;
|
|
Reference< XPropertySet > xAsSet;
|
|
for (sal_Int32 i=0; i<xContainer->getCount(); ++i)
|
|
{
|
|
xContainer->getByIndex(i) >>= xAsSet;
|
|
if (!xAsSet.is())
|
|
{
|
|
DBG_WARNING("OSelectLabelDialog::InsertEntries : strange : a form component which isn't a property set !");
|
|
continue;
|
|
}
|
|
|
|
if (!::comphelper::hasProperty(PROPERTY_NAME, xAsSet))
|
|
// we need at least a name for displaying ...
|
|
continue;
|
|
sName = ::comphelper::getString(xAsSet->getPropertyValue(PROPERTY_NAME)).getStr();
|
|
|
|
// we need to check if the control model supports the required service
|
|
Reference< XServiceInfo > xInfo(xAsSet, UNO_QUERY);
|
|
if (!xInfo.is())
|
|
continue;
|
|
|
|
if (!xInfo->supportsService(m_sRequiredService))
|
|
{ // perhaps it is a container
|
|
Reference< XIndexAccess > xCont(xAsSet, UNO_QUERY);
|
|
if (xCont.is() && xCont->getCount())
|
|
{ // yes -> step down
|
|
Image aFormImage = m_aModelImages.GetImage( RID_SVXIMG_FORM );
|
|
SvLBoxEntry* pCont = m_aControlTree.InsertEntry(sName, aFormImage, aFormImage, pContainerEntry);
|
|
sal_Int32 nContChildren = InsertEntries(xCont, pCont);
|
|
if (nContChildren)
|
|
{
|
|
m_aControlTree.Expand(pCont);
|
|
++nChildren;
|
|
}
|
|
else
|
|
{ // oops, no valid childs -> remove the entry
|
|
m_aControlTree.ModelIsRemoving(pCont);
|
|
m_aControlTree.GetModel()->Remove(pCont);
|
|
m_aControlTree.ModelHasRemoved(pCont);
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
|
|
// get the label
|
|
if (!::comphelper::hasProperty(PROPERTY_LABEL, xAsSet))
|
|
continue;
|
|
sDisplayName = ::comphelper::getString(xAsSet->getPropertyValue(PROPERTY_LABEL)).getStr();
|
|
sDisplayName += String::CreateFromAscii(" (");
|
|
sDisplayName += sName;
|
|
sDisplayName += ')';
|
|
|
|
// all requirements met -> insert
|
|
SvLBoxEntry* pCurrent = m_aControlTree.InsertEntry(sDisplayName, m_aRequiredControlImage, m_aRequiredControlImage, pContainerEntry);
|
|
pCurrent->SetUserData(new Reference< XPropertySet > (xAsSet));
|
|
++nChildren;
|
|
|
|
if (m_xInitialLabelControl == xAsSet)
|
|
m_pInitialSelection = pCurrent;
|
|
|
|
m_bHaveAssignableControl = sal_True;
|
|
}
|
|
|
|
return nChildren;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
IMPL_LINK(OSelectLabelDialog, OnEntrySelected, SvTreeListBox*, pLB)
|
|
{
|
|
DBG_ASSERT(pLB == &m_aControlTree, "OSelectLabelDialog::OnEntrySelected : where did this come from ?");
|
|
(void)pLB;
|
|
SvLBoxEntry* pSelected = m_aControlTree.FirstSelected();
|
|
void* pData = pSelected ? pSelected->GetUserData() : NULL;
|
|
|
|
if (pData)
|
|
m_xSelectedControl = Reference< XPropertySet > (*(Reference< XPropertySet > *)pData);
|
|
|
|
m_aNoAssignment.SetClickHdl(Link());
|
|
m_aNoAssignment.Check(pData == NULL);
|
|
m_aNoAssignment.SetClickHdl(LINK(this, OSelectLabelDialog, OnNoAssignmentClicked));
|
|
|
|
return 0L;
|
|
}
|
|
|
|
//------------------------------------------------------------------------
|
|
IMPL_LINK(OSelectLabelDialog, OnNoAssignmentClicked, Button*, pButton)
|
|
{
|
|
DBG_ASSERT(pButton == &m_aNoAssignment, "OSelectLabelDialog::OnNoAssignmentClicked : where did this come from ?");
|
|
(void)pButton;
|
|
|
|
if (m_aNoAssignment.IsChecked())
|
|
m_pLastSelected = m_aControlTree.FirstSelected();
|
|
else
|
|
{
|
|
DBG_ASSERT(m_bHaveAssignableControl, "OSelectLabelDialog::OnNoAssignmentClicked");
|
|
// search the first assignable entry
|
|
SvLBoxEntry* pSearch = m_aControlTree.First();
|
|
while (pSearch)
|
|
{
|
|
if (pSearch->GetUserData())
|
|
break;
|
|
pSearch = m_aControlTree.Next(pSearch);
|
|
}
|
|
// and select it
|
|
if (pSearch)
|
|
{
|
|
m_aControlTree.Select(pSearch);
|
|
m_pLastSelected = pSearch;
|
|
}
|
|
}
|
|
|
|
if (m_pLastSelected)
|
|
{
|
|
m_aControlTree.SetSelectHdl(Link());
|
|
m_aControlTree.SetDeselectHdl(Link());
|
|
m_aControlTree.Select(m_pLastSelected, !m_aNoAssignment.IsChecked());
|
|
m_aControlTree.SetSelectHdl(LINK(this, OSelectLabelDialog, OnEntrySelected));
|
|
m_aControlTree.SetDeselectHdl(LINK(this, OSelectLabelDialog, OnEntrySelected));
|
|
}
|
|
|
|
return 0L;
|
|
}
|
|
|
|
//............................................................................
|
|
} // namespace pcr
|
|
//............................................................................
|
|
|