/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"



// INCLUDE ---------------------------------------------------------------

#include "scitems.hxx"
#include <sfx2/viewfrm.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/request.hxx>
#include <svl/stritem.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/app.hxx>
#include "globstr.hrc"
#include "scmod.hxx"
#include "appoptio.hxx"
#include "tabvwsh.hxx"
#include "document.hxx"
#include "sc.hrc"
#include "docsh.hxx"
#include "reffact.hxx"
#include "uiitems.hxx"
//CHINA001 #include "scendlg.hxx"
//CHINA001 #include "mtrindlg.hxx"
#include "autoform.hxx"
#include "autofmt.hxx"
#include "cellsh.hxx"
#include "attrdlg.hrc"		// TP_ALIGNMENT
#include "inputhdl.hxx"
#include "editable.hxx"

#include "scabstdlg.hxx" //CHINA001

#define IS_EDITMODE() GetViewData()->HasEditView( GetViewData()->GetActivePart() )

inline long TwipsToHMM(long nTwips)	{ return (nTwips * 127 + 36) / 72; }
inline long HMMToTwips(long nHMM)	{ return (nHMM * 72 + 63) / 127; }
inline long TwipsToEvenHMM(long nTwips)	{ return ( (nTwips * 127 + 72) / 144 ) * 2; }

//------------------------------------------------------------------

