summaryrefslogtreecommitdiff
path: root/starmath/source/toolbox.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'starmath/source/toolbox.cxx')
-rw-r--r--starmath/source/toolbox.cxx404
1 files changed, 404 insertions, 0 deletions
diff --git a/starmath/source/toolbox.cxx b/starmath/source/toolbox.cxx
new file mode 100644
index 000000000000..5bcf1448aca0
--- /dev/null
+++ b/starmath/source/toolbox.cxx
@@ -0,0 +1,404 @@
+/*************************************************************************
+ *
+ * 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_starmath.hxx"
+
+
+#include <rtl/logfile.hxx>
+#include <svl/eitem.hxx>
+#include <sfx2/app.hxx>
+#include <svl/intitem.hxx>
+#include <svtools/imgdef.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/imgmgr.hxx>
+#include <vcl/wrkwin.hxx>
+#include "toolbox.hxx"
+#ifndef _STARMATH_HRC
+#include "starmath.hrc"
+#endif
+#ifndef _TOOLBOX_HRC_
+#include "toolbox.hrc"
+#endif
+#include "view.hxx"
+
+
+////////////////////////////////////////////////////////////
+
+static USHORT GetImageListRID( USHORT nCategoryRID, BOOL bHighContrast )
+{
+ USHORT nRes = 0xFFFF;
+ switch (nCategoryRID)
+ {
+ case RID_UNBINOPS_CAT : nRes = RID_IL_UNBINOPS; break;
+ case RID_RELATIONS_CAT : nRes = RID_IL_RELATIONS; break;
+ case RID_SETOPERATIONS_CAT : nRes = RID_IL_SETOPERATIONS; break;
+ case RID_FUNCTIONS_CAT : nRes = RID_IL_FUNCTIONS; break;
+ case RID_OPERATORS_CAT : nRes = RID_IL_OPERATORS; break;
+ case RID_ATTRIBUTES_CAT : nRes = RID_IL_ATTRIBUTES; break;
+ case RID_BRACKETS_CAT : nRes = RID_IL_BRACKETS; break;
+ case RID_FORMAT_CAT : nRes = RID_IL_FORMAT; break;
+ case RID_MISC_CAT : nRes = RID_IL_MISC; break;
+ default :
+ DBG_ERROR( "unkown category" );
+ }
+ if (nRes != 0xFFFF && bHighContrast)
+ ++nRes; //! the resource ID for the high contrast image list is just +1 compared to the regular ones
+ return nRes;
+}
+
+
+static sal_Int16 GetToolBoxCategoriesIndex( USHORT nCategoryRID )
+{
+ sal_Int16 nIdx = -1;
+ switch (nCategoryRID)
+ {
+ case RID_UNBINOPS_CAT : nIdx = 0; break;
+ case RID_RELATIONS_CAT : nIdx = 1; break;
+ case RID_SETOPERATIONS_CAT : nIdx = 2; break;
+ case RID_FUNCTIONS_CAT : nIdx = 3; break;
+ case RID_OPERATORS_CAT : nIdx = 4; break;
+ case RID_ATTRIBUTES_CAT : nIdx = 5; break;
+ case RID_BRACKETS_CAT : nIdx = 6; break;
+ case RID_FORMAT_CAT : nIdx = 7; break;
+ case RID_MISC_CAT : nIdx = 8; break;
+ default:
+ ;
+ }
+ return nIdx;
+}
+
+
+static USHORT GetCategoryRID( USHORT nResId )
+{
+ USHORT nRes = 0xFFFF;
+ switch (nResId)
+ {
+ case RID_IL_UNBINOPS :
+ case RID_ILH_UNBINOPS : nRes = RID_UNBINOPS_CAT; break;
+ case RID_IL_RELATIONS :
+ case RID_ILH_RELATIONS : nRes = RID_RELATIONS_CAT; break;
+ case RID_IL_SETOPERATIONS :
+ case RID_ILH_SETOPERATIONS : nRes = RID_SETOPERATIONS_CAT; break;
+ case RID_IL_FUNCTIONS :
+ case RID_ILH_FUNCTIONS : nRes = RID_FUNCTIONS_CAT; break;
+ case RID_IL_OPERATORS :
+ case RID_ILH_OPERATORS : nRes = RID_OPERATORS_CAT; break;
+ case RID_IL_ATTRIBUTES :
+ case RID_ILH_ATTRIBUTES : nRes = RID_ATTRIBUTES_CAT; break;
+ case RID_IL_BRACKETS :
+ case RID_ILH_BRACKETS : nRes = RID_BRACKETS_CAT; break;
+ case RID_IL_FORMAT :
+ case RID_ILH_FORMAT : nRes = RID_FORMAT_CAT; break;
+ case RID_IL_MISC :
+ case RID_ILH_MISC : nRes = RID_MISC_CAT; break;
+ default :
+ if (nResId != RID_IL_CATALOG && nResId != RID_ILH_CATALOG)
+ {
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ERROR( "unkown category" );
+#endif
+ }
+ }
+ return nRes;
+}
+
+
+////////////////////////////////////////////////////////////
+
+
+SmToolBoxWindow::SmToolBoxWindow(SfxBindings *pTmpBindings,
+ SfxChildWindow *pChildWindow,
+ Window *pParent) :
+ SfxFloatingWindow(pTmpBindings, pChildWindow, pParent, SmResId(RID_TOOLBOXWINDOW)),
+ aToolBoxCat(this, SmResId(TOOLBOX_CATALOG)),
+ aToolBoxCat_Delim(this, SmResId( FL_TOOLBOX_CAT_DELIM ))
+{
+ RTL_LOGFILE_CONTEXT( aLog, "starmath: SmToolBoxWindow::SmToolBoxWindow" );
+
+ // allow for cursor travelling between toolbox and sub-categories
+ SetStyle( GetStyle() | WB_DIALOGCONTROL );
+
+ nActiveCategoryRID = USHRT_MAX;
+
+ aToolBoxCat.SetClickHdl(LINK(this, SmToolBoxWindow, CategoryClickHdl));
+
+ USHORT i;
+ for (i = 0; i < NUM_TBX_CATEGORIES; ++i)
+ {
+ ToolBox *pBox = new ToolBox(this, SmResId( TOOLBOX_CAT_A + i ));
+ vToolBoxCategories[i] = pBox;
+ pBox->SetSelectHdl(LINK(this, SmToolBoxWindow, CmdSelectHdl));
+ }
+ pToolBoxCmd = vToolBoxCategories[0];
+
+ for (i = 0; i <= NUM_TBX_CATEGORIES; ++i)
+ {
+ aImageLists [i] = 0;
+ aImageListsH[i] = 0;
+ }
+
+ FreeResource();
+}
+
+SmToolBoxWindow::~SmToolBoxWindow()
+{
+ int i;
+ for (i = 0; i < NUM_TBX_CATEGORIES; ++i)
+ {
+ ToolBox *pBox = vToolBoxCategories[i];
+ delete pBox;
+ }
+ for (i = 0; i < NUM_TBX_CATEGORIES + 1; ++i)
+ {
+ delete aImageLists[i];
+ delete aImageListsH[i];
+ }
+}
+
+
+SmViewShell * SmToolBoxWindow::GetView()
+{
+ SfxViewShell *pView = GetBindings().GetDispatcher()->GetFrame()->GetViewShell();
+ return PTR_CAST(SmViewShell, pView);
+}
+
+
+const ImageList * SmToolBoxWindow::GetImageList( USHORT nResId, BOOL bHighContrast )
+{
+ // creates the image list via its resource id and stores that
+ // list for later use in the respective array.
+
+ const ImageList *pIL = 0;
+
+ // get index to use
+ USHORT nCategoryRID = GetCategoryRID( nResId );
+ sal_Int16 nIndex = GetToolBoxCategoriesIndex( nCategoryRID );
+ if (nIndex == -1 && (nResId == RID_IL_CATALOG || nResId == RID_ILH_CATALOG))
+ nIndex = NUM_TBX_CATEGORIES;
+
+ if (nIndex >= 0)
+ {
+ ImageList **pImgList = bHighContrast ? aImageListsH : aImageLists;
+ if (!pImgList[ nIndex ])
+ pImgList[ nIndex ] = new ImageList( SmResId(nResId) );
+ pIL = pImgList[ nIndex ];
+ }
+
+ DBG_ASSERT( pIL, "image list not found!" );
+ return pIL;
+}
+
+
+void SmToolBoxWindow::ApplyImageLists( USHORT nCategoryRID )
+{
+ BOOL bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ // set image list for toolbox 'catalog'
+ const ImageList *pImageList = GetImageList( bHighContrast ? RID_ILH_CATALOG : RID_IL_CATALOG, bHighContrast );
+ DBG_ASSERT( pImageList, "image list missing" );
+ if (pImageList)
+ aToolBoxCat.SetImageList( *pImageList );
+
+ // set image list for active (visible) category of 'catalog'
+ sal_Int16 nIdx = GetToolBoxCategoriesIndex( nCategoryRID );
+ USHORT nResId = GetImageListRID( nCategoryRID, bHighContrast );
+ pImageList = GetImageList( nResId, bHighContrast );
+ DBG_ASSERT( pImageList && nIdx >= 0, "image list or index missing" );
+ if (pImageList && nIdx >= 0)
+ vToolBoxCategories[ nIdx ]->SetImageList( *pImageList );
+}
+
+void SmToolBoxWindow::DataChanged( const DataChangedEvent &rEvt )
+{
+ if ( (rEvt.GetType() == DATACHANGED_SETTINGS) && (rEvt.GetFlags() & SETTINGS_STYLE) )
+ ApplyImageLists( nActiveCategoryRID );
+
+ SfxFloatingWindow::DataChanged( rEvt );
+}
+
+void SmToolBoxWindow::StateChanged( StateChangedType nStateChange )
+{
+ static BOOL bSetPosition = TRUE;
+ if (STATE_CHANGE_INITSHOW == nStateChange)
+ {
+ SetCategory( nActiveCategoryRID == USHRT_MAX ? RID_UNBINOPS_CAT : nActiveCategoryRID );
+
+ // calculate initial position to be used after creation of the window...
+ AdjustPosSize( bSetPosition );
+ bSetPosition = FALSE;
+ }
+ //... otherwise the base class will remember the last position of the window
+ SfxFloatingWindow::StateChanged( nStateChange );
+}
+
+
+void SmToolBoxWindow::AdjustPosSize( BOOL bSetPos )
+{
+ Size aCatSize( aToolBoxCat.CalcWindowSizePixel( 2 ) );
+ Size aCmdSize( pToolBoxCmd->CalcWindowSizePixel( 4 /* see nLines in SetCategory*/ ) );
+ DBG_ASSERT( aCatSize.Width() == aCmdSize.Width(), "width mismatch" );
+
+ // catalog settings
+ aToolBoxCat.SetPosPixel( Point(0, 3) );
+ aToolBoxCat.SetSizePixel( aCatSize );
+ // settings for catalog / category delimiter
+ Point aP( aToolBoxCat_Delim.GetPosPixel() );
+ aP.X() = 0;
+ aToolBoxCat_Delim.SetPosPixel( aP );
+ aToolBoxCat_Delim.SetSizePixel( Size( aCatSize.Width(), aToolBoxCat_Delim.GetSizePixel().Height() ) );
+ // category settings
+ aP.Y() += aToolBoxCat_Delim.GetSizePixel().Height();
+ for (int i = 0; i < NUM_TBX_CATEGORIES; ++i)
+ {
+ vToolBoxCategories[i]->SetPosPixel( aP );
+ vToolBoxCategories[i]->SetSizePixel( aCmdSize );
+ }
+ // main window settings
+ Size aWndSize ( aCatSize.Width(), pToolBoxCmd->GetPosPixel().Y() + pToolBoxCmd->GetSizePixel().Height() + 3);
+ SetOutputSizePixel( aWndSize );
+
+ if (bSetPos)
+ {
+ SmViewShell *pView = GetView();
+ DBG_ASSERT( pView, "view shell missing" );
+ Point aPos( 50, 75 );
+ if (pView)
+ {
+ SmGraphicWindow &rWin = pView->GetGraphicWindow();
+ aPos = Point( rWin.OutputToScreenPixel(
+ Point( rWin.GetSizePixel().Width() - aWndSize.Width(), 0) ) );
+ }
+ if (aPos.X() < 0)
+ aPos.X() = 0;
+ if (aPos.Y() < 0)
+ aPos.Y() = 0;
+ SetPosPixel( aPos );
+ }
+}
+
+
+BOOL SmToolBoxWindow::Close()
+{
+ SmViewShell *pViewSh = GetView();
+ if (pViewSh)
+ pViewSh->GetViewFrame()->GetDispatcher()->Execute(
+ SID_TOOLBOX, SFX_CALLMODE_STANDARD,
+ new SfxBoolItem(SID_TOOLBOX, FALSE), 0L);
+ return TRUE;
+}
+
+void SmToolBoxWindow::GetFocus()
+{
+ // give focus to category toolbox
+ // (allow for cursor travelling when a category is selected with the mouse)
+ aToolBoxCat.GrabFocus();
+}
+
+void SmToolBoxWindow::SetCategory(USHORT nCategoryRID)
+{
+ if (nCategoryRID != nActiveCategoryRID)
+ ApplyImageLists( nCategoryRID );
+
+ USHORT nLines;
+ // check for valid resource id
+ switch (nCategoryRID)
+ {
+ case RID_UNBINOPS_CAT : nLines = 4; break;
+ case RID_RELATIONS_CAT: nLines = 4; break;
+ case RID_SETOPERATIONS_CAT: nLines = 4; break;
+ case RID_FUNCTIONS_CAT: nLines = 4; break;
+ case RID_OPERATORS_CAT: nLines = 3; break;
+ case RID_ATTRIBUTES_CAT: nLines = 4; break;
+ case RID_MISC_CAT: nLines = 4; break;
+ case RID_BRACKETS_CAT: nLines = 4; break;
+ case RID_FORMAT_CAT: nLines = 3; break;
+ default:
+ // nothing to be done
+ return;
+ }
+
+ pToolBoxCmd->Hide();
+
+ sal_Int16 nIdx = GetToolBoxCategoriesIndex( nCategoryRID );
+ DBG_ASSERT( nIdx >= 0, "unkown category" );
+ if (nIdx >= 0)
+ pToolBoxCmd = vToolBoxCategories[nIdx];
+
+ // calculate actual size of window to use
+ Size aCatSize( aToolBoxCat.CalcWindowSizePixel( 2 ) );
+ Size aCmdSize( pToolBoxCmd->CalcWindowSizePixel( nLines ) );
+ DBG_ASSERT( aCatSize.Width() == aCmdSize.Width(), "width mismatch" );
+ // main window settings
+ Size aWndSize ( aCatSize.Width(), pToolBoxCmd->GetPosPixel().Y() + aCmdSize.Height() + 3);
+ SetOutputSizePixel( aWndSize );
+
+ if (nActiveCategoryRID)
+ aToolBoxCat.CheckItem(nActiveCategoryRID, FALSE);
+ nActiveCategoryRID = nCategoryRID;
+ aToolBoxCat.CheckItem(nActiveCategoryRID, TRUE);
+
+ pToolBoxCmd->Show();
+}
+
+
+IMPL_LINK( SmToolBoxWindow, CategoryClickHdl, ToolBox*, pToolBox)
+{
+ int nItemId = pToolBox->GetCurItemId();
+ if (nItemId != 0)
+ SetCategory( sal::static_int_cast< USHORT >(nItemId) );
+ return 0;
+}
+
+
+IMPL_LINK( SmToolBoxWindow, CmdSelectHdl, ToolBox*, pToolBox)
+{
+ SmViewShell *pViewSh = GetView();
+ if (pViewSh)
+ pViewSh->GetViewFrame()->GetDispatcher()->Execute(
+ SID_INSERTCOMMAND, SFX_CALLMODE_STANDARD,
+ new SfxInt16Item(SID_INSERTCOMMAND, pToolBox->GetCurItemId()), 0L);
+ return 0;
+}
+
+
+/**************************************************************************/
+
+SFX_IMPL_FLOATINGWINDOW(SmToolBoxWrapper, SID_TOOLBOXWINDOW);
+
+SmToolBoxWrapper::SmToolBoxWrapper(Window *pParentWindow,
+ USHORT nId, SfxBindings* pBindings,
+ SfxChildWinInfo *pInfo) :
+ SfxChildWindow(pParentWindow, nId)
+{
+ eChildAlignment = SFX_ALIGN_NOALIGNMENT;
+
+ pWindow = new SmToolBoxWindow(pBindings, this, pParentWindow);
+ ((SfxFloatingWindow *)pWindow)->Initialize(pInfo);
+}
+
+