office-gobmx/sd/source/ui/app/layoutctrl.cxx
2009-12-08 17:33:39 +01:00

379 lines
13 KiB
C++

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: tmplctrl.cxx,v $
*
* $Revision: 1.3 $
*
* 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_sd.hxx"
#include <com/sun/star/text/WritingMode.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <boost/scoped_ptr.hpp>
#include <vcl/menu.hxx>
#include <vcl/status.hxx>
#include <vcl/toolbox.hxx>
#include <svtools/languageoptions.hxx>
#include <svtools/style.hxx>
#include <svtools/stritem.hxx>
#include <svtools/miscopt.hxx>
#include <svtools/valueset.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/dockwin.hxx>
#include <svx/toolbarmenu.hxx>
#include "layoutdialog.hxx"
#include "sdresid.hxx"
#include "res_bmp.hrc"
#include "strings.hrc"
#include "layoutctrl.hxx"
#include "ViewShellBase.hxx"
#include "drawdoc.hxx"
#include "sdattr.hrc"
#include "app.hrc"
#include "glob.hrc"
using ::rtl::OUString;
using namespace ::com::sun::star;
using namespace ::com::sun::star::text;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
SFX_IMPL_TOOLBOX_CONTROL( SdLayoutControl, SfxVoidItem );
#if 0
class SdLayoutDialogContent : public SfxDockingWindow
{
using DockingWindow::StateChanged;
private:
ToolBox* mpToolBox;
ValueSet* mpLayoutSet;
AutoLayout meCurrentLayout;
/*boost::scoped_ptr<FixedText> mpTitle;
boost::scoped_ptr<FixedLine> mpSeperator;
boost::scoped_ptr<Menu> mpMenu;*/
::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > mxFrame;
bool mbPopupMode;
DECL_LINK( SelectHdl, void * );
protected:
virtual void PopupModeEnd();
/** This function is called when the window gets the focus. It grabs
the focus to the line ends value set so that it can be controlled with
the keyboard.
*/
virtual void GetFocus (void);
public:
SdLayoutDialogContent( SfxBindings* pBindings, SfxChildWindow *pCW, ::Window* pParent, const SdResId& rSdResId, ViewShellBase& rBase);
~SdLayoutDialogContent();
virtual SfxDockingWindow* Clone() const;
virtual void Paint( const Rectangle& rRect );
virtual void StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState );
virtual void DataChanged( const DataChangedEvent& rDCEvt );
};
#endif
// class SdLayoutControl ------------------------------------------
SdLayoutControl::SdLayoutControl( USHORT _nSlotId, USHORT _nId, ToolBox& rTbx )
: SfxToolBoxControl( _nSlotId, _nId, rTbx )
{
rTbx.SetItemBits( _nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( _nId ) );
rTbx.Invalidate();
}
// -----------------------------------------------------------------------
SdLayoutControl::~SdLayoutControl()
{
}
// -----------------------------------------------------------------------
void SdLayoutControl::Select( BOOL bMod1 )
{
(void)bMod1;
}
// -----------------------------------------------------------------------
void SdLayoutControl::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
{
SfxToolBoxControl::StateChanged( nSID, eState, pState );
}
SfxPopupWindowType SdLayoutControl::GetPopupWindowType() const
{
return SFX_POPUPWINDOW_ONCLICK;
}
// -----------------------------------------------------------------------
SfxPopupWindow* SdLayoutControl::CreatePopupWindow()
{
OUString sResourceName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/dockingwindow/" ) );
sResourceName += OUString::valueOf( static_cast<sal_Int32>(GetId()) );
createAndPositionSubToolBar( sResourceName );
/*
SfxPopupWindow* pWin = 0;
ToolBox& rTbx = GetToolBox();
SfxViewFrame* pViewFrame = SfxViewFrame::Current();
if( pViewFrame )
{
pWin = sd::LayoutDialogChildWindow::createChildWindow( *pViewFrame, &rTbx );
if( pWin )
{
pWin->EnableDocking(true);
Window::GetDockingManager()->StartPopupMode( &rTbx, pWin );
}
}
SetPopupWindow( pWin );
*/
return 0;
}
#if 0
// -----------------------------------------------------------------------
struct snewfoil_value_info
{
USHORT mnBmpResId;
USHORT mnHCBmpResId;
USHORT mnStrResId;
WritingMode meWritingMode;
AutoLayout maAutoLayout;
};
static snewfoil_value_info standard[] =
{
{BMP_FOIL_20, BMP_FOIL_20_H, STR_AUTOLAYOUT_NONE, WritingMode_LR_TB, AUTOLAYOUT_NONE},
{BMP_FOIL_00, BMP_FOIL_00_H, STR_AUTOLAYOUT_TITLE, WritingMode_LR_TB, AUTOLAYOUT_TITLE},
{BMP_FOIL_01, BMP_FOIL_01_H, STR_AUTOLAYOUT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_ENUM},
{BMP_FOIL_03, BMP_FOIL_03_H, STR_AUTOLAYOUT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_2TEXT},
{BMP_FOIL_19, BMP_FOIL_19_H, STR_AUTOLAYOUT_ONLY_TITLE, WritingMode_LR_TB, AUTOLAYOUT_ONLY_TITLE},
{BMP_FOIL_25, BMP_FOIL_25_H, STR_AUTOLAYOUT_ONLY_TEXT, WritingMode_LR_TB, AUTOLAYOUT_ONLY_TEXT},
{BMP_FOIL_12, BMP_FOIL_12_H, STR_AUTOLAYOUT_CONTENT_2CONTENT, WritingMode_LR_TB, AUTOLAYOUT_TEXT2OBJ},
{BMP_FOIL_15, BMP_FOIL_15_H, STR_AUTOLAYOUT_2CONTENT_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_2OBJTEXT},
{BMP_FOIL_16, BMP_FOIL_16_H, STR_AUTOLAYOUT_2CONTENT_OVER_CONTENT,WritingMode_LR_TB, AUTOLAYOUT_2OBJOVERTEXT},
{BMP_FOIL_14, BMP_FOIL_14_H, STR_AUTOLAYOUT_CONTENT_OVER_CONTENT, WritingMode_LR_TB, AUTOLAYOUT_OBJOVERTEXT},
{BMP_FOIL_18, BMP_FOIL_18_H, STR_AUTOLAYOUT_4CONTENT, WritingMode_LR_TB, AUTOLAYOUT_4OBJ},
{BMP_FOIL_27, BMP_FOIL_27_H, STR_AUTOLAYOUT_6CONTENT, WritingMode_LR_TB, AUTOLAYOUT_6CLIPART},
// vertical
{BMP_FOIL_21, BMP_FOIL_21_H, STR_AL_VERT_TITLE_TEXT_CHART, WritingMode_TB_RL,AUTOLAYOUT_VERTICAL_TITLE_TEXT_CHART},
{BMP_FOIL_22, BMP_FOIL_22_H, STR_AL_VERT_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_VERTICAL_TITLE_VERTICAL_OUTLINE},
{BMP_FOIL_23, BMP_FOIL_23_H, STR_AL_TITLE_VERT_OUTLINE, WritingMode_TB_RL, AUTOLAYOUT_TITLE_VERTICAL_OUTLINE},
{BMP_FOIL_24, BMP_FOIL_24_H, STR_AL_TITLE_VERT_OUTLINE_CLIPART, WritingMode_TB_RL, AUTOLAYOUT_TITLE_VERTICAL_OUTLINE_CLIPART},
{0, 0, 0, WritingMode_LR_TB, AUTOLAYOUT_NONE}
};
SfxPopupWindowType SdLayoutControl::GetPopupWindowType() const
{
return SFX_POPUPWINDOW_ONCLICK;
}
// -----------------------------------------------------------------------
SfxPopupWindow* SdLayoutControl::CreatePopupWindow()
{
ToolBox& rTbx = GetToolBox();
SdLayoutDialogContent* pWin = new SdLayoutDialogContent( GetId(), m_xFrame, &rTbx );
// pWin->StartPopupMode( &rTbx, FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_NOKEYCLOSE );
pWin->EnableDocking(true);
Window::GetDockingManager()->StartPopupMode( &rTbx, pWin );
// SetPopupWindow( pWin );
// return pWin;
return 0;
}
// -----------------------------------------------------------------------
SdLayoutDialogContent::SdLayoutDialogContent( USHORT nId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
: SfxDockingWindow( nId, rFrame, pParentWindow, WB_SYSTEMWINDOW )
, mxFrame( rFrame )
, mbPopupMode(true)
, meCurrentLayout( AUTOLAYOUT_NONE )
{
// SetHelpId( HID_POPUP_LAYOUT );
const Color aMenuColor( GetSettings().GetStyleSettings().GetMenuColor() );
const Color aMenuBarColor( GetSettings().GetStyleSettings().GetMenuBarColor() );
const Color aMenuTextColor( GetSettings().GetStyleSettings().GetMenuBarColor() );
const Color aMenuBarTextColor( GetSettings().GetStyleSettings().GetMenuBarTextColor() );
const bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
SvtLanguageOptions aLanguageOptions;
const bool bVerticalEnabled = aLanguageOptions.IsVerticalTextEnabled();
mpToolbarMenu.reset( new ToolbarMenu( this, WB_CLIPCHILDREN ) );
// mpToolbarMenu->SetHelpId( HID_MENU_EXTRUSION_DIRECTION );
mpToolbarMenu->SetSelectHdl( LINK( this, SdLayoutDialogContent, SelectHdl ) );
mpLayoutSet = new ValueSet( mpToolbarMenu.get(), WB_TABSTOP | WB_MENUSTYLEVALUESET | WB_FLATVALUESET | WB_NOBORDER | WB_NO_DIRECTSELECT );
// mpLayoutSet->SetHelpId( HID_VALUESET_EXTRUSION_LIGHTING );
mpLayoutSet->SetSelectHdl( LINK( this, SdLayoutDialogContent, SelectHdl ) );
mpLayoutSet->SetColCount( 4 );
mpLayoutSet->EnableFullItemMode( FALSE );
Size aLayoutItemSize;
USHORT nItem = 1;
for( snewfoil_value_info* pInfo = &standard[0]; pInfo->mnBmpResId; pInfo++ )
{
if( !bVerticalEnabled && (pInfo->meWritingMode == WritingMode_TB_RL) )
continue;
String aText( SdResId( pInfo->mnStrResId ) );
BitmapEx aBmp( SdResId( bHighContrast ? pInfo->mnHCBmpResId : pInfo->mnBmpResId ) );
mpLayoutSet->InsertItem( static_cast<USHORT>(pInfo->maAutoLayout)+1, aBmp, aText );
aLayoutItemSize.Width() = std::max( aLayoutItemSize.Width(), aBmp.GetSizePixel().Width() );
aLayoutItemSize.Height() = std::max( aLayoutItemSize.Height(), aBmp.GetSizePixel().Height() );
}
aLayoutItemSize = mpLayoutSet->CalcItemSizePixel( aLayoutItemSize );
Size aValueSize = mpLayoutSet->CalcWindowSizePixel( aLayoutItemSize );
mpLayoutSet->SetSizePixel( aValueSize );
mpToolbarMenu->appendEntry( -1, String( SdResId( STR_UNDO_MODIFY_PAGE ) ) );
mpToolbarMenu->appendEntry( 0, mpLayoutSet );
mpToolbarMenu->appendSeparator();
mpToolbarMenu->appendEntry( 1, String( RTL_CONSTASCII_USTRINGPARAM("Reset Slide Layout") ));
SetOutputSizePixel( mpToolbarMenu->getMenuSize() );
mpToolbarMenu->SetOutputSizePixel( GetOutputSizePixel() );
mpToolbarMenu->Show();
AddStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:AssignLayout" )));
}
SfxDockingWindow* SdLayoutDialogContent::Clone() const
{
return new SdLayoutDialogContent( GetId(), mxFrame );
}
void SdLayoutDialogContent::Paint( const Rectangle& rRect )
{
SfxDockingWindow::Paint(rRect);
}
void SdLayoutDialogContent::DataChanged( const DataChangedEvent& rDCEvt )
{
SfxDockingWindow::DataChanged( rDCEvt );
if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
{
// const bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
// todo switch images
}
}
// -----------------------------------------------------------------------
SdLayoutDialogContent::~SdLayoutDialogContent()
{
}
// -----------------------------------------------------------------------
void SdLayoutDialogContent::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
{
if( (nSID == SID_ASSIGN_LAYOUT) && (eState != SFX_ITEM_DISABLED) )
{
const SfxUInt32Item* pStateItem = dynamic_cast< const SfxUInt32Item* >(pState);
if( pStateItem )
{
meCurrentLayout = static_cast< AutoLayout >( pStateItem->GetValue() );
mpLayoutSet->SelectItem( static_cast<USHORT>(meCurrentLayout)+1 );
}
}
}
// -----------------------------------------------------------------------
IMPL_LINK( SdLayoutDialogContent, SelectHdl, void *, pControl )
{
if ( IsInPopupMode() )
EndPopupMode();
AutoLayout eLayout = meCurrentLayout;
if( pControl == mpLayoutSet )
eLayout = static_cast< AutoLayout >(mpLayoutSet->GetSelectItemId()-1);
const rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:AssignLayout" ));
Sequence< PropertyValue > aArgs( 1 );
aArgs[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM("WhatLayout") );
aArgs[0].Value <<= static_cast<sal_Int32>(eLayout);
SfxToolBoxControl::Dispatch( Reference< ::com::sun::star::frame::XDispatchProvider >( mxFrame->getController(), UNO_QUERY ), aCommand, aArgs );
return 0;
}
// -----------------------------------------------------------------------
void SdLayoutDialogContent::PopupModeEnd()
{
if ( IsVisible() )
mbPopupMode = FALSE;
SfxDockingWindow::PopupModeEnd();
}
// -----------------------------------------------------------------------
void SdLayoutDialogContent::GetFocus (void)
{
SfxDockingWindow::GetFocus();
if( mpToolbarMenu )
mpToolbarMenu->GrabFocus();
}
#endif