void ScCellShell::Execute( SfxRequest& rReq )
{
	ScTabViewShell*	pTabViewShell  	= GetViewData()->GetViewShell();
	SfxBindings&		rBindings	= pTabViewShell->GetViewFrame()->GetBindings();
	ScModule*			pScMod		= SC_MOD();
	const SfxItemSet*	pReqArgs	= rReq.GetArgs();
	sal_uInt16				nSlot		= rReq.GetSlot();

	if (nSlot != SID_CURRENTCELL)		// der kommt beim MouseButtonUp
		pTabViewShell->HideListBox();	// Autofilter-DropDown-Listbox

	if ( IS_EDITMODE() )
	{
		switch ( nSlot )
		{
			//	beim Oeffnen eines Referenz-Dialogs darf die SubShell nicht umgeschaltet werden
			//	(beim Schliessen des Dialogs wird StopEditShell gerufen)
			case SID_OPENDLG_FUNCTION:
					//	#53318# inplace macht die EditShell Aerger...
					//!	kann nicht immer umgeschaltet werden ????
                    if (!pTabViewShell->GetViewFrame()->GetFrame().IsInPlace())
						pTabViewShell->SetDontSwitch(sal_True);			// EditShell nicht abschalten
					// kein break

			case FID_CELL_FORMAT:
			case SID_ENABLE_HYPHENATION:
			case SID_DATA_SELECT:
			case SID_OPENDLG_CONSOLIDATE:
			case SID_OPENDLG_SOLVE:
            case SID_OPENDLG_OPTSOLVER:

					pScMod->InputEnterHandler();
					pTabViewShell->UpdateInputHandler();

					pTabViewShell->SetDontSwitch(sal_False);

					break;

			default:
					break;
		}
	}

	switch ( nSlot )
	{



		case SID_ATTR_SIZE://XXX ???
			break;

		case SID_STATUS_SELMODE:
			if ( pReqArgs )
			{
				/* 0: STD	Click hebt Sel auf
				 * 1: ER	Click erweitert Selektion
				 * 2: ERG	Click definiert weitere Selektion
				 */
				sal_uInt16 nMode = ((const SfxUInt16Item&)pReqArgs->Get( nSlot )).GetValue();

				switch ( nMode )
				{
					case 1: nMode = KEY_SHIFT;	break;
					case 2: nMode = KEY_MOD1;	break; // Control-Taste
					case 0:
					default:
						nMode = 0;
				}

				pTabViewShell->LockModifiers( nMode );
			}
			else
			{
				//	no arguments (also executed by double click on the status bar controller):
				//	advance to next selection mode

				sal_uInt16 nModifiers = pTabViewShell->GetLockedModifiers();
				switch ( nModifiers )
				{
					case KEY_SHIFT:	nModifiers = KEY_MOD1;	break;		// EXT -> ADD
					case KEY_MOD1:	nModifiers = 0;			break;		// ADD -> STD
					default:		nModifiers = KEY_SHIFT;	break;		// STD -> EXT
				}
				pTabViewShell->LockModifiers( nModifiers );
			}

			rBindings.Invalidate( SID_STATUS_SELMODE );
			rReq.Done();
			break;

		//	SID_STATUS_SELMODE_NORM wird nicht benutzt ???

		case SID_STATUS_SELMODE_NORM:
			pTabViewShell->LockModifiers( 0 );
			rBindings.Invalidate( SID_STATUS_SELMODE );
			break;

		//	SID_STATUS_SELMODE_ERG / SID_STATUS_SELMODE_ERW als Toggles:

		case SID_STATUS_SELMODE_ERG:
			if ( pTabViewShell->GetLockedModifiers() & KEY_MOD1 )
				pTabViewShell->LockModifiers( 0 );
			else
				pTabViewShell->LockModifiers( KEY_MOD1 );
			rBindings.Invalidate( SID_STATUS_SELMODE );
			break;

		case SID_STATUS_SELMODE_ERW:
			if ( pTabViewShell->GetLockedModifiers() & KEY_SHIFT )
				pTabViewShell->LockModifiers( 0 );
			else
				pTabViewShell->LockModifiers( KEY_SHIFT );
			rBindings.Invalidate( SID_STATUS_SELMODE );
			break;

		case SID_ENTER_STRING:
			{
				if ( pReqArgs )
				{
					String aStr( ((const SfxStringItem&)pReqArgs->
									Get( SID_ENTER_STRING )).GetValue() );

					pTabViewShell->EnterData( GetViewData()->GetCurX(),
											   GetViewData()->GetCurY(),
											   GetViewData()->GetTabNo(),
											   aStr );

					ScInputHandler* pHdl = SC_MOD()->GetInputHdl( pTabViewShell );
					if ( !pHdl || !pHdl->IsInEnterHandler() )
					{
						//	#101061# UpdateInputHandler is needed after the cell content
						//	has changed, but if called from EnterHandler, UpdateInputHandler
						//	will be called later when moving the cursor.

						pTabViewShell->UpdateInputHandler();
					}

					rReq.Done();

					//	hier kein GrabFocus, weil sonst auf dem Mac die Tabelle vor die
					//	Seitenansicht springt, wenn die Eingabe nicht abgeschlossen war
					//	(GrabFocus passiert in KillEditView)
				}
			}
			break;

		case SID_INSERT_MATRIX:
			{
				if ( pReqArgs )
				{
					String aStr = ((const SfxStringItem&)pReqArgs->
									Get( SID_INSERT_MATRIX )).GetValue();
					pTabViewShell->EnterMatrix( aStr );
					rReq.Done();
				}
			}
			break;

		case FID_INPUTLINE_ENTER:
		case FID_INPUTLINE_BLOCK:
		case FID_INPUTLINE_MATRIX:
			{
				if( pReqArgs == 0 ) //XXX vorlaufiger HACK um GPF zu vermeiden
					break;

				const ScInputStatusItem* pStatusItem
					= (const ScInputStatusItem*)&pReqArgs->
							Get( FID_INPUTLINE_STATUS );

				ScAddress aCursorPos = pStatusItem->GetPos();
                String aString = pStatusItem->GetString();
				const EditTextObject* pData = pStatusItem->GetEditData();
				if (pData)
				{
					if (nSlot == FID_INPUTLINE_BLOCK)
                    {
						pTabViewShell->EnterBlock( aString, pData );
                    }
                    else if ( aString.Len() > 0 && ( aString.GetChar(0) == '=' || aString.GetChar(0) == '+' || aString.GetChar(0) == '-' ) )
                    {
                        pTabViewShell->EnterData( aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), aString, sal_True, pData );
                    }
					else
                    {
						pTabViewShell->EnterData( aCursorPos.Col(), aCursorPos.Row(), aCursorPos.Tab(), pData );
                    }
				}
				else
				{
					if (nSlot == FID_INPUTLINE_ENTER)
					{
						if (
							aCursorPos.Col() == GetViewData()->GetCurX() &&
							aCursorPos.Row() == GetViewData()->GetCurY() &&
							aCursorPos.Tab() == GetViewData()->GetTabNo()
							)
						{
							SfxStringItem	aItem( SID_ENTER_STRING, aString );

                            // SfxBindings& rBindings = pTabViewShell->GetViewFrame()->GetBindings();
							const SfxPoolItem* aArgs[2];
							aArgs[0] = &aItem;
							aArgs[1] = NULL;
							rBindings.Execute( SID_ENTER_STRING, aArgs );
						}
						else
						{
							pTabViewShell->EnterData( aCursorPos.Col(),
													aCursorPos.Row(),
													aCursorPos.Tab(),
													aString );
							rReq.Done();
						}
					}
					else if (nSlot == FID_INPUTLINE_BLOCK)
					{
						pTabViewShell->EnterBlock( aString, NULL );
						rReq.Done();
					}
					else
					{
						pTabViewShell->EnterMatrix( aString );
						rReq.Done();
					}

				}

				//	hier kein GrabFocus, weil sonst auf dem Mac die Tabelle vor die
				//	Seitenansicht springt, wenn die Eingabe nicht abgeschlossen war
				//	(GrabFocus passiert in KillEditView)
			}
			break;

		case SID_OPENDLG_FUNCTION:
			{
				sal_uInt16 nId = SID_OPENDLG_FUNCTION;
				SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
				SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );

				pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
                rReq.Ignore();
			}
			break;

		case SID_OPENDLG_CONSOLIDATE:
			{
				sal_uInt16			nId  = ScConsolidateDlgWrapper::GetChildWindowId();
				SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
				SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );

				pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
			}
			break;

		case FID_CELL_FORMAT:
			{
				if ( pReqArgs != NULL )
				{
					//----------------------------------
					// Zellattribute ohne Dialog setzen:
					//----------------------------------
					SfxItemSet* 	pEmptySet =
										new SfxItemSet( *pReqArgs->GetPool(),
														ATTR_PATTERN_START,
														ATTR_PATTERN_END );

					SfxItemSet* 	pNewSet =
										new SfxItemSet( *pReqArgs->GetPool(),
														ATTR_PATTERN_START,
														ATTR_PATTERN_END );

					const SfxPoolItem*	pAttr = NULL;
					sal_uInt16				nWhich = 0;

					for ( nWhich=ATTR_PATTERN_START; nWhich<=ATTR_PATTERN_END; nWhich++ )
						if ( pReqArgs->GetItemState( nWhich, sal_True, &pAttr ) == SFX_ITEM_SET )
							pNewSet->Put( *pAttr );

					pTabViewShell->ApplyAttributes( pNewSet, pEmptySet );

					delete pNewSet;
					delete pEmptySet;

					rReq.Done();
				}
				else if ( pReqArgs == NULL )
				{
					pTabViewShell->ExecuteCellFormatDlg( rReq );
				}
			}
			break;

		case SID_ENABLE_HYPHENATION:
			pTabViewShell->ExecuteCellFormatDlg( rReq, TP_ALIGNMENT );
			break;

		case SID_OPENDLG_SOLVE:
			{
				sal_uInt16			nId  = ScSolverDlgWrapper::GetChildWindowId();
				SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
				SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );

				pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
			}
			break;

        case SID_OPENDLG_OPTSOLVER:
            {
                sal_uInt16 nId = ScOptSolverDlgWrapper::GetChildWindowId();
                SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
                SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );

                pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
            }
            break;

		case SID_OPENDLG_TABOP:
			{
				sal_uInt16			nId  = ScTabOpDlgWrapper::GetChildWindowId();
				SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
				SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );

				pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
			}
			break;

		case SID_SCENARIOS:
			{
				ScDocument* pDoc = GetViewData()->GetDocument();
				ScMarkData& rMark = GetViewData()->GetMarkData();
				SCTAB nTab = GetViewData()->GetTabNo();

				if ( pDoc->IsScenario(nTab) )
				{
					rMark.MarkToMulti();
					if ( rMark.IsMultiMarked() )
					{
						if (   rReq.IsAPI()
							|| RET_YES ==
							   QueryBox( pTabViewShell->GetDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES),
										 ScGlobal::GetRscString(STR_UPDATE_SCENARIO) ).
										Execute() )
						{
							pTabViewShell->ExtendScenario();
							rReq.Done();
						}
					}
					else if( ! rReq.IsAPI() )
					{
						ErrorBox aErrorBox( pTabViewShell->GetDialogParent(), WinBits(WB_OK | WB_DEF_OK),
											ScGlobal::GetRscString(STR_NOAREASELECTED) );
						aErrorBox.Execute();
					}
				}
				else
				{
					rMark.MarkToMulti();
					if ( rMark.IsMultiMarked() )
					{
						SCTAB i=1;
						String aBaseName;
						String aName;
						String aComment;
						Color  aColor;
						sal_uInt16 nFlags;

						pDoc->GetName( nTab, aBaseName );
						aBaseName += '_';
						aBaseName += ScGlobal::GetRscString(STR_SCENARIO);
						aBaseName += '_';

						//	vorneweg testen, ob der Prefix als gueltig erkannt wird
						//	wenn nicht, nur doppelte vermeiden
						sal_Bool bPrefix = pDoc->ValidTabName( aBaseName );
						DBG_ASSERT(bPrefix, "ungueltiger Tabellenname");

						while ( pDoc->IsScenario(nTab+i) )
							i++;

						sal_Bool bValid;
						SCTAB nDummy;
						do
						{
							aName = aBaseName;
							aName += String::CreateFromInt32( i );
							if (bPrefix)
								bValid = pDoc->ValidNewTabName( aName );
							else
								bValid = !pDoc->GetTable( aName, nDummy );
							++i;
						}
						while ( !bValid && i <= 2*MAXTAB );

						if ( pReqArgs != NULL )
						{
							String aArgName;
							String aArgComment;
							const SfxPoolItem* pItem;
							if ( pReqArgs->GetItemState( SID_SCENARIOS, sal_True, &pItem ) == SFX_ITEM_SET )
								aArgName = ((const SfxStringItem*)pItem)->GetValue();
							if ( pReqArgs->GetItemState( SID_NEW_TABLENAME, sal_True, &pItem ) == SFX_ITEM_SET )
								aArgComment = ((const SfxStringItem*)pItem)->GetValue();

							aColor = Color( COL_LIGHTGRAY );		// Default
							nFlags = 0;								// nicht-TwoWay

							pTabViewShell->MakeScenario( aArgName, aArgComment, aColor, nFlags );
							if( ! rReq.IsAPI() )
								rReq.Done();
						}
						else
						{
							sal_Bool bSheetProtected = pDoc->IsTabProtected(nTab);
							//CHINA001 ScNewScenarioDlg* pNewDlg =
							//CHINA001 	new ScNewScenarioDlg( pTabViewShell->GetDialogParent(), aName, sal_False, bSheetProtected );
							ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
							DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001

							AbstractScNewScenarioDlg* pNewDlg = pFact->CreateScNewScenarioDlg( pTabViewShell->GetDialogParent(), aName, RID_SCDLG_NEWSCENARIO, sal_False,bSheetProtected);
							DBG_ASSERT(pNewDlg, "Dialog create fail!");//CHINA001
							if ( pNewDlg->Execute() == RET_OK )
							{
								pNewDlg->GetScenarioData( aName, aComment, aColor, nFlags );
								pTabViewShell->MakeScenario( aName, aComment, aColor, nFlags );

								rReq.AppendItem( SfxStringItem( SID_SCENARIOS, aName ) );
								rReq.AppendItem( SfxStringItem( SID_NEW_TABLENAME, aComment ) );
								rReq.Done();
							}
							delete pNewDlg;
						}
					}
					else if( ! rReq.IsAPI() )
					{
						pTabViewShell->ErrorMessage(STR_ERR_NEWSCENARIO);
					}
				}
			}
			break;


		case SID_SELECTALL:
			{
				pTabViewShell->SelectAll();
				rReq.Done();
			}
			break;

		//----------------------------------------------------------------

		case FID_ROW_HEIGHT:
			{
				if ( pReqArgs )
				{
					const SfxUInt16Item&  rUInt16Item = (const SfxUInt16Item&)pReqArgs->Get( FID_ROW_HEIGHT );

                    // #101390#; the value of the macro is in HMM so use HMMToTwips to convert
                    pTabViewShell->SetMarkedWidthOrHeight( sal_False, SC_SIZE_DIRECT,
                                    sal::static_int_cast<sal_uInt16>( HMMToTwips(rUInt16Item.GetValue()) ) );
					if( ! rReq.IsAPI() )
						rReq.Done();
				}
				else
				{
					ScViewData* pData      = GetViewData();
					FieldUnit	eMetric    = SC_MOD()->GetAppOptions().GetAppMetric();
					sal_uInt16		nCurHeight = pData->GetDocument()->
												GetRowHeight( pData->GetCurY(),
															  pData->GetTabNo() );
//CHINA001					ScMetricInputDlg* pDlg =
//CHINA001					new ScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_ROW_MAN,
//CHINA001					nCurHeight,
//CHINA001					ScGlobal::nStdRowHeight,
//CHINA001					eMetric,
//CHINA001					2,
//CHINA001					MAX_COL_HEIGHT );
					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001

					AbstractScMetricInputDlg* pDlg = pFact->CreateScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_ROW_MAN,
																					nCurHeight,
																					ScGlobal::nStdRowHeight,
																					RID_SCDLG_ROW_MAN,
																					eMetric,
																					2,
																					MAX_COL_HEIGHT);
					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001

					if ( pDlg->Execute() == RET_OK )
					{
						long nVal = pDlg->GetInputValue();
						pTabViewShell->SetMarkedWidthOrHeight( sal_False, SC_SIZE_DIRECT, (sal_uInt16)nVal );

                        // #101390#; the value of the macro should be in HMM so use TwipsToEvenHMM to convert
						rReq.AppendItem( SfxUInt16Item( FID_ROW_HEIGHT, (sal_uInt16)TwipsToEvenHMM(nVal) ) );
						rReq.Done();

					}
					delete pDlg;
				}
			}
			break;

		case FID_ROW_OPT_HEIGHT:
			{
				if ( pReqArgs )
				{
					const SfxUInt16Item&  rUInt16Item = (const SfxUInt16Item&)pReqArgs->Get( FID_ROW_OPT_HEIGHT );

                    // #101390#; the value of the macro is in HMM so use HMMToTwips to convert
                    pTabViewShell->SetMarkedWidthOrHeight( sal_False, SC_SIZE_OPTIMAL,
                                    sal::static_int_cast<sal_uInt16>( HMMToTwips(rUInt16Item.GetValue()) ) );
					ScGlobal::nLastRowHeightExtra = rUInt16Item.GetValue();

					if( ! rReq.IsAPI() )
						rReq.Done();
				}
				else
				{
					FieldUnit eMetric = SC_MOD()->GetAppOptions().GetAppMetric();

//CHINA001					ScMetricInputDlg* pDlg =
//CHINA001					new ScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_ROW_OPT,
//CHINA001					ScGlobal::nLastRowHeightExtra,
//CHINA001					0,
//CHINA001					eMetric,
//CHINA001					1,
//CHINA001					MAX_EXTRA_HEIGHT );
					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001

					AbstractScMetricInputDlg* pDlg = pFact->CreateScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_ROW_OPT,
																					ScGlobal::nLastRowHeightExtra,
																					0,
																					RID_SCDLG_ROW_OPT,
																					eMetric,
																					1,
																					MAX_EXTRA_HEIGHT);
					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001

					if ( pDlg->Execute() == RET_OK )
					{
						long nVal = pDlg->GetInputValue();
						pTabViewShell->SetMarkedWidthOrHeight( sal_False, SC_SIZE_OPTIMAL, (sal_uInt16)nVal );
						ScGlobal::nLastRowHeightExtra = nVal;

                        // #101390#; the value of the macro should be in HMM so use TwipsToEvenHMM to convert
						rReq.AppendItem( SfxUInt16Item( FID_ROW_OPT_HEIGHT, (sal_uInt16)TwipsToEvenHMM(nVal) ) );
						rReq.Done();

					}
					delete pDlg;
				}
			}
			break;

		case FID_COL_WIDTH:
			{
				if ( pReqArgs )
				{
					const SfxUInt16Item&  rUInt16Item = (const SfxUInt16Item&)pReqArgs->Get( FID_COL_WIDTH );

                    // #101390#; the value of the macro is in HMM so use HMMToTwips to convert
                    pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_DIRECT,
                                    sal::static_int_cast<sal_uInt16>( HMMToTwips(rUInt16Item.GetValue()) ) );
					if( ! rReq.IsAPI() )
						rReq.Done();
				}
				else
				{
					FieldUnit   eMetric	   = SC_MOD()->GetAppOptions().GetAppMetric();
					ScViewData* pData      = GetViewData();
					sal_uInt16		nCurHeight = pData->GetDocument()->
												GetColWidth( pData->GetCurX(),
															 pData->GetTabNo() );
//CHINA001					ScMetricInputDlg* pDlg =
//CHINA001					new ScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_COL_MAN,
//CHINA001					nCurHeight,
//CHINA001					STD_COL_WIDTH,
//CHINA001					eMetric,
//CHINA001					2,
//CHINA001					MAX_COL_WIDTH );
					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001

					AbstractScMetricInputDlg* pDlg = pFact->CreateScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_COL_MAN,
																					nCurHeight,
																					STD_COL_WIDTH,
																					RID_SCDLG_COL_MAN,
																					eMetric,
																					2,
																					MAX_COL_WIDTH);
					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001

					if ( pDlg->Execute() == RET_OK )
					{
						long nVal = pDlg->GetInputValue();
						pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_DIRECT, (sal_uInt16)nVal );

                        // #101390#; the value of the macro should be in HMM so use TwipsToEvenHMM to convert
						rReq.AppendItem( SfxUInt16Item( FID_COL_WIDTH, (sal_uInt16)TwipsToEvenHMM(nVal)) );
						rReq.Done();

					}
					delete pDlg;
				}
			}
			break;

		case FID_COL_OPT_WIDTH:
			{
				if ( pReqArgs )
				{
					const SfxUInt16Item&  rUInt16Item = (const SfxUInt16Item&)pReqArgs->Get( FID_COL_OPT_WIDTH );

                    // #101390#; the value of the macro is in HMM so use HMMToTwips to convert
                    pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_OPTIMAL,
                                    sal::static_int_cast<sal_uInt16>( HMMToTwips(rUInt16Item.GetValue()) ) );
					ScGlobal::nLastColWidthExtra = rUInt16Item.GetValue();

					if( ! rReq.IsAPI() )
						rReq.Done();
				}
				else
				{
					FieldUnit eMetric = SC_MOD()->GetAppOptions().GetAppMetric();

//CHINA001					ScMetricInputDlg* pDlg =
//CHINA001					new ScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_COL_OPT,
//CHINA001					ScGlobal::nLastColWidthExtra,
//CHINA001					STD_EXTRA_WIDTH,
//CHINA001					eMetric,
//CHINA001					1,
//CHINA001					MAX_EXTRA_WIDTH );

					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001

					AbstractScMetricInputDlg* pDlg = pFact->CreateScMetricInputDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_COL_OPT,
																					ScGlobal::nLastColWidthExtra,
																					STD_EXTRA_WIDTH,
																					RID_SCDLG_COL_OPT,
																					eMetric,
																					1,
																					MAX_EXTRA_WIDTH);
					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
					if ( pDlg->Execute() == RET_OK )
					{
						long nVal = pDlg->GetInputValue();
						pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_OPTIMAL, (sal_uInt16)nVal );
						ScGlobal::nLastColWidthExtra = nVal;

                        // #101390#; the value of the macro should be in HMM so use TwipsToEvenHMM to convert
						rReq.AppendItem( SfxUInt16Item( FID_COL_OPT_WIDTH, (sal_uInt16)TwipsToEvenHMM(nVal) ) );
						rReq.Done();
					}
					delete pDlg;
				}
			}
			break;

		case FID_COL_OPT_DIRECT:
			pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH );
			rReq.Done();
			break;

		case FID_ROW_HIDE:
			pTabViewShell->SetMarkedWidthOrHeight( sal_False, SC_SIZE_DIRECT, 0 );
			rReq.Done();
			break;
		case FID_ROW_SHOW:
			pTabViewShell->SetMarkedWidthOrHeight( sal_False, SC_SIZE_SHOW, 0 );
			rReq.Done();
			break;
		case FID_COL_HIDE:
			pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_DIRECT, 0 );
			rReq.Done();
			break;
		case FID_COL_SHOW:
			pTabViewShell->SetMarkedWidthOrHeight( sal_True, SC_SIZE_SHOW, 0 );
			rReq.Done();
			break;

		//----------------------------------------------------------------


		case SID_CELL_FORMAT_RESET:
			{
				pTabViewShell->DeleteContents( IDF_HARDATTR | IDF_EDITATTR );
				rReq.Done();
			}
			break;

		case FID_MERGE_ON:
        case FID_MERGE_OFF:
        case FID_MERGE_TOGGLE:
        {
            if ( !GetViewData()->GetDocument()->GetChangeTrack() )
            {
                // test whether to merge or to split
                bool bMerge = false;
                switch( nSlot )
                {
                    case FID_MERGE_ON:
                        bMerge = true;
                    break;
                    case FID_MERGE_OFF:
                        bMerge = false;
                    break;
                    case FID_MERGE_TOGGLE:
                    {
                        SfxPoolItem* pItem = 0;
                        if( rBindings.QueryState( nSlot, pItem ) >= SFX_ITEM_DEFAULT )
                            bMerge = !static_cast< SfxBoolItem* >( pItem )->GetValue();
                    }
                    break;
                }

                if( bMerge )
                {
                    // merge - check if to move contents of covered cells
                    sal_Bool bMoveContents = sal_False;
                    sal_Bool bApi = rReq.IsAPI();
                    const SfxPoolItem* pItem;
                    if ( pReqArgs &&
                        pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET )
                    {
                        DBG_ASSERT(pItem && pItem->ISA(SfxBoolItem), "falsches Item");
                        bMoveContents = ((const SfxBoolItem*)pItem)->GetValue();
                    }

                    if (pTabViewShell->MergeCells( bApi, bMoveContents ))
                    {
                        if (!bApi && bMoveContents)             // "ja" im Dialog geklickt
                            rReq.AppendItem( SfxBoolItem( nSlot, bMoveContents ) );
                        rBindings.Invalidate( nSlot );
                        rReq.Done();
                    }
                }
                else
                {
                    // split cells
                    if (pTabViewShell->RemoveMerge())
                    {
                        rBindings.Invalidate( nSlot );
                        rReq.Done();
                    }
                }
                break;
            }
        }
        break;

		case SID_AUTOFORMAT:
			{
				Window* pDlgParent = pTabViewShell->GetDialogParent();
				SCCOL nStartCol;
				SCROW nStartRow;
				SCTAB nStartTab;
				SCCOL nEndCol;
				SCROW nEndRow;
				SCTAB nEndTab;

				const ScMarkData& rMark = GetViewData()->GetMarkData();
				if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
					pTabViewShell->MarkDataArea( sal_True );

				GetViewData()->GetSimpleArea( nStartCol,nStartRow,nStartTab,
											  nEndCol,nEndRow,nEndTab );

				if (   ( Abs((SCsCOL)nEndCol-(SCsCOL)nStartCol) > 1 )
					&& ( Abs((SCsROW)nEndRow-(SCsROW)nStartRow) > 1 ) )
				{
					if ( pReqArgs )
					{
						const SfxStringItem& rNameItem = (const SfxStringItem&)pReqArgs->Get( SID_AUTOFORMAT );
						ScAutoFormat* pFormat = ScGlobal::GetAutoFormat();
						sal_uInt16 nIndex = pFormat->FindIndexPerName( rNameItem.GetValue() );

						pTabViewShell->AutoFormat( nIndex );

						if( ! rReq.IsAPI() )
							rReq.Done();
					}
					else
					{
						ScGlobal::ClearAutoFormat();
						ScAutoFormatData* pNewEntry = pTabViewShell->CreateAutoFormatData();
//CHINA001						ScAutoFormatDlg*  pDlg		= new ScAutoFormatDlg(
//CHINA001						pDlgParent,
//CHINA001						ScGlobal::GetAutoFormat(),
//CHINA001						pNewEntry,
//CHINA001						GetViewData()->GetDocument() );
						ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
						DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001

						AbstractScAutoFormatDlg* pDlg = pFact->CreateScAutoFormatDlg( pDlgParent, ScGlobal::GetAutoFormat(), pNewEntry,GetViewData()->GetDocument(), RID_SCDLG_AUTOFORMAT );
						DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001

						if ( pDlg->Execute() == RET_OK )
						{
							ScEditableTester aTester( pTabViewShell );
							if ( !aTester.IsEditable() )
							{
								pTabViewShell->ErrorMessage(aTester.GetMessageId());
							}
							else
							{
								pTabViewShell->AutoFormat( pDlg->GetIndex() );

								rReq.AppendItem( SfxStringItem( SID_AUTOFORMAT, pDlg->GetCurrFormatName() ) );
								rReq.Done();
							}
						}
						delete pDlg;
						delete pNewEntry;
					}
				}
				else
					ErrorBox( pDlgParent, WinBits( WB_OK | WB_DEF_OK ),
							  ScGlobal::GetRscString(STR_INVALID_AFAREA) ).Execute();
			}
			break;

		case SID_CANCEL:
			{
				if (GetViewData()->HasEditView(GetViewData()->GetActivePart()))
					pScMod->InputCancelHandler();
                else if (pTabViewShell->HasPaintBrush())
                    pTabViewShell->ResetBrushDocument();            // abort format paint brush
				else if (pTabViewShell->HasHintWindow())
					pTabViewShell->RemoveHintWindow();				// Eingabemeldung abschalten
                else if( ScViewUtil::IsFullScreen( *pTabViewShell ) )
                    ScViewUtil::SetFullScreen( *pTabViewShell, false );
				else
				{
                    // TODO/LATER: when is this code executed?
                    pTabViewShell->Escape();
                    //SfxObjectShell* pObjSh = GetViewData()->GetSfxDocShell();
                    //if (pObjSh->GetInPlaceObject() &&
                    //    pObjSh->GetInPlaceObject()->GetIPClient())
                    //{
                    //    GetViewData()->GetDocShell()->
                    //        DoInPlaceActivate(sal_False);       // OLE beenden
                    //}
				}

//				SetSumAssignMode(); //ScInputWindow
			}
			break;

		case SID_DATA_SELECT:
			pTabViewShell->StartDataSelect();
			break;

		case SID_DETECTIVE_FILLMODE:
			{
				sal_Bool bOldMode = pTabViewShell->IsAuditShell();
				pTabViewShell->SetAuditShell( !bOldMode );
				pTabViewShell->Invalidate( nSlot );
			}
			break;

		case SID_OPENDLG_CONDFRMT:
			{
				sal_uInt16			nId  = ScCondFormatDlgWrapper::GetChildWindowId();
				SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
				SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );

				pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
			}
			break;

		//	----------------------------------------------------------------

		case FID_INPUTLINE_STATUS:
			DBG_ERROR("Execute von InputLine-Status");
			break;

        case SID_STATUS_DOCPOS:
            // Launch navigator.
            GetViewData()->GetDispatcher().Execute( 
                SID_NAVIGATOR, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD );
            break;

		case SID_MARKAREA:
			// called from Basic at the hidden view to select a range in the visible view
			DBG_ERROR("old slot SID_MARKAREA");
			break;

		default:
			DBG_ERROR("Unbekannter Slot bei ScCellShell::Execute");
			break;
	}
}

