diff options
Diffstat (limited to 'sw/source/ui/misc')
49 files changed, 14835 insertions, 0 deletions
diff --git a/sw/source/ui/misc/autocorr.src b/sw/source/ui/misc/autocorr.src new file mode 100644 index 000000000000..1807d12744e4 --- /dev/null +++ b/sw/source/ui/misc/autocorr.src @@ -0,0 +1,29 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +/* StarView ressource file */ + + diff --git a/sw/source/ui/misc/bookmark.cxx b/sw/source/ui/misc/bookmark.cxx new file mode 100644 index 000000000000..1d5489da0a01 --- /dev/null +++ b/sw/source/ui/misc/bookmark.cxx @@ -0,0 +1,268 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + +#include <sfx2/request.hxx> +#include <svl/stritem.hxx> +#include <vcl/msgbox.hxx> + + +#include "view.hxx" +#include "basesh.hxx" +#include "wrtsh.hxx" // +#include "cmdid.h" +#include "bookmark.hxx" // SwInsertBookmarkDlg +#include "IMark.hxx" +#include "bookmark.hrc" +#include "misc.hrc" + +const String BookmarkCombo::aForbiddenChars = String::CreateFromAscii("/\\@:*?\";,.#"); + +IMPL_LINK( SwInsertBookmarkDlg, ModifyHdl, BookmarkCombo *, pBox ) +{ + sal_Bool bSelEntries = pBox->GetSelectEntryCount() != 0; + // if a string has been pasted from the clipboard then + // there may be illegal characters in the box + if(!bSelEntries) + { + String sTmp = pBox->GetText(); + sal_uInt16 nLen = sTmp.Len(); + String sMsg; + for(sal_uInt16 i = 0; i < BookmarkCombo::aForbiddenChars.Len(); i++) + { + sal_uInt16 nTmpLen = sTmp.Len(); + sTmp.EraseAllChars(BookmarkCombo::aForbiddenChars.GetChar(i)); + if(sTmp.Len() != nTmpLen) + sMsg += BookmarkCombo::aForbiddenChars.GetChar(i); + } + if(sTmp.Len() != nLen) + { + pBox->SetText(sTmp); + String sWarning(sRemoveWarning); + sWarning += sMsg; + InfoBox(this, sWarning).Execute(); + } + + + } + + aOkBtn.Enable(!bSelEntries); // neue Textmarke + aDeleteBtn.Enable(bSelEntries); // loeschbar? + + return 0; +} + +/*------------------------------------------------------------------------ + Beschreibung: Callback zum Loeschen einer Textmarke + -----------------------------------------------------------------------*/ +IMPL_LINK( SwInsertBookmarkDlg, DeleteHdl, Button *, EMPTYARG ) +{ + // Textmarken aus der ComboBox entfernen + + for (sal_uInt16 i = aBookmarkBox.GetSelectEntryCount(); i; i-- ) + aBookmarkBox.RemoveEntry(aBookmarkBox.GetSelectEntryPos(i - 1)); + + aBookmarkBox.SetText(aEmptyStr); + aDeleteBtn.Enable(sal_False); // keine weiteren Eintraege vorhanden + + aOkBtn.Enable(); // Im OK Handler wird geloescht + return 0; +} + +/*------------------------------------------------------------------------ + Beschreibung: Callback fuer OKButton. Fuegt eine neue Textmarke + an die akt. Position ein. Geloeschte Textmarken werden auch am Modell + entfernt. + -----------------------------------------------------------------------*/ +void SwInsertBookmarkDlg::Apply() +{ + //at first remove deleted bookmarks to prevent multiple bookmarks with the same + //name + for (sal_uInt16 nCount = aBookmarkBox.GetRemovedCount(); nCount > 0; nCount--) + { + String sRemoved = aBookmarkBox.GetRemovedEntry( nCount -1 ).GetName(); + IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess(); + pMarkAccess->deleteMark( pMarkAccess->findMark(sRemoved) ); + SfxRequest aReq( rSh.GetView().GetViewFrame(), FN_DELETE_BOOKMARK ); + aReq.AppendItem( SfxStringItem( FN_DELETE_BOOKMARK, sRemoved ) ); + aReq.Done(); + } + + // Textmarke einfuegen + sal_uInt16 nLen = aBookmarkBox.GetText().Len(); + SwBoxEntry aTmpEntry(aBookmarkBox.GetText(), 0 ); + + if ( nLen && (aBookmarkBox.GetEntryPos(aTmpEntry) == COMBOBOX_ENTRY_NOTFOUND) ) + { + String sEntry(aBookmarkBox.GetText()); + sEntry.EraseAllChars(aBookmarkBox.GetMultiSelectionSeparator()); + + rSh.SetBookmark( KeyCode(), sEntry, aEmptyStr ); + rReq.AppendItem( SfxStringItem( FN_INSERT_BOOKMARK, sEntry ) ); + rReq.Done(); + } + + if ( !rReq.IsDone() ) + rReq.Ignore(); + +} + +/*------------------------------------------------------------------------ + Beschreibung: CTOR + -----------------------------------------------------------------------*/ +SwInsertBookmarkDlg::SwInsertBookmarkDlg( Window *pParent, SwWrtShell &rS, SfxRequest& rRequest ) : + + SvxStandardDialog(pParent,SW_RES(DLG_INSERT_BOOKMARK)), + aBookmarkFl(this,SW_RES(FL_BOOKMARK)), + aBookmarkBox(this,SW_RES(CB_BOOKMARK)), + aOkBtn(this,SW_RES(BT_OK)), + aCancelBtn(this,SW_RES(BT_CANCEL)), + aDeleteBtn(this,SW_RES(BT_DELETE)), + rSh( rS ), + rReq( rRequest ) +{ + aBookmarkBox.SetModifyHdl(LINK(this, SwInsertBookmarkDlg, ModifyHdl)); + aBookmarkBox.EnableMultiSelection(sal_True); + aBookmarkBox.EnableAutocomplete( sal_True, sal_True ); + + aDeleteBtn.SetClickHdl(LINK(this, SwInsertBookmarkDlg, DeleteHdl)); + + // Combobox mit vorhandenen Bookmarks fuellen + IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess(); + sal_uInt16 nId = 0; + for( IDocumentMarkAccess::const_iterator_t ppBookmark = pMarkAccess->getBookmarksBegin(); + ppBookmark != pMarkAccess->getBookmarksEnd(); + ppBookmark++) + { + if(IDocumentMarkAccess::BOOKMARK == IDocumentMarkAccess::GetType(**ppBookmark)) + aBookmarkBox.InsertEntry( SwBoxEntry( ppBookmark->get()->GetName(), nId++ ) ); + } + FreeResource(); + sRemoveWarning = String(SW_RES(STR_REMOVE_WARNING)); +} + +SwInsertBookmarkDlg::~SwInsertBookmarkDlg() +{ +} + +BookmarkCombo::BookmarkCombo( Window* pWin, const ResId& rResId ) : + SwComboBox(pWin, rResId) +{ +} + +sal_uInt16 BookmarkCombo::GetFirstSelEntryPos() const +{ + return GetSelEntryPos(0); +} + +sal_uInt16 BookmarkCombo::GetNextSelEntryPos(sal_uInt16 nPos) const +{ + return GetSelEntryPos(nPos + 1); +} + +sal_uInt16 BookmarkCombo::GetSelEntryPos(sal_uInt16 nPos) const +{ + sal_Unicode cSep = GetMultiSelectionSeparator(); + + sal_uInt16 nCnt = GetText().GetTokenCount(cSep); + + for (; nPos < nCnt; nPos++) + { + String sEntry(GetText().GetToken(nPos, cSep)); + sEntry.EraseLeadingChars(); + sEntry.EraseTrailingChars(); + if (GetEntryPos(sEntry) != COMBOBOX_ENTRY_NOTFOUND) + return nPos; + } + + return COMBOBOX_ENTRY_NOTFOUND; +} + +sal_uInt16 BookmarkCombo::GetSelectEntryCount() const +{ + sal_uInt16 nCnt = 0; + + sal_uInt16 nPos = GetFirstSelEntryPos(); + while (nPos != COMBOBOX_ENTRY_NOTFOUND) + { + nPos = GetNextSelEntryPos(nPos); + nCnt++; + } + + return nCnt; +} + +/*------------------------------------------------------------------------ + Beschreibung: Position in der Listbox (der ComboBox) + -----------------------------------------------------------------------*/ +sal_uInt16 BookmarkCombo::GetSelectEntryPos( sal_uInt16 nSelIndex ) const +{ + sal_uInt16 nCnt = 0; + sal_uInt16 nPos = GetFirstSelEntryPos(); + + while (nPos != COMBOBOX_ENTRY_NOTFOUND) + { + if (nSelIndex == nCnt) + { + sal_Unicode cSep = GetMultiSelectionSeparator(); + String sEntry(GetText().GetToken(nPos, cSep)); + sEntry.EraseLeadingChars(); + sEntry.EraseTrailingChars(); + + return GetEntryPos(sEntry); + } + nPos = GetNextSelEntryPos(nPos); + nCnt++; + } + + return COMBOBOX_ENTRY_NOTFOUND; +} + +long BookmarkCombo::PreNotify( NotifyEvent& rNEvt ) +{ + long nHandled = 0; + if( EVENT_KEYINPUT == rNEvt.GetType() && + rNEvt.GetKeyEvent()->GetCharCode() ) + { + String sKey( rNEvt.GetKeyEvent()->GetCharCode() ); + if(STRING_NOTFOUND != aForbiddenChars.Search(sKey)) + nHandled = 1; + } + if(!nHandled) + nHandled = SwComboBox::PreNotify( rNEvt ); + return nHandled; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/bookmark.hrc b/sw/source/ui/misc/bookmark.hrc new file mode 100644 index 000000000000..3320e3774516 --- /dev/null +++ b/sw/source/ui/misc/bookmark.hrc @@ -0,0 +1,34 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#define CB_BOOKMARK 1 +#define FL_BOOKMARK 2 + +#define BT_OK 20 +#define BT_CANCEL 21 +#define BT_DELETE 22 diff --git a/sw/source/ui/misc/bookmark.src b/sw/source/ui/misc/bookmark.src new file mode 100644 index 000000000000..da27b5553b79 --- /dev/null +++ b/sw/source/ui/misc/bookmark.src @@ -0,0 +1,116 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" +#include "bookmark.hrc" +#include "cmdid.h" +#include "helpid.h" +ModalDialog DLG_INSERT_BOOKMARK +{ + HelpID = CMD_FN_INSERT_BOOKMARK ; + OUTPUTSIZE = TRUE ; + Size = MAP_APPFONT ( 179 , 96 ) ; + Text [ en-US ] = "Insert Bookmark" ; + MOVEABLE = TRUE ; + SVLOOK = TRUE ; + OkButton BT_OK + { + DISABLE = TRUE ; + Pos = MAP_APPFONT ( 123 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TABSTOP = TRUE ; + DefButton = TRUE ; + }; + CancelButton BT_CANCEL + { + Pos = MAP_APPFONT ( 123 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TABSTOP = TRUE ; + }; + ComboBox CB_BOOKMARK + { + HelpID = "sw:ComboBox:DLG_INSERT_BOOKMARK:CB_BOOKMARK"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 99 , 76 ) ; + TABSTOP = TRUE ; + AutoHScroll = TRUE ; + SORT = TRUE ; + }; + PushButton BT_DELETE + { + HelpID = "sw:PushButton:DLG_INSERT_BOOKMARK:BT_DELETE"; + Pos = MAP_APPFONT ( 123 , 40 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "~Delete" ; + TABSTOP = TRUE ; + DISABLE = TRUE ; + }; + FixedLine FL_BOOKMARK + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 111 , 8 ) ; + Text [ en-US ] = "Bookmarks" ; + }; +}; +String STR_REMOVE_WARNING +{ + Text [ en-US ] = "The following characters are not valid and have been removed: "; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/docfnote.cxx b/sw/source/ui/misc/docfnote.cxx new file mode 100644 index 000000000000..990152ab3def --- /dev/null +++ b/sw/source/ui/misc/docfnote.cxx @@ -0,0 +1,484 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + +#include <svl/style.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <docsh.hxx> +#include <docfnote.hxx> +#include <impfnote.hxx> +#include <ftninfo.hxx> +#include <fmtcol.hxx> +#include <pagedesc.hxx> +#include <charfmt.hxx> +#include <docstyle.hxx> +#include <wdocsh.hxx> +#include <uitool.hxx> +#include <poolfmt.hxx> +#include <swstyle.h> +#include <helpid.h> +#include <misc.hrc> +#include <docfnote.hrc> +#include <frmui.hrc> +#include <SwStyleNameMapper.hxx> + +SwFootNoteOptionDlg::SwFootNoteOptionDlg( Window *pParent, SwWrtShell &rS ) : + SfxTabDialog( pParent, SW_RES(DLG_DOC_FOOTNOTE) ), + rSh( rS ) +{ + FreeResource(); + RemoveResetButton(); + + aOldOkHdl = GetOKButton().GetClickHdl(); + GetOKButton().SetClickHdl( LINK( this, SwFootNoteOptionDlg, OkHdl ) ); + + AddTabPage( TP_FOOTNOTEOPTION, SwFootNoteOptionPage::Create, 0 ); + AddTabPage( TP_ENDNOTEOPTION, SwEndNoteOptionPage::Create, 0 ); +} + +void SwFootNoteOptionDlg::PageCreated( sal_uInt16 /*nId*/, SfxTabPage &rPage ) +{ + ((SwEndNoteOptionPage&)rPage).SetShell( rSh ); +} + +SwFootNoteOptionDlg::~SwFootNoteOptionDlg() +{ +} + +IMPL_LINK( SwFootNoteOptionDlg, OkHdl, Button *, pBtn ) +{ + SfxItemSet aDummySet(rSh.GetAttrPool(), 1, 1 ); + SfxTabPage *pPage = GetTabPage( TP_FOOTNOTEOPTION ); + if ( pPage ) + pPage->FillItemSet( aDummySet ); + pPage = GetTabPage( TP_ENDNOTEOPTION ); + if ( pPage ) + pPage->FillItemSet( aDummySet ); + aOldOkHdl.Call( pBtn ); + return 0; +} + + +//---------------------------------------------------------------------- + + +SwEndNoteOptionPage::SwEndNoteOptionPage( Window *pParent, sal_Bool bEN, + const SfxItemSet &rSet ) : + SfxTabPage( pParent, SW_RES(bEN ? TP_ENDNOTEOPTION : TP_FOOTNOTEOPTION), rSet ), + aNumFL (this, SW_RES( FL_NUM )), + + aNumTypeFT (this, SW_RES( FT_NUMTYPE )), + aNumViewBox (this, SW_RES( LB_NUMVIEW ), INSERT_NUM_EXTENDED_TYPES), + aOffsetLbl (this, SW_RES( FT_OFFSET )), + aOffsetFld (this, SW_RES( FLD_OFFSET )), + aNumCountFT (this, SW_RES( FT_NUMCOUNT )), + aNumCountBox (this, SW_RES( LB_NUMCOUNT )), + aPrefixFT (this, SW_RES( FT_PREFIX )), + aPrefixED (this, SW_RES( ED_PREFIX )), + aSuffixFT (this, SW_RES( FT_SUFFIX )), + aSuffixED (this, SW_RES( ED_SUFFIX )), + aPosFT (this, SW_RES( FT_POS )), + aPosPageBox (this, SW_RES( RB_POS_PAGE )), + aPosChapterBox (this, SW_RES( RB_POS_CHAPTER)), + + aTemplFL (this, SW_RES( FL_TEMPL )), + aParaTemplLbl (this, SW_RES( FT_PARA_TEMPL)), + aParaTemplBox (this, SW_RES( LB_PARA_TEMPL)), + aPageTemplLbl (this, SW_RES( FT_PAGE_TEMPL)), + aPageTemplBox (this, SW_RES( LB_PAGE_TEMPL)), + + aCharTemplFL( this, SW_RES(FL_CHAR_TEMPL)), + aFtnCharAnchorTemplLbl( this, SW_RES( FT_ANCHR_CHARFMT)), + aFtnCharAnchorTemplBox( this, SW_RES( LB_ANCHR_CHARFMT)), + aFtnCharTextTemplLbl( this, SW_RES( FT_TEXT_CHARFMT)), + aFtnCharTextTemplBox( this, SW_RES( LB_TEXT_CHARFMT)), + + aContFL (this, SW_RES( FL_CONT )), + aContLbl (this, SW_RES( FT_CONT )), + aContEdit (this, SW_RES( ED_CONT )), + aContFromLbl (this, SW_RES( FT_CONT_FROM )), + aContFromEdit (this, SW_RES( ED_CONT_FROM )), + + aNumDoc(aNumCountBox.GetEntry(FTNNUM_DOC)), + aNumPage(aNumCountBox.GetEntry(FTNNUM_PAGE)), + aNumChapter(aNumCountBox.GetEntry(FTNNUM_CHAPTER)), + pSh( 0 ), + bPosDoc(sal_False), + bEndNote( bEN ) +{ + FreeResource(); + + aPosPageBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosPageHdl)); + aPosChapterBox.SetClickHdl(LINK(this, SwEndNoteOptionPage, PosChapterHdl)); + aNumCountBox.SetSelectHdl(LINK(this, SwEndNoteOptionPage, NumCountHdl)); + + aPosPageBox.SetAccessibleRelationMemberOf(&aPosFT); + aPosChapterBox.SetAccessibleRelationMemberOf(&aPosFT); +} + +void SwEndNoteOptionPage::Reset( const SfxItemSet& ) +{ + SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo( pSh->GetEndNoteInfo() ) + : new SwFtnInfo( pSh->GetFtnInfo() ); + SfxObjectShell * pDocSh = SfxObjectShell::Current(); + sal_uInt16 i; + + if(PTR_CAST(SwWebDocShell, pDocSh)) + { + aParaTemplLbl .Hide(); + aParaTemplBox .Hide(); + aPageTemplLbl .Hide(); + aPageTemplBox .Hide(); + aFtnCharTextTemplLbl.Hide(); + aFtnCharTextTemplBox.Hide(); + aFtnCharAnchorTemplLbl.Hide(); + aFtnCharAnchorTemplBox.Hide(); + aCharTemplFL .Hide(); + aTemplFL .Hide(); + } + if ( bEndNote ) + { + aPosPageBox.Hide(); + aPosChapterBox.Hide(); + aNumCountBox.Hide(); + aContLbl.Hide(); + aContEdit.Hide(); + aContFromLbl.Hide(); + aContFromEdit.Hide(); + aContFL.Hide(); + bPosDoc = sal_True; + } + else + { + const SwFtnInfo &rInf = pSh->GetFtnInfo(); + // Position (Seite, Kapitel) setzen + if ( rInf.ePos == FTNPOS_PAGE ) + { + aPosPageBox.Check(); + aPageTemplLbl.Enable(sal_False); + aPageTemplBox.Enable(sal_False); + } + else + { + aPosChapterBox.Check(); + aNumCountBox.RemoveEntry(aNumPage); + aNumCountBox.RemoveEntry(aNumChapter); + bPosDoc = sal_True; + } + // Verweistexte + aContEdit.SetText(rInf.aQuoVadis); + aContFromEdit.SetText(rInf.aErgoSum); + + // gesammelt wo + SelectNumbering(rInf.eNum); + } + + // Numerierung + // Art + aNumViewBox.SelectNumberingType( pInf->aFmt.GetNumberingType()); + aOffsetFld.SetValue(pInf->nFtnOffset + 1); + aPrefixED.SetText(pInf->GetPrefix()); + aSuffixED.SetText(pInf->GetSuffix()); + + const SwCharFmt* pCharFmt = pInf->GetCharFmt( + *pSh->GetView().GetDocShell()->GetDoc()); + aFtnCharTextTemplBox.SelectEntry(pCharFmt->GetName()); + aFtnCharTextTemplBox.SaveValue(); + + pCharFmt = pInf->GetAnchorCharFmt( *pSh->GetDoc() ); + aFtnCharAnchorTemplBox.SelectEntry( pCharFmt->GetName() ); + aFtnCharAnchorTemplBox.SaveValue(); + + // Vorlagen - Sonderbereiche + // Absatz + SfxStyleSheetBasePool* pStyleSheetPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); + pStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_PARA, SWSTYLEBIT_EXTRA); + SfxStyleSheetBase *pStyle = pStyleSheetPool->First(); + while(pStyle) + { + aParaTemplBox.InsertEntry(pStyle->GetName()); + pStyle = pStyleSheetPool->Next(); + } + + String sStr; + SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(bEndNote ? RES_POOLCOLL_ENDNOTE + : RES_POOLCOLL_FOOTNOTE), sStr ); + if(LISTBOX_ENTRY_NOTFOUND == aParaTemplBox.GetEntryPos( sStr ) ) + aParaTemplBox.InsertEntry( sStr ); + + SwTxtFmtColl* pColl = pInf->GetFtnTxtColl(); + if( !pColl ) + aParaTemplBox.SelectEntry( sStr ); // Default + else + { + OSL_ENSURE(!pColl->IsDefault(), "default style for footnotes is wrong"); + const sal_uInt16 nPos = aParaTemplBox.GetEntryPos(pColl->GetName()); + if( LISTBOX_ENTRY_NOTFOUND != nPos ) + aParaTemplBox.SelectEntryPos( nPos ); + else + { + aParaTemplBox.InsertEntry(pColl->GetName()); + aParaTemplBox.SelectEntry(pColl->GetName()); + } + } + + // Seite + for( i = RES_POOLPAGE_BEGIN; i < RES_POOLPAGE_END; ++i ) + aPageTemplBox.InsertEntry(SwStyleNameMapper::GetUIName( i, aEmptyStr )); + + sal_uInt16 nCount = pSh->GetPageDescCnt(); + for(i = 0; i < nCount; ++i) + { + const SwPageDesc &rPageDesc = pSh->GetPageDesc(i); + if(LISTBOX_ENTRY_NOTFOUND == aPageTemplBox.GetEntryPos(rPageDesc.GetName())) + aPageTemplBox.InsertEntry(rPageDesc.GetName()); + } + + aPageTemplBox.SelectEntry( pInf->GetPageDesc( *pSh->GetDoc() )->GetName()); + delete pInf; +} + +SwEndNoteOptionPage::~SwEndNoteOptionPage() +{ +} + +SfxTabPage *SwEndNoteOptionPage::Create( Window *pParent, const SfxItemSet &rSet ) +{ + return new SwEndNoteOptionPage( pParent, sal_True, rSet ); +} + +/*------------------------------------------------------------------------ + Beschreibung: Unterschiedliche Arten der Numerierung; da die Listbox + unterschiedlich viele Eintraege hat, hier Funktionen + fuer das Setzen und Erfragen der gemeinten Art + der Numerierung. +------------------------------------------------------------------------*/ +void SwEndNoteOptionPage::SelectNumbering(int eNum) +{ + String sSelect; + switch(eNum) + { + case FTNNUM_DOC: + sSelect = aNumDoc; + break; + case FTNNUM_PAGE: + sSelect = aNumPage; + break; + case FTNNUM_CHAPTER: + sSelect = aNumChapter; + break; +#if OSL_DEBUG_LEVEL > 1 + default: + OSL_FAIL("Which numbering type?"); +#endif + } + aNumCountBox.SelectEntry(sSelect); + NumCountHdl( &aNumCountBox ); +} + + + +int SwEndNoteOptionPage::GetNumbering() const +{ + const sal_uInt16 nPos = aNumCountBox.GetSelectEntryPos(); + return (int) bPosDoc? nPos + 1: nPos; +} + +void SwEndNoteOptionPage::SetShell( SwWrtShell &rShell ) +{ + pSh = &rShell; + // Zeichenvorlagen sammeln + aFtnCharTextTemplBox.Clear(); + aFtnCharAnchorTemplBox.Clear(); + ::FillCharStyleListBox(aFtnCharTextTemplBox, + pSh->GetView().GetDocShell()); + + ::FillCharStyleListBox(aFtnCharAnchorTemplBox, + pSh->GetView().GetDocShell()); +} + +/*------------------------------------------------------------------------ + Beschreibung: Handler hinter dem Button fuer Sammeln der Fussnote + auf der Seite. + In diesem Fall koennen alle Numerierungsarten verwendet + werden. +------------------------------------------------------------------------*/ + + +IMPL_LINK( SwEndNoteOptionPage, PosPageHdl, Button *, EMPTYARG ) +{ + const SwFtnNum eNum = (const SwFtnNum)GetNumbering(); + bPosDoc = sal_False; + if(LISTBOX_ENTRY_NOTFOUND == aNumCountBox.GetEntryPos(aNumPage)) + { + aNumCountBox.InsertEntry(aNumPage, FTNNUM_PAGE); + aNumCountBox.InsertEntry(aNumChapter, FTNNUM_CHAPTER); + SelectNumbering(eNum); + } + aPageTemplLbl.Enable(sal_False); + aPageTemplBox.Enable(sal_False); + + return 0; +} + +IMPL_LINK( SwEndNoteOptionPage, NumCountHdl, ListBox*, EMPTYARG ) +{ + sal_Bool bEnable = sal_True; + if( aNumCountBox.GetEntryCount() - 1 != aNumCountBox.GetSelectEntryPos() ) + { + bEnable = sal_False; + aOffsetFld.SetValue(1); + } + aOffsetLbl.Enable(bEnable); + aOffsetFld.Enable(bEnable); + return 0; +} + +/*------------------------------------------------------------------------ + Beschreibung: Handler hinter dem Button fuer Sammeln der Fussnote + am Kapitel oder Dokumentende. + In diesem Fall kann keine seitenweise Numerierung verwendet + werden. +------------------------------------------------------------------------*/ + + +IMPL_LINK_INLINE_START( SwEndNoteOptionPage, PosChapterHdl, Button *, EMPTYARG ) +{ + if ( !bPosDoc ) + SelectNumbering(FTNNUM_DOC); + + bPosDoc = sal_True; + aNumCountBox.RemoveEntry(aNumPage); + aNumCountBox.RemoveEntry(aNumChapter); + aPageTemplLbl.Enable(); + aPageTemplBox.Enable(); + return 0; +} +IMPL_LINK_INLINE_END( SwEndNoteOptionPage, PosChapterHdl, Button *, EMPTYARG ) + +SwCharFmt* lcl_GetCharFormat( SwWrtShell* pSh, const String& rCharFmtName ) +{ + SwCharFmt* pFmt = 0; + sal_uInt16 nChCount = pSh->GetCharFmtCount(); + for(sal_uInt16 i = 0; i< nChCount; i++) + { + SwCharFmt& rChFmt = pSh->GetCharFmt(i); + if(rChFmt.GetName() == rCharFmtName ) + { + pFmt = &rChFmt; + break; + } + } + if(!pFmt) + { + SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); + SfxStyleSheetBase* pBase; + pBase = pPool->Find(rCharFmtName, SFX_STYLE_FAMILY_CHAR); + if(!pBase) + pBase = &pPool->Make(rCharFmtName, SFX_STYLE_FAMILY_CHAR); + pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt(); + } + return pFmt; +} + +sal_Bool SwEndNoteOptionPage::FillItemSet( SfxItemSet & ) +{ + SwEndNoteInfo *pInf = bEndNote ? new SwEndNoteInfo() : new SwFtnInfo(); + + pInf->nFtnOffset = static_cast< sal_uInt16 >(aOffsetFld.GetValue() -1); + pInf->aFmt.SetNumberingType(aNumViewBox.GetSelectedNumberingType() ); + pInf->SetPrefix(aPrefixED.GetText()); + pInf->SetSuffix(aSuffixED.GetText()); + + pInf->SetCharFmt( lcl_GetCharFormat( pSh, + aFtnCharTextTemplBox.GetSelectEntry() ) ); + pInf->SetAnchorCharFmt( lcl_GetCharFormat( pSh, + aFtnCharAnchorTemplBox.GetSelectEntry() ) ); + + // Absatzvorlage + sal_uInt16 nPos = aParaTemplBox.GetSelectEntryPos(); + if(LISTBOX_ENTRY_NOTFOUND != nPos) + { + const String aFmtName( aParaTemplBox.GetSelectEntry() ); + SwTxtFmtColl *pColl = pSh->GetParaStyle(aFmtName, SwWrtShell::GETSTYLE_CREATEANY); + OSL_ENSURE(pColl, "paragraph style not found"); + pInf->SetFtnTxtColl(*pColl); + } + + // Seitenvorlage + pInf->ChgPageDesc( pSh->FindPageDescByName( + aPageTemplBox.GetSelectEntry(), sal_True ) ); + + if ( bEndNote ) + { + if ( !(*pInf == pSh->GetEndNoteInfo()) ) + pSh->SetEndNoteInfo( *pInf ); + } + else + { + SwFtnInfo *pI = (SwFtnInfo*)pInf; + pI->ePos = aPosPageBox.IsChecked() ? FTNPOS_PAGE : FTNPOS_CHAPTER; + pI->eNum = (SwFtnNum)GetNumbering(); + pI->aQuoVadis = aContEdit.GetText(); + pI->aErgoSum = aContFromEdit.GetText(); + if ( !(*pI == pSh->GetFtnInfo()) ) + pSh->SetFtnInfo( *pI ); + } + delete pInf; + return sal_True; +} + +SwFootNoteOptionPage::SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet ) : + SwEndNoteOptionPage( pParent, sal_False, rSet ) +{ +} + +SwFootNoteOptionPage::~SwFootNoteOptionPage() +{ +} + +SfxTabPage *SwFootNoteOptionPage::Create(Window *pParent, const SfxItemSet &rSet ) +{ + return new SwFootNoteOptionPage( pParent, rSet ); +} + + + + + + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/docfnote.hrc b/sw/source/ui/misc/docfnote.hrc new file mode 100644 index 000000000000..f826f276620e --- /dev/null +++ b/sw/source/ui/misc/docfnote.hrc @@ -0,0 +1,60 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#define RB_POS_PAGE 1 +#define RB_POS_CHAPTER 2 +#define FT_POS 3 +#define FT_NUMTYPE 4 +#define FT_NUMCOUNT 5 + +#define LB_NUMVIEW 10 +#define LB_NUMCOUNT 11 +#define FLD_OFFSET 12 +#define FT_OFFSET 13 +#define FL_NUM 14 + +#define LB_PARA_TEMPL 30 +#define LB_PAGE_TEMPL 31 +#define FT_PARA_TEMPL 32 +#define FT_PAGE_TEMPL 33 +#define FL_TEMPL 34 + +#define FT_CONT 40 +#define ED_CONT 41 +#define FT_CONT_FROM 42 +#define ED_CONT_FROM 43 +#define FL_CONT 44 + +#define FT_PREFIX 45 +#define ED_PREFIX 46 +#define FT_SUFFIX 47 +#define ED_SUFFIX 48 +#define FT_TEXT_CHARFMT 49 +#define LB_TEXT_CHARFMT 50 +#define FT_ANCHR_CHARFMT 51 +#define FL_CHAR_TEMPL 52 +#define LB_ANCHR_CHARFMT 53 + diff --git a/sw/source/ui/misc/docfnote.src b/sw/source/ui/misc/docfnote.src new file mode 100644 index 000000000000..171cb5bc0dad --- /dev/null +++ b/sw/source/ui/misc/docfnote.src @@ -0,0 +1,562 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" +#include "docfnote.hrc" +#include "helpid.h" +#include "cmdid.h" +#include "frmui.hrc" +TabDialog DLG_DOC_FOOTNOTE +{ + OutputSize = TRUE ; + SVLook = TRUE ; + Text [ en-US ] = "Footnotes/Endnotes Settings" ; + Moveable = TRUE ; + TabControl 1 + { + OutputSize = TRUE ; + PageList = + { + PageItem + { + Identifier = TP_FOOTNOTEOPTION ; + PageResID = TP_FOOTNOTEOPTION ; + Text [ en-US ] = "Footnotes" ; + }; + PageItem + { + Identifier = TP_ENDNOTEOPTION ; + PageResID = TP_ENDNOTEOPTION ; + Text [ en-US ] = "Endnotes" ; + }; + }; + }; +}; +TabPage TP_FOOTNOTEOPTION +{ + SVLook = TRUE ; + Hide = TRUE; + HelpID = HID_FOOTNOTE_OPTIONS ; + Pos = MAP_APPFONT ( 0 , 0 ) ; + Size = MAP_APPFONT ( 260 , 185 ) ; + FixedLine FL_NUM + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "AutoNumbering" ; + Group = TRUE ; + }; + FixedText FT_NUMTYPE + { + Pos = MAP_APPFONT ( 12 , 16 ) ; + Size = MAP_APPFONT ( 51 , 8 ) ; + Text [ en-US ] = "Num~bering"; + }; + ListBox LB_NUMVIEW + { + HelpID = "sw:ListBox:TP_FOOTNOTEOPTION:LB_NUMVIEW"; + Border = TRUE ; + Pos = MAP_APPFONT ( 65 , 14 ) ; + Size = MAP_APPFONT ( 59 , 72 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + }; + FixedText FT_OFFSET + { + Pos = MAP_APPFONT ( 130 , 16 ) ; + Size = MAP_APPFONT ( 50 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "~Start at" ; + }; + NumericField FLD_OFFSET + { + HelpID = "sw:NumericField:TP_FOOTNOTEOPTION:FLD_OFFSET"; + Pos = MAP_APPFONT ( 189 , 14 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Spin = TRUE ; + Minimum = 1 ; + First = 1 ; + Last = 9999 ; + Maximum = 9999 ; + TabStop = TRUE ; + Border = TRUE ; + }; + FixedText FT_NUMCOUNT + { + Pos = MAP_APPFONT ( 12 , 31 ) ; + Size = MAP_APPFONT ( 51 , 8 ) ; + Text [ en-US ] = "~Counting"; + }; + ListBox LB_NUMCOUNT + { + HelpID = "sw:ListBox:TP_FOOTNOTEOPTION:LB_NUMCOUNT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 65 , 29 ) ; + Size = MAP_APPFONT ( 59 , 50 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + StringList [ en-US ] = + { + < "Per page" ; > ; + < "Per chapter" ; > ; + < "Per document" ; > ; + }; + }; + FixedText FT_PREFIX + { + Pos = MAP_APPFONT ( 12 , 46 ) ; + Size = MAP_APPFONT ( 48 , 8 ) ; + Text [ en-US ] = "~Before" ; + Left = TRUE ; + }; + Edit ED_PREFIX + { + HelpID = "sw:Edit:TP_FOOTNOTEOPTION:ED_PREFIX"; + Border = TRUE ; + Pos = MAP_APPFONT ( 65 , 44 ) ; + Size = MAP_APPFONT ( 59 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 50 ; + }; + FixedText FT_SUFFIX + { + Pos = MAP_APPFONT ( 130 , 46 ) ; + Size = MAP_APPFONT ( 48 , 8 ) ; + Text [ en-US ] = "~After" ; + Left = TRUE ; + }; + Edit ED_SUFFIX + { + HelpID = "sw:Edit:TP_FOOTNOTEOPTION:ED_SUFFIX"; + Border = TRUE ; + Pos = MAP_APPFONT ( 189 , 44 ) ; + Size = MAP_APPFONT ( 59 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 50 ; + }; + FixedText FT_POS + { + Pos = MAP_APPFONT ( 12 , 63 ) ; + Size = MAP_APPFONT ( 36 , 8 ) ; + Text [ en-US ] = "Position" ; + }; + RadioButton RB_POS_PAGE + { + HelpID = "sw:RadioButton:TP_FOOTNOTEOPTION:RB_POS_PAGE"; + Pos = MAP_APPFONT ( 65 , 62 ) ; + Size = MAP_APPFONT ( 150 , 10 ) ; + Text [ en-US ] = "~End of page" ; + TabStop = TRUE ; + Group = TRUE ; + }; + RadioButton RB_POS_CHAPTER + { + HelpID = "sw:RadioButton:TP_FOOTNOTEOPTION:RB_POS_CHAPTER"; + Pos = MAP_APPFONT ( 65 , 75 ) ; + Size = MAP_APPFONT ( 150 , 10 ) ; + Text [ en-US ] = "En~d of document" ; + }; + FixedLine FL_TEMPL + { + Pos = MAP_APPFONT ( 6 , 89 ) ; + Size = MAP_APPFONT ( 103 , 8 ) ; + Text [ en-US ] = "Styles" ; + }; + FixedText FT_PARA_TEMPL + { + Pos = MAP_APPFONT ( 12 , 102 ) ; + Size = MAP_APPFONT ( 35 , 8 ) ; + Text [ en-US ] = "Pa~ragraph" ; + Left = TRUE ; + }; + ListBox LB_PARA_TEMPL + { + HelpID = "sw:ListBox:TP_FOOTNOTEOPTION:LB_PARA_TEMPL"; + Border = TRUE ; + Pos = MAP_APPFONT ( 48 , 100 ) ; + Size = MAP_APPFONT ( 58 , 80 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + Sort = TRUE ; + }; + FixedText FT_PAGE_TEMPL + { + Pos = MAP_APPFONT ( 12 , 118 ) ; + Size = MAP_APPFONT ( 35 , 8 ) ; + Text [ en-US ] = "~Page" ; + Left = TRUE ; + }; + ListBox LB_PAGE_TEMPL + { + HelpID = "sw:ListBox:TP_FOOTNOTEOPTION:LB_PAGE_TEMPL"; + Border = TRUE ; + Pos = MAP_APPFONT ( 48 , 116) ; + Size = MAP_APPFONT ( 58 , 80 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + }; + FixedLine FL_CHAR_TEMPL + { + Pos = MAP_APPFONT ( 113 , 89 ) ; + Size = MAP_APPFONT ( 141 , 8 ) ; + + Text [ en-US ] = "Character Styles"; + }; + FixedText FT_ANCHR_CHARFMT + { + Pos = MAP_APPFONT ( 117 , 102 ) ; + Size = MAP_APPFONT ( 67 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "Te~xt area" ; + }; + ListBox LB_ANCHR_CHARFMT + { + HelpID = "sw:ListBox:TP_FOOTNOTEOPTION:LB_ANCHR_CHARFMT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 186 , 100 ) ; + Size = MAP_APPFONT ( 65 , 72 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + Sort = TRUE ; + }; + FixedText FT_TEXT_CHARFMT + { + Pos = MAP_APPFONT ( 117 , 118 ) ; + Size = MAP_APPFONT ( 67 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "~Footnote area" ; + }; + ListBox LB_TEXT_CHARFMT + { + HelpID = "sw:ListBox:TP_FOOTNOTEOPTION:LB_TEXT_CHARFMT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 186 , 116 ) ; + Size = MAP_APPFONT ( 65 , 72 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + Sort = TRUE ; + }; + FixedLine FL_CONT + { + Pos = MAP_APPFONT ( 6 , 134 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Continuation notice" ; + }; + FixedText FT_CONT + { + Pos = MAP_APPFONT ( 12 , 148 ) ; + Size = MAP_APPFONT ( 73 , 8 ) ; + Text [ en-US ] = "End ~of footnote" ; + Left = TRUE ; + }; + Edit ED_CONT + { + HelpID = "sw:Edit:TP_FOOTNOTEOPTION:ED_CONT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 88, 145 ) ; + Size = MAP_APPFONT ( 160 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 30 ; + }; + FixedText FT_CONT_FROM + { + Pos = MAP_APPFONT ( 12 , 163 ) ; + Size = MAP_APPFONT ( 73 , 8 ) ; + Text [ en-US ] = "Star~t of next page" ; + Left = TRUE ; + }; + Edit ED_CONT_FROM + { + HelpID = "sw:Edit:TP_FOOTNOTEOPTION:ED_CONT_FROM"; + Border = TRUE ; + Pos = MAP_APPFONT ( 88 , 161 ) ; + Size = MAP_APPFONT ( 160 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 30 ; + }; +}; +TabPage TP_ENDNOTEOPTION +{ + SVLook = TRUE ; + Hide = TRUE; + HelpID = HID_ENDNOTE_OPTIONS ; + Pos = MAP_APPFONT ( 0 , 0 ) ; + Size = MAP_APPFONT ( 260 , 185 ) ; + FixedLine FL_NUM + { + Pos = MAP_APPFONT ( 6 , 2 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "AutoNumbering" ; + Group = TRUE ; + }; + FixedText FT_NUMTYPE + { + Pos = MAP_APPFONT ( 12 , 16 ) ; + Size = MAP_APPFONT ( 51 , 8 ) ; + Text [ en-US ] = "~Numbering"; + }; + ListBox LB_NUMVIEW + { + HelpID = "sw:ListBox:TP_ENDNOTEOPTION:LB_NUMVIEW"; + Border = TRUE ; + Pos = MAP_APPFONT ( 65 , 14 ) ; + Size = MAP_APPFONT ( 59 , 72 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + StringList = + { + "A, B, C" ; + "a, b, c" ; + "I, II, III" ; + "i, ii, iii" ; + "1, 2, 3" ; + "A, .., AA, .., AAA" ; + "a, .., aa, .., aaa" ; + }; + }; + FixedText FT_OFFSET + { + Pos = MAP_APPFONT ( 130 , 16 ) ; + Size = MAP_APPFONT ( 50 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "~Start at" ; + }; + NumericField FLD_OFFSET + { + HelpID = "sw:NumericField:TP_ENDNOTEOPTION:FLD_OFFSET"; + Pos = MAP_APPFONT ( 189 , 14 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Spin = TRUE ; + Minimum = 1 ; + First = 1 ; + Last = 9999 ; + Maximum = 9999 ; + TabStop = TRUE ; + Border = TRUE ; + }; + FixedText FT_NUMCOUNT + { + Pos = MAP_APPFONT ( 82 , 14 ) ; + Size = MAP_APPFONT ( 36 , 8 ) ; + Hide = TRUE; + }; + ListBox LB_NUMCOUNT + { + HelpID = "sw:ListBox:TP_ENDNOTEOPTION:LB_NUMCOUNT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 12 , 27 ) ; + Size = MAP_APPFONT ( 62 , 72 ) ; + Hide = TRUE; + }; + FixedText FT_PREFIX + { + Pos = MAP_APPFONT ( 12 , 32 ) ; + Size = MAP_APPFONT ( 48 , 8 ) ; + + Text [ en-US ] = "~Before" ; + Left = TRUE ; + }; + Edit ED_PREFIX + { + HelpID = "sw:Edit:TP_ENDNOTEOPTION:ED_PREFIX"; + Pos = MAP_APPFONT ( 65 , 30 ) ; + Size = MAP_APPFONT ( 59 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 50 ; + }; + FixedText FT_SUFFIX + { + Pos = MAP_APPFONT ( 130 , 32 ) ; + Size = MAP_APPFONT ( 48 , 8 ) ; + Text [ en-US ] = "~After" ; + Left = TRUE ; + }; + Edit ED_SUFFIX + { + HelpID = "sw:Edit:TP_ENDNOTEOPTION:ED_SUFFIX"; + Pos = MAP_APPFONT ( 189 , 30 ) ; + Size = MAP_APPFONT ( 59 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 50 ; + }; + FixedText FT_POS + { + Pos = MAP_APPFONT ( 82 , 14 ) ; + Size = MAP_APPFONT ( 36 , 8 ) ; + Hide = TRUE; + }; + RadioButton RB_POS_PAGE + { + HelpID = "sw:RadioButton:TP_ENDNOTEOPTION:RB_POS_PAGE"; + Pos = MAP_APPFONT ( 12 , 104 ) ; + Size = MAP_APPFONT ( 60 , 10 ) ; + Text [ en-US ] = "End ~of page" ; + TabStop = TRUE ; + Group = TRUE ; + }; + RadioButton RB_POS_CHAPTER + { + HelpID = "sw:RadioButton:TP_ENDNOTEOPTION:RB_POS_CHAPTER"; + Pos = MAP_APPFONT ( 12 , 118 ) ; + Size = MAP_APPFONT ( 60 , 10 ) ; + Text [ en-US ] = "End of ~document" ; + }; + FixedLine FL_TEMPL + { + Pos = MAP_APPFONT ( 6 , 46 ) ; + Size = MAP_APPFONT ( 115 , 8 ) ; + Text [ en-US ] = "Styles" ; + }; + FixedText FT_PARA_TEMPL + { + Pos = MAP_APPFONT ( 12 , 58 ) ; + Size = MAP_APPFONT ( 38 , 8 ) ; + Text [ en-US ] = "Pa~ragraph" ; + Left = TRUE ; + }; + ListBox LB_PARA_TEMPL + { + HelpID = "sw:ListBox:TP_ENDNOTEOPTION:LB_PARA_TEMPL"; + Border = TRUE ; + Pos = MAP_APPFONT ( 51 , 56 ) ; + Size = MAP_APPFONT ( 67 , 72 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + Sort = TRUE ; + }; + FixedText FT_PAGE_TEMPL + { + Pos = MAP_APPFONT ( 12 , 74 ) ; + Size = MAP_APPFONT ( 38 , 8 ) ; + Text [ en-US ] = "~Page" ; + Left = TRUE ; + }; + ListBox LB_PAGE_TEMPL + { + HelpID = "sw:ListBox:TP_ENDNOTEOPTION:LB_PAGE_TEMPL"; + Border = TRUE ; + Pos = MAP_APPFONT ( 51 , 72 ) ; + Size = MAP_APPFONT ( 67 , 72 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + }; + FixedLine FL_CHAR_TEMPL + { + Pos = MAP_APPFONT ( 125 , 46 ) ; + Size = MAP_APPFONT ( 129 , 8 ) ; + Text [ en-US ] = "Character Styles"; + }; + FixedText FT_ANCHR_CHARFMT + { + Pos = MAP_APPFONT ( 129 , 58 ) ; + Size = MAP_APPFONT ( 55 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "Te~xt area" ; + }; + ListBox LB_ANCHR_CHARFMT + { + HelpID = "sw:ListBox:TP_ENDNOTEOPTION:LB_ANCHR_CHARFMT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 186 , 56 ) ; + Size = MAP_APPFONT ( 65 , 72 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + Sort = TRUE ; + }; + FixedText FT_TEXT_CHARFMT + { + Pos = MAP_APPFONT ( 129 , 74 ) ; + Size = MAP_APPFONT ( 55 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "~Endnote area" ; + }; + ListBox LB_TEXT_CHARFMT + { + HelpID = "sw:ListBox:TP_ENDNOTEOPTION:LB_TEXT_CHARFMT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 186 , 72 ) ; + Size = MAP_APPFONT ( 65 , 72 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + Sort = TRUE ; + }; + FixedLine FL_CONT + { + Pos = MAP_APPFONT ( 80 , 91 ) ; + Size = MAP_APPFONT ( 174 , 8 ) ; + Text [ en-US ] = "Continuation notice" ; + }; + FixedText FT_CONT + { + Pos = MAP_APPFONT ( 86 , 103 ) ; + Size = MAP_APPFONT ( 38 , 8 ) ; + Text [ en-US ] = "~Following page" ; + Left = TRUE ; + }; + Edit ED_CONT + { + HelpID = "sw:Edit:TP_ENDNOTEOPTION:ED_CONT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 137 , 101 ) ; + Size = MAP_APPFONT ( 114 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 30 ; + }; + FixedText FT_CONT_FROM + { + Pos = MAP_APPFONT ( 86 , 118 ) ; + Size = MAP_APPFONT ( 38 , 8 ) ; + Text [ en-US ] = "~Start" ; + Left = TRUE ; + }; + Edit ED_CONT_FROM + { + HelpID = "sw:Edit:TP_ENDNOTEOPTION:ED_CONT_FROM"; + Border = TRUE ; + Pos = MAP_APPFONT ( 137 , 116 ) ; + Size = MAP_APPFONT ( 114 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + MaxTextLength = 30 ; + }; +}; diff --git a/sw/source/ui/misc/glosbib.cxx b/sw/source/ui/misc/glosbib.cxx new file mode 100644 index 000000000000..96177f96b5a2 --- /dev/null +++ b/sw/source/ui/misc/glosbib.cxx @@ -0,0 +1,533 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#define _SVSTDARR_STRINGS +#include <tools/urlobj.hxx> +#include <tools/stream.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/help.hxx> +#include <unotools/transliterationwrapper.hxx> +#include <unotools/tempfile.hxx> + +#include <svl/svstdarr.hxx> +#include <unotools/pathoptions.hxx> +#include <swtypes.hxx> +#include <glosbib.hxx> +#include <gloshdl.hxx> +#include <actctrl.hxx> +#include <glossary.hxx> +#include <glosdoc.hxx> +#include <swunohelper.hxx> + +#include <glosbib.hrc> +#include <misc.hrc> +#include <helpid.h> + + +#define PATH_CASE_SENSITIVE 0x01 +#define PATH_READONLY 0x02 + +#define RENAME_TOKEN_DELIM (sal_Unicode)1 + +SwGlossaryGroupDlg::SwGlossaryGroupDlg(Window * pParent, + const SvStrings* pPathArr, + SwGlossaryHdl *pHdl) : + SvxStandardDialog(pParent, SW_RES(DLG_BIB_BASE)), + aBibFT( this, SW_RES(FT_BIB)), + aNameED( this, SW_RES(ED_NAME)), + aPathFT( this, SW_RES(FT_PATH)), + aPathLB( this, SW_RES(LB_PATH)), + aSelectFT( this, SW_RES(FT_SELECT)), + aGroupTLB( this, SW_RES(TLB_GROUPS)), + + aOkPB( this, SW_RES(BT_OK)), + aCancelPB( this, SW_RES(BT_CANCEL)), + aHelpPB( this, SW_RES(BT_HELP)), + aNewPB( this, SW_RES(PB_NEW)), + aDelPB( this, SW_RES(PB_DELETE)), + aRenamePB( this, SW_RES(PB_RENAME)), + + pRemovedArr(0), + pInsertedArr(0), + pRenamedArr(0), + pGlosHdl(pHdl) +{ + sal_uInt16 i; + + FreeResource(); + + long nTabs[] = + { 2, // Number of Tabs + 0, 160 + }; + + aGroupTLB.SetHelpId(HID_GLOS_GROUP_TREE); + aGroupTLB.SetTabs( &nTabs[0], MAP_APPFONT ); + aGroupTLB.SetStyle(aGroupTLB.GetStyle()|WB_HSCROLL|WB_CLIPCHILDREN|WB_SORT); + aGroupTLB.SetSelectHdl(LINK(this, SwGlossaryGroupDlg, SelectHdl)); + aGroupTLB.GetModel()->SetSortMode(SortAscending); + aNewPB.SetClickHdl(LINK(this, SwGlossaryGroupDlg, NewHdl)); + aDelPB.SetClickHdl(LINK(this, SwGlossaryGroupDlg, DeleteHdl)); + aNameED.SetModifyHdl(LINK(this, SwGlossaryGroupDlg, ModifyHdl)); + aPathLB.SetSelectHdl(LINK(this, SwGlossaryGroupDlg, ModifyHdl)); + aRenamePB.SetClickHdl(LINK(this, SwGlossaryGroupDlg, RenameHdl)); + for( i = 0; i < pPathArr->Count(); i++) + { + String sPath(*(*pPathArr)[i]); + INetURLObject aTempURL(sPath); + sPath = aTempURL.GetMainURL(INetURLObject::DECODE_WITH_CHARSET ); + aPathLB.InsertEntry(sPath); + sal_uLong nCaseReadonly = 0; + utl::TempFile aTempFile(&sPath); + aTempFile.EnableKillingFile(); + if(!aTempFile.IsValid()) + nCaseReadonly |= PATH_READONLY; + else if( SWUnoHelper::UCB_IsCaseSensitiveFileName( aTempFile.GetURL())) + nCaseReadonly |= PATH_CASE_SENSITIVE; + aPathLB.SetEntryData(i, (void*)nCaseReadonly); + } + aPathLB.SelectEntryPos(0); + aPathLB.Enable(sal_True); + + const sal_uInt16 nCount = pHdl->GetGroupCnt(); + for(i = 0; i < nCount; ++i) + { + String sTitle; + String sGroup = pHdl->GetGroupName(i, &sTitle); + if(!sGroup.Len()) + continue; + GlosBibUserData* pData = new GlosBibUserData; + pData->sGroupName = sGroup; + pData->sGroupTitle = sTitle; + String sTemp(sTitle); + sTemp += '\t'; + pData->sPath = aPathLB.GetEntry((sal_uInt16)sGroup.GetToken(1, GLOS_DELIM).ToInt32()); + sTemp += pData->sPath; + SvLBoxEntry* pEntry = aGroupTLB.InsertEntry(sTemp); + pEntry->SetUserData(pData); + + } + aGroupTLB.GetModel()->Resort(); +} + +SwGlossaryGroupDlg::~SwGlossaryGroupDlg() +{ + + if(pInsertedArr) + { + pInsertedArr->DeleteAndDestroy(0, pInsertedArr->Count()); + delete pInsertedArr; + } + if(pRemovedArr) + { + pRemovedArr->DeleteAndDestroy(0, pRemovedArr->Count()); + delete pRemovedArr; + } + if(pRenamedArr) + { + pRenamedArr->DeleteAndDestroy(0, pRenamedArr->Count()); + delete pRenamedArr; + } + +} + +void SwGlossaryGroupDlg::Apply() +{ + if(aNewPB.IsEnabled()) + NewHdl(&aNewPB); + + String aActGroup = SwGlossaryDlg::GetCurrGroup(); + + if(pRemovedArr && pRemovedArr->Count()) + { + sal_uInt16 nCount = pRemovedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + const String* pDelEntry = (*pRemovedArr)[i]; + const String sDelGroup = pDelEntry->GetToken(0, '\t'); + if( sDelGroup == aActGroup ) + { + //soll die aktuelle Gruppe geloescht werden, muss die akt. Gruppe + //umgesetzt werden + if(aGroupTLB.GetEntryCount()) + { + SvLBoxEntry* pFirst = aGroupTLB.First(); + GlosBibUserData* pUserData = (GlosBibUserData*)pFirst->GetUserData(); + pGlosHdl->SetCurGroup(pUserData->sGroupName); + } + } + String sMsg(SW_RES(STR_QUERY_DELETE_GROUP1)); + String sTitle(pDelEntry->GetToken(1, '\t')); + if(sTitle.Len()) + sMsg += sTitle; + else + sDelGroup.GetToken(1, GLOS_DELIM); + sMsg += SW_RESSTR(STR_QUERY_DELETE_GROUP2); + QueryBox aQuery(this->GetParent(), WB_YES_NO|WB_DEF_NO, sMsg ); + if(RET_YES == aQuery.Execute()) + pGlosHdl->DelGroup( sDelGroup ); + } + + } + //erst umbenennen, falls es schon eins gab + if(pRenamedArr && pRenamedArr->Count()) + { + sal_uInt16 nCount = pRenamedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + String * pEntry = (*pRenamedArr)[i]; + xub_StrLen nStrSttPos = 0; + String sOld( pEntry->GetToken(0, RENAME_TOKEN_DELIM, nStrSttPos ) ); + String sNew( pEntry->GetToken(0, RENAME_TOKEN_DELIM, nStrSttPos) ); + String sTitle( pEntry->GetToken(0, RENAME_TOKEN_DELIM, nStrSttPos) ); + pGlosHdl->RenameGroup(sOld, sNew, sTitle); + if(!i) + sCreatedGroup = sNew; + } + } + if(pInsertedArr && pInsertedArr->Count()) + { + sal_uInt16 nCount = pInsertedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + String sNewGroup = *(*pInsertedArr)[i]; + String sNewTitle = sNewGroup.GetToken(0, GLOS_DELIM); + if( *(*pInsertedArr)[i] != aActGroup ) + { + pGlosHdl->NewGroup(sNewGroup, sNewTitle); + if(!sCreatedGroup.Len()) + sCreatedGroup = sNewGroup; + } + } + } +} + +IMPL_LINK( SwGlossaryGroupDlg, SelectHdl, SvTabListBox*, EMPTYARG ) +{ + aNewPB.Enable(sal_False); + SvLBoxEntry* pFirstEntry = aGroupTLB.FirstSelected(); + if(pFirstEntry) + { + GlosBibUserData* pUserData = (GlosBibUserData*)pFirstEntry->GetUserData(); + String sEntry(pUserData->sGroupName); + String sName(aNameED.GetText()); + sal_Bool bExists = sal_False; + sal_uLong nPos = aGroupTLB.GetEntryPos(sName, 0); + if( 0xffffffff > nPos) + { + SvLBoxEntry* pEntry = aGroupTLB.GetEntry(nPos); + GlosBibUserData* pFoundData = (GlosBibUserData*)pEntry->GetUserData(); + String sGroup = pFoundData->sGroupName; + bExists = sGroup == sEntry; + } + + aRenamePB.Enable(!bExists && sName.Len()); + aDelPB.Enable(IsDeleteAllowed(sEntry)); + } + return 0; +} + +IMPL_LINK( SwGlossaryGroupDlg, NewHdl, Button*, EMPTYARG ) +{ + String sGroup(aNameED.GetText()); + sGroup += GLOS_DELIM; + sGroup += String::CreateFromInt32(aPathLB.GetSelectEntryPos()); + OSL_ENSURE(!pGlosHdl->FindGroupName(sGroup), "group already available!"); + if(!pInsertedArr) + pInsertedArr = new SvStrings; + pInsertedArr->Insert(new String(sGroup), pInsertedArr->Count()); + String sTemp(aNameED.GetText()); + sTemp += '\t'; + sTemp += aPathLB.GetSelectEntry(); + SvLBoxEntry* pEntry = aGroupTLB.InsertEntry(sTemp); + GlosBibUserData* pData = new GlosBibUserData; + pData->sPath = aPathLB.GetSelectEntry(); + pData->sGroupName = sGroup; + pData->sGroupTitle = aNameED.GetText(); + pEntry->SetUserData(pData); + aGroupTLB.Select(pEntry); + aGroupTLB.MakeVisible(pEntry); + aGroupTLB.GetModel()->Resort(); + + return 0; +} + +IMPL_LINK( SwGlossaryGroupDlg, DeleteHdl, Button*, pButton ) +{ + SvLBoxEntry* pEntry = aGroupTLB.FirstSelected(); + if(!pEntry) + { + pButton->Enable(sal_False); + return 0; + } + GlosBibUserData* pUserData = (GlosBibUserData*)pEntry->GetUserData(); + String sEntry(pUserData->sGroupName); + // befindet sich der zu loeschende Name schon unter den + // den neuen - dann weg damit + sal_Bool bDelete = sal_True; + if(pInsertedArr && pInsertedArr->Count()) + { + sal_uInt16 nCount = pInsertedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + const String* pTemp = (*pInsertedArr)[i]; + if(*pTemp == sEntry) + { + pInsertedArr->Remove(i); + bDelete = sal_False; + break; + } + + } + } + // moeglicherweise sollte es schon umbenannt werden? + if(bDelete) + { + if(pRenamedArr && pRenamedArr->Count()) + { + sal_uInt16 nCount = pRenamedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + const String* pTemp = (*pRenamedArr)[i]; + String sTemp( pTemp->GetToken(0, RENAME_TOKEN_DELIM )); + if(sTemp == sEntry) + { + pRenamedArr->Remove(i); + bDelete = sal_False; + break; + } + } + } + } + if(bDelete) + { + if(!pRemovedArr) + pRemovedArr = new SvStrings; + String sGroupEntry(pUserData->sGroupName); + sGroupEntry += '\t'; + sGroupEntry += pUserData->sGroupTitle; + pRemovedArr->Insert(new String(sGroupEntry), pRemovedArr->Count()); + } + delete pUserData; + aGroupTLB.GetModel()->Remove(pEntry); + if(!aGroupTLB.First()) + pButton->Enable(sal_False); + //the content must be deleted - otherwise the new handler would be called in Apply() + aNameED.SetText(aEmptyStr); + return 0; +} + +IMPL_LINK( SwGlossaryGroupDlg, RenameHdl, Button *, EMPTYARG ) +{ + SvLBoxEntry* pEntry = aGroupTLB.FirstSelected(); + GlosBibUserData* pUserData = (GlosBibUserData*)pEntry->GetUserData(); + String sEntryText(aGroupTLB.GetEntryText(pEntry)); + String sEntry(pUserData->sGroupName); + + String sNewName(aNameED.GetText()); + String sNewTitle(sNewName); + + sNewName += GLOS_DELIM; + sNewName += String::CreateFromInt32(aPathLB.GetSelectEntryPos()); + OSL_ENSURE(!pGlosHdl->FindGroupName(sNewName), "group already available!"); + + // befindet sich der umzubenennende Name unter den + // den neuen - dann austauschen + sal_Bool bDone = sal_False; + if(pInsertedArr && pInsertedArr->Count()) + { + sal_uInt16 nCount = pInsertedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + const String* pTemp = (*pInsertedArr)[i]; + if(*pTemp == sEntry) + { + pInsertedArr->Remove(i); + pInsertedArr->Insert(new String(sNewName), pInsertedArr->Count()); + bDone = sal_True; + break; + } + } + } + if(!bDone) + { + if(!pRenamedArr) + pRenamedArr = new SvStrings; + sEntry += RENAME_TOKEN_DELIM; + sEntry += sNewName; + sEntry += RENAME_TOKEN_DELIM; + sEntry += sNewTitle; + pRenamedArr->Insert(new String(sEntry), pRenamedArr->Count()); + } + delete (GlosBibUserData*)pEntry->GetUserData(); + aGroupTLB.GetModel()->Remove(pEntry); + String sTemp(aNameED.GetText()); + sTemp += '\t'; + sTemp += aPathLB.GetSelectEntry(); + pEntry = aGroupTLB.InsertEntry(sTemp); + GlosBibUserData* pData = new GlosBibUserData; + pData->sPath = aPathLB.GetSelectEntry(); + pData->sGroupName = sNewName; + pData->sGroupTitle = sNewTitle; + pEntry->SetUserData(pData); + aGroupTLB.Select(pEntry); + aGroupTLB.MakeVisible(pEntry); + aGroupTLB.GetModel()->Resort(); + return 0; +} + +IMPL_LINK( SwGlossaryGroupDlg, ModifyHdl, Edit*, EMPTYARG ) +{ + String sEntry(aNameED.GetText()); + sal_Bool bEnableNew = sal_True; + sal_Bool bEnableDel = sal_False; + sal_uLong nCaseReadonly = + (sal_uLong)aPathLB.GetEntryData(aPathLB.GetSelectEntryPos()); + sal_Bool bDirReadonly = 0 != (nCaseReadonly&PATH_READONLY); + + if(!sEntry.Len() || bDirReadonly) + bEnableNew = sal_False; + else if(sEntry.Len()) + { + sal_uLong nPos = 0xffffffff; + + + nPos = aGroupTLB.GetEntryPos(sEntry, 0); + //ist es nicht case sensitive muss man selbst suchen + if( 0xffffffff == nPos) + { + const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore(); + for(sal_uInt16 i = 0; i < aGroupTLB.GetEntryCount(); i++) + { + String sTemp = aGroupTLB.GetEntryText( i, 0 ); + nCaseReadonly = (sal_uLong)aPathLB.GetEntryData( + aPathLB.GetEntryPos(aGroupTLB.GetEntryText(i,1))); + sal_Bool bCase = 0 != (nCaseReadonly & PATH_CASE_SENSITIVE); + + if( !bCase && rSCmp.isEqual( sTemp, sEntry )) + { + nPos = i; + break; + } + } + } + if( 0xffffffff > nPos) + { + bEnableNew = sal_False; + aGroupTLB.Select(aGroupTLB.GetEntry( nPos )); + aGroupTLB.MakeVisible(aGroupTLB.GetEntry( nPos )); + } + } + SvLBoxEntry* pEntry = aGroupTLB.FirstSelected(); + if(pEntry) + { + GlosBibUserData* pUserData = (GlosBibUserData*)pEntry->GetUserData(); + bEnableDel = IsDeleteAllowed(pUserData->sGroupName); + } + + aDelPB.Enable(bEnableDel); + aNewPB.Enable(bEnableNew); + aRenamePB.Enable(bEnableNew && pEntry); + return 0; +} + +sal_Bool SwGlossaryGroupDlg::IsDeleteAllowed(const String &rGroup) +{ + sal_Bool bDel = (!pGlosHdl->IsReadOnly(&rGroup)); + + // OM: befindet sich der Name unter den den neuen Bereichsnamen, + // dann ist er auch loeschbar! Bei noch nicht existenten Bereichsnamen + // liefert ReadOnly naemlich sal_True. + + if(pInsertedArr && pInsertedArr->Count()) + { + sal_uInt16 nCount = pInsertedArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + const String* pTemp = (*pInsertedArr)[i]; + if(*pTemp == rGroup) + { + bDel = sal_True; + break; + } + } + } + + return bDel; +} + +void FEdit::KeyInput( const KeyEvent& rKEvent ) +{ + KeyCode aCode = rKEvent.GetKeyCode(); + if( KEYGROUP_CURSOR == aCode.GetGroup() || + ( KEYGROUP_MISC == aCode.GetGroup() && + KEY_DELETE >= aCode.GetCode() ) || + SVT_SEARCHPATH_DELIMITER != rKEvent.GetCharCode() ) + Edit::KeyInput( rKEvent ); +} + +void SwGlossaryGroupTLB::RequestHelp( const HelpEvent& rHEvt ) +{ + Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() )); + SvLBoxEntry* pEntry = GetEntry( aPos ); + if(pEntry) + { + SvLBoxTab* pTab; + SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab ); + if(pItem) + { + aPos = GetEntryPosition( pEntry ); + Size aSize(pItem->GetSize( this, pEntry )); + aPos.X() = GetTabPos( pEntry, pTab ); + + if((aPos.X() + aSize.Width()) > GetSizePixel().Width()) + aSize.Width() = GetSizePixel().Width() - aPos.X(); + aPos = OutputToScreenPixel(aPos); + Rectangle aItemRect( aPos, aSize ); + String sMsg; + GlosBibUserData* pData = (GlosBibUserData*)pEntry->GetUserData(); + sMsg = pData->sPath; + sMsg += INET_PATH_TOKEN; + sMsg += pData->sGroupName.GetToken(0, GLOS_DELIM); + sMsg += SwGlossaries::GetExtension(); + + Help::ShowQuickHelp( this, aItemRect, sMsg, + QUICKHELP_LEFT|QUICKHELP_VCENTER ); + } + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/glosbib.hrc b/sw/source/ui/misc/glosbib.hrc new file mode 100644 index 000000000000..834163d52fe0 --- /dev/null +++ b/sw/source/ui/misc/glosbib.hrc @@ -0,0 +1,41 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#define FT_BIB 1 +#define FT_PATH 2 +#define FT_SELECT 3 +#define CO_NAME 2 +#define PB_NEW 3 +#define PB_DELETE 4 +#define BT_OK 5 +#define BT_CANCEL 6 +#define BT_HELP 7 +#define LB_PATH 8 +#define TLB_GROUPS 9 +#define ED_NAME 10 +#define PB_RENAME 11 + diff --git a/sw/source/ui/misc/glosbib.src b/sw/source/ui/misc/glosbib.src new file mode 100644 index 000000000000..25b83bf27d68 --- /dev/null +++ b/sw/source/ui/misc/glosbib.src @@ -0,0 +1,182 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "glosbib.hrc" +#include "misc.hrc" +#include "helpid.h" +ModalDialog DLG_BIB_BASE +{ + HelpID = HID_BIB_BASE ; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 349 , 121 ) ; + Moveable = TRUE ; + Text [ en-US ] = "Edit Categories" ; + PushButton PB_NEW + { + HelpID = "sw:PushButton:DLG_BIB_BASE:PB_NEW"; + Disable = TRUE ; + Pos = MAP_APPFONT ( 293 , 66 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "~New" ; + TabStop = TRUE ; + }; + PushButton PB_DELETE + { + HelpID = "sw:PushButton:DLG_BIB_BASE:PB_DELETE"; + Pos = MAP_APPFONT ( 293 , 83 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "~Delete" ; + TabStop = TRUE ; + Disable = TRUE ; + }; + PushButton PB_RENAME + { + HelpID = "sw:PushButton:DLG_BIB_BASE:PB_RENAME"; + Disable = TRUE ; + Pos = MAP_APPFONT ( 293 , 100 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "~Rename" ; + TabStop = TRUE ; + }; + FixedText FT_BIB + { + Pos = MAP_APPFONT ( 12 , 3 ) ; + Size = MAP_APPFONT ( 100 , 8 ) ; + Text [ en-US ] = "Category" ; + }; + OKButton BT_OK + { + Pos = MAP_APPFONT ( 293 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + DefButton = TRUE ; + }; + CancelButton BT_CANCEL + { + Pos = MAP_APPFONT ( 293 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + HelpButton BT_HELP + { + Pos = MAP_APPFONT ( 293 , 43 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + Edit ED_NAME + { + HelpID = "sw:Edit:DLG_BIB_BASE:ED_NAME"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 159 , 12 ) ; + TabStop = TRUE ; + Border = TRUE ; + MaxTextLength = 256 ; + }; + FixedText FT_PATH + { + Pos = MAP_APPFONT ( 174 , 3 ) ; + Size = MAP_APPFONT ( 60 , 8 ) ; + Text [ en-US ] = "Path"; + }; + ListBox LB_PATH + { + HelpID = "sw:ListBox:DLG_BIB_BASE:LB_PATH"; + Pos = MAP_APPFONT ( 174 , 14 ) ; + Size = MAP_APPFONT ( 107 , 50 ) ; + DropDown = TRUE ; + Border = TRUE ; + TabStop = TRUE ; + DDExtraWidth = TRUE ; + }; + FixedText FT_SELECT + { + Pos = MAP_APPFONT ( 12 , 30 ) ; + Size = MAP_APPFONT ( 100 , 8 ) ; + Text [ en-US ] = "Selection list"; + }; + Control TLB_GROUPS + { + Pos = MAP_APPFONT ( 12 , 41 ) ; + Size = MAP_APPFONT ( 269 , 73 ) ; + TabStop = TRUE ; + Border = TRUE ; + }; + /* ComboBox CO_NAME + { + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 89 , 76 ) ; + TabStop = TRUE ; +#ifdef WIN + MaxTextLength = 8 ; +#else + MaxTextLength = 32 ; +#endif + Sort = TRUE ; + };*/ +}; +/* +String STR_GLOSSARY_BIB_DLG +{ + Text [ en-US ] = "Edit Categories" ; +};*/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/glosdoc.cxx b/sw/source/ui/misc/glosdoc.cxx new file mode 100644 index 000000000000..357813684d5e --- /dev/null +++ b/sw/source/ui/misc/glosdoc.cxx @@ -0,0 +1,761 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#include <memory> + +#include <com/sun/star/container/XNamed.hpp> + +#define _SVSTDARR_STRINGS +#include <unotools/transliterationwrapper.hxx> + +#include <svl/svstdarr.hxx> + +#ifndef __RSC //autogen +#include <tools/errinf.hxx> +#endif +#include <osl/diagnose.h> +#include <svl/urihelper.hxx> +#include <svl/fstathelper.hxx> +#include <unotools/pathoptions.hxx> +#include <unotools/tempfile.hxx> +#include <swtypes.hxx> +#include <uitool.hxx> +#include <glosdoc.hxx> +#include <shellio.hxx> +#include <swunohelper.hxx> + +#include <unoatxt.hxx> +#include <swerror.h> +#include <globals.hrc> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +// PUBLIC METHODES ------------------------------------------------------- +String lcl_CheckFileName( const String& rNewFilePath, + const String& rNewGroupName ) +{ + String sRet; + //group name should contain only A-Z and a-z and spaces + for( xub_StrLen i = 0; i < rNewGroupName.Len(); i++ ) + { + sal_Unicode cChar = rNewGroupName.GetChar(i); + if( (cChar >= 'A' && cChar <= 'Z') || + (cChar >= 'a' && cChar <= 'z') || + (cChar >= '0' && cChar <= '9') || + cChar == '_' || cChar == 0x20 ) + { + sRet += cChar; + } + } + sRet.EraseLeadingChars(); + sRet.EraseTrailingChars(); + + sal_Bool bOk = sal_False; + if( sRet.Len() ) + { + String sTmpDir(rNewFilePath); + sTmpDir += INET_PATH_TOKEN; + sTmpDir += sRet; + sTmpDir += SwGlossaries::GetExtension(); + bOk = !FStatHelper::IsDocument( sTmpDir ); + } + + if( !bOk ) + { + String rSG = SwGlossaries::GetExtension(); + //generate generic name + utl::TempFile aTemp( + String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "group" )), + &rSG, &rNewFilePath ); + aTemp.EnableKillingFile(); + + INetURLObject aTempURL( aTemp.GetURL() ); + sRet = aTempURL.GetBase(); + } + return sRet; +} + +/*------------------------------------------------------------------------ + Beschreibung: Liefert den Namen der Default-Gruppe +------------------------------------------------------------------------*/ +String SwGlossaries::GetDefName() +{ + return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "standard" )); + +} + +/*------------------------------------------------------------------------ + Beschreibung: Liefert die Anzahl der Textbausteingruppen +------------------------------------------------------------------------*/ +sal_uInt16 SwGlossaries::GetGroupCnt() +{ + return GetNameList()->Count(); +} + +/*------------------------------------------------------------------------ + Beschreibung: Liefert den Gruppennamen +------------------------------------------------------------------------*/ +sal_Bool SwGlossaries::FindGroupName(String & rGroup) +{ + // enthaelt der Gruppenname keinen Pfad, kann hier ein passender + // Gruppeneintrag gesucht werden; + sal_uInt16 nCount = GetGroupCnt(); + sal_uInt16 i; + for(i= 0; i < nCount; i++) + { + String sTemp(GetGroupName(i)); + if(rGroup.Equals( sTemp.GetToken(0, GLOS_DELIM))) + { + rGroup = sTemp; + return sal_True; + } + } + //man darf zweimal suchen, denn bei mehreren Verzeichnissen koennte + //der caseinsensitive Name mehrfach auftreten + const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore(); + for(i = 0; i < nCount; i++) + { + String sTemp( GetGroupName( i )); + sal_uInt16 nPath = (sal_uInt16)sTemp.GetToken(1, GLOS_DELIM).ToInt32(); + + if( !SWUnoHelper::UCB_IsCaseSensitiveFileName( *(*m_pPathArr)[nPath] ) + && rSCmp.isEqual( rGroup, sTemp.GetToken( 0, GLOS_DELIM) ) ) + { + rGroup = sTemp; + return sal_True; + } + } + return sal_False; +} + +String SwGlossaries::GetGroupName(sal_uInt16 nGroupId) +{ + OSL_ENSURE(nGroupId < m_pGlosArr->Count(), "Textbausteinarray ueberindiziert"); + return *(*m_pGlosArr)[nGroupId]; +} + +String SwGlossaries::GetGroupTitle( const String& rGroupName ) +{ + String sRet; + String sGroup(rGroupName); + if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM)) + FindGroupName(sGroup); + SwTextBlocks* pGroup = GetGroupDoc(sGroup, sal_False); + if(pGroup) + { + sRet = pGroup->GetName(); + PutGroupDoc( pGroup ); + } + return sRet; +} + +/*------------------------------------------------------------------------ + Beschreibung: Liefert das Textbaustein-Dokument der Gruppe rName +------------------------------------------------------------------------*/ +SwTextBlocks* SwGlossaries::GetGroupDoc(const String &rName, + sal_Bool bCreate) const +{ + // gfs. in die Liste der Textbausteine eintragen + if(bCreate && m_pGlosArr) + { + const String aName(rName); + const sal_uInt16 nCount = m_pGlosArr->Count(); + sal_uInt16 i; + + for( i = 0; i < nCount; ++i) + { + const String *pName = (*m_pGlosArr)[i]; + if(*pName == aName) + break; + } + if(i == nCount) + { // Baustein nicht in der Liste + String *pTmp = new String(aName); + m_pGlosArr->Insert(pTmp, m_pGlosArr->Count()); + } + } + return GetGlosDoc( rName, bCreate ); +} + +/*------------------------------------------------------------------------ + Beschreibung: Loeschen Textblock +------------------------------------------------------------------------*/ +void SwGlossaries::PutGroupDoc(SwTextBlocks *pBlock) { + delete pBlock; +} + +/*------------------------------------------------------------------------ + Beschreibung: Erzeugt ein neues Dokument mit dem Gruppenname + Wird temp. auch als File angelegt, damit die + Gruppen auch spaeter (ohne Zugriff) vorhanden sind. +------------------------------------------------------------------------*/ +sal_Bool SwGlossaries::NewGroupDoc(String& rGroupName, const String& rTitle) +{ + sal_uInt16 nNewPath = (sal_uInt16)rGroupName.GetToken(1, GLOS_DELIM).ToInt32(); + String sNewFilePath(*(*m_pPathArr)[nNewPath]); + String sNewGroup = lcl_CheckFileName(sNewFilePath, rGroupName.GetToken(0, GLOS_DELIM)); + sNewGroup += GLOS_DELIM; + sNewGroup += rGroupName.GetToken(1, GLOS_DELIM); + SwTextBlocks *pBlock = GetGlosDoc( sNewGroup ); + if(pBlock) + { + String *pTmp = + new String(sNewGroup); + SvStrings* pList = GetNameList(); + pList->Insert(pTmp, pList->Count()); + pBlock->SetName(rTitle); + PutGroupDoc(pBlock); + rGroupName = sNewGroup; + return sal_True; + } + return sal_False; +} + +sal_Bool SwGlossaries::RenameGroupDoc( + const String& rOldGroup, String& rNewGroup, const String& rNewTitle ) +{ + sal_Bool bRet = sal_False; + sal_uInt16 nOldPath = (sal_uInt16)rOldGroup.GetToken(1, GLOS_DELIM).ToInt32(); + if(nOldPath < m_pPathArr->Count()) + { + String sOldFileURL(*(*m_pPathArr)[nOldPath]); + sOldFileURL += INET_PATH_TOKEN; + sOldFileURL += rOldGroup.GetToken(0, GLOS_DELIM); + sOldFileURL += SwGlossaries::GetExtension(); + sal_Bool bExist = FStatHelper::IsDocument( sOldFileURL ); + OSL_ENSURE(bExist, "group doesn't exist!"); + if(bExist) + { + sal_uInt16 nNewPath = (sal_uInt16)rNewGroup.GetToken(1, GLOS_DELIM).ToInt32(); + if( nNewPath < m_pPathArr->Count()) + { + String sNewFilePath(*(*m_pPathArr)[nNewPath]); + String sNewFileName = lcl_CheckFileName( + sNewFilePath, rNewGroup.GetToken(0, GLOS_DELIM)); + const sal_uInt16 nFileNameLen = sNewFileName.Len(); + sNewFileName += SwGlossaries::GetExtension(); + String sTempNewFilePath(sNewFilePath); + sTempNewFilePath += INET_PATH_TOKEN; + sTempNewFilePath += sNewFileName ; + bExist = FStatHelper::IsDocument( sTempNewFilePath ); + OSL_ENSURE(!bExist, "group already exists!"); + if(!bExist) + { + sal_Bool bCopyCompleted = SWUnoHelper::UCB_CopyFile( + sOldFileURL, sTempNewFilePath, sal_True ); + if(bCopyCompleted) + { + bRet = sal_True; + RemoveFileFromList( rOldGroup ); + + rNewGroup = sNewFileName.Copy(0, nFileNameLen); + rNewGroup += GLOS_DELIM; + rNewGroup += String::CreateFromInt32(nNewPath); + String *pTmp = new String(rNewGroup); + if(!m_pGlosArr) + GetNameList(); + else + m_pGlosArr->Insert(pTmp, m_pGlosArr->Count()); + + sNewFilePath += INET_PATH_TOKEN; + sNewFilePath += sNewFileName ; + SwTextBlocks* pNewBlock = new SwTextBlocks( sNewFilePath ); + pNewBlock->SetName(rNewTitle); + delete pNewBlock; + } + } + } + } + } + return bRet; +} + +/*------------------------------------------------------------------------ + Beschreibung: Loescht eine Textbausteingruppe +------------------------------------------------------------------------*/ +sal_Bool SwGlossaries::DelGroupDoc(const String &rName) +{ + sal_uInt16 nPath = (sal_uInt16)rName.GetToken(1, GLOS_DELIM).ToInt32(); + if(nPath >= m_pPathArr->Count()) + return sal_False; + String sFileURL(*(*m_pPathArr)[nPath]); + String aTmp( rName.GetToken(0, GLOS_DELIM)); + String aName(aTmp); + aName += GLOS_DELIM; + aName += String::CreateFromInt32(nPath); + + aTmp += SwGlossaries::GetExtension(); + sFileURL += INET_PATH_TOKEN; + sFileURL += aTmp; + // Auch, wenn das File nicht existiert, muss es aus der Liste + // der Textbausteinbereiche entfernt werden + // Kein && wegen CFfront + sal_Bool bRemoved = SWUnoHelper::UCB_DeleteFile( sFileURL ); + OSL_ENSURE(bRemoved, "file has not been removed"); + RemoveFileFromList( aName ); + return bRemoved; +} + +/*------------------------------------------------------------------------ + Beschreibung: DTOR +------------------------------------------------------------------------*/ +SwGlossaries::~SwGlossaries() +{ + sal_uInt16 nCount = m_pGlosArr? m_pGlosArr->Count() : 0; + sal_uInt16 i; + + for( i = 0; i < nCount; ++i) + { + String *pTmp = (*m_pGlosArr)[i]; + delete pTmp; + } + nCount = m_pPathArr? m_pPathArr->Count() : 0; + for(i = 0; i < nCount; ++i) + { + String *pTmp = (*m_pPathArr)[i]; + delete pTmp; + } + delete m_pGlosArr; + delete m_pPathArr; + + InvalidateUNOOjects(); +} + +/*------------------------------------------------------------------------ + Beschreibung: Bausteindokument einlesen +------------------------------------------------------------------------*/ +SwTextBlocks* SwGlossaries::GetGlosDoc( const String &rName, sal_Bool bCreate ) const +{ + sal_uInt16 nPath = (sal_uInt16)rName.GetToken(1, GLOS_DELIM).ToInt32(); + SwTextBlocks *pTmp = 0; + if(nPath < m_pPathArr->Count()) + { + String sFileURL(*(*m_pPathArr)[nPath]); + String aTmp( rName.GetToken(0, GLOS_DELIM)); + aTmp += SwGlossaries::GetExtension(); + sFileURL += INET_PATH_TOKEN; + sFileURL += aTmp; + + sal_Bool bExist = sal_False; + if(!bCreate) + bExist = FStatHelper::IsDocument( sFileURL ); + + if (bCreate || bExist) + { + pTmp = new SwTextBlocks( sFileURL ); + sal_Bool bOk = sal_True; + if( pTmp->GetError() ) + { + ErrorHandler::HandleError( pTmp->GetError() ); + bOk = !IsError( pTmp->GetError() ); + } + + if( bOk && !pTmp->GetName().Len() ) + pTmp->SetName( rName ); + } + } + + return pTmp; +} + +/*------------------------------------------------------------------------ + Beschreibung: Zugriff auf die Liste der Name; diese wird gfs. eingelesen +------------------------------------------------------------------------*/ +SvStrings* SwGlossaries::GetNameList() +{ + if( !m_pGlosArr ) + { + m_pGlosArr = new SvStrings; + String sExt( SwGlossaries::GetExtension() ); + for( sal_uInt16 i = 0; i < m_pPathArr->Count(); i++ ) + { + SvStrings aFiles( 16, 16 ); + + SWUnoHelper::UCB_GetFileListOfFolder( *(*m_pPathArr)[i], aFiles, + &sExt ); + for( sal_uInt16 nFiles = 0, nFEnd = aFiles.Count(); + nFiles < nFEnd; ++nFiles ) + { + String* pTitle = aFiles[ nFiles ]; + String sName( pTitle->Copy( 0, pTitle->Len() - sExt.Len() )); + sName += GLOS_DELIM; + sName += String::CreateFromInt32( i ); + m_pGlosArr->Insert( new String(sName), m_pGlosArr->Count() ); + + // don't need any more these pointers + delete pTitle; + } + } + if(!m_pGlosArr->Count()) + { + // Der Standard-Baustein steht im ersten Teil des Pfades + String *pTmp = new String( SwGlossaries::GetDefName() ); + (*pTmp) += GLOS_DELIM; + (*pTmp) += '0'; + m_pGlosArr->Insert(pTmp, m_pGlosArr->Count()); + } + } + return m_pGlosArr; +} + +/*------------------------------------------------------------------------ + Beschreibung: CTOR +------------------------------------------------------------------------*/ +SwGlossaries::SwGlossaries() : + m_pPathArr(0), + m_pGlosArr(0) +{ + m_pPathArr = new SvStrings; + UpdateGlosPath(sal_True); +} + +/*------------------------------------------------------------------------ + Beschreibung: Neuen Pfad einstellen und internes Array neu aufbauen +------------------------------------------------------------------------*/ + +/* -------------------------------------------------- +* #61050# Doppelte Pfade fuehren zu Verwirrung - als raus damit + * --------------------------------------------------*/ +sal_Bool lcl_FindSameEntry(const SvStrings& rDirArr, const String& rEntryURL) +{ + for(sal_uInt16 i = 0; i < rDirArr.Count(); i++) + if(rEntryURL == (*rDirArr.GetObject(i))) + return sal_True; + return sal_False; +} + +void SwGlossaries::UpdateGlosPath(sal_Bool bFull) +{ + SvtPathOptions aPathOpt; + String aNewPath( aPathOpt.GetAutoTextPath() ); + sal_Bool bPathChanged = m_aPath != aNewPath; + if (bFull || bPathChanged) + { + m_aPath = aNewPath; + sal_uInt16 nCount = m_pPathArr? m_pPathArr->Count() : 0; + sal_uInt16 i; + + for( i = nCount; i; --i) + { + String *pTmp = (*m_pPathArr)[i - 1]; + m_pPathArr->Remove(i - 1); + delete pTmp; + } + sal_uInt16 nTokenCount = m_aPath.GetTokenCount(SVT_SEARCHPATH_DELIMITER); + SvStrings aDirArr; + for( i = 0; i < nTokenCount; i++ ) + { + String sPth(m_aPath.GetToken(i, SVT_SEARCHPATH_DELIMITER)); + sPth = URIHelper::SmartRel2Abs( + INetURLObject(), sPth, URIHelper::GetMaybeFileHdl()); + + if(i && lcl_FindSameEntry(aDirArr, sPth)) + { + continue; + } + aDirArr.Insert(new String(sPth), aDirArr.Count()); + if( !FStatHelper::IsFolder( sPth ) ) + { + if( m_sErrPath.Len() ) + m_sErrPath += SVT_SEARCHPATH_DELIMITER; + INetURLObject aTemp( sPth ); + m_sErrPath += String(aTemp.GetFull()); + } + else + m_pPathArr->Insert(new String(sPth), m_pPathArr->Count()); + } + aDirArr.DeleteAndDestroy(0, aDirArr.Count()); + + if(!nTokenCount || + (m_sErrPath.Len() && (bPathChanged || m_sOldErrPath != m_sErrPath)) ) + { + m_sOldErrPath = m_sErrPath; + // Falscher Pfad, d.h. AutoText-Verzeichnis existiert nicht + + ErrorHandler::HandleError( *new StringErrorInfo( + ERR_AUTOPATH_ERROR, m_sErrPath, + ERRCODE_BUTTON_OK | ERRCODE_MSG_ERROR )); + m_bError = sal_True; + } + else + m_bError = sal_False; + + if(m_pGlosArr) + { + for(i = 0; i < m_pGlosArr->Count(); ++i) + { + delete (String *)(*m_pGlosArr)[i]; + } + DELETEZ(m_pGlosArr); + GetNameList(); + } + } +} + +void SwGlossaries::ShowError() +{ + sal_uInt32 nPathError = *new StringErrorInfo(ERR_AUTOPATH_ERROR, + m_sErrPath, ERRCODE_BUTTON_OK ); + ErrorHandler::HandleError( nPathError ); +} + +String SwGlossaries::GetExtension() +{ + return String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( ".bau" )); +} + +void SwGlossaries::RemoveFileFromList( const String& rGroup ) +{ + if(m_pGlosArr) + { + const sal_uInt16 nCount = m_pGlosArr->Count(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + String *pTmp = (*m_pGlosArr)[i]; + if(*pTmp == rGroup) + { + rtl::OUString aUName = rGroup; + { + // tell the UNO AutoTextGroup object that it's not valid anymore + for ( UnoAutoTextGroups::iterator aLoop = m_aGlossaryGroups.begin(); + aLoop != m_aGlossaryGroups.end(); + ++aLoop + ) + { + Reference< container::XNamed > xNamed( aLoop->get(), UNO_QUERY ); + if ( xNamed.is() && ( xNamed->getName() == aUName ) ) + { + static_cast< SwXAutoTextGroup* >( xNamed.get() )->Invalidate(); + // note that this static_cast works because we know that the array only + // contains SwXAutoTextGroup implementation + m_aGlossaryGroups.erase( aLoop ); + break; + } + } + } + + { + // tell all our UNO AutoTextEntry objects that they're not valid anymore + for ( UnoAutoTextEntries::iterator aLoop = m_aGlossaryEntries.begin(); + aLoop != m_aGlossaryEntries.end(); + ) + { + Reference< lang::XUnoTunnel > xEntryTunnel( aLoop->get(), UNO_QUERY ); + + SwXAutoTextEntry* pEntry = NULL; + if ( xEntryTunnel.is() ) + pEntry = reinterpret_cast< SwXAutoTextEntry* >( + xEntryTunnel->getSomething( SwXAutoTextEntry::getUnoTunnelId() ) ); + + if ( pEntry && ( pEntry->GetGroupName() == rGroup ) ) + { + pEntry->Invalidate(); + aLoop = m_aGlossaryEntries.erase( aLoop ); + } + else + ++aLoop; + } + } + + m_pGlosArr->Remove(i); + delete pTmp; + break; + } + } + } +} + +String SwGlossaries::GetCompleteGroupName( const rtl::OUString& GroupName ) +{ + sal_uInt16 nCount = GetGroupCnt(); + //wenn der Gruppenname intern erzeugt wurde, dann steht auch hier der Pfad drin + String sGroup(GroupName); + String sGroupName(sGroup.GetToken(0, GLOS_DELIM)); + String sPath = sGroup.GetToken(1, GLOS_DELIM); + sal_Bool bPathLen = sPath.Len() > 0; + for ( sal_uInt16 i = 0; i < nCount; i++ ) + { + String sGrpName = GetGroupName(i); + if(bPathLen ? sGroup == sGrpName : sGroupName == sGrpName.GetToken(0, GLOS_DELIM)) + { + return sGrpName; + } + } + return aEmptyStr; +} + +void SwGlossaries::InvalidateUNOOjects() +{ + // invalidate all the AutoTextGroup-objects + for ( UnoAutoTextGroups::iterator aGroupLoop = m_aGlossaryGroups.begin(); + aGroupLoop != m_aGlossaryGroups.end(); + ++aGroupLoop + ) + { + Reference< text::XAutoTextGroup > xGroup( aGroupLoop->get(), UNO_QUERY ); + if ( xGroup.is() ) + static_cast< SwXAutoTextGroup* >( xGroup.get() )->Invalidate(); + } + UnoAutoTextGroups aTmpg = UnoAutoTextGroups(); + m_aGlossaryGroups.swap( aTmpg ); + + // invalidate all the AutoTextEntry-objects + for ( UnoAutoTextEntries::const_iterator aEntryLoop = m_aGlossaryEntries.begin(); + aEntryLoop != m_aGlossaryEntries.end(); + ++aEntryLoop + ) + { + Reference< lang::XUnoTunnel > xEntryTunnel( aEntryLoop->get(), UNO_QUERY ); + SwXAutoTextEntry* pEntry = NULL; + if ( xEntryTunnel.is() ) + pEntry = reinterpret_cast< SwXAutoTextEntry* >( + xEntryTunnel->getSomething( SwXAutoTextEntry::getUnoTunnelId() ) ); + + if ( pEntry ) + pEntry->Invalidate(); + } + UnoAutoTextEntries aTmpe = UnoAutoTextEntries(); + m_aGlossaryEntries.swap( aTmpe ); +} + +Reference< text::XAutoTextGroup > SwGlossaries::GetAutoTextGroup( const ::rtl::OUString& _rGroupName, bool _bCreate ) +{ + // first, find the name with path-extension + String sCompleteGroupName = GetCompleteGroupName( _rGroupName ); + + Reference< text::XAutoTextGroup > xGroup; + + // look up the group in the cache + UnoAutoTextGroups::iterator aSearch = m_aGlossaryGroups.begin(); + for ( ; aSearch != m_aGlossaryGroups.end(); ) + { + Reference< lang::XUnoTunnel > xGroupTunnel( aSearch->get(), UNO_QUERY ); + + SwXAutoTextGroup* pSwGroup = 0; + if ( xGroupTunnel.is() ) + pSwGroup = reinterpret_cast< SwXAutoTextGroup* >( xGroupTunnel->getSomething( SwXAutoTextGroup::getUnoTunnelId() ) ); + + if ( !pSwGroup ) + { + // the object is dead in the meantime -> remove from cache + aSearch = m_aGlossaryGroups.erase( aSearch ); + continue; + } + + if ( _rGroupName == pSwGroup->getName() ) + { // the group is already cached + if ( sCompleteGroupName.Len() ) + { // the group still exists -> return it + xGroup = pSwGroup; + break; + } + else + { + // this group does not exist (anymore) -> release the cached UNO object for it + aSearch = m_aGlossaryGroups.erase( aSearch ); + // so it won't be created below + _bCreate = sal_False; + break; + } + } + + ++aSearch; + } + + if ( !xGroup.is() && _bCreate ) + { + xGroup = new SwXAutoTextGroup( sCompleteGroupName, this ); + // cache it + m_aGlossaryGroups.push_back( AutoTextGroupRef( xGroup ) ); + } + + return xGroup; +} + +Reference< text::XAutoTextEntry > SwGlossaries::GetAutoTextEntry( const String& _rCompleteGroupName, const ::rtl::OUString& _rGroupName, const ::rtl::OUString& _rEntryName, + bool _bCreate ) +{ + //standard must be created + sal_Bool bCreate = ( _rCompleteGroupName == GetDefName() ); + ::std::auto_ptr< SwTextBlocks > pGlosGroup( GetGroupDoc( _rCompleteGroupName, bCreate ) ); + + if ( pGlosGroup.get() && !pGlosGroup->GetError() ) + { + sal_uInt16 nIdx = pGlosGroup->GetIndex( _rEntryName ); + if ( USHRT_MAX == nIdx ) + throw container::NoSuchElementException(); + } + else + throw lang::WrappedTargetException(); + + Reference< text::XAutoTextEntry > xReturn; + String sGroupName( _rGroupName ); + String sEntryName( _rEntryName ); + + UnoAutoTextEntries::iterator aSearch( m_aGlossaryEntries.begin() ); + for ( ; aSearch != m_aGlossaryEntries.end(); ) + { + Reference< lang::XUnoTunnel > xEntryTunnel( aSearch->get(), UNO_QUERY ); + + SwXAutoTextEntry* pEntry = NULL; + if ( xEntryTunnel.is() ) + pEntry = reinterpret_cast< SwXAutoTextEntry* >( xEntryTunnel->getSomething( SwXAutoTextEntry::getUnoTunnelId() ) ); + else + { + // the object is dead in the meantime -> remove from cache + aSearch = m_aGlossaryEntries.erase( aSearch ); + continue; + } + + if ( pEntry + && ( COMPARE_EQUAL == pEntry->GetGroupName().CompareTo( sGroupName ) ) + && ( COMPARE_EQUAL == pEntry->GetEntryName().CompareTo( sEntryName ) ) + ) + { + xReturn = pEntry; + break; + } + + ++aSearch; + } + + if ( !xReturn.is() && _bCreate ) + { + xReturn = new SwXAutoTextEntry( this, sGroupName, sEntryName ); + // cache it + m_aGlossaryEntries.push_back( AutoTextEntryRef( xReturn ) ); + } + + return xReturn; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/glossary.cxx b/sw/source/ui/misc/glossary.cxx new file mode 100644 index 000000000000..24e3417747c0 --- /dev/null +++ b/sw/source/ui/misc/glossary.cxx @@ -0,0 +1,1228 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + +#define _SVSTDARR_STRINGSDTOR +#define _SVSTDARR_STRINGS +#include <hintids.hxx> + +#include <vcl/menu.hxx> +#include <vcl/msgbox.hxx> +#include <vcl/help.hxx> +#include <svl/svstdarr.hxx> +#include <svl/stritem.hxx> +#include <unotools/pathoptions.hxx> +#include <unotools/lingucfg.hxx> +#include <sfx2/request.hxx> +#include <sfx2/fcontnr.hxx> + +#include <svx/svxdlg.hxx> +#include <svx/dialogs.hrc> +#include <editeng/acorrcfg.hxx> +#include <sfx2/viewfrm.hxx> +#include <unocrsr.hxx> +#include <unotools.hxx> +#include <comphelper/processfactory.hxx> +#include <ucbhelper/content.hxx> +#include <com/sun/star/ui/dialogs/XFilePicker.hpp> +#include <com/sun/star/ui/dialogs/XFilterManager.hpp> +#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> +#include <svl/urihelper.hxx> +#include <unotools/charclass.hxx> +#include <swwait.hxx> +#include <swtypes.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <basesh.hxx> +#include <glossary.hxx> +#include <gloshdl.hxx> +#include <glosbib.hxx> +#include <initui.hxx> // fuer ::GetGlossaries() +#include <glosdoc.hxx> +#include <macassgn.hxx> +#include <swevent.hxx> +#include <docsh.hxx> +#include <shellio.hxx> + +#include <cmdid.h> +#include <helpid.h> +#include <swerror.h> +#include <globals.hrc> +#include <misc.hrc> +#include <glossary.hrc> +#include <swmodule.hxx> +#include <sfx2/filedlghelper.hxx> + +#include "access.hrc" + +#define LONG_LENGTH 60 +#define SHORT_LENGTH 30 + + +using namespace ::com::sun::star; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::ucb; +using namespace ::com::sun::star::ui::dialogs; +using namespace ::comphelper; +using namespace ::ucbhelper; +using ::rtl::OUString; +using namespace ::sfx2; + +String lcl_GetValidShortCut( const String& rName ) +{ + const sal_uInt16 nSz = rName.Len(); + + if ( 0 == nSz ) + return rName; + + sal_uInt16 nStart = 1; + while( rName.GetChar( nStart-1 ) == ' ' && nStart < nSz ) + nStart++; + + String aBuf( rName.GetChar( nStart-1 )); + + for( ; nStart < nSz; ++nStart ) + { + if( rName.GetChar( nStart-1 ) == ' ' && rName.GetChar( nStart ) != ' ') + aBuf += rName.GetChar( nStart ); + } + return aBuf; +} + +struct GroupUserData +{ + String sGroupName; + sal_uInt16 nPathIdx; + sal_Bool bReadonly; + + GroupUserData() + : nPathIdx(0), + bReadonly(sal_False) {} +}; + +/*------------------------------------------------------------------------ + Beschreibung: Dialog fuer neuen Bausteinnamen +------------------------------------------------------------------------*/ +class SwNewGlosNameDlg : public ModalDialog +{ + FixedText aNNFT; + Edit aNewName; + FixedText aNSFT; + NoSpaceEdit aNewShort; + OKButton aOk; + CancelButton aCancel; + FixedText aONFT; + Edit aOldName; + FixedText aOSFT; + Edit aOldShort; + FixedLine aFL; + +protected: + DECL_LINK( Modify, Edit * ); + DECL_LINK( Rename, Button * ); + +public: + SwNewGlosNameDlg( Window* pParent, + const String& rOldName, + const String& rOldShort ); + + String GetNewName() const { return aNewName.GetText(); } + String GetNewShort() const { return aNewShort.GetText(); } +}; + +SwNewGlosNameDlg::SwNewGlosNameDlg(Window* pParent, + const String& rOldName, + const String& rOldShort ) : + ModalDialog( pParent, SW_RES( DLG_RENAME_GLOS ) ), + aNNFT (this, SW_RES( FT_NN )), + aNewName(this, SW_RES( ED_NN )), + aNSFT (this, SW_RES( FT_NS )), + aNewShort(this,SW_RES( ED_NS )), + aOk (this, SW_RES( BT_OKNEW)), + aCancel (this, SW_RES( BT_CANCEL)), + aONFT (this, SW_RES( FT_ON )), + aOldName(this, SW_RES( ED_ON )), + aOSFT (this, SW_RES( FT_OS )), + aOldShort(this,SW_RES( ED_OS )), + aFL (this, SW_RES( FL_NN )) + +{ + FreeResource(); + aOldName.SetText( rOldName ); + aOldShort.SetText( rOldShort ); + aNewShort.SetMaxTextLen(SHORT_LENGTH); + aNewName.SetMaxTextLen(LONG_LENGTH); + aNewName.SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify )); + aNewShort.SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify )); + aOk.SetClickHdl(LINK(this, SwNewGlosNameDlg, Rename )); + aNewName.GrabFocus(); +} + +/*------------------------------------------------------------------------ + Beschreibung: aktuell eingestellte Gruppe erfragen / setzen +------------------------------------------------------------------------*/ +String SwGlossaryDlg::GetCurrGroup() +{ + if( ::GetCurrGlosGroup() && ::GetCurrGlosGroup()->Len() ) + return *(::GetCurrGlosGroup()); + return SwGlossaries::GetDefName(); +} + +void SwGlossaryDlg::SetActGroup(const String &rGrp) +{ + if( !::GetCurrGlosGroup() ) + ::SetCurrGlosGroup( new String ); + *(::GetCurrGlosGroup()) = rGrp; +} + +SwGlossaryDlg::SwGlossaryDlg(SfxViewFrame* pViewFrame, + SwGlossaryHdl * pGlosHdl, SwWrtShell *pWrtShell) : + + SvxStandardDialog(&pViewFrame->GetWindow(), SW_RES(DLG_GLOSSARY)), + + aInsertTipCB (this, SW_RES(CB_INSERT_TIP)), + aNameLbl (this, SW_RES(FT_NAME)), + aNameED (this, SW_RES(ED_NAME)), + aShortNameLbl (this, SW_RES(FT_SHORTNAME)), + aShortNameEdit(this, SW_RES(ED_SHORTNAME)), + aCategoryBox (this, SW_RES(LB_BIB)), + aRelativeFL (this, SW_RES(FL_RELATIVE)), + aFileRelCB (this, SW_RES(CB_FILE_REL)), + aNetRelCB (this, SW_RES(CB_NET_REL)), + aExampleWIN (this, SW_RES(WIN_EXAMPLE )), + aExampleDummyWIN(this, SW_RES(WIN_EXAMPLE_DUMMY )), + aShowExampleCB(this, SW_RES(CB_SHOW_EXAMPLE )), + aInsertBtn (this, SW_RES(PB_INSERT)), + aCloseBtn (this, SW_RES(PB_CLOSE)), + aHelpBtn (this, SW_RES(PB_HELP)), + aEditBtn (this, SW_RES(PB_EDIT)), + aBibBtn (this, SW_RES(PB_BIB)), + aPathBtn (this, SW_RES(PB_PATH)), + + sReadonlyPath (SW_RES(ST_READONLY_PATH)), + pExampleFrame(0), + + pMenu (new PopupMenu(SW_RES(MNU_EDIT))), + pGlossaryHdl (pGlosHdl), + + bResume(sal_False), + + bSelection( pWrtShell->IsSelection() ), + bReadOnly( sal_False ), + bIsOld( sal_False ), + bIsDocReadOnly(sal_False), + + pSh (pWrtShell) +{ + SvtLinguConfig aLocalLinguConfig; + + // Static-Pointer initialisieren + if( !::GetCurrGlosGroup() ) + ::SetCurrGlosGroup(new String);//(SwGlossaries::GetDefName()); + + pMenu->SetActivateHdl(LINK(this,SwGlossaryDlg,EnableHdl)); + pMenu->SetSelectHdl(LINK(this,SwGlossaryDlg,MenuHdl)); + aEditBtn.SetPopupMenu(pMenu); + aEditBtn.SetSelectHdl(LINK(this,SwGlossaryDlg,EditHdl)); + aPathBtn.SetClickHdl(LINK(this, SwGlossaryDlg, PathHdl)); + + aNameED.SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify)); + aShortNameEdit.SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify)); + + aCategoryBox.SetDoubleClickHdl(LINK(this,SwGlossaryDlg, NameDoubleClick)); + aCategoryBox.SetSelectHdl(LINK(this,SwGlossaryDlg,GrpSelect)); + aBibBtn.SetClickHdl(LINK(this,SwGlossaryDlg,BibHdl)); + aShowExampleCB.SetClickHdl(LINK(this, SwGlossaryDlg, ShowPreviewHdl)); + + aShortNameEdit.SetMaxTextLen(SHORT_LENGTH); + aNameED.SetMaxTextLen(LONG_LENGTH); + FreeResource(); + + const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); + + aShowExampleCB.Check( pCfg->IsAutoTextPreview()); + ShowPreviewHdl(&aShowExampleCB); + + bIsDocReadOnly = pSh->GetView().GetDocShell()->IsReadOnly() || + pSh->HasReadonlySel(); + if( bIsDocReadOnly ) + aInsertBtn.Enable(sal_False); + aNameED.GrabFocus(); + aCategoryBox.SetHelpId(HID_MD_GLOS_CATEGORY); + aCategoryBox.SetStyle(aCategoryBox.GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL|WB_VSCROLL|WB_CLIPCHILDREN|WB_SORT); + aCategoryBox.GetModel()->SetSortMode(SortAscending); + aCategoryBox.SetHighlightRange(); // ueber volle Breite selektieren + aCategoryBox.SetNodeDefaultImages( ); + aCategoryBox.SetAccessibleName(SW_RES(STR_ACCESS_SW_CATEGORY)); + aCategoryBox.SetAccessibleRelationLabeledBy(&aInsertTipCB); + + Init(); +} + +SwGlossaryDlg::~SwGlossaryDlg() +{ + SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); + pCfg->SetAutoTextPreview(aShowExampleCB.IsChecked()) ; + + aCategoryBox.Clear(); + aEditBtn.SetPopupMenu(0); + delete pMenu; + delete pExampleFrame; +} + +/*------------------------------------------------------------------------ + Beschreibung: Auswahl neue Gruppe +------------------------------------------------------------------------*/ +IMPL_LINK( SwGlossaryDlg, GrpSelect, SvTreeListBox *, pBox ) +{ + SvLBoxEntry* pEntry = pBox->FirstSelected(); + if(!pEntry) + return 0; + SvLBoxEntry* pParent = pBox->GetParent(pEntry) ? pBox->GetParent(pEntry) : pEntry; + GroupUserData* pGroupData = (GroupUserData*)pParent->GetUserData(); + String *pGlosGroup = ::GetCurrGlosGroup(); + (*pGlosGroup) = pGroupData->sGroupName; + (*pGlosGroup) += GLOS_DELIM; + (*pGlosGroup) += String::CreateFromInt32(pGroupData->nPathIdx); + pGlossaryHdl->SetCurGroup(*pGlosGroup); + // Aktuellen Textbaustein setzen + bReadOnly = pGlossaryHdl->IsReadOnly(); + EnableShortName( !bReadOnly ); + aEditBtn.Enable(!bReadOnly); + bIsOld = pGlossaryHdl->IsOld(); + if( pParent != pEntry) + { + String aName(pBox->GetEntryText(pEntry)); + aNameED.SetText(aName); + aShortNameEdit.SetText(*(String*)pEntry->GetUserData()); + pEntry = pBox->GetParent(pEntry); + aInsertBtn.Enable( !bIsDocReadOnly); + ShowAutoText(*::GetCurrGlosGroup(), aShortNameEdit.GetText()); + } + else + ShowAutoText(aEmptyStr, aEmptyStr); + //Controls aktualisieren + NameModify(&aShortNameEdit); + if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) ) + { + SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_SET_ACT_GLOSSARY ); + String sTemp(*::GetCurrGlosGroup()); + // der nullte Pfad wird nicht aufgezeichnet! + if('0' == sTemp.GetToken(1, GLOS_DELIM).GetChar(0)) + sTemp = sTemp.GetToken(0, GLOS_DELIM); + aReq.AppendItem(SfxStringItem(FN_SET_ACT_GLOSSARY, sTemp)); + aReq.Done(); + } + return 0; +} + +void SwGlossaryDlg::Apply() +{ + const String aGlosName(aShortNameEdit.GetText()); + if(aGlosName.Len()) pGlossaryHdl->InsertGlossary(aGlosName); + if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) ) + { + SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_INSERT_GLOSSARY ); + String sTemp(*::GetCurrGlosGroup()); + // der nullte Pfad wird nicht aufgezeichnet! + if('0' == sTemp.GetToken(1, GLOS_DELIM).GetChar(0)) + sTemp = sTemp.GetToken(0, GLOS_DELIM); + aReq.AppendItem(SfxStringItem(FN_INSERT_GLOSSARY, sTemp)); + aReq.AppendItem(SfxStringItem(FN_PARAM_1, aGlosName)); + aReq.Done(); + } +} + +/* inline */ void SwGlossaryDlg::EnableShortName(sal_Bool bOn) +{ + aShortNameLbl.Enable(bOn); + aShortNameEdit.Enable(bOn); +} + +/* -------------------------------------------------- + * existiert der Titel in der ausgewaehlten Gruppe? + * --------------------------------------------------*/ +SvLBoxEntry* SwGlossaryDlg::DoesBlockExist(const String& rBlock, + const String& rShort) +{ + //evtl. vorhandenen Eintrag in der TreeListBox suchen + SvLBoxEntry* pEntry = aCategoryBox.FirstSelected(); + if(pEntry) + { + if(aCategoryBox.GetParent(pEntry)) + pEntry = aCategoryBox.GetParent(pEntry); + sal_uInt32 nChildCount = aCategoryBox.GetChildCount( pEntry ); + for(sal_uInt32 i = 0; i < nChildCount; i++) + { + SvLBoxEntry* pChild = aCategoryBox.GetEntry( pEntry, i ); + if(rBlock == aCategoryBox.GetEntryText(pChild) && + (!rShort.Len() || rShort == *(String*)pChild->GetUserData())) + { + return pChild; + } + } + } + return 0; +} + +IMPL_LINK( SwGlossaryDlg, NameModify, Edit *, pEdit ) +{ + String aName(aNameED.GetText()); + sal_Bool bNameED = pEdit == &aNameED; + if( !aName.Len() ) + { + if(bNameED) + aShortNameEdit.SetText(aName); + aInsertBtn.Enable(sal_False); + return 0; + } + String sShortSearch; + if(!bNameED) + sShortSearch = pEdit->GetText(); + sal_Bool bNotFound = !DoesBlockExist(aName, sShortSearch); + if(bNameED) + { + // ist der Text durch einen Klick in die Listbox in das + // Edit gekommem? + if(bNotFound) + { + aShortNameEdit.SetText( lcl_GetValidShortCut( aName ) ); + EnableShortName(); + } + else + { + aShortNameEdit.SetText(pGlossaryHdl->GetGlossaryShortName(aName)); + EnableShortName(!bReadOnly); + } + aInsertBtn.Enable(!bNotFound && !bIsDocReadOnly); + } + else + { + //ShortNameEdit + if(!bNotFound) + { + sal_Bool bEnable = !bNotFound; + bEnable &= !bIsDocReadOnly; + aInsertBtn.Enable(bEnable); + } + } + return 0; +} + +IMPL_LINK_INLINE_START( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, pBox ) +{ + SvLBoxEntry* pEntry = pBox->FirstSelected(); + if(pBox->GetParent(pEntry) && !bIsDocReadOnly) + EndDialog( RET_OK ); + return 0; +} +IMPL_LINK_INLINE_END( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, EMPTYARG ) + +IMPL_LINK( SwGlossaryDlg, EnableHdl, Menu *, pMn ) +{ + const String aEditText(aNameED.GetText()); + const sal_Bool bHasEntry = aEditText.Len() && aShortNameEdit.GetText().Len(); + const sal_Bool bExists = 0 != DoesBlockExist(aEditText, aShortNameEdit.GetText()); + pMn->EnableItem(FN_GL_DEFINE, bSelection && bHasEntry && !bExists); + pMn->EnableItem(FN_GL_DEFINE_TEXT, bSelection && bHasEntry && !bExists); + pMn->EnableItem(FN_GL_COPY_TO_CLIPBOARD, bExists); + pMn->EnableItem(FN_GL_REPLACE, bSelection && bExists && !bIsOld ); + pMn->EnableItem(FN_GL_REPLACE_TEXT, bSelection && bExists && !bIsOld ); + pMn->EnableItem(FN_GL_EDIT, bExists ); + pMn->EnableItem(FN_GL_RENAME, bExists ); + pMn->EnableItem(FN_GL_DELETE, bExists ); + pMn->EnableItem(FN_GL_MACRO, bExists && !bIsOld && + !pGlossaryHdl->IsReadOnly() ); + + SvLBoxEntry* pEntry = aCategoryBox.FirstSelected(); + sal_Bool bEnable = sal_False; + if ( pEntry ) + bEnable = !aCategoryBox.GetParent( pEntry ) && !bIsOld && !pGlossaryHdl->IsReadOnly(); + pMn->EnableItem( FN_GL_IMPORT, bEnable ); + return 1; +} + +IMPL_LINK( SwGlossaryDlg, MenuHdl, Menu *, pMn ) +{ + sal_Bool bNoAttr = sal_False; + + switch(pMn->GetCurItemId()) + { + case FN_GL_REPLACE: + case FN_GL_REPLACE_TEXT: + pGlossaryHdl->NewGlossary( aNameED.GetText(), + aShortNameEdit.GetText(), + sal_False, + pMn->GetCurItemId() == FN_GL_REPLACE_TEXT); + break; + case FN_GL_DEFINE_TEXT: + bNoAttr = sal_True; + // Kein break!!! + case FN_GL_DEFINE: + { + const String aStr(aNameED.GetText()); + const String aShortName(aShortNameEdit.GetText()); + if(pGlossaryHdl->HasShortName(aShortName)) + { + InfoBox(this, SW_RES(MSG_DOUBLE_SHORTNAME)).Execute(); + aShortNameEdit.SetSelection(Selection(0, SELECTION_MAX)); + aShortNameEdit.GrabFocus(); + break; + } + if(pGlossaryHdl->NewGlossary(aStr, aShortName, sal_False, bNoAttr )) + { + SvLBoxEntry* pEntry = aCategoryBox.FirstSelected(); + if(aCategoryBox.GetParent(pEntry)) + pEntry = aCategoryBox.GetParent(pEntry); + + SvLBoxEntry* pChild = aCategoryBox.InsertEntry(aStr, pEntry); + pChild->SetUserData(new String(aShortName)); + aNameED.SetText(aStr); + aShortNameEdit.SetText(aShortName); + NameModify(&aNameED); // fuer Schalten der Buttons + + if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) ) + { + SfxRequest aReq(pSh->GetView().GetViewFrame(), FN_NEW_GLOSSARY); + String sTemp(*::GetCurrGlosGroup()); + // der nullte Pfad wird nicht aufgezeichnet! + if('0' == sTemp.GetToken(1, GLOS_DELIM).GetChar(0)) + sTemp = sTemp.GetToken(0, GLOS_DELIM); + aReq.AppendItem(SfxStringItem(FN_NEW_GLOSSARY, sTemp)); + aReq.AppendItem(SfxStringItem(FN_PARAM_1, aShortName)); + aReq.AppendItem(SfxStringItem(FN_PARAM_2, aStr)); + aReq.Done(); + } + } + } + break; + case FN_GL_COPY_TO_CLIPBOARD : + { + pGlossaryHdl->CopyToClipboard(*pSh, aShortNameEdit.GetText()); + } + break; + case FN_GL_EDIT: + break; + case FN_GL_RENAME: + { + aShortNameEdit.SetText(pGlossaryHdl->GetGlossaryShortName(aNameED.GetText())); + SwNewGlosNameDlg* pNewNameDlg = new SwNewGlosNameDlg(this, aNameED.GetText(), + aShortNameEdit.GetText() ); + if( RET_OK == pNewNameDlg->Execute() && + pGlossaryHdl->Rename( aShortNameEdit.GetText(), + pNewNameDlg->GetNewShort(), + pNewNameDlg->GetNewName())) + { + SvLBoxEntry* pEntry = aCategoryBox.FirstSelected(); + SvLBoxEntry* pNewEntry = aCategoryBox.InsertEntry( + pNewNameDlg->GetNewName(), aCategoryBox.GetParent(pEntry)); + pNewEntry->SetUserData(new String(pNewNameDlg->GetNewShort())); + delete (String*)pEntry->GetUserData(); + aCategoryBox.GetModel()->Remove(pEntry); + aCategoryBox.Select(pNewEntry); + aCategoryBox.MakeVisible(pNewEntry); + } + GrpSelect( &aCategoryBox ); + delete pNewNameDlg; + } + break; + case FN_GL_DELETE: + { + QueryBox aQuery(this, SW_RES(MSG_QUERY_DELETE)); + if(RET_YES == aQuery.Execute()) + { + const String aShortName(aShortNameEdit.GetText()); + const String aTitle(aNameED.GetText()); + if(aTitle.Len() && pGlossaryHdl->DelGlossary(aShortName)) + { + SvLBoxEntry* pChild = DoesBlockExist(aTitle, aShortName); + OSL_ENSURE(pChild, "entry not found!"); + SvLBoxEntry* pParent = aCategoryBox.GetParent(pChild); + aCategoryBox.Select(pParent); + + aCategoryBox.GetModel()->Remove(pChild); + aNameED.SetText( aEmptyStr ); + NameModify(&aNameED); + } + } + } + break; + case FN_GL_MACRO: + { + SfxItemSet aSet( pSh->GetAttrPool(), RES_FRMMACRO, RES_FRMMACRO, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 ); + + SvxMacro aStart(aEmptyStr, aEmptyStr, STARBASIC); + SvxMacro aEnd(aEmptyStr, aEmptyStr, STARBASIC); + pGlossaryHdl->GetMacros(aShortNameEdit.GetText(), aStart, aEnd ); + + SvxMacroItem aItem(RES_FRMMACRO); + if( aStart.GetMacName().Len() ) + aItem.SetMacro( SW_EVENT_START_INS_GLOSSARY, aStart ); + if( aEnd.GetMacName().Len() ) + aItem.SetMacro( SW_EVENT_END_INS_GLOSSARY, aEnd ); + + aSet.Put( aItem ); + aSet.Put( SwMacroAssignDlg::AddEvents( MACASSGN_AUTOTEXT ) ); + + const SfxPoolItem* pItem; + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( this, aSet, + pSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(), SID_EVENTCONFIG ); + if ( pMacroDlg && pMacroDlg->Execute() == RET_OK && + SFX_ITEM_SET == pMacroDlg->GetOutputItemSet()->GetItemState( RES_FRMMACRO, sal_False, &pItem ) ) + { + const SvxMacroTableDtor& rTbl = ((SvxMacroItem*)pItem)->GetMacroTable(); + pGlossaryHdl->SetMacros( aShortNameEdit.GetText(), + rTbl.Get( SW_EVENT_START_INS_GLOSSARY ), + rTbl.Get( SW_EVENT_END_INS_GLOSSARY ) ); + } + + delete pMacroDlg; + } + break; + + case FN_GL_IMPORT: + { + // call the FileOpenDialog do find WinWord - Files with templates + FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 ); + uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker(); + + SvtPathOptions aPathOpt; + xFP->setDisplayDirectory(aPathOpt.GetWorkPath() ); + String sWW8( C2S( FILTER_WW8 ) ); + + uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY); + SfxFilterMatcher aMatcher( String::CreateFromAscii(SwDocShell::Factory().GetShortName()) ); + SfxFilterMatcherIter aIter( &aMatcher ); + const SfxFilter* pFilter = aIter.First(); + while ( pFilter ) + { + if( pFilter->GetUserData() == sWW8 ) + { + xFltMgr->appendFilter( pFilter->GetUIName(), + ((WildCard&)pFilter->GetWildcard()).GetWildCard() ); + xFltMgr->setCurrentFilter( pFilter->GetUIName() ) ; + } + + pFilter = aIter.Next(); + } + + if( aDlgHelper.Execute() == ERRCODE_NONE ) + { + if( pGlossaryHdl->ImportGlossaries( xFP->getFiles().getConstArray()[0] )) + Init(); + else + { + InfoBox(this, SW_RES( MSG_NO_GLOSSARIES )).Execute(); + } + } + } + break; + + default: + return 0; + } + return 1; +} + +/*-------------------------------------------------------------------- + Beschreibung: Dialog Verwaltung Bereiche + --------------------------------------------------------------------*/ +IMPL_LINK( SwGlossaryDlg, BibHdl, Button *, EMPTYARG ) +{ + SwGlossaries* pGloss = ::GetGlossaries(); + if( pGloss->IsGlosPathErr() ) + pGloss->ShowError(); + else + { + //check if at least one glossary path is write enabled + SvtPathOptions aPathOpt; + String sGlosPath( aPathOpt.GetAutoTextPath() ); + sal_uInt16 nPaths = sGlosPath.GetTokenCount(';'); + sal_Bool bIsWritable = sal_False; + for(sal_uInt16 nPath = 0; nPath < nPaths; nPath++) + { + String sPath = URIHelper::SmartRel2Abs( + INetURLObject(), sGlosPath.GetToken(nPath, ';'), + URIHelper::GetMaybeFileHdl()); + try + { + Content aTestContent( sPath, + uno::Reference< XCommandEnvironment >()); + Any aAny = aTestContent.getPropertyValue( C2U("IsReadOnly") ); + if(aAny.hasValue()) + { + bIsWritable = !*(sal_Bool*)aAny.getValue(); + } + } + catch(Exception&) + {} + if(bIsWritable) + break; + } + if(bIsWritable) + { + + SwGlossaryGroupDlg *pDlg = new SwGlossaryGroupDlg( this, pGloss->GetPathArray(), pGlossaryHdl ); + if ( RET_OK == pDlg->Execute() ) + { + Init(); + //if new groups were created - select one of them + String sNewGroup = pDlg->GetCreatedGroupName(); + SvLBoxEntry* pEntry = aCategoryBox.First(); + while(sNewGroup.Len() && pEntry) + { + if(!aCategoryBox.GetParent(pEntry)) + { + GroupUserData* pGroupData = (GroupUserData*)pEntry->GetUserData(); + String sGroup = pGroupData->sGroupName; + sGroup += GLOS_DELIM; + sGroup += String::CreateFromInt32(pGroupData->nPathIdx); + if(sGroup == sNewGroup) + { + aCategoryBox.Select(pEntry); + aCategoryBox.MakeVisible(pEntry); + GrpSelect(&aCategoryBox); + break; + } + } + pEntry = aCategoryBox.Next(pEntry); + } + + } + delete pDlg; + } + else + { + QueryBox aBox(this, WB_YES_NO, sReadonlyPath); + if(RET_YES == aBox.Execute()) + PathHdl(&aPathBtn); + } + } + return 0; +} + +/*------------------------------------------------------------------------ + Beschreibung: Initialisierung; aus Ctor und nach Bearbeiten Bereiche +------------------------------------------------------------------------*/ +void SwGlossaryDlg::Init() +{ + aCategoryBox.SetUpdateMode( sal_False ); + aCategoryBox.Clear(); + // Textbausteinbereiche anzeigen + const sal_uInt16 nCnt = pGlossaryHdl->GetGroupCnt(); + SvLBoxEntry* pSelEntry = 0; + const String sSelStr(::GetCurrGlosGroup()->GetToken(0, GLOS_DELIM)); + const sal_uInt16 nSelPath = static_cast< sal_uInt16 >(::GetCurrGlosGroup()->GetToken(1, GLOS_DELIM).ToInt32()); + // #i66304# - "My AutoText" comes from mytexts.bau, but should be translated + const String sMyAutoTextEnglish(RTL_CONSTASCII_USTRINGPARAM("My AutoText")); + const String sMyAutoTextTranslated(SW_RESSTR(STR_MY_AUTOTEXT)); + for(sal_uInt16 nId = 0; nId < nCnt; ++nId ) + { + String sTitle; + String sGroupName(pGlossaryHdl->GetGroupName(nId, &sTitle)); + if(!sGroupName.Len()) + continue; + if(!sTitle.Len()) + sTitle = sGroupName.GetToken( 0, GLOS_DELIM ); + if(sTitle == sMyAutoTextEnglish) + sTitle = sMyAutoTextTranslated; + SvLBoxEntry* pEntry = aCategoryBox.InsertEntry( sTitle ); + sal_uInt16 nPath = static_cast< sal_uInt16 >(sGroupName.GetToken( 1, GLOS_DELIM ).ToInt32()); + + GroupUserData* pData = new GroupUserData; + pData->sGroupName = sGroupName.GetToken(0, GLOS_DELIM); + pData->nPathIdx = nPath; + pData->bReadonly = pGlossaryHdl->IsReadOnly(&sGroupName); + + pEntry->SetUserData(pData); + if(sSelStr == pData->sGroupName && nSelPath == nPath) + pSelEntry = pEntry; + + //Eintraege fuer die Gruppen auffuellen + { + pGlossaryHdl->SetCurGroup(sGroupName, sal_False, sal_True); + const sal_uInt16 nCount = pGlossaryHdl->GetGlossaryCnt(); + for(sal_uInt16 i = 0; i < nCount; ++i) + { + String sGroupTitle(pGlossaryHdl->GetGlossaryName(i)); + SvLBoxEntry* pChild = aCategoryBox.InsertEntry( + sGroupTitle, pEntry); + pChild->SetUserData(new String(pGlossaryHdl->GetGlossaryShortName(i))); + } + } + } + // Aktuelle Gruppe setzen und Textbausteine anzeigen + if(!pSelEntry) + { + //find a non-readonly group + SvLBoxEntry* pSearch = aCategoryBox.First(); + while(pSearch) + { + if(!aCategoryBox.GetParent(pSearch)) + { + GroupUserData* pData = (GroupUserData*)pSearch->GetUserData(); + if(!pData->bReadonly) + { + pSelEntry = pSearch; + break; + } + } + pSearch = aCategoryBox.Next(pSearch); + } + if(!pSelEntry) + pSelEntry = aCategoryBox.GetEntry(0); + } + if(pSelEntry) + { + aCategoryBox.Expand(pSelEntry); + aCategoryBox.Select(pSelEntry); + aCategoryBox.MakeVisible(pSelEntry); + GrpSelect(&aCategoryBox); + } + //JP 16.11.99: the SvxTreeListBox has a Bug. The Box dont recalc the + // outputsize, when all entries are insertet. The result is, that + // the Focus/Highlight rectangle is to large and paintet over the + // HScrollbar. -> Fix: call the resize + aCategoryBox.Resize(); + + aCategoryBox.GetModel()->Resort(); + aCategoryBox.SetUpdateMode( sal_True ); + aCategoryBox.Update(); + + const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); + aFileRelCB.Check( pCfg->IsSaveRelFile() ); + aFileRelCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl)); + aNetRelCB.Check( pCfg->IsSaveRelNet() ); + aNetRelCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl)); + aInsertTipCB.Check( pCfg->IsAutoTextTip() ); + aInsertTipCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl)); +} + +IMPL_LINK_INLINE_START( SwGlossaryDlg, EditHdl, Button *, EMPTYARG ) +{ +//EndDialog darf nicht im MenuHdl aufgerufen werden + if(aEditBtn.GetCurItemId() == FN_GL_EDIT ) + { + SwTextBlocks *pGroup = ::GetGlossaries()->GetGroupDoc ( GetCurrGrpName () ); + sal_Bool bRet = pGlossaryHdl->ConvertToNew ( *pGroup ); + delete pGroup; + if ( bRet ) + EndDialog(RET_EDIT); + } + return 0; +} +IMPL_LINK_INLINE_END( SwGlossaryDlg, EditHdl, Button *, EMPTYARG ) + +/*------------------------------------------------------------------------ + Beschreibung: KeyInput fuer ShortName - Edits ohne Spaces +------------------------------------------------------------------------*/ +IMPL_LINK( SwNewGlosNameDlg, Modify, Edit *, pBox ) +{ + String aName(aNewName.GetText()); + SwGlossaryDlg* pDlg = (SwGlossaryDlg*)GetParent(); + + if( pBox == &aNewName ) + aNewShort.SetText( lcl_GetValidShortCut( aName ) ); + + sal_Bool bEnable = aName.Len() && aNewShort.GetText().Len() && + (!pDlg->DoesBlockExist(aName, aNewShort.GetText()) + || aName == aOldName.GetText()); + aOk.Enable(bEnable); + return 0; +} + +IMPL_LINK( SwNewGlosNameDlg, Rename, Button *, EMPTYARG ) +{ + SwGlossaryDlg* pDlg = (SwGlossaryDlg*)GetParent(); + String sNew = aNewShort.GetText(); + GetAppCharClass().toUpper(sNew); + if( pDlg->pGlossaryHdl->HasShortName(aNewShort.GetText()) + && sNew != aOldShort.GetText() ) + { + InfoBox(this, SW_RES(MSG_DOUBLE_SHORTNAME)).Execute(); + aNewShort.GrabFocus(); + } + else + EndDialog(sal_True); + return 0; +} + +IMPL_LINK( SwGlossaryDlg, CheckBoxHdl, CheckBox *, pBox ) +{ + SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); + sal_Bool bCheck = pBox->IsChecked(); + if( pBox == &aInsertTipCB ) + pCfg->SetAutoTextTip(bCheck); + else if(pBox == &aFileRelCB) + pCfg->SetSaveRelFile(bCheck); + else + pCfg->SetSaveRelNet(bCheck); + return 0; +} + +/* -------------------------------------------------- + * TreeListBox fuer Gruppen und Bausteine + * --------------------------------------------------*/ +SwGlTreeListBox::SwGlTreeListBox(Window* pParent, const ResId& rResId) : + SvTreeListBox(pParent, rResId), + sReadonly (SW_RES(ST_READONLY)), + pDragEntry(0) +{ + FreeResource(); + SetDragDropMode( SV_DRAGDROP_CTRL_MOVE|SV_DRAGDROP_CTRL_COPY ); +} + +void SwGlTreeListBox::Clear() +{ + SvLBoxEntry* pEntry = First(); + while(pEntry) + { + if(GetParent(pEntry)) + delete (String*)pEntry->GetUserData(); + else + delete (GroupUserData*)pEntry->GetUserData(); + pEntry = Next(pEntry); + } + SvTreeListBox::Clear(); +} + +void SwGlTreeListBox::RequestHelp( const HelpEvent& rHEvt ) +{ + Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() )); + SvLBoxEntry* pEntry = GetEntry( aPos ); + // Hilfe gibt es nur fuer die Gruppennamen + if(pEntry) + { + SvLBoxTab* pTab; + SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab ); + if(pItem) + { + aPos = GetEntryPosition( pEntry ); + Size aSize(pItem->GetSize( this, pEntry )); + aPos.X() = GetTabPos( pEntry, pTab ); + + if((aPos.X() + aSize.Width()) > GetSizePixel().Width()) + aSize.Width() = GetSizePixel().Width() - aPos.X(); + aPos = OutputToScreenPixel(aPos); + Rectangle aItemRect( aPos, aSize ); + String sMsg; + if(!GetParent(pEntry)) + { + GroupUserData* pData = (GroupUserData*)pEntry->GetUserData(); + const SvStrings* pPathArr = ::GetGlossaries()->GetPathArray(); + if(pPathArr->Count()) + { + sMsg = (*(*pPathArr)[pData->nPathIdx]); + sMsg += INET_PATH_TOKEN; + sMsg += pData->sGroupName; + sMsg += SwGlossaries::GetExtension(); + INetURLObject aTmp(sMsg); + sMsg = aTmp.GetPath(); + + if(pData->bReadonly) + { + sMsg += ' '; + sMsg += '('; + sMsg += sReadonly; + sMsg += ')'; + } + + + } + } + else + sMsg = *(String*)pEntry->GetUserData(); + Help::ShowQuickHelp( this, aItemRect, sMsg, + QUICKHELP_LEFT|QUICKHELP_VCENTER ); + } + } +} + +DragDropMode SwGlTreeListBox::NotifyStartDrag( + TransferDataContainer& /*rContainer*/, + SvLBoxEntry* pEntry ) +{ + DragDropMode eRet; + pDragEntry = pEntry; + if(!GetParent(pEntry)) + eRet = SV_DRAGDROP_NONE; + else + { + SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent(); + SvLBoxEntry* pParent = GetParent(pEntry); + + GroupUserData* pGroupData = (GroupUserData*)pParent->GetUserData(); + String sEntry(pGroupData->sGroupName); + sEntry += GLOS_DELIM; + sEntry += String::CreateFromInt32(pGroupData->nPathIdx); + sal_Int8 nDragOption = DND_ACTION_COPY; + eRet = SV_DRAGDROP_CTRL_COPY; + if(!pDlg->pGlossaryHdl->IsReadOnly(&sEntry)) + { + eRet |= SV_DRAGDROP_CTRL_MOVE; + nDragOption |= DND_ACTION_MOVE; + } + SetDragOptions( nDragOption ); + } + return eRet; +} + +sal_Bool SwGlTreeListBox::NotifyAcceptDrop( SvLBoxEntry* pEntry) +{ + // TODO: Readonly - Ueberpruefung fehlt noch! + SvLBoxEntry* pSrcParent = GetParent(pEntry) ? GetParent(pEntry) : pEntry; + SvLBoxEntry* pDestParent = + GetParent(pDragEntry ) ? GetParent(pDragEntry ) : pDragEntry ; + return pDestParent != pSrcParent; + +} + +sal_Bool SwGlTreeListBox::NotifyMoving( SvLBoxEntry* pTarget, + SvLBoxEntry* pEntry, + SvLBoxEntry*& /*rpNewParent*/, + sal_uLong& /*rNewChildPos*/ + ) +{ + pDragEntry = 0; + if(!pTarget) //An den Anfang verschieben + { + pTarget = GetEntry(0); + } + // 1. wird in verschiedene Gruppen verschoben? + // 2. darf in beiden Gruppen geschrieben werden? + SvLBoxEntry* pSrcParent = GetParent(pEntry); + SvLBoxEntry* pDestParent = + GetParent(pTarget) ? GetParent(pTarget) : pTarget; + sal_Bool bRet = sal_False; + if(pDestParent != pSrcParent) + { + SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent(); + SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), sal_True ); + + GroupUserData* pGroupData = (GroupUserData*)pSrcParent->GetUserData(); + String sSourceGroup(pGroupData->sGroupName); + sSourceGroup += GLOS_DELIM; + sSourceGroup += String::CreateFromInt32(pGroupData->nPathIdx); + pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup); + String sTitle(GetEntryText(pEntry)); + String sShortName(*(String*)pEntry->GetUserData()); + + GroupUserData* pDestData = (GroupUserData*)pDestParent->GetUserData(); + String sDestName = pDestData->sGroupName; + sDestName += GLOS_DELIM; + sDestName += String::CreateFromInt32(pDestData->nPathIdx); + bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup, sShortName, + sDestName, sTitle, sal_True ); + if(bRet) + { + SvLBoxEntry* pChild = InsertEntry(sTitle, pDestParent); + pChild->SetUserData(new String(sShortName)); + GetModel()->Remove(pEntry); + } + } + return sal_False; //sonst wird der Eintrag automatisch vorgenommen +} + +sal_Bool SwGlTreeListBox::NotifyCopying( SvLBoxEntry* pTarget, + SvLBoxEntry* pEntry, + SvLBoxEntry*& /*rpNewParent*/, + sal_uLong& /*rNewChildPos*/ + ) +{ + pDragEntry = 0; + // 1. wird in verschiedene Gruppen verschoben? + // 2. darf in beiden Gruppen geschrieben werden? + if(!pTarget) //An den Anfang verschieben + { + pTarget = GetEntry(0); + } + SvLBoxEntry* pSrcParent = GetParent(pEntry); + SvLBoxEntry* pDestParent = + GetParent(pTarget) ? GetParent(pTarget) : pTarget; + sal_Bool bRet = sal_False; + if(pDestParent != pSrcParent) + { + SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent(); + SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), sal_True ); + + GroupUserData* pGroupData = (GroupUserData*)pSrcParent->GetUserData(); + String sSourceGroup(pGroupData->sGroupName); + sSourceGroup += GLOS_DELIM; + sSourceGroup += String::CreateFromInt32(pGroupData->nPathIdx); + + pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup); + String sTitle(GetEntryText(pEntry)); + String sShortName(*(String*)pEntry->GetUserData()); + + GroupUserData* pDestData = (GroupUserData*)pDestParent->GetUserData(); + String sDestName = pDestData->sGroupName; + sDestName += GLOS_DELIM; + sDestName += String::CreateFromInt32(pDestData->nPathIdx); + + bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup, sShortName, + sDestName, sTitle, sal_False ); + if(bRet) + { + SvLBoxEntry* pChild = InsertEntry(sTitle, pDestParent); + pChild->SetUserData(new String(sShortName)); + } + } + return sal_False; //sonst wird der Eintrag automatisch vorgenommen +} + +String SwGlossaryDlg::GetCurrGrpName() const +{ + SvLBoxEntry* pEntry = aCategoryBox.FirstSelected(); + String sRet; + if(pEntry) + { + pEntry = + aCategoryBox.GetParent(pEntry) ? aCategoryBox.GetParent(pEntry) : pEntry; + GroupUserData* pGroupData = (GroupUserData*)pEntry->GetUserData(); + sRet = pGroupData->sGroupName; + sRet += GLOS_DELIM; + sRet += String::CreateFromInt32(pGroupData->nPathIdx); + } + return sRet; +} + +IMPL_LINK( SwGlossaryDlg, PathHdl, Button *, pBtn ) +{ + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if(pFact) + { + AbstractSvxMultiPathDialog* pDlg = pFact->CreateSvxMultiPathDialog( pBtn ); + OSL_ENSURE(pDlg, "Dialogdiet fail!"); + SvtPathOptions aPathOpt; + String sGlosPath( aPathOpt.GetAutoTextPath() ); + pDlg->SetPath(sGlosPath); + if(RET_OK == pDlg->Execute()) + { + String sTmp(pDlg->GetPath()); + if(sTmp != sGlosPath) + { + aPathOpt.SetAutoTextPath( sTmp ); + ::GetGlossaries()->UpdateGlosPath( sal_True ); + Init(); + } + } + delete pDlg; + } + return 0; +} + +IMPL_LINK( SwGlossaryDlg, ShowPreviewHdl, CheckBox *, pBox ) +{ + sal_Bool bCreated = sal_False; + if(pBox->IsChecked()) + { + //create example + if(!pExampleFrame) + { + Link aLink(LINK(this, SwGlossaryDlg, PreviewLoadedHdl)); + pExampleFrame = new SwOneExampleFrame( aExampleWIN, + EX_SHOW_ONLINE_LAYOUT, &aLink ); + bCreated = sal_True; + } + } + + sal_Bool bShow = pBox->IsChecked() && !bCreated; + aExampleWIN.Show( bShow ); + aExampleDummyWIN.Show(!bShow); + if( ::GetCurrGlosGroup() ) + ShowAutoText(*::GetCurrGlosGroup(), aShortNameEdit.GetText()); + + return 0; +}; + +IMPL_LINK( SwGlossaryDlg, PreviewLoadedHdl, void *, EMPTYARG ) +{ + sal_Bool bShow = aShowExampleCB.IsChecked(); + aExampleWIN.Show( bShow ); + aExampleDummyWIN.Show(!bShow); + ResumeShowAutoText(); + return 0; +} + +void SwGlossaryDlg::ShowAutoText(const String& rGroup, const String& rShortName) +{ + if(aExampleWIN.IsVisible()) + { + SetResumeData(rGroup, rShortName); + //try to make an Undo() + pExampleFrame->ClearDocument( sal_True ); + } +} + +void SwGlossaryDlg::ResumeShowAutoText() +{ + String sGroup, sShortName; + if(GetResumeData(sGroup, sShortName) && aExampleWIN.IsVisible()) + { + if(!_xAutoText.is()) + { + uno::Reference< lang::XMultiServiceFactory > + xMgr = getProcessServiceFactory(); + //now the AutoText ListBoxes have to be filled + + uno::Reference< uno::XInterface > xAText = xMgr->createInstance( C2U("com.sun.star.text.AutoTextContainer") ); + _xAutoText = uno::Reference< container::XNameAccess >(xAText, uno::UNO_QUERY); + } + + uno::Reference< XTextCursor > & xCrsr = pExampleFrame->GetTextCursor(); + if(xCrsr.is()) + { + if(sShortName.Len()) + { + uno::Any aGroup = _xAutoText->getByName(sGroup); + uno::Reference< XAutoTextGroup > xGroup; + OUString uShortName(sShortName); + if((aGroup >>= xGroup) && xGroup->hasByName(uShortName)) + { + uno::Any aEntry(xGroup->getByName(uShortName)); + uno::Reference< XAutoTextEntry > xEntry; + aEntry >>= xEntry; + uno::Reference< XTextRange > xRange(xCrsr, uno::UNO_QUERY); + xEntry->applyTo(xRange); + } + } + } + } + ResetResumeData(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/glossary.hrc b/sw/source/ui/misc/glossary.hrc new file mode 100644 index 000000000000..4ee5aaaa7ede --- /dev/null +++ b/sw/source/ui/misc/glossary.hrc @@ -0,0 +1,91 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +// Box Textbausteine +#define FT_SHORTNAME 1 +#define ED_SHORTNAME 2 +#define FT_NAME 3 +//#define DCB_NAME 4 +#define ED_NAME 4 +#define CB_INSERT_TIP 5 + +//#define FT_BIB 10 + +#define PB_INSERT 50 +#define PB_EDIT 52 +#define PB_BIB 54 +#define PB_CLOSE 55 +#define PB_PATH 56 +#define PB_HELP 57 + +#define MNU_EDIT 60 +#define FN_GL_DEFINE 61 +#define FN_GL_DEFINE_TEXT 62 +#define FN_GL_REPLACE 63 +#define FN_GL_EDIT 64 +#define FN_GL_DELETE 65 +#define FN_GL_RENAME 66 +#define FN_GL_MACRO 67 +#define CB_FILE_REL 68 +#define CB_NET_REL 69 +#define FL_RELATIVE 70 +#define WIN_EXAMPLE 72 +#define CB_SHOW_EXAMPLE 73 +#define FN_GL_COPY_TO_CLIPBOARD 74 +#define FN_GL_IMPORT 75 +#define ST_READONLY 76 +#define ST_READONLY_PATH 77 +#define FN_GL_REPLACE_TEXT 78 +#define WIN_EXAMPLE_DUMMY 79 + +// Box Bibliothek Textbausteine +#define FL_EDIT 1 +#define FL_BIB 2 +#define ED_BIB 3 + +#define PB_NEW 10 +#define PB_DELETE 11 + +#define BT_OK 100 + +// beide +#define LB_BIB 80 + +// Dialog Namensaenderung +#define FT_ON 1 +#define FT_OS 2 +#define FT_NN 3 +#define FT_NS 4 +#define ED_ON 5 +#define ED_OS 6 +#define ED_NN 7 +#define ED_NS 8 +#define FL_NN 9 +#define BT_CANCEL 10 +#define BT_OKNEW 11 + diff --git a/sw/source/ui/misc/glossary.src b/sw/source/ui/misc/glossary.src new file mode 100644 index 000000000000..4e2db6dcfe49 --- /dev/null +++ b/sw/source/ui/misc/glossary.src @@ -0,0 +1,392 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" +#include "glossary.hrc" +#include "cmdid.h" +#include "helpid.h" +#include "access.hrc" + + // #define DLG_GLOSSARY 256 +ModalDialog DLG_GLOSSARY +{ + HelpID = CMD_FN_GLOSSARY_DLG ; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 375 , 164 ) ; + Text [ en-US ] = "AutoText" ; + Moveable = TRUE ; + CheckBox CB_INSERT_TIP + { + HelpID = "sw:CheckBox:DLG_GLOSSARY:CB_INSERT_TIP"; + Pos = MAP_APPFONT ( 12 , 12 ) ; + Size = MAP_APPFONT ( 200 , 12 ) ; + TabStop = TRUE ; + Text [ en-US ] = "~Display remainder of name as suggestion while typing" ; + }; + FixedText FT_NAME + { + Pos = MAP_APPFONT ( 12 , 31 ) ; + Size = MAP_APPFONT ( 40 , 8 ) ; + Text [ en-US ] = "~Name" ; + Left = TRUE ; + }; + Edit ED_NAME + { + HelpID = "sw:Edit:DLG_GLOSSARY:ED_NAME"; + Border = TRUE ; + Pos = MAP_APPFONT ( 55 , 29 ) ; + Size = MAP_APPFONT ( 85 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + }; + FixedText FT_SHORTNAME + { + Disable = TRUE ; + Pos = MAP_APPFONT ( 143 , 31 ) ; + Size = MAP_APPFONT ( 57 , 8 ) ; + Text [ en-US ] = "~Shortcut" ; + Right = TRUE ; + }; + Edit ED_SHORTNAME + { + HelpID = "sw:Edit:DLG_GLOSSARY:ED_SHORTNAME"; + Disable = TRUE ; + Border = TRUE ; + Pos = MAP_APPFONT ( 203 , 29 ) ; + Size = MAP_APPFONT ( 21 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + }; + Control LB_BIB + { + Border = TRUE ; + Pos = MAP_APPFONT ( 12 , 44 ) ; + Size = MAP_APPFONT ( 212 , 84 ) ; + TabStop = TRUE ; + // Sort = TRUE ; + // CurPos = 0 ; + String ST_READONLY + { + Text [ en-US ] = "read-only"; + }; + }; + FixedLine FL_RELATIVE + { + Pos = MAP_APPFONT ( 6 , 134 ) ; + Size = MAP_APPFONT ( 221 , 8 ) ; + Text [ en-US ] = "Save links relative to"; + }; + CheckBox CB_FILE_REL + { + HelpID = "sw:CheckBox:DLG_GLOSSARY:CB_FILE_REL"; + Pos = MAP_APPFONT ( 14 , 145 ) ; + Size = MAP_APPFONT ( 90 , 12 ) ; + TabStop = TRUE ; + Text [ en-US ] = "~File system" ; + }; + CheckBox CB_NET_REL + { + HelpID = "sw:CheckBox:DLG_GLOSSARY:CB_NET_REL"; + Pos = MAP_APPFONT ( 109 , 145 ) ; + Size = MAP_APPFONT ( 90 , 12 ) ; + Text [ en-US ] = "Inte~rnet" ; + }; + Window WIN_EXAMPLE + { + Pos = MAP_APPFONT ( 231 , 14 ) ; + Size = MAP_APPFONT ( 82 , 124 ) ; + }; + Window WIN_EXAMPLE_DUMMY + { + Pos = MAP_APPFONT ( 231 , 14 ) ; + Size = MAP_APPFONT ( 82 , 124 ) ; + Border = TRUE; + }; + CheckBox CB_SHOW_EXAMPLE + { + HelpID = "sw:CheckBox:DLG_GLOSSARY:CB_SHOW_EXAMPLE"; + Pos = MAP_APPFONT ( 231 , 145 ) ; + Size = MAP_APPFONT ( 82 , 12 ) ; + Text [ en-US ] = "Sho~w preview"; + }; + OKButton PB_INSERT + { + Pos = MAP_APPFONT ( 319 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "~Insert" ; + TabStop = TRUE ; + DefButton = TRUE ; + }; + CancelButton PB_CLOSE + { + Pos = MAP_APPFONT ( 319 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "~Close" ; + TabStop = TRUE ; + }; + HelpButton PB_HELP + { + Pos = MAP_APPFONT ( 319 , 43 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + }; + MenuButton PB_EDIT + { + HelpID = "sw:MenuButton:DLG_GLOSSARY:PB_EDIT"; + Pos = MAP_APPFONT ( 319 , 60 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "AutoTe~xt" ; + TabStop = TRUE ; + }; + PushButton PB_BIB + { + HelpID = "sw:PushButton:DLG_GLOSSARY:PB_BIB"; + Pos = MAP_APPFONT ( 319 , 77 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "C~ategories..." ; + TabStop = TRUE ; + }; + PushButton PB_PATH + { + HelpID = "sw:PushButton:DLG_GLOSSARY:PB_PATH"; + Pos = MAP_APPFONT ( 319 , 94 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Text [ en-US ] = "~Path..." ; + }; + String ST_READONLY_PATH + { + Text [ en-US ] = "The 'AutoText' directories are read-only. Do you want to call the path settings dialog?"; + }; + Menu MNU_EDIT + { + ItemList = + { + MenuItem + { + Identifier = FN_GL_DEFINE ; + HelpID = HID_MD_GLOS_DEFINE ; + Text [ en-US ] = "~New" ; + }; + MenuItem + { + Identifier = FN_GL_DEFINE_TEXT ; + HelpID = HID_MD_GLOS_DEFINE_TEXT ; + Text [ en-US ] = "New (text only)" ; + }; + MenuItem + { + Identifier = FN_GL_COPY_TO_CLIPBOARD; + HelpID = HID_MD_COPY_TO_CLIPBOARD; + Text [ en-US ] = "~Copy"; + }; + MenuItem + { + Identifier = FN_GL_REPLACE ; + HelpID = HID_MD_GLOS_REPLACE ; + Text [ en-US ] = "Replace" ; + }; + MenuItem + { + Identifier = FN_GL_REPLACE_TEXT; + HelpID = HID_MD_GLOS_REPLACE; + Text [ en-US ] = "Rep~lace (text only)" ; + }; + MenuItem + { + Identifier = FN_GL_RENAME ; + HelpID = HID_MD_GLOS_RENAME ; + Text [ en-US ] = "Rename..." ; + }; + MenuItem + { + Identifier = FN_GL_DELETE ; + HelpID = HID_MD_GLOS_DELETE ; + Text [ en-US ] = "~Delete" ; + }; + MenuItem + { + Separator = TRUE ; + }; + MenuItem + { + Identifier = FN_GL_EDIT ; + HelpID = HID_MD_GLOS_EDIT ; + Text [ en-US ] = "~Edit" ; + }; + MenuItem + { + Separator = TRUE ; + }; + MenuItem + { + Identifier = FN_GL_MACRO ; + HelpID = HID_MD_GLOS_MACRO ; + Text [ en-US ] = "~Macro..." ; + }; + MenuItem + { + Separator = TRUE ; + }; + MenuItem + { + Identifier = FN_GL_IMPORT; + HelpID = HID_MD_GLOS_IMPORT ; + Text [ en-US ] = "~Import..."; + }; + }; + }; +}; +InfoBox MSG_DOUBLE_SHORTNAME +{ + Message [ en-US ] = "Shortcut name already exists. Please choose another name." ; +}; +QueryBox MSG_QUERY_DELETE +{ + BUTTONS = WB_YES_NO ; + DEFBUTTON = WB_DEF_NO ; + Message [ en-US ] = "Delete AutoText?" ; +}; +String STR_QUERY_DELETE_GROUP1 +{ + Text [ en-US ] = "Delete the category " ; +}; +String STR_QUERY_DELETE_GROUP2 +{ + Text [ en-US ] = "?" ; +}; +String STR_GLOSSARY +{ + Text [ en-US ] = "AutoText :" ; +}; +/*IAccessibility2 Implementation 2009-----*/ +String STR_ACCESS_SW_CATEGORY +{ + Text [ en-US ] = "Category" ; +}; +/*-----IAccessibility2 Implementation 2009*/ +ModalDialog DLG_RENAME_GLOS +{ + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 287 , 47 ) ; + Moveable = TRUE ; + HelpID = HID_RENAME_GLOSSARY ; + OKButton BT_OKNEW + { + Disable = TRUE ; + Pos = MAP_APPFONT ( 231 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + DefButton = TRUE ; + TabStop = TRUE ; + }; + CancelButton BT_CANCEL + { + Pos = MAP_APPFONT ( 231 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + FixedText FT_ON + { + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 30 , 8 ) ; + Text [ en-US ] = "Na~me" ; + }; + Edit ED_ON + { + HelpID = "sw:Edit:DLG_RENAME_GLOS:ED_ON"; + ReadOnly = TRUE ; + Border = TRUE ; + Pos = MAP_APPFONT ( 44 , 12 ) ; + Size = MAP_APPFONT ( 100 , 12 ) ; + Left = TRUE ; + }; + FixedText FT_OS + { + Pos = MAP_APPFONT ( 147 , 14 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "Short~cut" ; + }; + Edit ED_OS + { + HelpID = "sw:Edit:DLG_RENAME_GLOS:ED_OS"; + ReadOnly = TRUE ; + Border = TRUE ; + Pos = MAP_APPFONT ( 200 , 12 ) ; + Size = MAP_APPFONT ( 21 , 12 ) ; + Left = TRUE ; + }; + FixedText FT_NN + { + Pos = MAP_APPFONT ( 12 , 29 ) ; + Size = MAP_APPFONT ( 30 , 8 ) ; + Text [ en-US ] = "~New" ; + }; + Edit ED_NN + { + HelpID = "sw:Edit:DLG_RENAME_GLOS:ED_NN"; + TabStop = TRUE ; + Border = TRUE ; + Pos = MAP_APPFONT ( 44 , 27 ) ; + Size = MAP_APPFONT ( 100 , 12 ) ; + Left = TRUE ; + }; + FixedText FT_NS + { + Pos = MAP_APPFONT ( 147 , 29 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "~Shortcut" ; + }; + Edit ED_NS + { + HelpID = "sw:Edit:DLG_RENAME_GLOS:ED_NS"; + TabStop = TRUE ; + Border = TRUE ; + Pos = MAP_APPFONT ( 200 , 27 ) ; + Size = MAP_APPFONT ( 21 , 12 ) ; + Left = TRUE ; + }; + FixedLine FL_NN + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 219 , 8 ) ; + }; + Text [ en-US ] = "Rename AutoText" ; +}; +String STR_SAVE_GLOSSARY +{ + Text[ en-US ] = "Save AutoText"; +}; +InfoBox MSG_NO_GLOSSARIES +{ + Message [ en-US ] = "There is no AutoText in this file."; +}; + +String STR_MY_AUTOTEXT +{ + Text[ en-US ] = "My AutoText"; +}; diff --git a/sw/source/ui/misc/glshell.cxx b/sw/source/ui/misc/glshell.cxx new file mode 100644 index 000000000000..a0d6693e74ae --- /dev/null +++ b/sw/source/ui/misc/glshell.cxx @@ -0,0 +1,289 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#include <com/sun/star/frame/XTitle.hpp> + +#include <svl/eitem.hxx> +#include <svl/stritem.hxx> +#include <sfx2/printer.hxx> +#include <sfx2/request.hxx> +#include <sfx2/sfxsids.hrc> +#include <svl/srchitem.hxx> +#include <svl/macitem.hxx> +#include <gloshdl.hxx> + +#include <editeng/acorrcfg.hxx> +#include <sfx2/app.hxx> +#include <sfx2/objface.hxx> +#include <sfx2/viewfrm.hxx> +#include <uitool.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <glshell.hxx> +#include <doc.hxx> +#include <IDocumentUndoRedo.hxx> +#include <glosdoc.hxx> +#include <shellio.hxx> +#include <initui.hxx> // fuer ::GetGlossaries() +#include <cmdid.h> +#include <swerror.h> +#include <misc.hrc> + +#define SwWebGlosDocShell +#define SwGlosDocShell + +#include <sfx2/msg.hxx> +#include <swslots.hxx> + +using namespace ::com::sun::star; + +SFX_IMPL_INTERFACE( SwGlosDocShell, SwDocShell, SW_RES(0) ) +{ +} + +SFX_IMPL_INTERFACE( SwWebGlosDocShell, SwWebDocShell, SW_RES(0) ) +{ +} + +TYPEINIT1( SwGlosDocShell, SwDocShell ); +TYPEINIT1( SwWebGlosDocShell, SwWebDocShell ); + +void lcl_Execute( SwDocShell& rSh, SfxRequest& rReq ) +{ + if ( rReq.GetSlot() == SID_SAVEDOC ) + { + if( !rSh.HasName() ) + { + rReq.SetReturnValue( SfxBoolItem( 0, rSh.Save() ) ); + } + else + { + const SfxBoolItem* pRes = ( const SfxBoolItem* ) + rSh.ExecuteSlot( rReq, + rSh.SfxObjectShell::GetInterface() ); + if( pRes->GetValue() ) + rSh.GetDoc()->ResetModified(); + } + } +} + +void lcl_GetState( SwDocShell& rSh, SfxItemSet& rSet ) +{ + if( SFX_ITEM_AVAILABLE >= rSet.GetItemState( SID_SAVEDOC, sal_False )) + { + if( !rSh.GetDoc()->IsModified() ) + rSet.DisableItem( SID_SAVEDOC ); + else + rSet.Put( SfxStringItem( SID_SAVEDOC, SW_RESSTR(STR_SAVE_GLOSSARY))); + } +} + +sal_Bool lcl_Save( SwWrtShell& rSh, const String& rGroupName, + const String& rShortNm, const String& rLongNm ) +{ + const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get(); + SwTextBlocks * pBlock = ::GetGlossaries()->GetGroupDoc( rGroupName ); + + SvxMacro aStart(aEmptyStr, aEmptyStr); + SvxMacro aEnd(aEmptyStr, aEmptyStr); + SwGlossaryHdl* pGlosHdl; + + pGlosHdl = rSh.GetView().GetGlosHdl(); + pGlosHdl->GetMacros( rShortNm, aStart, aEnd, pBlock ); + + sal_uInt16 nRet = rSh.SaveGlossaryDoc( *pBlock, rLongNm, rShortNm, + pCfg->IsSaveRelFile(), + pBlock->IsOnlyTextBlock( rShortNm ) ); + + if(aStart.GetMacName().Len() || aEnd.GetMacName().Len() ) + { + SvxMacro* pStart = aStart.GetMacName().Len() ? &aStart : 0; + SvxMacro* pEnd = aEnd.GetMacName().Len() ? &aEnd : 0; + pGlosHdl->SetMacros( rShortNm, pStart, pEnd, pBlock ); + } + + rSh.EnterStdMode(); + if( USHRT_MAX != nRet ) + rSh.ResetModified(); + delete pBlock; + return nRet != USHRT_MAX; +} + +SwGlosDocShell::SwGlosDocShell(sal_Bool bNewShow) + : SwDocShell( (bNewShow) + ? SFX_CREATE_MODE_STANDARD : SFX_CREATE_MODE_INTERNAL ) + , bShow ( bNewShow ) +{ + SetHelpId(SW_GLOSDOCSHELL); +} + +SwGlosDocShell::~SwGlosDocShell( ) +{ +} + +void SwGlosDocShell::Execute( SfxRequest& rReq ) +{ + ::lcl_Execute( *this, rReq ); +} + +void SwGlosDocShell::GetState( SfxItemSet& rSet ) +{ + ::lcl_GetState( *this, rSet ); +} + +sal_Bool SwGlosDocShell::Save() +{ + // In case of an API object which holds this document, it is possible that the WrtShell is already + // dead. For instance, if the doc is modified via this API object, and then, upon office shutdown, + // the document's view is closed (by the SFX framework) _before_ the API object is release and + // tries to save the doc, again. + // 96380 - 2002-03-03 - fs@openoffice.org + if ( GetWrtShell() ) + return ::lcl_Save( *GetWrtShell(), aGroupName, aShortName, aLongName ); + else + { + SetModified( sal_False ); + return sal_False; + } +} + +SwWebGlosDocShell::SwWebGlosDocShell() + : SwWebDocShell( SFX_CREATE_MODE_STANDARD ) +{ + SetHelpId(SW_WEBGLOSDOCSHELL); +} + +SwWebGlosDocShell::~SwWebGlosDocShell( ) +{ +} + +void SwWebGlosDocShell::Execute( SfxRequest& rReq ) +{ + ::lcl_Execute( *this, rReq ); +} + +void SwWebGlosDocShell::GetState( SfxItemSet& rSet ) +{ + ::lcl_GetState( *this, rSet ); +} + +sal_Bool SwWebGlosDocShell::Save() +{ + // same comment as in SwGlosDocShell::Save - see there + if ( GetWrtShell() ) + return ::lcl_Save( *GetWrtShell(), aGroupName, aShortName, aLongName ); + else + { + SetModified( sal_False ); + return sal_False; + } +} + +SV_IMPL_REF ( SwDocShell ) + +SwDocShellRef SwGlossaries::EditGroupDoc( const String& rGroup, const String& rShortName, sal_Bool bShow ) +{ + SwDocShellRef xDocSh; + + SwTextBlocks* pGroup = GetGroupDoc( rGroup ); + if( pGroup && pGroup->GetCount() ) + { + // erfrage welche View registriert ist. Im WebWriter gibts es keine + // normale View + sal_uInt16 nViewId = 0 != &SwView::Factory() ? 2 : 6; + String sLongName = pGroup->GetLongName(pGroup->GetIndex( rShortName )); + + if( 6 == nViewId ) + { + SwWebGlosDocShell* pDocSh = new SwWebGlosDocShell(); + xDocSh = pDocSh; + pDocSh->DoInitNew( 0 ); + pDocSh->SetLongName( sLongName ); + pDocSh->SetShortName( rShortName); + pDocSh->SetGroupName( rGroup ); + } + else + { + SwGlosDocShell* pDocSh = new SwGlosDocShell(bShow); + xDocSh = pDocSh; + pDocSh->DoInitNew( 0 ); + pDocSh->SetLongName( sLongName ); + pDocSh->SetShortName( rShortName ); + pDocSh->SetGroupName( rGroup ); + } + + // Dokumenttitel setzen + SfxViewFrame* pFrame = bShow ? SfxViewFrame::LoadDocument( *xDocSh, nViewId ) : SfxViewFrame::LoadHiddenDocument( *xDocSh, nViewId ); + String aDocTitle(SW_RES( STR_GLOSSARY )); + aDocTitle += ' '; + aDocTitle += sLongName; + + bool const bDoesUndo = + xDocSh->GetDoc()->GetIDocumentUndoRedo().DoesUndo(); + xDocSh->GetDoc()->GetIDocumentUndoRedo().DoUndo( false ); + + xDocSh->GetWrtShell()->InsertGlossary( *pGroup, rShortName ); + if( !xDocSh->GetDoc()->getPrinter( false ) ) + { + // wir erzeugen einen default SfxPrinter. + // Das ItemSet wird vom Sfx geloescht! + SfxItemSet *pSet = new SfxItemSet( xDocSh->GetDoc()->GetAttrPool(), + FN_PARAM_ADDPRINTER, FN_PARAM_ADDPRINTER, + SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN, + SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC, + 0 ); + SfxPrinter* pPrinter = new SfxPrinter( pSet ); + + // und haengen ihn ans Dokument. + xDocSh->GetDoc()->setPrinter( pPrinter, true, true ); + } + + xDocSh->SetTitle( aDocTitle ); + try + { + // set the UI-title + uno::Reference< frame::XTitle > xTitle( xDocSh->GetModel(), uno::UNO_QUERY_THROW ); + xTitle->setTitle( aDocTitle ); + } + catch( uno::Exception& ) + {} + + xDocSh->GetDoc()->GetIDocumentUndoRedo().DoUndo( bDoesUndo ); + xDocSh->GetDoc()->ResetModified(); + if ( bShow ) + pFrame->GetFrame().Appear(); + + delete pGroup; + } + return xDocSh; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/impfnote.hxx b/sw/source/ui/misc/impfnote.hxx new file mode 100644 index 000000000000..ad90331808f0 --- /dev/null +++ b/sw/source/ui/misc/impfnote.hxx @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#ifndef _IMPFNOTE_HXX +#define _IMPFNOTE_HXX + +#include <sfx2/tabdlg.hxx> +#include <vcl/button.hxx> +#include <vcl/lstbox.hxx> +#include <vcl/fixed.hxx> +#include <vcl/field.hxx> +#include <numberingtypelistbox.hxx> + +class SwWrtShell; + +class SwEndNoteOptionPage : public SfxTabPage +{ + FixedLine aNumFL; + FixedText aNumTypeFT; + SwNumberingTypeListBox aNumViewBox; + FixedText aOffsetLbl; + NumericField aOffsetFld; + FixedText aNumCountFT; + ListBox aNumCountBox; + FixedText aPrefixFT; + Edit aPrefixED; + FixedText aSuffixFT; + Edit aSuffixED; + FixedText aPosFT; + RadioButton aPosPageBox; + RadioButton aPosChapterBox; + + FixedLine aTemplFL; + FixedText aParaTemplLbl; + ListBox aParaTemplBox; + FixedText aPageTemplLbl; + ListBox aPageTemplBox; + + FixedLine aCharTemplFL; + FixedText aFtnCharAnchorTemplLbl; + ListBox aFtnCharAnchorTemplBox; + FixedText aFtnCharTextTemplLbl; + ListBox aFtnCharTextTemplBox; + + FixedLine aContFL; + FixedText aContLbl; + Edit aContEdit; + FixedText aContFromLbl; + Edit aContFromEdit; + + String aNumDoc; + String aNumPage; + String aNumChapter; + SwWrtShell *pSh; + sal_Bool bPosDoc; + sal_Bool bEndNote; + + inline void SelectNumbering(int eNum); + int GetNumbering() const; + + DECL_LINK( PosPageHdl, Button * ); + DECL_LINK( PosChapterHdl, Button * ); + DECL_LINK( NumCountHdl, ListBox * ); + + +public: + SwEndNoteOptionPage( Window *pParent, sal_Bool bEndNote, + const SfxItemSet &rSet ); + ~SwEndNoteOptionPage(); + + static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet); + virtual sal_Bool FillItemSet(SfxItemSet &rSet); + virtual void Reset( const SfxItemSet& ); + + void SetShell( SwWrtShell &rShell ); +}; + +class SwFootNoteOptionPage : public SwEndNoteOptionPage +{ + SwFootNoteOptionPage( Window *pParent, const SfxItemSet &rSet ); + ~SwFootNoteOptionPage(); + +public: + static SfxTabPage *Create(Window *pParent, const SfxItemSet &rSet); +}; + + + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/insfnote.cxx b/sw/source/ui/misc/insfnote.cxx new file mode 100644 index 000000000000..3fbb9effb9f8 --- /dev/null +++ b/sw/source/ui/misc/insfnote.cxx @@ -0,0 +1,305 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + +#include <hintids.hxx> +#include <svl/eitem.hxx> +#include <svl/stritem.hxx> +#include <sfx2/request.hxx> +#include <editeng/fontitem.hxx> +#include <vcl/msgbox.hxx> +#include <fmtftn.hxx> +#include <swundo.hxx> +#include <cmdid.h> +#include <wrtsh.hxx> +#include <view.hxx> +#include <basesh.hxx> +#include <insfnote.hxx> +#include <crsskip.hxx> +#include <misc.hrc> +#include <insfnote.hrc> +#include <svx/svxdlg.hxx> +#include <svx/dialogs.hrc> +#include <sfx2/viewfrm.hxx> + +static sal_Bool bFootnote = sal_True; + +/*------------------------------------------------------------------------ + Beschreibung: Einfuegen der Fussnote durch OK +------------------------------------------------------------------------*/ + +void SwInsFootNoteDlg::Apply() +{ + String aStr; + + if ( aNumberCharBtn.IsChecked() ) + aStr = aNumberCharEdit.GetText(); + + if ( bEdit ) + { + rSh.StartAction(); + rSh.Left(CRSR_SKIP_CHARS, sal_False, 1, sal_False ); + rSh.StartUndo( UNDO_START ); + SwFmtFtn aNote( aEndNoteBtn.IsChecked() ); + aNote.SetNumStr( aStr ); + + if( rSh.SetCurFtn( aNote ) && bExtCharAvailable ) + { + rSh.Right(CRSR_SKIP_CHARS, sal_True, 1, sal_False ); + SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT ); + rSh.GetCurAttr( aSet ); + SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT ); + SvxFontItem aFont( rFont.GetFamily(), aFontName, + rFont.GetStyleName(), rFont.GetPitch(), + eCharSet, RES_CHRATR_FONT ); + aSet.Put( aFont ); + rSh.SetAttr( aSet, nsSetAttrMode::SETATTR_DONTEXPAND ); + rSh.ResetSelect(0, sal_False); + rSh.Left(CRSR_SKIP_CHARS, sal_False, 1, sal_False ); + } + rSh.EndUndo( UNDO_END ); + rSh.EndAction(); + } + else + { + + } + + bFootnote = aFtnBtn.IsChecked(); +} + +IMPL_LINK_INLINE_START( SwInsFootNoteDlg, NumberCharHdl, Button *, EMPTYARG ) +{ + aNumberCharEdit.GrabFocus(); + aOkBtn.Enable( aNumberCharEdit.GetText().Len() || bExtCharAvailable ); + return 0; +} +IMPL_LINK_INLINE_END( SwInsFootNoteDlg, NumberCharHdl, Button *, EMPTYARG ) + +IMPL_LINK_INLINE_START( SwInsFootNoteDlg, NumberEditHdl, void *, EMPTYARG ) +{ + aNumberCharBtn.Check( sal_True ); + aOkBtn.Enable( 0 != aNumberCharEdit.GetText().Len() ); + + return 0; +} +IMPL_LINK_INLINE_END( SwInsFootNoteDlg, NumberEditHdl, void *, EMPTYARG ) + +IMPL_LINK_INLINE_START( SwInsFootNoteDlg, NumberAutoBtnHdl, Button *, EMPTYARG ) +{ + aOkBtn.Enable( sal_True ); + return 0; +} +IMPL_LINK_INLINE_END( SwInsFootNoteDlg, NumberAutoBtnHdl, Button *, EMPTYARG ) + +IMPL_LINK( SwInsFootNoteDlg, NumberExtCharHdl, Button *, EMPTYARG ) +{ + aNumberCharBtn.Check( sal_True ); + + SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT ); + rSh.GetCurAttr( aSet ); + const SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT ); + + SfxAllItemSet aAllSet( rSh.GetAttrPool() ); + aAllSet.Put( SfxBoolItem( FN_PARAM_1, sal_False ) ); + aAllSet.Put( rFont ); + + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( this, aAllSet, + rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); + if (RET_OK == pDlg->Execute()) + { + SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pItem, SfxStringItem, SID_CHARMAP, sal_False ); + SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, sal_False ); + if ( pItem ) + { + String sExtChars(pItem->GetValue()); + aNumberCharEdit.SetText( sExtChars ); + + if ( pFontItem ) + { + aFontName = pFontItem->GetFamilyName(); + eCharSet = pFontItem->GetCharSet(); + Font aFont( aFontName, pFontItem->GetStyleName(), aNumberCharEdit.GetFont().GetSize() ); + aFont.SetCharSet( pFontItem->GetCharSet() ); + aFont.SetPitch( pFontItem->GetPitch() ); + aNumberCharEdit.SetFont( aFont ); + } + + bExtCharAvailable = sal_True; + aOkBtn.Enable(0 != aNumberCharEdit.GetText().Len()); + } + } + delete pDlg; + + return 0; +} + +IMPL_LINK( SwInsFootNoteDlg, NextPrevHdl, Button *, pBtn ) +{ + Apply(); + + // Hier zur naechsten Fuss/Endnote wandern + rSh.ResetSelect(0, sal_False); + if (pBtn == &aNextBT) + rSh.GotoNextFtnAnchor(); + else + rSh.GotoPrevFtnAnchor(); + + Init(); + + return 0; +} + +SwInsFootNoteDlg::SwInsFootNoteDlg(Window *pParent, SwWrtShell &rShell, sal_Bool bEd) : + + SvxStandardDialog(pParent,SW_RES(DLG_INS_FOOTNOTE)), + + rSh(rShell), + bExtCharAvailable(sal_False), + bEdit(bEd), + aNumberFL (this,SW_RES(FL_NUMBER)), + aNumberAutoBtn (this,SW_RES(RB_NUMBER_AUTO)), + aNumberCharBtn (this,SW_RES(RB_NUMBER_CHAR)), + aNumberCharEdit (this,SW_RES(ED_NUMBER_CHAR)), + aNumberExtChar (this,SW_RES(BT_NUMBER_CHAR)), + + aTypeFL (this,SW_RES(FL_TYPE)), + aFtnBtn (this,SW_RES(RB_TYPE_FTN)), + aEndNoteBtn (this,SW_RES(RB_TYPE_ENDNOTE)), + + aOkBtn (this,SW_RES(BT_OK)), + aCancelBtn (this,SW_RES(BT_CANCEL)), + aHelpBtn (this,SW_RES(BT_HELP)), + aPrevBT (this,SW_RES(BT_PREV)), + aNextBT (this,SW_RES(BT_NEXT)) +{ + aNumberCharEdit.SetAccessibleName(String(SW_RES(STR_CHAR))); + aNumberExtChar.SetAccessibleRelationMemberOf(&aNumberFL); + aNumberCharEdit.SetAccessibleRelationLabeledBy(&aNumberCharBtn); + + aNumberAutoBtn.SetClickHdl(LINK(this,SwInsFootNoteDlg,NumberAutoBtnHdl)); + aNumberExtChar.SetClickHdl(LINK(this,SwInsFootNoteDlg,NumberExtCharHdl)); + aNumberCharBtn.SetClickHdl(LINK(this,SwInsFootNoteDlg,NumberCharHdl)); + aNumberCharEdit.SetModifyHdl(LINK(this,SwInsFootNoteDlg,NumberEditHdl)); + aNumberCharEdit.SetMaxTextLen(10); + aNumberCharEdit.Enable(); + + aPrevBT.SetClickHdl(LINK(this, SwInsFootNoteDlg, NextPrevHdl)); + aNextBT.SetClickHdl(LINK(this, SwInsFootNoteDlg, NextPrevHdl)); + + FreeResource(); + rSh.SetCareWin(this); + + if (bEdit) + { + Init(); + + aPrevBT.Show(); + aNextBT.Show(); + } +} + +SwInsFootNoteDlg::~SwInsFootNoteDlg() +{ + rSh.SetCareWin(0); + + if (bEdit) + rSh.ResetSelect(0, sal_False); +} + +void SwInsFootNoteDlg::Init() +{ + SwFmtFtn aFtnNote; + String sNumStr; + Font aFont; + bExtCharAvailable = sal_False; + + rSh.StartAction(); + + if( rSh.GetCurFtn( &aFtnNote )) + { + if(aFtnNote.GetNumStr().Len()) + { + sNumStr = aFtnNote.GetNumStr(); + + rSh.Right(CRSR_SKIP_CHARS, sal_True, 1, sal_False ); + SfxItemSet aSet( rSh.GetAttrPool(), RES_CHRATR_FONT, RES_CHRATR_FONT ); + rSh.GetCurAttr( aSet ); + const SvxFontItem &rFont = (SvxFontItem &) aSet.Get( RES_CHRATR_FONT ); + + aFont = aNumberCharEdit.GetFont(); + aFontName = rFont.GetFamilyName(); + eCharSet = rFont.GetCharSet(); + aFont.SetName(aFontName); + aFont.SetCharSet(eCharSet); + bExtCharAvailable = sal_True; + rSh.Left( CRSR_SKIP_CHARS, sal_False, 1, sal_False ); + } + bFootnote = !aFtnNote.IsEndNote(); + } + aNumberCharEdit.SetFont(aFont); + + sal_Bool bNumChar = sNumStr.Len() != 0; + + aNumberCharEdit.SetText(sNumStr); + aNumberCharBtn.Check(bNumChar); + aNumberAutoBtn.Check(!bNumChar); + if (bNumChar) + aNumberCharEdit.GrabFocus(); + + if (bFootnote) + aFtnBtn.Check(); + else + aEndNoteBtn.Check(); + + sal_Bool bNext = rSh.GotoNextFtnAnchor(); + + if (bNext) + rSh.GotoPrevFtnAnchor(); + + sal_Bool bPrev = rSh.GotoPrevFtnAnchor(); + + if (bPrev) + rSh.GotoNextFtnAnchor(); + + aPrevBT.Enable(bPrev); + aNextBT.Enable(bNext); + + rSh.Right(CRSR_SKIP_CHARS, sal_True, 1, sal_False ); + + rSh.EndAction(); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/insfnote.hrc b/sw/source/ui/misc/insfnote.hrc new file mode 100644 index 000000000000..d8e534f9255a --- /dev/null +++ b/sw/source/ui/misc/insfnote.hrc @@ -0,0 +1,45 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#define RB_NUMBER_AUTO 1 +#define RB_NUMBER_CHAR 2 +#define ED_NUMBER_CHAR 3 +#define BT_NUMBER_CHAR 4 +#define FL_NUMBER 5 +#define FL_TYPE 6 +#define RB_TYPE_FTN 7 +#define RB_TYPE_ENDNOTE 8 + +#define BT_OK 100 +#define BT_CANCEL 101 +#define BT_HELP 102 +#define BT_PREV 103 +#define BT_NEXT 104 + +//IAccessibility2 Implementation 2009----- +#define STR_CHAR 105 +//-----IAccessibility2 Implementation 2009 diff --git a/sw/source/ui/misc/insfnote.src b/sw/source/ui/misc/insfnote.src new file mode 100644 index 000000000000..a37f03817374 --- /dev/null +++ b/sw/source/ui/misc/insfnote.src @@ -0,0 +1,181 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" +#include "insfnote.hrc" +#include "helpid.h" + // #define DLG_INS_FOOTNOTE 257 +ModalDialog DLG_INS_FOOTNOTE +{ + HelpID = "sw:ModalDialog:DLG_INS_FOOTNOTE"; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 160 , 100 ) ; + Text [ en-US ] = "Insert Footnote/Endnote" ; + Moveable = TRUE ; + Edit ED_NUMBER_CHAR + { + HelpID = "sw:Edit:DLG_INS_FOOTNOTE:ED_NUMBER_CHAR"; + Disable = TRUE ; + Border = TRUE ; + Pos = MAP_APPFONT ( 69 , 27 ) ; + Size = MAP_APPFONT ( 23 , 12 ) ; + TabStop = TRUE ; + Group = TRUE ; + Left = TRUE ; + }; + //IAccessibility2 Implementation 2009----- + String STR_CHAR + { + Text [ en-US ] = "Character" ; + }; + //-----IAccessibility2 Implementation 2009 + OKButton BT_OK + { + Pos = MAP_APPFONT ( 104 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Group = TRUE ; + DefButton = TRUE ; + }; + CancelButton BT_CANCEL + { + Pos = MAP_APPFONT ( 104 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Group = TRUE ; + }; + HelpButton BT_HELP + { + Pos = MAP_APPFONT ( 104 , 43 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + Group = TRUE ; + }; + ImageButton BT_PREV + { + HelpID = "sw:ImageButton:DLG_INS_FOOTNOTE:BT_PREV"; + Pos = MAP_APPFONT ( 104 , 82 ) ; + Size = MAP_APPFONT ( 24 , 14 ) ; + TabStop = TRUE ; + Hide = TRUE ; + SYMBOL = IMAGEBUTTON_PREV ; + }; + ImageButton BT_NEXT + { + HelpID = "sw:ImageButton:DLG_INS_FOOTNOTE:BT_NEXT"; + Pos = MAP_APPFONT ( 130 , 82 ) ; + Size = MAP_APPFONT ( 24 , 14 ) ; + TabStop = TRUE ; + Hide = TRUE ; + SYMBOL = IMAGEBUTTON_NEXT ; + }; + RadioButton RB_NUMBER_AUTO + { + HelpID = "sw:RadioButton:DLG_INS_FOOTNOTE:RB_NUMBER_AUTO"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 79 , 10 ) ; + Text [ en-US ] = "~Automatic" ; + TabStop = TRUE ; + Group = TRUE ; + Check = TRUE ; + }; + RadioButton RB_NUMBER_CHAR + { + HelpID = "sw:RadioButton:DLG_INS_FOOTNOTE:RB_NUMBER_CHAR"; + Pos = MAP_APPFONT ( 12 , 27 ) ; + Size = MAP_APPFONT ( 54 , 10 ) ; + Text [ en-US ] = "~Character" ; + }; + FixedLine FL_NUMBER + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 92 , 8 ) ; + Text [ en-US ] = "Numbering" ; + }; + PushButton BT_NUMBER_CHAR + { + HelpID = "sw:PushButton:DLG_INS_FOOTNOTE:BT_NUMBER_CHAR"; + Pos = MAP_APPFONT ( 69 , 42 ) ; + Size = MAP_APPFONT ( 12 , 12 ) ; + Text = "..." ; + }; + RadioButton RB_TYPE_FTN + { + HelpID = "sw:RadioButton:DLG_INS_FOOTNOTE:RB_TYPE_FTN"; + Pos = MAP_APPFONT ( 12 , 70 ) ; + Size = MAP_APPFONT ( 79 , 10 ) ; + TabStop = TRUE ; + Group = TRUE ; + Check = TRUE ; + Text [ en-US ] = "~Footnote" ; + }; + RadioButton RB_TYPE_ENDNOTE + { + HelpID = "sw:RadioButton:DLG_INS_FOOTNOTE:RB_TYPE_ENDNOTE"; + Pos = MAP_APPFONT ( 12 , 83 ) ; + Size = MAP_APPFONT ( 79 , 10 ) ; + Text [ en-US ] = "~Endnote" ; + }; + FixedLine FL_TYPE + { + Pos = MAP_APPFONT ( 6 , 60 ) ; + Size = MAP_APPFONT ( 92 , 8 ) ; + Text [ en-US ] = "Type" ; + }; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/insrule.cxx b/sw/source/ui/misc/insrule.cxx new file mode 100644 index 000000000000..d861f085c86f --- /dev/null +++ b/sw/source/ui/misc/insrule.cxx @@ -0,0 +1,199 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#include "hintids.hxx" +#include <svx/gallery.hxx> +#include <vcl/msgbox.hxx> +#include <editeng/brshitem.hxx> +#include <svl/urihelper.hxx> +#include <vcl/graph.hxx> + +#include "swtypes.hxx" +#include "docsh.hxx" +#include "insrule.hxx" +#include "swvset.hxx" +#include "insrule.hrc" +#include "misc.hrc" +#include "helpid.h" + +SwInsertGrfRulerDlg::SwInsertGrfRulerDlg( Window* pParent ) : + SfxModalDialog(pParent, SW_RES(DLG_INSERT_RULER)), + aSelectionFL(this, SW_RES(FL_SEL )), + aOkPB (this, SW_RES(PB_OK )), + aCancelPB (this, SW_RES(PB_CANCEL )), + aHelpPB (this, SW_RES(PB_HELP )), + + sSimple (SW_RES(ST_SIMPLE)), + nSelPos(USHRT_MAX), + pExampleVS (new SwRulerValueSet(this, SW_RES(VS_EXAMPLE ))) +{ + FreeResource(); + pExampleVS->SetLineCount(6); + pExampleVS->SetColCount(1); + pExampleVS->SetSelectHdl(LINK(this, SwInsertGrfRulerDlg, SelectHdl)); + pExampleVS->SetDoubleClickHdl(LINK(this, SwInsertGrfRulerDlg, DoubleClickHdl)); + pExampleVS->GrabFocus(); + + // Grafiknamen ermitteln + GalleryExplorer::BeginLocking(GALLERY_THEME_RULERS); + GalleryExplorer::FillObjList( GALLERY_THEME_RULERS, aGrfNames ); + pExampleVS->SetHelpId(HID_VS_RULER); + Color aColor(COL_WHITE); + pExampleVS->InsertItem( 1, 1); + pExampleVS->SetItemText( 1, sSimple); + + for(sal_uInt16 i = 1; i <= aGrfNames.Count(); i++) + { + pExampleVS->InsertItem( i + 1, i); + pExampleVS->SetItemText( i + 1, *((String*)aGrfNames.GetObject(i-1))); + } + pExampleVS->Show(); + +} + +SwInsertGrfRulerDlg::~SwInsertGrfRulerDlg() +{ + GalleryExplorer::EndLocking(GALLERY_THEME_RULERS); + delete pExampleVS; +} + +String SwInsertGrfRulerDlg::GetGraphicName() +{ + String sRet; + sal_uInt16 nSel = nSelPos - 2; //align selection position with ValueSet index + if(nSel < aGrfNames.Count()) + sRet = URIHelper::SmartRel2Abs( + INetURLObject(), *(String*) aGrfNames.GetObject(nSel), + URIHelper::GetMaybeFileHdl()); + return sRet; +} + +IMPL_LINK(SwInsertGrfRulerDlg, SelectHdl, ValueSet*, pVS) +{ + nSelPos = pVS->GetSelectItemId(); + aOkPB.Enable(); + return 0; +} + +SwRulerValueSet::SwRulerValueSet( Window* pParent, const ResId& rResId ) : + SvxBmpNumValueSet(pParent, rResId) +{ + SetStyle( GetStyle() & ~WB_ITEMBORDER ); +} + +SwRulerValueSet::~SwRulerValueSet() +{ +} + +void SwRulerValueSet::UserDraw( const UserDrawEvent& rUDEvt ) +{ + Rectangle aRect = rUDEvt.GetRect(); + OutputDevice* pDev = rUDEvt.GetDevice(); + sal_uInt16 nItemId = rUDEvt.GetItemId(); + Point aBLPos = aRect.TopLeft(); + + // Itemzaehlung beginnt bei 1, und die 1. ist die einfache Linie + if(nItemId > 1) + { + Graphic aGraphic; + if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_RULERS, nItemId - 2, + &aGraphic)) + { + Size aGrfSize = aGraphic.GetPrefSize(); + if(aGrfSize.Width() && aGrfSize.Height()) + { + int nRelGrf = aGrfSize.Height() * 100 / aGrfSize.Width(); + Size aWinSize = aRect.GetSize(); + Size aPaintSize = aWinSize; + int nRelWin = aWinSize.Height() * 100 / aWinSize.Width(); + if(nRelGrf > nRelWin) + { + aPaintSize.Width() = aWinSize.Height() * 100 / nRelGrf; + aBLPos.X() += (aWinSize.Width() - aPaintSize.Width()) /2; + } + else + { + aPaintSize.Height() = aWinSize.Width() * nRelGrf/100; + aBLPos.Y() += (aWinSize.Height() - aPaintSize.Height()) /2; + } + aBLPos.X() -= aPaintSize.Width() /2; + aBLPos.Y() -= aPaintSize.Height() /2; + + aPaintSize.Width() *= 2; + aPaintSize.Height() *= 2; + if(aPaintSize.Height() < 2) + aPaintSize.Height() = 2; + Region aRegion = pDev->GetClipRegion(); + pDev->SetClipRegion(aRect); + aGraphic.Draw(pDev, aBLPos, aPaintSize); + pDev->SetClipRegion(aRegion); + } + } + else + { + SetGrfNotFound(sal_True); + } + } + else + { + // Text fuer einfache Linie painten + Font aOldFont = pDev->GetFont(); + Font aFont = pDev->GetFont(); + Size aSize = aFont.GetSize(); + int nRectHeight = aRect.GetHeight(); + aSize.Height() = nRectHeight * 2 / 3; + aFont.SetSize(aSize); + pDev->SetFont(aFont); + String aText(GetItemText(nItemId)); + aSize.Width() = pDev->GetTextWidth(aText); + aSize.Height() = pDev->GetTextHeight(); + Point aPos(aBLPos); + aPos.Y() += (nRectHeight - aSize.Height()) / 2; + aPos.X() += (aRect.GetWidth() - aSize.Width()) / 2; + pDev->DrawText(aPos, aText); + + pDev->SetFont(aOldFont); + } +} + +IMPL_LINK(SwInsertGrfRulerDlg, DoubleClickHdl, ValueSet*, EMPTYARG) +{ + EndDialog(RET_OK); + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/insrule.hrc b/sw/source/ui/misc/insrule.hrc new file mode 100644 index 000000000000..47289f2c366a --- /dev/null +++ b/sw/source/ui/misc/insrule.hrc @@ -0,0 +1,35 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" + +#define FL_SEL 1 +#define VS_EXAMPLE 2 +#define PB_OK 3 +#define PB_CANCEL 4 +#define PB_HELP 5 +#define ST_SIMPLE 6 diff --git a/sw/source/ui/misc/insrule.src b/sw/source/ui/misc/insrule.src new file mode 100644 index 000000000000..89890e5904af --- /dev/null +++ b/sw/source/ui/misc/insrule.src @@ -0,0 +1,114 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "insrule.hrc" +#include "helpid.h" +ModalDialog DLG_INSERT_RULER +{ + HelpID = HID_RULER_DIALOG ; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 242 , 124 ) ; + Moveable = TRUE ; + FixedLine FL_SEL + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 174 , 8 ) ; + Text [ en-US ] = "Selection" ; + }; + Control VS_EXAMPLE + { + Pos = MAP_APPFONT ( 9 , 14 ) ; + Size = MAP_APPFONT ( 168 , 104 ) ; + Hide = TRUE ; + Border = TRUE ; + TabStop = TRUE ; + Group = TRUE ; + }; + OKButton PB_OK + { + Pos = MAP_APPFONT ( 186 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + DefButton = TRUE ; + Disable = TRUE ; + }; + CancelButton PB_CANCEL + { + Pos = MAP_APPFONT ( 186 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + HelpButton PB_HELP + { + Pos = MAP_APPFONT ( 186 , 43 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + String ST_SIMPLE + { + Text [ en-US ] = "Plain" ; + }; + Text [ en-US ] = "Insert Horizontal Rule" ; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/linenum.cxx b/sw/source/ui/misc/linenum.cxx new file mode 100644 index 000000000000..74f479424079 --- /dev/null +++ b/sw/source/ui/misc/linenum.cxx @@ -0,0 +1,295 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + +#include <sfx2/viewfrm.hxx> +#include <svl/style.hxx> +#include <vcl/msgbox.hxx> +#include <view.hxx> +#include <wrtsh.hxx> +#include <docsh.hxx> +#include <charfmt.hxx> + +#include <docstyle.hxx> + +#include "fldbas.hxx" +#include "lineinfo.hxx" +#include "globals.hrc" +#include "linenum.hrc" +#include "linenum.hxx" +#include "uitool.hxx" + +#include <IDocumentStylePoolAccess.hxx> + +SwLineNumberingDlg::SwLineNumberingDlg(SwView *pVw) : + SfxSingleTabDialog(&pVw->GetViewFrame()->GetWindow(), 0, 0), + pSh(pVw->GetWrtShellPtr()) +{ + // TabPage erzeugen + SetTabPage(SwLineNumberingPage::Create(this, *(SfxItemSet*)0)); + + GetOKButton()->SetClickHdl(LINK(this, SwLineNumberingDlg, OKHdl)); +} + +SwLineNumberingDlg::~SwLineNumberingDlg() +{ +} + +IMPL_LINK( SwLineNumberingDlg, OKHdl, Button *, EMPTYARG ) +{ + if (GetOKButton()->IsEnabled()) + { + SfxTabPage* pCurPage = GetTabPage(); + if( pCurPage ) + pCurPage->FillItemSet(*(SfxItemSet*)0); + + EndDialog( RET_OK ); + } + + return 0; +} + +SwLineNumberingPage::SwLineNumberingPage( Window* pParent, + const SfxItemSet& rSet ) + : SfxTabPage(pParent, SW_RES(TP_LINENUMBERING), rSet), + aNumberingOnCB ( this, SW_RES( CB_NUMBERING_ON )), + aDisplayFL ( this, SW_RES( FL_DISPLAY )), + aCharStyleFT ( this, SW_RES( FT_CHAR_STYLE )), + aCharStyleLB ( this, SW_RES( LB_CHAR_STYLE )), + aFormatFT ( this, SW_RES( FT_FORMAT )), + aFormatLB ( this, SW_RES( LB_FORMAT ), INSERT_NUM_EXTENDED_TYPES), + aPosFT ( this, SW_RES( FT_POS )), + aPosLB ( this, SW_RES( LB_POS )), + aOffsetFT ( this, SW_RES( FT_OFFSET )), + aOffsetMF ( this, SW_RES( MF_OFFSET )), + aNumIntervalFT ( this, SW_RES( FT_NUM_INVERVAL )), + aNumIntervalNF ( this, SW_RES( NF_NUM_INVERVAL )), + aNumRowsFT ( this, SW_RES( FT_NUM_ROWS )), + aDivisorFL ( this, SW_RES( FL_DIVISOR )), + aDivisorFT ( this, SW_RES( FT_DIVISOR )), + aDivisorED ( this, SW_RES( ED_DIVISOR )), + aDivIntervalFT ( this, SW_RES( FT_DIV_INTERVAL )), + aDivIntervalNF ( this, SW_RES( NF_DIV_INTERVAL )), + aDivRowsFT ( this, SW_RES( FT_DIV_ROWS )), + aCountFL ( this, SW_RES( FL_COUNT )), + aCountEmptyLinesCB ( this, SW_RES( CB_COUNT_EMPTYLINES )), + aCountFrameLinesCB ( this, SW_RES( CB_COUNT_FRAMELINES )), + aRestartEachPageCB ( this, SW_RES( CB_RESTART_PAGE )) + +{ + String sIntervalName = aDivIntervalFT.GetAccessibleName(); + sIntervalName += String::CreateFromAscii("("); + sIntervalName += aDivRowsFT.GetAccessibleName(); + sIntervalName += String::CreateFromAscii(")"); + aDivIntervalNF.SetAccessibleName(sIntervalName); + sIntervalName = aNumIntervalFT.GetAccessibleName(); + sIntervalName += String::CreateFromAscii("("); + sIntervalName += aNumRowsFT.GetAccessibleName(); + sIntervalName += String::CreateFromAscii(")"); + aNumIntervalNF.SetAccessibleName(sIntervalName); + + FreeResource(); + SwLineNumberingDlg *pDlg = (SwLineNumberingDlg *)GetParent(); + pSh = pDlg->GetWrtShell(); + // Zeichenvorlagen + ::FillCharStyleListBox(aCharStyleLB, pSh->GetView().GetDocShell()); +} + +SwLineNumberingPage::~SwLineNumberingPage() +{ +} + +SfxTabPage* SwLineNumberingPage::Create( Window* pParent, const SfxItemSet& rSet ) +{ + return new SwLineNumberingPage( pParent, rSet ); +} + +void SwLineNumberingPage::Reset( const SfxItemSet& ) +{ + const SwLineNumberInfo &rInf = pSh->GetLineNumberInfo(); + IDocumentStylePoolAccess* pIDSPA = pSh->getIDocumentStylePoolAccess(); + + String sStyleName(rInf.GetCharFmt( *pIDSPA )->GetName()); + const sal_uInt16 nPos = aCharStyleLB.GetEntryPos(sStyleName); + + if (nPos != LISTBOX_ENTRY_NOTFOUND) + aCharStyleLB.SelectEntryPos(nPos); + else + { + if (sStyleName.Len()) + { + aCharStyleLB.InsertEntry(sStyleName); + aCharStyleLB.SelectEntry(sStyleName); + } + } + + // Format + sal_uInt16 nSelFmt = rInf.GetNumType().GetNumberingType(); + + aFormatLB.SelectNumberingType(nSelFmt); + + // Position + aPosLB.SelectEntryPos((sal_uInt16)rInf.GetPos()); + + // Offset + sal_uInt16 nOffset = rInf.GetPosFromLeft(); + if (nOffset == USHRT_MAX) + nOffset = 0; + + aOffsetMF.SetValue(aOffsetMF.Normalize(nOffset), FUNIT_TWIP); + + // Numerierungsoffset + aNumIntervalNF.SetValue(rInf.GetCountBy()); + + // Teiler + aDivisorED.SetText(rInf.GetDivider()); + + // Teileroffset + aDivIntervalNF.SetValue(rInf.GetDividerCountBy()); + + // Zaehlen + aCountEmptyLinesCB.Check(rInf.IsCountBlankLines()); + aCountFrameLinesCB.Check(rInf.IsCountInFlys()); + aRestartEachPageCB.Check(rInf.IsRestartEachPage()); + + aNumberingOnCB.Check(rInf.IsPaintLineNumbers()); + + aNumberingOnCB.SetClickHdl(LINK(this, SwLineNumberingPage, LineOnOffHdl)); + aDivisorED.SetModifyHdl(LINK(this, SwLineNumberingPage, ModifyHdl)); + ModifyHdl(); + LineOnOffHdl(); +} + +/*-------------------------------------------------------------------- + Beschreibung: Modify + --------------------------------------------------------------------*/ +IMPL_LINK( SwLineNumberingPage, ModifyHdl, Edit *, EMPTYARG ) +{ + sal_Bool bHasValue = aDivisorED.GetText().Len() != 0; + + aDivIntervalFT.Enable(bHasValue); + aDivIntervalNF.Enable(bHasValue); + aDivRowsFT.Enable(bHasValue); + + return 0; +} + +/*-------------------------------------------------------------------- + Beschreibung: On/Off + --------------------------------------------------------------------*/ +IMPL_LINK( SwLineNumberingPage, LineOnOffHdl, CheckBox *, EMPTYARG ) +{ + sal_Bool bEnable = aNumberingOnCB.IsChecked(); + + aCharStyleFT.Enable(bEnable); + aCharStyleLB.Enable(bEnable); + aFormatFT.Enable(bEnable); + aFormatLB.Enable(bEnable); + aPosFT.Enable(bEnable); + aPosLB.Enable(bEnable); + aOffsetFT.Enable(bEnable); + aOffsetMF.Enable(bEnable); + aNumIntervalFT.Enable(bEnable); + aNumIntervalNF.Enable(bEnable); + aNumRowsFT.Enable(bEnable); + aDisplayFL.Enable(bEnable); + aDivisorFT.Enable(bEnable); + aDivisorED.Enable(bEnable); + aDivIntervalFT.Enable(bEnable); + aDivIntervalNF.Enable(bEnable); + aDivRowsFT.Enable(bEnable); + aDivisorFL.Enable(bEnable); + aCountEmptyLinesCB.Enable(bEnable); + aCountFrameLinesCB.Enable(bEnable); + aRestartEachPageCB.Enable(bEnable); + aCountFL.Enable(bEnable); + + return 0; +} + +sal_Bool SwLineNumberingPage::FillItemSet( SfxItemSet& ) +{ + SwLineNumberInfo aInf(pSh->GetLineNumberInfo()); + + // Zeichenvorlagen + String sCharFmtName(aCharStyleLB.GetSelectEntry()); + SwCharFmt *pCharFmt = pSh->FindCharFmtByName(sCharFmtName); + + if (!pCharFmt) + { + SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); + SfxStyleSheetBase* pBase; + pBase = pPool->Find(sCharFmtName, SFX_STYLE_FAMILY_CHAR); + if(!pBase) + pBase = &pPool->Make(sCharFmtName, SFX_STYLE_FAMILY_CHAR); + pCharFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt(); + } + + if (pCharFmt) + aInf.SetCharFmt(pCharFmt); + + // Format + SvxNumberType aType; + aType.SetNumberingType(aFormatLB.GetSelectedNumberingType()); + aInf.SetNumType(aType); + + // Position + aInf.SetPos((LineNumberPosition)aPosLB.GetSelectEntryPos()); + + // Offset + aInf.SetPosFromLeft((sal_uInt16)aOffsetMF.Denormalize(aOffsetMF.GetValue(FUNIT_TWIP))); + + // Numerierungsoffset + aInf.SetCountBy((sal_uInt16)aNumIntervalNF.GetValue()); + + // Teiler + aInf.SetDivider(aDivisorED.GetText()); + + // Teileroffset + aInf.SetDividerCountBy((sal_uInt16)aDivIntervalNF.GetValue()); + + // Zaehlen + aInf.SetCountBlankLines(aCountEmptyLinesCB.IsChecked()); + aInf.SetCountInFlys(aCountFrameLinesCB.IsChecked()); + aInf.SetRestartEachPage(aRestartEachPageCB.IsChecked()); + + aInf.SetPaintLineNumbers(aNumberingOnCB.IsChecked()); + + pSh->SetLineNumberInfo(aInf); + + return sal_False; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/linenum.hrc b/sw/source/ui/misc/linenum.hrc new file mode 100644 index 000000000000..235d13576aa3 --- /dev/null +++ b/sw/source/ui/misc/linenum.hrc @@ -0,0 +1,50 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#define CB_NUMBERING_ON 1 +#define FT_CHAR_STYLE 2 +#define LB_CHAR_STYLE 3 +#define FT_FORMAT 4 +#define LB_FORMAT 5 +#define FT_POS 6 +#define LB_POS 7 +#define FT_OFFSET 8 +#define MF_OFFSET 9 +#define FT_NUM_INVERVAL 10 +#define NF_NUM_INVERVAL 11 +#define FT_NUM_ROWS 12 +#define FL_DISPLAY 13 +#define FT_DIVISOR 14 +#define ED_DIVISOR 15 +#define FT_DIV_INTERVAL 16 +#define NF_DIV_INTERVAL 17 +#define FT_DIV_ROWS 18 +#define FL_DIVISOR 19 +#define CB_COUNT_EMPTYLINES 20 +#define CB_COUNT_FRAMELINES 21 +#define FL_COUNT 22 +#define CB_RESTART_PAGE 23 + diff --git a/sw/source/ui/misc/linenum.src b/sw/source/ui/misc/linenum.src new file mode 100644 index 000000000000..1b2db408c761 --- /dev/null +++ b/sw/source/ui/misc/linenum.src @@ -0,0 +1,279 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +/* StarView ressource file */ + +#ifndef _SFX_HRC +#include <sfx2/sfx.hrc> +#endif +#ifndef _SVX_DIALOGS_HRC +#include <svx/dialogs.hrc> +#endif +#include "globals.hrc" +#include "misc.hrc" +#include "linenum.hrc" +#include "helpid.h" +/**************************************************************************/ +/* */ +/**************************************************************************/ +TabPage TP_LINENUMBERING +{ + HelpID = HID_LINENUMBERING ; + SVLook = TRUE ; + Hide = TRUE ; + Size = MAP_APPFONT ( 260 , 185 ) ; + CheckBox CB_NUMBERING_ON + { + HelpID = "sw:CheckBox:TP_LINENUMBERING:CB_NUMBERING_ON"; + Pos = MAP_APPFONT ( 12 , 6 ) ; + Size = MAP_APPFONT ( 242 , 8 ) ; + TabStop = TRUE ; + Text [ en-US ] = "~Show numbering" ; + }; + FixedText FT_CHAR_STYLE + { + Pos = MAP_APPFONT ( 12 , 30 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "~Character Style" ; + }; + ListBox LB_CHAR_STYLE + { + HelpID = "sw:ListBox:TP_LINENUMBERING:LB_CHAR_STYLE"; + Pos = MAP_APPFONT ( 100 , 30 ) ; + Size = MAP_APPFONT ( 148 , 80 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + Sort = TRUE ; + }; + FixedText FT_FORMAT + { + Pos = MAP_APPFONT ( 12 , 46 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "F~ormat" ; + }; + ListBox LB_FORMAT + { + HelpID = "sw:ListBox:TP_LINENUMBERING:LB_FORMAT"; + Pos = MAP_APPFONT ( 100 , 44 ) ; + Size = MAP_APPFONT ( 148 , 80 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + }; + FixedText FT_POS + { + Pos = MAP_APPFONT ( 12 , 62 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "Position" ; + }; + ListBox LB_POS + { + HelpID = "sw:ListBox:TP_LINENUMBERING:LB_POS"; + Pos = MAP_APPFONT ( 100 , 60 ) ; + Size = MAP_APPFONT ( 148 , 60 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + StringList [ en-US ] = + { + < "Left" ; > ; + < "Right" ; > ; + < "Inner" ; > ; + < "Outer" ; > ; + }; + }; + FixedText FT_OFFSET + { + Pos = MAP_APPFONT ( 12 , 78 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "Spacing" ; + }; + MetricField MF_OFFSET + { + HelpID = "sw:MetricField:TP_LINENUMBERING:MF_OFFSET"; + Pos = MAP_APPFONT ( 100 , 76 ) ; + Size = MAP_APPFONT ( 45 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 0 ; + Maximum = 9999 ; + DecimalDigits = 2 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 9999 ; + SpinSize = 10 ; + }; + FixedText FT_NUM_INVERVAL + { + Pos = MAP_APPFONT ( 12 , 94 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "Interval" ; + }; + NumericField NF_NUM_INVERVAL + { + HelpID = "sw:NumericField:TP_LINENUMBERING:NF_NUM_INVERVAL"; + Pos = MAP_APPFONT ( 100 , 92 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 1000 ; + First = 1 ; + Last = 1000 ; + SpinSize = 1 ; + }; + FixedText FT_NUM_ROWS + { + Pos = MAP_APPFONT ( 136 , 94 ) ; + Size = MAP_APPFONT ( 80 , 10 ) ; + Text [ en-US ] = "lines" ; + }; + FixedLine FL_DISPLAY + { + Pos = MAP_APPFONT ( 6 , 17 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "View" ; + }; + FixedText FT_DIVISOR + { + Pos = MAP_APPFONT ( 12 , 123 ) ; + Size = MAP_APPFONT ( 30 , 8 ) ; + Text [ en-US ] = "Text" ; + }; + Edit ED_DIVISOR + { + HelpID = "sw:Edit:TP_LINENUMBERING:ED_DIVISOR"; + Pos = MAP_APPFONT ( 45 , 121 ) ; + Size = MAP_APPFONT ( 76 , 12 ) ; + Left = TRUE ; + Border = TRUE ; + }; + FixedText FT_DIV_INTERVAL + { + Pos = MAP_APPFONT ( 12 , 139 ) ; + Size = MAP_APPFONT ( 30 , 8 ) ; + // Disable = TRUE ; + Text [ en-US ] = "Every" ; + }; + NumericField NF_DIV_INTERVAL + { + HelpID = "sw:NumericField:TP_LINENUMBERING:NF_DIV_INTERVAL"; + Pos = MAP_APPFONT ( 45 , 137 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 0 ; + Maximum = 1000 ; + First = 0 ; + Last = 1000 ; + SpinSize = 1 ; + // Disable = TRUE ; + }; + FixedText FT_DIV_ROWS + { + Pos = MAP_APPFONT ( 78 , 139 ) ; + Size = MAP_APPFONT ( 40 , 8 ) ; + Text [ en-US ] = "Lines" ; + }; + FixedLine FL_DIVISOR + { + Pos = MAP_APPFONT ( 6 , 110 ) ; + Size = MAP_APPFONT ( 121 , 8 ) ; + Text [ en-US ] = "Separator" ; + }; + CheckBox CB_COUNT_EMPTYLINES + { + HelpID = "sw:CheckBox:TP_LINENUMBERING:CB_COUNT_EMPTYLINES"; + Pos = MAP_APPFONT ( 139 , 121 ) ; + Size = MAP_APPFONT ( 110 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Blank lines" ; + }; + CheckBox CB_COUNT_FRAMELINES + { + HelpID = "sw:CheckBox:TP_LINENUMBERING:CB_COUNT_FRAMELINES"; + Pos = MAP_APPFONT ( 139 , 135 ) ; + Size = MAP_APPFONT ( 110 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Lines in text frames" ; + }; + CheckBox CB_RESTART_PAGE + { + HelpID = "sw:CheckBox:TP_LINENUMBERING:CB_RESTART_PAGE"; + Pos = MAP_APPFONT ( 139 , 149 ); + Size = MAP_APPFONT ( 110 , 10 ); + TabStop = TRUE; + Text [ en-US ] = "~Restart every new page"; + }; + FixedLine FL_COUNT + { + Pos = MAP_APPFONT ( 133 , 110 ) ; + Size = MAP_APPFONT ( 121 , 8 ) ; + Text [ en-US ] = "Count" ; + }; + Text [ en-US ] = "Line Numbering" ; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/num.cxx b/sw/source/ui/misc/num.cxx new file mode 100644 index 000000000000..8088699c5ea7 --- /dev/null +++ b/sw/source/ui/misc/num.cxx @@ -0,0 +1,1035 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#define USE_NUMTABPAGES +#define _NUM_CXX +#include <hintids.hxx> + +#include <vcl/msgbox.hxx> +#include <tools/urlobj.hxx> +#include <sfx2/app.hxx> +#include <sfx2/imgmgr.hxx> +#include <svx/gallery.hxx> +#include <editeng/brshitem.hxx> +#include <editeng/lrspitem.hxx> +#include <editeng/numitem.hxx> +#include <swvset.hxx> +#include <swmodule.hxx> +#include <wrtsh.hxx> +#include <docsh.hxx> +#include <wview.hxx> +#include <uitool.hxx> +#include <wdocsh.hxx> +#include <uiitems.hxx> +#include <docstyle.hxx> +#include <charfmt.hxx> +#include <uinums.hxx> +#include <poolfmt.hxx> +#include <shellres.hxx> +#include <outline.hxx> +#include <num.hxx> +#include <viewopt.hxx> +#include <frmmgr.hxx> + +#include <misc.hrc> +#include <frmui.hrc> +#include <num.hrc> +#include <globals.hrc> +#include <helpid.h> +#include <SwStyleNameMapper.hxx> +#include <svx/svxids.hrc> +#include <svx/dialogs.hrc> +#include <svl/stritem.hxx> +#include <svl/aeitem.hxx> +#include <svl/slstitm.hxx> + +static sal_Bool bLastRelative = sal_False; + +SwNumPositionTabPage::SwNumPositionTabPage(Window* pParent, + const SfxItemSet& rSet) : + SfxTabPage( pParent, SW_RES( TP_NUM_POSITION ), rSet ), + aLevelFL( this, SW_RES(FL_LEVEL )), + aLevelLB( this, SW_RES(LB_LEVEL )), + aPositionFL( this, SW_RES(FL_POSITION )), + + aDistBorderFT( this, SW_RES(FT_BORDERDIST )), + aDistBorderMF( this, SW_RES(MF_BORDERDIST )), + aRelativeCB( this, SW_RES(CB_RELATIVE )), + aIndentFT( this, SW_RES(FT_INDENT )), + aIndentMF( this, SW_RES(MF_INDENT )), + aDistNumFT( this, SW_RES(FT_NUMDIST )), + aDistNumMF( this, SW_RES(MF_NUMDIST )), + aAlignFT( this, SW_RES(FT_ALIGN )), + aAlignLB( this, SW_RES(LB_ALIGN )), + aLabelFollowedByFT( this, SW_RES(FT_LABEL_FOLLOWED_BY) ), + aLabelFollowedByLB( this, SW_RES(LB_LABEL_FOLLOWED_BY) ), + aListtabFT( this, SW_RES(FT_LISTTAB) ), + aListtabMF( this, SW_RES(MF_LISTTAB) ), + aAlign2FT( this, SW_RES(FT_ALIGN_2) ), + aAlign2LB( this, SW_RES(LB_ALIGN_2) ), + aAlignedAtFT( this, SW_RES(FT_ALIGNED_AT) ), + aAlignedAtMF( this, SW_RES(MF_ALIGNED_AT) ), + aIndentAtFT( this, SW_RES(FT_INDENT_AT) ), + aIndentAtMF( this, SW_RES(MF_INDENT_AT) ), + aStandardPB( this, SW_RES(PB_STANDARD )), + + aPreviewWIN( this, SW_RES(WIN_PREVIEW )), + + pActNum(0), + pSaveNum(0), + pWrtSh(0), + pOutlineDlg(0), + bPreset( sal_False ), + bInInintControl(sal_False), + bLabelAlignmentPosAndSpaceModeActive( false ) +{ + FreeResource(); + SetExchangeSupport(); + aPreviewWIN.SetBackground(Wallpaper(Color(COL_TRANSPARENT))); + + aStandardPB.SetAccessibleRelationMemberOf(&aPositionFL); + + + aRelativeCB.Check(); + aAlignLB.SetSelectHdl(LINK(this, SwNumPositionTabPage, EditModifyHdl)); + aAlign2LB.SetSelectHdl(LINK(this, SwNumPositionTabPage, EditModifyHdl)); + for ( sal_uInt16 i = 0; i < aAlignLB.GetEntryCount(); ++i ) + { + aAlign2LB.InsertEntry( aAlignLB.GetEntry( i ) ); + } + aAlign2LB.SetDropDownLineCount( aAlign2LB.GetEntryCount() ); + aAlign2FT.SetText( aAlignFT.GetText() ); + + Link aLk = LINK(this, SwNumPositionTabPage, DistanceHdl); + aDistBorderMF.SetUpHdl(aLk); + aDistNumMF.SetUpHdl(aLk); + aIndentMF.SetUpHdl(aLk); + aDistBorderMF.SetDownHdl(aLk); + aDistNumMF.SetDownHdl(aLk); + aIndentMF.SetDownHdl(aLk); + aDistBorderMF.SetLoseFocusHdl(aLk); + aDistNumMF.SetLoseFocusHdl(aLk); + aIndentMF.SetLoseFocusHdl(aLk); + + aLabelFollowedByLB.SetDropDownLineCount( aLabelFollowedByLB.GetEntryCount() ); + aLabelFollowedByLB.SetSelectHdl( LINK(this, SwNumPositionTabPage, LabelFollowedByHdl_Impl) ); + + aLk = LINK(this, SwNumPositionTabPage, ListtabPosHdl_Impl); + aListtabMF.SetUpHdl(aLk); + aListtabMF.SetDownHdl(aLk); + aListtabMF.SetLoseFocusHdl(aLk); + + aLk = LINK(this, SwNumPositionTabPage, AlignAtHdl_Impl); + aAlignedAtMF.SetUpHdl(aLk); + aAlignedAtMF.SetDownHdl(aLk); + aAlignedAtMF.SetLoseFocusHdl(aLk); + + aLk = LINK(this, SwNumPositionTabPage, IndentAtHdl_Impl); + aIndentAtMF.SetUpHdl(aLk); + aIndentAtMF.SetDownHdl(aLk); + aIndentAtMF.SetLoseFocusHdl(aLk); + + aLevelLB.SetSelectHdl(LINK(this, SwNumPositionTabPage, LevelHdl)); + aRelativeCB.SetClickHdl(LINK(this, SwNumPositionTabPage, RelativeHdl)); + aStandardPB.SetClickHdl(LINK(this, SwNumPositionTabPage, StandardHdl)); + + // Ebenen einfuegen + for(sal_uInt16 i = 1; i <= MAXLEVEL; i++) + aLevelLB.InsertEntry(String::CreateFromInt32(i)); + String sEntry(String::CreateFromAscii("1 - ")); + sEntry += String::CreateFromInt32(MAXLEVEL); + aLevelLB.InsertEntry(sEntry); + aLevelLB.SelectEntry(sEntry); + + aRelativeCB.Check(bLastRelative); + aPreviewWIN.SetPositionMode(); +} + +SwNumPositionTabPage::~SwNumPositionTabPage() +{ + delete pActNum; +} + +void SwNumPositionTabPage::InitControls() +{ + bInInintControl = sal_True; + const bool bRelative = !bLabelAlignmentPosAndSpaceModeActive && + aRelativeCB.IsEnabled() && aRelativeCB.IsChecked(); + const bool bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 && + USHRT_MAX != nActNumLvl; + + aDistBorderMF.Enable( !bLabelAlignmentPosAndSpaceModeActive && + ( bSingleSelection || bRelative || pOutlineDlg != 0 ) ); + aDistBorderFT.Enable( !bLabelAlignmentPosAndSpaceModeActive && + ( bSingleSelection || bRelative || pOutlineDlg != 0 ) ); + + bool bSetDistEmpty = false; + bool bSameDistBorderNum = !bLabelAlignmentPosAndSpaceModeActive; + bool bSameDist = !bLabelAlignmentPosAndSpaceModeActive; + bool bSameIndent = !bLabelAlignmentPosAndSpaceModeActive; + bool bSameAdjust = true; + + bool bSameLabelFollowedBy = bLabelAlignmentPosAndSpaceModeActive; + bool bSameListtab = bLabelAlignmentPosAndSpaceModeActive; + bool bSameAlignAt = bLabelAlignmentPosAndSpaceModeActive; + bool bSameIndentAt = bLabelAlignmentPosAndSpaceModeActive; + + const SwNumFmt* aNumFmtArr[MAXLEVEL]; + sal_uInt16 nMask = 1; + sal_uInt16 nLvl = USHRT_MAX; + long nFirstBorderTextRelative = -1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + aNumFmtArr[i] = &pActNum->Get(i); + if(nActNumLvl & nMask) + { + if(USHRT_MAX == nLvl) + { + nLvl = i; + } + + if( i > nLvl) + { + bSameAdjust &= aNumFmtArr[i]->GetNumAdjust() == aNumFmtArr[nLvl]->GetNumAdjust(); + if ( !bLabelAlignmentPosAndSpaceModeActive ) + { + if(bRelative) + { + if(nFirstBorderTextRelative == -1) + nFirstBorderTextRelative = + (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() - + aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset()); + else + bSameDistBorderNum &= nFirstBorderTextRelative == + (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() - + aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset()); + + } + else + { + bSameDistBorderNum &= + aNumFmtArr[i]->GetAbsLSpace() - aNumFmtArr[i]->GetFirstLineOffset() == + aNumFmtArr[i - 1]->GetAbsLSpace() - aNumFmtArr[i - 1]->GetFirstLineOffset(); + } + + bSameDist &= aNumFmtArr[i]->GetCharTextDistance() == aNumFmtArr[nLvl]->GetCharTextDistance(); + bSameIndent &= aNumFmtArr[i]->GetFirstLineOffset() == aNumFmtArr[nLvl]->GetFirstLineOffset(); + } + else + { + bSameLabelFollowedBy &= + aNumFmtArr[i]->GetLabelFollowedBy() == aNumFmtArr[nLvl]->GetLabelFollowedBy(); + bSameListtab &= + aNumFmtArr[i]->GetListtabPos() == aNumFmtArr[nLvl]->GetListtabPos(); + bSameAlignAt &= + ( ( aNumFmtArr[i]->GetIndentAt() + aNumFmtArr[i]->GetFirstLineIndent() ) + == ( aNumFmtArr[nLvl]->GetIndentAt() + aNumFmtArr[nLvl]->GetFirstLineIndent() ) ); + bSameIndentAt &= + aNumFmtArr[i]->GetIndentAt() == aNumFmtArr[nLvl]->GetIndentAt(); + } + } + } + nMask <<= 1; + + } + if(bSameDistBorderNum) + { + long nDistBorderNum; + if(bRelative) + { + nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset(); + if(nLvl) + nDistBorderNum -= (long)aNumFmtArr[nLvl - 1]->GetAbsLSpace()+ aNumFmtArr[nLvl - 1]->GetFirstLineOffset(); + } + else + { + nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset(); + } + aDistBorderMF.SetValue(aDistBorderMF.Normalize(nDistBorderNum),FUNIT_TWIP); + } + else + bSetDistEmpty = sal_True; + + if(bSameDist) + aDistNumMF .SetValue(aDistNumMF.Normalize(aNumFmtArr[nLvl]->GetCharTextDistance()), FUNIT_TWIP); + else + aDistNumMF.SetText(aEmptyStr); + if(bSameIndent) + aIndentMF.SetValue(aIndentMF.Normalize(-aNumFmtArr[nLvl]->GetFirstLineOffset()), FUNIT_TWIP); + else + aIndentMF.SetText(aEmptyStr); + + if(bSameAdjust) + { + sal_uInt16 nPos = 1; // zentriert + if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_LEFT) + nPos = 0; + else if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_RIGHT) + nPos = 2; + aAlignLB.SelectEntryPos(nPos); + aAlign2LB.SelectEntryPos( nPos ); + } + else + { + aAlignLB.SetNoSelection(); + aAlign2LB.SetNoSelection(); + } + + if ( bSameLabelFollowedBy ) + { + sal_uInt16 nPos = 0; // LISTTAB + if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::SPACE ) + { + nPos = 1; + } + else if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::NOTHING ) + { + nPos = 2; + } + aLabelFollowedByLB.SelectEntryPos( nPos ); + } + else + { + aLabelFollowedByLB.SetNoSelection(); + } + + if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::LISTTAB ) + { + aListtabFT.Enable( true ); + aListtabMF.Enable( true ); + if ( bSameListtab ) + { + aListtabMF.SetValue(aListtabMF.Normalize(aNumFmtArr[nLvl]->GetListtabPos()),FUNIT_TWIP); + } + else + { + aListtabMF.SetText(aEmptyStr); + } + } + else + { + aListtabFT.Enable( false ); + aListtabMF.Enable( false ); + aListtabMF.SetText(aEmptyStr); + } + + if ( bSameAlignAt ) + { + aAlignedAtMF.SetValue( + aAlignedAtMF.Normalize( aNumFmtArr[nLvl]->GetIndentAt() + + aNumFmtArr[nLvl]->GetFirstLineIndent()), + FUNIT_TWIP ); + } + else + { + aAlignedAtMF.SetText(aEmptyStr); + } + + if ( bSameIndentAt ) + { + aIndentAtMF.SetValue( + aIndentAtMF.Normalize( aNumFmtArr[nLvl]->GetIndentAt()), FUNIT_TWIP ); + } + else + { + aIndentAtMF.SetText(aEmptyStr); + } + + if(sal_True == bSetDistEmpty) + aDistBorderMF.SetText(aEmptyStr); + + bInInintControl = sal_False; +} + +void SwNumPositionTabPage::ActivatePage(const SfxItemSet& ) +{ + const SfxPoolItem* pItem; + sal_uInt16 nTmpNumLvl = + pOutlineDlg ? pOutlineDlg->GetActNumLevel() : 0; + const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet(); + if(pExampleSet && pExampleSet->GetItemState(FN_PARAM_NUM_PRESET, sal_False, &pItem)) + { + bPreset = ((const SfxBoolItem*)pItem)->GetValue(); + } + bModified = (!pActNum->GetNumFmt( 0 ) || bPreset); + if(*pActNum != *pSaveNum || + nActNumLvl != nTmpNumLvl ) + { + *pActNum = *pSaveNum; + nActNumLvl = nTmpNumLvl; + sal_uInt16 nMask = 1; + aLevelLB.SetUpdateMode(sal_False); + aLevelLB.SetNoSelection(); + aLevelLB.SelectEntryPos( MAXLEVEL, nActNumLvl == USHRT_MAX); + if(nActNumLvl != USHRT_MAX) + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActNumLvl & nMask) + aLevelLB.SelectEntryPos( i, sal_True); + nMask <<= 1 ; + } + aLevelLB.SetUpdateMode(sal_True); + + InitPosAndSpaceMode(); + ShowControlsDependingOnPosAndSpaceMode(); + + InitControls(); + } + aRelativeCB.Enable(1 != nActNumLvl); + aPreviewWIN.Invalidate(); +} + +int SwNumPositionTabPage::DeactivatePage(SfxItemSet *_pSet) +{ + SwOutlineTabDialog::SetActNumLevel(nActNumLvl); + if(_pSet) + FillItemSet(*_pSet); + return sal_True; + +} + +sal_Bool SwNumPositionTabPage::FillItemSet( SfxItemSet& rSet ) +{ + if(pOutlineDlg) + *pOutlineDlg->GetNumRule() = *pActNum; + else if(bModified && pActNum) + { + *pSaveNum = *pActNum; + rSet.Put(SwUINumRuleItem( *pSaveNum )); + rSet.Put(SfxBoolItem(FN_PARAM_NUM_PRESET, sal_False)); + } + return bModified; +} + +void SwNumPositionTabPage::Reset( const SfxItemSet& rSet ) +{ + const SfxPoolItem* pItem; + if(pOutlineDlg) + { + pSaveNum = pOutlineDlg->GetNumRule(); + aLevelLB.EnableMultiSelection(sal_False); + } + else if(SFX_ITEM_SET == rSet.GetItemState(FN_PARAM_ACT_NUMBER, sal_False, &pItem)) + pSaveNum = ((SwUINumRuleItem*)pItem)->GetNumRule(); + + nActNumLvl = SwOutlineTabDialog::GetActNumLevel(); + sal_uInt16 nMask = 1; + aLevelLB.SetUpdateMode(sal_False); + aLevelLB.SetNoSelection(); + if(nActNumLvl == USHRT_MAX) + { + aLevelLB.SelectEntryPos( MAXLEVEL, sal_True); + } + else + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActNumLvl & nMask) + aLevelLB.SelectEntryPos( i, sal_True); + nMask <<= 1; + } + aLevelLB.SetUpdateMode(sal_True); + + if(!pActNum) + pActNum = new SwNumRule(*pSaveNum); + else if(*pSaveNum != *pActNum) + *pActNum = *pSaveNum; + aPreviewWIN.SetNumRule(pActNum); + InitPosAndSpaceMode(); + ShowControlsDependingOnPosAndSpaceMode(); + InitControls(); + bModified = sal_False; +} + +void SwNumPositionTabPage::InitPosAndSpaceMode() +{ + if ( pActNum == 0 ) + { + OSL_FAIL( "<SwNumPositionTabPage::InitPosAndSpaceMode()> - misusage of method -> <pAktNum> has to be already set!" ); + return; + } + + SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode = + SvxNumberFormat::LABEL_ALIGNMENT; + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; ++i ) + { + if(nActNumLvl & nMask) + { + SvxNumberFormat aNumFmt( pActNum->Get(i) ); + ePosAndSpaceMode = aNumFmt.GetPositionAndSpaceMode(); + if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT ) + { + break; + } + } + nMask <<= 1; + } + + bLabelAlignmentPosAndSpaceModeActive = + ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT; +} + +void SwNumPositionTabPage::ShowControlsDependingOnPosAndSpaceMode() +{ + aDistBorderFT.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aDistBorderMF.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aRelativeCB.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aIndentFT.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aIndentMF.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aDistNumFT.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aDistNumMF.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aAlignFT.Show( !bLabelAlignmentPosAndSpaceModeActive ); + aAlignLB.Show( !bLabelAlignmentPosAndSpaceModeActive ); + + aLabelFollowedByFT.Show( bLabelAlignmentPosAndSpaceModeActive ); + aLabelFollowedByLB.Show( bLabelAlignmentPosAndSpaceModeActive ); + aListtabFT.Show( bLabelAlignmentPosAndSpaceModeActive ); + aListtabMF.Show( bLabelAlignmentPosAndSpaceModeActive ); + aAlign2FT.Show( bLabelAlignmentPosAndSpaceModeActive ); + aAlign2LB.Show( bLabelAlignmentPosAndSpaceModeActive ); + aAlignedAtFT.Show( bLabelAlignmentPosAndSpaceModeActive ); + aAlignedAtMF.Show( bLabelAlignmentPosAndSpaceModeActive ); + aIndentAtFT.Show( bLabelAlignmentPosAndSpaceModeActive ); + aIndentAtMF.Show( bLabelAlignmentPosAndSpaceModeActive ); +} + +SfxTabPage* SwNumPositionTabPage::Create( Window* pParent, + const SfxItemSet& rAttrSet) +{ + return new SwNumPositionTabPage(pParent, rAttrSet); +} + +void SwNumPositionTabPage::SetWrtShell(SwWrtShell* pSh) +{ + pWrtSh = pSh; + + const SwTwips nWidth = pWrtSh->GetAnyCurRect(RECT_FRM).Width(); + + aDistBorderMF.SetMax(aDistBorderMF.Normalize( nWidth ), FUNIT_TWIP ); + aDistNumMF .SetMax(aDistNumMF .Normalize( nWidth ), FUNIT_TWIP ); + aIndentMF .SetMax(aIndentMF .Normalize( nWidth ), FUNIT_TWIP ); + aListtabMF.SetMax(aListtabMF.Normalize( nWidth ), FUNIT_TWIP ); + aAlignedAtMF.SetMax(aAlignedAtMF.Normalize( nWidth ), FUNIT_TWIP ); + aIndentAtMF.SetMax(aIndentAtMF.Normalize( nWidth ), FUNIT_TWIP ); + const SwTwips nLast2 = nWidth /2; + aDistBorderMF.SetLast( aDistBorderMF.Normalize( nLast2 ), FUNIT_TWIP ); + aDistNumMF .SetLast( aDistNumMF .Normalize( nLast2 ), FUNIT_TWIP ); + aIndentMF .SetLast( aIndentMF .Normalize( nLast2 ), FUNIT_TWIP ); + aListtabMF.SetLast(aListtabMF.Normalize( nLast2 ), FUNIT_TWIP ); + aAlignedAtMF.SetLast(aAlignedAtMF.Normalize( nLast2 ), FUNIT_TWIP ); + aIndentAtMF.SetLast(aIndentAtMF.Normalize( nLast2 ), FUNIT_TWIP ); + + const SwRect& rPrtRect = pWrtSh->GetAnyCurRect(RECT_PAGE); + aPreviewWIN.SetPageWidth(rPrtRect.Width()); + FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &pWrtSh->GetView())); + if(eMetric == FUNIT_MM) + { + aDistBorderMF .SetDecimalDigits(1); + aDistNumMF .SetDecimalDigits(1); + aIndentMF .SetDecimalDigits(1); + aListtabMF.SetDecimalDigits(1); + aAlignedAtMF.SetDecimalDigits(1); + aIndentAtMF.SetDecimalDigits(1); + } + aDistBorderMF .SetUnit( eMetric ); + aDistNumMF .SetUnit( eMetric ); + aIndentMF .SetUnit( eMetric ); + aListtabMF.SetUnit( eMetric ); + aAlignedAtMF.SetUnit( eMetric ); + aIndentAtMF.SetUnit( eMetric ); +} + +IMPL_LINK( SwNumPositionTabPage, EditModifyHdl, Edit *, EMPTYARG ) +{ + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActNumLvl & nMask) + { + SwNumFmt aNumFmt(pActNum->Get(i)); + + const sal_uInt16 nPos = aAlignLB.IsVisible() + ? aAlignLB.GetSelectEntryPos() + : aAlign2LB.GetSelectEntryPos(); + SvxAdjust eAdjust = SVX_ADJUST_CENTER; + if(nPos == 0) + eAdjust = SVX_ADJUST_LEFT; + else if(nPos == 2) + eAdjust = SVX_ADJUST_RIGHT; + aNumFmt.SetNumAdjust( eAdjust ); + pActNum->Set(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, LevelHdl, ListBox *, pBox ) +{ + sal_uInt16 nSaveNumLvl = nActNumLvl; + nActNumLvl = 0; + if(pBox->IsEntryPosSelected( MAXLEVEL ) && + (pBox->GetSelectEntryCount() == 1 || nSaveNumLvl != 0xffff)) + { + nActNumLvl = 0xFFFF; + pBox->SetUpdateMode(sal_False); + for( sal_uInt16 i = 0; i < MAXLEVEL; i++ ) + pBox->SelectEntryPos( i, sal_False ); + pBox->SetUpdateMode(sal_True); + } + else if(pBox->GetSelectEntryCount()) + { + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; i++ ) + { + if(pBox->IsEntryPosSelected( i )) + nActNumLvl |= nMask; + nMask <<= 1; + } + pBox->SelectEntryPos( MAXLEVEL, sal_False ); + } + else + { + nActNumLvl = nSaveNumLvl; + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; i++ ) + { + if(nActNumLvl & nMask) + { + pBox->SelectEntryPos(i); + break; + } + nMask <<=1; + } + } + aRelativeCB.Enable(1 != nActNumLvl); + SetModified(); + InitPosAndSpaceMode(); + ShowControlsDependingOnPosAndSpaceMode(); + InitControls(); + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, DistanceHdl, MetricField *, pFld ) +{ + if(bInInintControl) + return 0; + long nValue = static_cast< long >(pFld->Denormalize(pFld->GetValue(FUNIT_TWIP))); + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActNumLvl & nMask) + { + SwNumFmt aNumFmt( pActNum->Get( i ) ); + if(pFld == &aDistBorderMF) + { + + if(aRelativeCB.IsChecked() && aRelativeCB.IsEnabled()) + { + if(0 == i) + { + long nTmp = aNumFmt.GetFirstLineOffset(); + aNumFmt.SetAbsLSpace( sal_uInt16(nValue - nTmp)); + } + else + { + long nTmp = pActNum->Get( i - 1 ).GetAbsLSpace() + + pActNum->Get( i - 1 ).GetFirstLineOffset() - + pActNum->Get( i ).GetFirstLineOffset(); + + aNumFmt.SetAbsLSpace( sal_uInt16(nValue + nTmp)); + } + } + else + { + aNumFmt.SetAbsLSpace( (short)nValue - aNumFmt.GetFirstLineOffset()); + } + } + else if(pFld == &aDistNumMF) + { + aNumFmt.SetCharTextDistance( (short)nValue ); + } + else if(pFld == &aIndentMF) + { + //jetzt muss mit dem FirstLineOffset auch der AbsLSpace veraendert werden + long nDiff = nValue + aNumFmt.GetFirstLineOffset(); + long nAbsLSpace = aNumFmt.GetAbsLSpace(); + aNumFmt.SetAbsLSpace(sal_uInt16(nAbsLSpace + nDiff)); + aNumFmt.SetFirstLineOffset( -(short)nValue ); + } + + pActNum->Set( i, aNumFmt ); + } + nMask <<= 1; + } + + SetModified(); + if(!aDistBorderMF.IsEnabled()) + aDistBorderMF.SetText(aEmptyStr); + + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, RelativeHdl, CheckBox *, pBox ) +{ + sal_Bool bOn = pBox->IsChecked(); + sal_Bool bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 && USHRT_MAX != nActNumLvl; + sal_Bool bSetValue = sal_False; + long nValue = 0; + if(bOn || bSingleSelection) + { + sal_uInt16 nMask = 1; + sal_Bool bFirst = sal_True; + bSetValue = sal_True; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActNumLvl & nMask) + { + const SwNumFmt &rNumFmt = pActNum->Get(i); + if(bFirst) + { + nValue = rNumFmt.GetAbsLSpace(); + if(bOn && i) + nValue -= pActNum->Get(i - 1).GetAbsLSpace(); + } + else + bSetValue = nValue == rNumFmt.GetAbsLSpace() - pActNum->Get(i - 1).GetAbsLSpace(); + bFirst = sal_False; + } + nMask <<= 1; + } + + } + if(bSetValue) + aDistBorderMF.SetValue(aDistBorderMF.Normalize(nValue), FUNIT_TWIP); + else + aDistBorderMF.SetText(aEmptyStr); + aDistBorderMF.Enable(bOn || bSingleSelection||0 != pOutlineDlg); + bLastRelative = bOn; + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, LabelFollowedByHdl_Impl, ListBox*, EMPTYARG ) +{ + // determine value to be set at the chosen list levels + SvxNumberFormat::SvxNumLabelFollowedBy eLabelFollowedBy = + SvxNumberFormat::LISTTAB; + { + const sal_uInt16 nPos = aLabelFollowedByLB.GetSelectEntryPos(); + if ( nPos == 1 ) + { + eLabelFollowedBy = SvxNumberFormat::SPACE; + } + else if ( nPos == 2 ) + { + eLabelFollowedBy = SvxNumberFormat::NOTHING; + } + } + + // set value at the chosen list levels + bool bSameListtabPos = true; + sal_uInt16 nFirstLvl = USHRT_MAX; + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; ++i ) + { + if ( nActNumLvl & nMask ) + { + SwNumFmt aNumFmt( pActNum->Get(i) ); + aNumFmt.SetLabelFollowedBy( eLabelFollowedBy ); + pActNum->Set( i, aNumFmt ); + + if ( nFirstLvl == USHRT_MAX ) + { + nFirstLvl = i; + } + else + { + bSameListtabPos &= aNumFmt.GetListtabPos() == + pActNum->Get( nFirstLvl ).GetListtabPos(); + } + } + nMask <<= 1; + } + + // enable/disable metric field for list tab stop position depending on + // selected item following the list label. + aListtabFT.Enable( eLabelFollowedBy == SvxNumberFormat::LISTTAB ); + aListtabMF.Enable( eLabelFollowedBy == SvxNumberFormat::LISTTAB ); + if ( bSameListtabPos && eLabelFollowedBy == SvxNumberFormat::LISTTAB ) + { + aListtabMF.SetValue( + aListtabMF.Normalize( pActNum->Get( nFirstLvl ).GetListtabPos() ), + FUNIT_TWIP ); + } + else + { + aListtabMF.SetText( String() ); + } + + SetModified(); + + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, ListtabPosHdl_Impl, MetricField*, pFld ) +{ + // determine value to be set at the chosen list levels + const long nValue = static_cast< long >(pFld->Denormalize(pFld->GetValue(FUNIT_TWIP))); + + // set value at the chosen list levels + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; ++i ) + { + if ( nActNumLvl & nMask ) + { + SwNumFmt aNumFmt( pActNum->Get(i) ); + aNumFmt.SetListtabPos( nValue ); + pActNum->Set( i, aNumFmt ); + } + nMask <<= 1; + } + + SetModified(); + + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, AlignAtHdl_Impl, MetricField*, pFld ) +{ + // determine value to be set at the chosen list levels + const long nValue = static_cast< long >(pFld->Denormalize(pFld->GetValue(FUNIT_TWIP))); + + // set value at the chosen list levels + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; ++i ) + { + if ( nActNumLvl & nMask ) + { + SwNumFmt aNumFmt( pActNum->Get(i) ); + const long nFirstLineIndent = nValue - aNumFmt.GetIndentAt(); + aNumFmt.SetFirstLineIndent( nFirstLineIndent ); + pActNum->Set( i, aNumFmt ); + } + nMask <<= 1; + } + + SetModified(); + + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, IndentAtHdl_Impl, MetricField*, pFld ) +{ + // determine value to be set at the chosen list levels + const long nValue = static_cast< long >(pFld->Denormalize(pFld->GetValue(FUNIT_TWIP))); + + // set value at the chosen list levels + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; ++i ) + { + if ( nActNumLvl & nMask ) + { + SwNumFmt aNumFmt( pActNum->Get(i) ); + const long nAlignedAt = aNumFmt.GetIndentAt() + + aNumFmt.GetFirstLineIndent(); + aNumFmt.SetIndentAt( nValue ); + const long nNewFirstLineIndent = nAlignedAt - nValue; + aNumFmt.SetFirstLineIndent( nNewFirstLineIndent ); + pActNum->Set( i, aNumFmt ); + } + nMask <<= 1; + } + + SetModified(); + + return 0; +} + +IMPL_LINK( SwNumPositionTabPage, StandardHdl, PushButton *, EMPTYARG ) +{ + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActNumLvl & nMask) + { + SwNumFmt aNumFmt( pActNum->Get( i ) ); + SwNumRule aTmpNumRule( pWrtSh->GetUniqueNumRuleName(), + aNumFmt.GetPositionAndSpaceMode(), + pOutlineDlg ? OUTLINE_RULE : NUM_RULE ); + SwNumFmt aTempFmt(aTmpNumRule.Get( i )); + aNumFmt.SetPositionAndSpaceMode( aTempFmt.GetPositionAndSpaceMode() ); + if ( aTempFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION ) + { + aNumFmt.SetAbsLSpace( aTempFmt.GetAbsLSpace()); + aNumFmt.SetCharTextDistance( aTempFmt.GetCharTextDistance() ); + aNumFmt.SetFirstLineOffset( aTempFmt.GetFirstLineOffset() ); + } + else if ( aTempFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) + { + aNumFmt.SetNumAdjust( aTempFmt.GetNumAdjust() ); + aNumFmt.SetLabelFollowedBy( aTempFmt.GetLabelFollowedBy() ); + aNumFmt.SetListtabPos( aTempFmt.GetListtabPos() ); + aNumFmt.SetFirstLineIndent( aTempFmt.GetFirstLineIndent() ); + aNumFmt.SetIndentAt( aTempFmt.GetIndentAt() ); + } + pActNum->Set( i, aNumFmt ); + } + nMask <<= 1; + } + + InitControls(); + SetModified(); + return 0; +} + +#if OSL_DEBUG_LEVEL > 1 +void SwNumPositionTabPage::SetModified(sal_Bool bRepaint) +{ + bModified = sal_True; + if(bRepaint) + { + aPreviewWIN.SetLevel(nActNumLvl); + aPreviewWIN.Invalidate(); + } +} + +#endif + +SwSvxNumBulletTabDialog::SwSvxNumBulletTabDialog(Window* pParent, + const SfxItemSet* pSwItemSet, SwWrtShell & rSh) : + SfxTabDialog(pParent, SW_RES(DLG_SVXTEST_NUM_BULLET), pSwItemSet, sal_False, &aEmptyStr), + rWrtSh(rSh), + sRemoveText(SW_RES(ST_RESET)), + nRetOptionsDialog(USHRT_MAX) +{ + FreeResource(); + GetUserButton()->SetText(sRemoveText); + GetUserButton()->SetHelpId(HID_NUM_RESET); + GetUserButton()->SetClickHdl(LINK(this, SwSvxNumBulletTabDialog, RemoveNumberingHdl)); + if(!rWrtSh.GetCurNumRule()) + GetUserButton()->Enable(sal_False); + AddTabPage( RID_SVXPAGE_PICK_SINGLE_NUM ); + AddTabPage( RID_SVXPAGE_PICK_BULLET ); + AddTabPage( RID_SVXPAGE_PICK_NUM ); + AddTabPage( RID_SVXPAGE_PICK_BMP ); + AddTabPage( RID_SVXPAGE_NUM_OPTIONS ); + AddTabPage( RID_SVXPAGE_NUM_POSITION ); + +} + +SwSvxNumBulletTabDialog::~SwSvxNumBulletTabDialog() +{ +} + +void SwSvxNumBulletTabDialog::PageCreated(sal_uInt16 nPageId, SfxTabPage& rPage) +{ + //Namen der Vorlagen und Metric setzen + String sNumCharFmt, sBulletCharFmt; + SwStyleNameMapper::FillUIName( RES_POOLCHR_NUM_LEVEL, sNumCharFmt ); + SwStyleNameMapper::FillUIName( RES_POOLCHR_BUL_LEVEL, sBulletCharFmt ); + + switch ( nPageId ) + { + case RID_SVXPAGE_PICK_NUM: + { + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + aSet.Put (SfxStringItem(SID_NUM_CHAR_FMT,sNumCharFmt)); + aSet.Put (SfxStringItem(SID_BULLET_CHAR_FMT,sBulletCharFmt)); + rPage.PageCreated(aSet); + } + break; + case RID_SVXPAGE_PICK_BULLET : + { + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + aSet.Put (SfxStringItem(SID_BULLET_CHAR_FMT,sBulletCharFmt)); + rPage.PageCreated(aSet); + } + break; + + case RID_SVXPAGE_NUM_OPTIONS: + { + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + aSet.Put (SfxStringItem(SID_NUM_CHAR_FMT,sNumCharFmt)); + aSet.Put (SfxStringItem(SID_BULLET_CHAR_FMT,sBulletCharFmt)); + // Zeichenvorlagen sammeln + ListBox rCharFmtLB(this); + rCharFmtLB.Clear(); + rCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone ); + SwDocShell* pDocShell = rWrtSh.GetView().GetDocShell(); + ::FillCharStyleListBox(rCharFmtLB, pDocShell); + List aList; + for(sal_uInt16 j = 0; j < rCharFmtLB.GetEntryCount(); j++) + { + + aList.Insert( new XubString(rCharFmtLB.GetEntry(j)), LIST_APPEND ); + } + aSet.Put( SfxStringListItem( SID_CHAR_FMT_LIST_BOX,&aList ) ) ; + + FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, pDocShell)); + aSet.Put ( SfxAllEnumItem(SID_METRIC_ITEM, static_cast< sal_uInt16 >(eMetric) ) ); + rPage.PageCreated(aSet); + for( sal_uInt16 i = (sal_uInt16)aList.Count(); i; --i ) + delete (XubString*)aList.Remove(i); + aList.Clear(); + } + break; + case RID_SVXPAGE_NUM_POSITION: + { + SwDocShell* pDocShell = rWrtSh.GetView().GetDocShell(); + FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, pDocShell)); + SfxAllItemSet aSet(*(GetInputSetImpl()->GetPool())); + aSet.Put ( SfxAllEnumItem(SID_METRIC_ITEM, static_cast< sal_uInt16 >(eMetric)) ); + rPage.PageCreated(aSet); + } + break; + } +} + +short SwSvxNumBulletTabDialog::Ok() +{ + short nRet = SfxTabDialog::Ok(); + pExampleSet->ClearItem(SID_PARAM_NUM_PRESET); + return nRet; +} + +IMPL_LINK(SwSvxNumBulletTabDialog, RemoveNumberingHdl, PushButton*, EMPTYARG) +{ + EndDialog(RET_USER); + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/num.hrc b/sw/source/ui/misc/num.hrc new file mode 100644 index 000000000000..379c8cb3e56d --- /dev/null +++ b/sw/source/ui/misc/num.hrc @@ -0,0 +1,55 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + + +#define FL_LEVEL 1 +#define LB_LEVEL 2 +#define FL_POSITION 3 +#define FT_BORDERDIST 4 +#define MF_BORDERDIST 5 +#define CB_RELATIVE 6 +#define FT_INDENT 7 +#define MF_INDENT 8 +#define FT_NUMDIST 9 +#define MF_NUMDIST 10 +#define FT_ALIGN 11 +#define LB_ALIGN 12 +#define PB_STANDARD 13 +#define WIN_PREVIEW 15 +#define ST_RESET 16 + +#define FT_LABEL_FOLLOWED_BY 17 +#define LB_LABEL_FOLLOWED_BY 18 +#define FT_LISTTAB 19 +#define MF_LISTTAB 20 +#define FT_ALIGN_2 21 +#define LB_ALIGN_2 22 +#define FT_ALIGNED_AT 23 +#define MF_ALIGNED_AT 24 +#define FT_INDENT_AT 25 +#define MF_INDENT_AT 26 + diff --git a/sw/source/ui/misc/num.src b/sw/source/ui/misc/num.src new file mode 100644 index 000000000000..3f19d847f607 --- /dev/null +++ b/sw/source/ui/misc/num.src @@ -0,0 +1,373 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +/* StarView ressource file */ + + +#include "globals.hrc" +#include "misc.hrc" +#include "num.hrc" +#include "cmdid.h" +#include "helpid.h" +#include "svx/dialogs.hrc" + +/**************************************************************************/ +/* */ +/* TabPage Positionen */ +/* */ +/**************************************************************************/ +TabPage TP_NUM_POSITION +{ + HelpID = HID_NUM_POSITION ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 260 , 185 ) ; + Hide = TRUE; + FixedLine FL_LEVEL + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 35 , 8 ) ; + Text [ en-US ] = "Level" ; + }; + MultiListBox LB_LEVEL + { + HelpID = "sw:MultiListBox:TP_NUM_POSITION:LB_LEVEL"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 26 , 163 ) ; + TabStop = TRUE ; + DropDown = FALSE ; + Border = TRUE ; + SimpleMode = TRUE ; + }; + FixedLine FL_POSITION + { + Pos = MAP_APPFONT ( 47 , 3 ) ; + Size = MAP_APPFONT ( 207 , 8 ) ; + Group = TRUE ; + Text [ en-US ] = "Position and spacing" ; + }; + FixedText FT_BORDERDIST + { + Pos = MAP_APPFONT ( 50 , 27 ) ; + Size = MAP_APPFONT ( 105 , 10 ) ; + Text [ en-US ] = "Indent" ; + }; + MetricField MF_BORDERDIST + { + HelpID = "sw:MetricField:TP_NUM_POSITION:MF_BORDERDIST"; + Pos = MAP_APPFONT ( 198 , 25 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = -1999 ; + Maximum = 1999 ; + DecimalDigits = 2 ; + Value = 0 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 1999 ; + SpinSize = 5 ; + }; + CheckBox CB_RELATIVE + { + HelpID = "sw:CheckBox:TP_NUM_POSITION:CB_RELATIVE"; + Pos = MAP_APPFONT ( 198 , 41 ) ; + Size = MAP_APPFONT ( 52 , 10 ) ; + Text [ en-US ] = "Relati~ve" ; + }; + FixedText FT_INDENT + { + Pos = MAP_APPFONT ( 50 , 59 ) ; + Size = MAP_APPFONT ( 105 , 8 ) ; + Text [ en-US ] = "Width of numbering" ; + }; + MetricField MF_INDENT + { + HelpID = "sw:MetricField:TP_NUM_POSITION:MF_INDENT"; + Pos = MAP_APPFONT ( 198 , 57 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 0 ; + Maximum = 1999 ; + DecimalDigits = 2 ; + Value = 0 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 1999 ; + SpinSize = 5 ; + }; + FixedText FT_NUMDIST + { + Pos = MAP_APPFONT ( 50 , 75 ) ; + Size = MAP_APPFONT ( 105 , 8 ) ; + Text [ en-US ] = "Minimum space numbering <-> text" ; + }; + MetricField MF_NUMDIST + { + HelpID = "sw:MetricField:TP_NUM_POSITION:MF_NUMDIST"; + Pos = MAP_APPFONT ( 198 , 73 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 0 ; + Maximum = 1999 ; + DecimalDigits = 2 ; + Value = 0 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 1999 ; + SpinSize = 5 ; + Border = TRUE ; + TabStop = TRUE ; + }; + FixedText FT_ALIGN + { + Pos = MAP_APPFONT ( 50 , 91 ) ; + Size = MAP_APPFONT ( 105 , 8 ) ; + Text [ en-US ] = "N~umbering alignment" ; + }; + ListBox LB_ALIGN + { + HelpID = "sw:ListBox:TP_NUM_POSITION:LB_ALIGN"; + Pos = MAP_APPFONT ( 198 , 89 ) ; + Size = MAP_APPFONT ( 40 , 40 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + StringList [ en-US ] = + { + < "Left" ; > ; + < "Centered" ; > ; + < "Right" ; > ; + }; + }; + FixedText FT_LABEL_FOLLOWED_BY + { + Pos = MAP_APPFONT ( 50 , 27 ) ; + Size = MAP_APPFONT ( 105 , 10 ) ; + Text [ en-US ] = "Numbering followed by" ; + }; + ListBox LB_LABEL_FOLLOWED_BY + { + HelpID = "sw:ListBox:TP_NUM_POSITION:LB_LABEL_FOLLOWED_BY"; + Pos = MAP_APPFONT ( 198 , 25 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + StringList [ en-US ] = + { + < "Tab stop" ; > ; + < "Space" ; > ; + < "Nothing" ; > ; + }; + }; + FixedText FT_LISTTAB + { + Pos = MAP_APPFONT ( 50 , 43 ) ; + Size = MAP_APPFONT ( 143 , 10 ) ; + Right = TRUE ; + Text [ en-US ] = "at" ; + }; + MetricField MF_LISTTAB + { + HelpID = "sw:MetricField:TP_NUM_POSITION:MF_LISTTAB"; + Pos = MAP_APPFONT ( 198 , 41 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 0 ; + Maximum = 1999 ; + DecimalDigits = 2 ; + Value = 0 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 1999 ; + SpinSize = 5 ; + }; + FixedText FT_ALIGN_2 + { + Pos = MAP_APPFONT ( 50 , 59 ) ; + Size = MAP_APPFONT ( 105 , 8 ) ; + }; + ListBox LB_ALIGN_2 + { + HelpID = "sw:ListBox:TP_NUM_POSITION:LB_ALIGN_2"; + Pos = MAP_APPFONT ( 198 , 57 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + }; + FixedText FT_ALIGNED_AT + { + Pos = MAP_APPFONT ( 50 , 75 ) ; + Size = MAP_APPFONT ( 105 , 8 ) ; + Text [ en-US ] = "Aligned at" ; + }; + MetricField MF_ALIGNED_AT + { + HelpID = "sw:MetricField:TP_NUM_POSITION:MF_ALIGNED_AT"; + Pos = MAP_APPFONT ( 198 , 73 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = -1999 ; + Maximum = 1999 ; + DecimalDigits = 2 ; + Value = 0 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 1999 ; + SpinSize = 5 ; + Border = TRUE ; + TabStop = TRUE ; + }; + FixedText FT_INDENT_AT + { + Pos = MAP_APPFONT ( 50 , 91 ) ; + Size = MAP_APPFONT ( 105 , 8 ) ; + Text [ en-US ] = "Indent at" ; + }; + MetricField MF_INDENT_AT + { + HelpID = "sw:MetricField:TP_NUM_POSITION:MF_INDENT_AT"; + Pos = MAP_APPFONT ( 198 , 89 ) ; + Size = MAP_APPFONT ( 40 , 12 ) ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = -1999 ; + Maximum = 1999 ; + DecimalDigits = 2 ; + Value = 0 ; + Unit = FUNIT_CM ; + First = 0 ; + Last = 1999 ; + SpinSize = 5 ; + Border = TRUE ; + TabStop = TRUE ; + }; + PushButton PB_STANDARD + { + HelpID = "sw:PushButton:TP_NUM_POSITION:PB_STANDARD"; + Pos = MAP_APPFONT ( 198 , 165 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + Text [ en-US ] = "Default" ; + }; + Window WIN_PREVIEW + { + Pos = MAP_APPFONT ( 50 , 113 ) ; + Size = MAP_APPFONT ( 143 , 67 ) ; + Border = TRUE ; + }; +}; + +/**************************************************************************/ +/* */ +/* Dialog fuer Test der Svx-Implementation */ +/* */ +/**************************************************************************/ +TabDialog DLG_SVXTEST_NUM_BULLET +{ + OutputSize = TRUE ; + SVLook = TRUE ; + Text [ en-US ] = "Bullets and Numbering"; + Moveable = TRUE ; + TabControl 1 + { + SVLook = TRUE ; + PageList = + { + PageItem + { + Identifier = RID_SVXPAGE_PICK_BULLET ; + Text [ en-US ] = "Bullets" ; + }; + PageItem + { + Identifier = RID_SVXPAGE_PICK_SINGLE_NUM ; + Text [ en-US ] = "Numbering type" ; + }; + PageItem + { + Identifier = RID_SVXPAGE_PICK_NUM ; + Text [ en-US ] = "Outline" ; + }; + PageItem + { + Identifier = RID_SVXPAGE_PICK_BMP ; + Text [ en-US ] = "Graphics" ; + }; + PageItem + { + Identifier = RID_SVXPAGE_NUM_POSITION ; + Text [ en-US ] = "Position" ; + }; + PageItem + { + Identifier = RID_SVXPAGE_NUM_OPTIONS ; + Text [ en-US ] = "Options" ; + }; + }; + }; + String ST_RESET + { + Text [ en-US ] = "~Remove" ; + }; +}; + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/numberingtypelistbox.cxx b/sw/source/ui/misc/numberingtypelistbox.cxx new file mode 100644 index 000000000000..3421f3c58788 --- /dev/null +++ b/sw/source/ui/misc/numberingtypelistbox.cxx @@ -0,0 +1,165 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" +#include <numberingtypelistbox.hxx> +#include <misc.hrc> +#include <cnttab.hxx> +#include <com/sun/star/style/NumberingType.hpp> +#include <com/sun/star/text/XDefaultNumberingProvider.hpp> +#include <comphelper/processfactory.hxx> +#include <com/sun/star/text/XNumberingTypeInfo.hpp> + +#include <unomid.h> + +using namespace com::sun::star; + +using ::rtl::OUString; + +struct SwNumberingTypeListBox_Impl +{ + uno::Reference<text::XNumberingTypeInfo> xInfo; +}; + +SwNumberingTypeListBox::SwNumberingTypeListBox( Window* pWin, const ResId& rResId, + sal_uInt16 nTypeFlags ) : + ListBox(pWin, rResId), + pImpl(new SwNumberingTypeListBox_Impl) +{ + uno::Reference< lang::XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); + uno::Reference < uno::XInterface > xI = xMSF->createInstance( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.DefaultNumberingProvider")) ); + uno::Reference<text::XDefaultNumberingProvider> xDefNum(xI, uno::UNO_QUERY); + OSL_ENSURE(xDefNum.is(), "service missing: \"com.sun.star.text.DefaultNumberingProvider\""); + + pImpl->xInfo = uno::Reference<text::XNumberingTypeInfo>(xDefNum, uno::UNO_QUERY); + Reload(nTypeFlags); +} + +SwNumberingTypeListBox::~SwNumberingTypeListBox() +{ + delete pImpl; +} + +void SwNumberingTypeListBox::Reload(sal_uInt16 nTypeFlags) +{ + Clear(); + uno::Sequence<sal_Int16> aTypes; + const sal_Int16* pTypes = NULL; + if(0 != (nTypeFlags&INSERT_NUM_EXTENDED_TYPES) ) + { + if(pImpl->xInfo.is()) + { + aTypes = pImpl->xInfo->getSupportedNumberingTypes(); + pTypes = aTypes.getConstArray(); + } + } + SwOLENames aNames(SW_RES(STRRES_NUMTYPES)); + ResStringArray& rNames = aNames.GetNames(); + for(sal_uInt16 i = 0; i < rNames.Count(); i++) + { + long nValue = rNames.GetValue(i); + sal_Bool bInsert = sal_True; + sal_uInt16 nPos = LISTBOX_APPEND; + switch(nValue) + { + case style::NumberingType::NUMBER_NONE: + bInsert = 0 != (nTypeFlags&INSERT_NUM_TYPE_NO_NUMBERING); + nPos = 0; + break; + case style::NumberingType::CHAR_SPECIAL: bInsert = 0 != (nTypeFlags&INSERT_NUM_TYPE_BULLET); break; + case style::NumberingType::PAGE_DESCRIPTOR:bInsert = 0 != (nTypeFlags&INSERT_NUM_TYPE_PAGE_STYLE_NUMBERING); break; + case style::NumberingType::BITMAP:bInsert = 0 != (nTypeFlags&INSERT_NUM_TYPE_BITMAP ); break; + default: + if (nValue > style::NumberingType::CHARS_LOWER_LETTER_N) + { + // Insert only if offered by i18n framework per configuration. + bInsert = sal_False; + if (pTypes) + { + for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++) + { + if (pTypes[nType] == nValue) + { + bInsert = sal_True; + break; // for + } + } + } + } + } + if(bInsert) + { + sal_uInt16 nEntry = InsertEntry(rNames.GetString(i), nPos); + SetEntryData( nEntry, (void*)nValue ); + } + } + if(0 != (nTypeFlags&INSERT_NUM_EXTENDED_TYPES) ) + { + if(pTypes) + { + for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++) + { + sal_Int16 nCurrent = pTypes[nType]; + if(nCurrent > style::NumberingType::CHARS_LOWER_LETTER_N) + { + if(LISTBOX_ENTRY_NOTFOUND == GetEntryPos((void*)(sal_uLong)nCurrent)) + { + OUString aIdent = pImpl->xInfo->getNumberingIdentifier( nCurrent ); + sal_uInt16 nPos = InsertEntry(aIdent); + SetEntryData(nPos,(void*)(sal_uLong)nCurrent); + } + } + } + } + SelectEntryPos(0); + } +} + +sal_Int16 SwNumberingTypeListBox::GetSelectedNumberingType() +{ + sal_Int16 nRet = 0; + sal_uInt16 nSelPos = GetSelectEntryPos(); + if(LISTBOX_ENTRY_NOTFOUND != nSelPos) + nRet = (sal_Int16)(sal_uLong)GetEntryData(nSelPos); +#if OSL_DEBUG_LEVEL > 1 + else + OSL_FAIL("SwNumberingTypeListBox not selected"); +#endif + return nRet; +} + +sal_Bool SwNumberingTypeListBox::SelectNumberingType(sal_Int16 nType) +{ + sal_uInt16 nPos = GetEntryPos((void*)(sal_uLong)nType); + SelectEntryPos( nPos ); + return LISTBOX_ENTRY_NOTFOUND != nPos; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/numberingtypelistbox.src b/sw/source/ui/misc/numberingtypelistbox.src new file mode 100644 index 000000000000..3e46d0b3f7a8 --- /dev/null +++ b/sw/source/ui/misc/numberingtypelistbox.src @@ -0,0 +1,100 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" + +Resource STRRES_NUMTYPES +{ + StringArray 1 + { + + ItemList [ en-US ] = + { + < "1, 2, 3, ..." ; 4/*SVX_NUM_ARABIC */; > ; + < "A, B, C, ..." ; 0/*SVX_NUM_CHARS_UPPER_LETTER */; > ; + < "a, b, c, ..." ; 1/*SVX_NUM_CHARS_LOWER_LETTER */; > ; + < "I, II, III, ..." ; 2/*SVX_NUM_ROMAN_UPPER */; > ; + < "i, ii, iii, ..." ; 3/*SVX_NUM_ROMAN_LOWER */; > ; + < "A, .., AA, .., AAA, ..." ; 9/*SVX_NUM_CHARS_UPPER_LETTER_N*/; > ; + < "a, .., aa, .., aaa, ..." ; 10/*SVX_NUM_CHARS_LOWER_LETTER_N*/; > ; + < "Bullet" ; 6/*SVX_NUM_CHAR_SPECIAL */; > ; + < "Graphics" ; 8/*SVX_NUM_BITMAP */; > ; + < "None" ; 5/*SVX_NUM_NUMBER_NONE */; > ; + < "Native Numbering" ; 12 /*NATIVE_NUMBERING */; > ; + < "А, Б, .., Аа, Аб, ... (Bulgarian)" ; 38 /*CHARS_CYRILLIC_UPPER_LETTER_BG */; > ; + < "а, б, .., аа, аб, ... (Bulgarian)" ; 39 /*CHARS_CYRILLIC_LOWER_LETTER_BG */; > ; + < "А, Б, .., Аа, Бб, ... (Bulgarian)" ; 40 /*CHARS_CYRILLIC_UPPER_LETTER_N_BG */; > ; + < "а, б, .., аа, бб, ... (Bulgarian)" ; 41 /*CHARS_CYRILLIC_LOWER_LETTER_N_BG */; > ; + < "А, Б, .., Аа, Аб, ... (Russian)" ; 42 /*CHARS_CYRILLIC_UPPER_LETTER_RU */; > ; + < "а, б, .., аа, аб, ... (Russian)" ; 43 /*CHARS_CYRILLIC_LOWER_LETTER_RU */; > ; + < "А, Б, .., Аа, Бб, ... (Russian)" ; 44 /*CHARS_CYRILLIC_UPPER_LETTER_N_RU */; > ; + < "а, б, .., аа, бб, ... (Russian)" ; 45 /*CHARS_CYRILLIC_LOWER_LETTER_N_RU */; > ; + < "А, Б, .., Аа, Аб, ... (Serbian)" ; 48 /*CHARS_CYRILLIC_UPPER_LETTER_SR */; > ; + < "а, б, .., аа, аб, ... (Serbian)" ; 49 /*CHARS_CYRILLIC_LOWER_LETTER_SR */; > ; + < "А, Б, .., Аа, Бб, ... (Serbian)" ; 50 /*CHARS_CYRILLIC_UPPER_LETTER_N_SR */; > ; + < "а, б, .., аа, бб, ... (Serbian)" ; 51 /*CHARS_CYRILLIC_LOWER_LETTER_N_SR */; > ; + < "Α, Β, Γ, ... (Greek Upper Letter)"; 52 /*CHARS_GREEK_UPPER_LETTER */; > ; + < "α, β, γ, ... (Greek Lower Letter)"; 53 /*CHARS_GREEK_LOWER_LETTER */; > ; + }; + }; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/outline.cxx b/sw/source/ui/misc/outline.cxx new file mode 100644 index 000000000000..a70fe224ed88 --- /dev/null +++ b/sw/source/ui/misc/outline.cxx @@ -0,0 +1,1190 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif +#include <hintids.hxx> +#include <tools/shl.hxx> +#include <vcl/menu.hxx> +#include <vcl/msgbox.hxx> +#include <sfx2/tabdlg.hxx> +#include <editeng/brshitem.hxx> +#include <unotools/configmgr.hxx> +#include <SwStyleNameMapper.hxx> + +#ifndef _NUM_HXX //autogen +#define USE_NUMTABPAGES +#include <num.hxx> +#endif +#include <view.hxx> +#include <docsh.hxx> +#include <uitool.hxx> +#include <wrtsh.hxx> +#include <swmodule.hxx> +#include <fmtcol.hxx> +#include <outline.hxx> +#include <uinums.hxx> +#include <poolfmt.hxx> +#include <shellres.hxx> +#include <svl/style.hxx> +#include <charfmt.hxx> +#include <docstyle.hxx> +#include <viewopt.hxx> +#include <svtools/ctrlbox.hxx> +#include <helpid.h> +#include <globals.hrc> // fuer Vorlagenname 'keins' +#include <misc.hrc> +#include <outline.hrc> +#include <paratr.hxx> + +#include <unomid.h> + +#include <IDocumentOutlineNodes.hxx> +#include <app.hrc> + +#ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_ +#include <com/sun/star/accessibility/AccessibleRole.hpp> +#endif + +using namespace ::com::sun::star; + +DBG_NAME(outlinehdl) + +class SwNumNamesDlg: public ModalDialog +{ + FixedLine aFormFL; + Edit aFormEdit; + ListBox aFormBox; + OKButton aOKBtn; + CancelButton aCancelBtn; + HelpButton aHelpBtn; + + DECL_LINK( ModifyHdl, Edit * ); + DECL_LINK( SelectHdl, ListBox * ); + DECL_LINK( DoubleClickHdl, ListBox * ); + +public: + SwNumNamesDlg(Window *pParent); + ~SwNumNamesDlg(); + void SetUserNames(const String *pList[]); + String GetName() const { return aFormEdit.GetText(); } + sal_uInt16 GetCurEntryPos() const { return aFormBox.GetSelectEntryPos(); } +}; + +/*------------------------------------------------------------------------ + Beschreibung: selektierten Eintrag merken +------------------------------------------------------------------------*/ +IMPL_LINK_INLINE_START( SwNumNamesDlg, SelectHdl, ListBox *, pBox ) +{ + aFormEdit.SetText(pBox->GetSelectEntry()); + aFormEdit.SetSelection(Selection(0, SELECTION_MAX)); + return 0; +} +IMPL_LINK_INLINE_END( SwNumNamesDlg, SelectHdl, ListBox *, pBox ) + +/*------------------------------------------------------------------------ + Beschreibung: Setzen der vom Benutzer vergebenen Namen + Parameter: Liste der vom Benutzer vergebenen Namen; + nicht vom Benutzer benannte Positionen sind 0. +------------------------------------------------------------------------*/ +void SwNumNamesDlg::SetUserNames(const String *pList[]) +{ + sal_uInt16 nSelect = 0; + for(sal_uInt16 i = 0; i < SwBaseNumRules::nMaxRules; ++i) + { + if(pList[i]) + { + aFormBox.RemoveEntry(i); + aFormBox.InsertEntry(*pList[i], i); + if(i == nSelect && nSelect < SwBaseNumRules::nMaxRules) + nSelect++; + } + } + aFormBox.SelectEntryPos(nSelect); + SelectHdl(&aFormBox); +} + +/*------------------------------------------------------------------------ + Beschreibung: OK-Button freischalten, wenn Text im Edit steht. +------------------------------------------------------------------------*/ +IMPL_LINK_INLINE_START( SwNumNamesDlg, ModifyHdl, Edit *, pBox ) +{ + aOKBtn.Enable(0 != pBox->GetText().Len()); + return 0; +} +IMPL_LINK_INLINE_END( SwNumNamesDlg, ModifyHdl, Edit *, pBox ) + +/*------------------------------------------------------------------------ + Beschreibung: DoubleClickHdl +------------------------------------------------------------------------*/ +IMPL_LINK_INLINE_START( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG ) +{ + EndDialog(RET_OK); + return 0; +} +IMPL_LINK_INLINE_END( SwNumNamesDlg, DoubleClickHdl, ListBox *, EMPTYARG ) + +SwNumNamesDlg::SwNumNamesDlg(Window *pParent) + : ModalDialog(pParent, SW_RES(DLG_NUM_NAMES)), + aFormFL(this, SW_RES(FL_FORM)), + aFormEdit(this, SW_RES(ED_FORM)), + aFormBox(this, SW_RES(LB_FORM)), + aOKBtn(this, SW_RES(BT_OK)), + aCancelBtn(this, SW_RES(BT_CANCEL)), + aHelpBtn(this, SW_RES(BT_HELP)) +{ + FreeResource(); + aFormEdit.SetModifyHdl(LINK(this, SwNumNamesDlg, ModifyHdl)); + aFormBox.SetSelectHdl(LINK(this, SwNumNamesDlg, SelectHdl)); + aFormBox.SetDoubleClickHdl(LINK(this, SwNumNamesDlg, DoubleClickHdl)); + SelectHdl(&aFormBox); +} + +SwNumNamesDlg::~SwNumNamesDlg() {} + +sal_uInt16 lcl_BitToLevel(sal_uInt16 nActLevel) +{ + sal_uInt16 nTmp = nActLevel; + sal_uInt16 nTmpLevel = 0; + while( 0 != (nTmp >>= 1) ) + nTmpLevel++; + return nTmpLevel; +} + +sal_uInt16 SwOutlineTabDialog::nNumLevel = 1; +SwOutlineTabDialog::SwOutlineTabDialog(Window* pParent, + const SfxItemSet* pSwItemSet, + SwWrtShell &rSh) : + //der UserString wird danach richtig gesetzt + SfxTabDialog(pParent, SW_RES(DLG_TAB_OUTLINE), pSwItemSet, sal_False, &aEmptyStr), + aNullStr(C2S("____")), + aFormMenu(SW_RES(MN_FORM)), + rWrtSh(rSh), + pChapterNumRules(SW_MOD()->GetChapterNumRules()), + bModified(rWrtSh.IsModified()) +{ + // --> OD 2008-04-14 #outlinelevel# + SetText( SW_RES( STR_OUTLINE_NUMBERING ) ); + // <-- + PushButton* pUserButton = GetUserButton(); + pUserButton->SetText(SW_RES(ST_FORM)); + pUserButton->SetHelpId(HID_OUTLINE_FORM); + pUserButton->SetClickHdl(LINK(this, SwOutlineTabDialog, FormHdl)); + pUserButton->SetAccessibleRole( com::sun::star::accessibility::AccessibleRole::BUTTON_MENU ); + + FreeResource(); + pNumRule = new SwNumRule( *rSh.GetOutlineNumRule() ); + GetCancelButton().SetClickHdl(LINK(this, SwOutlineTabDialog, CancelHdl)); + + AddTabPage(TP_NUM_POSITION , &SwNumPositionTabPage::Create, 0); + AddTabPage(TP_OUTLINE_NUM , &SwOutlineSettingsTabPage::Create, 0); + + String sHeadline; + sal_uInt16 i; + + for( i = 0; i < MAXLEVEL; ++i ) + { + // wurde die Vorlage noch nicht angelegt, dann ist sie noch an dieserPosition + if( !rWrtSh.GetParaStyle( sHeadline = + SwStyleNameMapper::GetUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i), + sHeadline )) ) + aCollNames[i] = sHeadline; + } + + // Erfragen der Gliederungsebenen der Textvorlagen + const sal_uInt16 nCount = rWrtSh.GetTxtFmtCollCount(); + for(i = 0; i < nCount; ++i ) + { + SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i); + if(!rTxtColl.IsDefault()) + { + //->added by zhaojianwei + if(rTxtColl.IsAssignedToListLevelOfOutlineStyle()) + { + int nOutLevel = rTxtColl.GetAssignedOutlineStyleLevel(); + aCollNames[ nOutLevel ] = rTxtColl.GetName(); + } + //<-end + } + } +} + +SwOutlineTabDialog::~SwOutlineTabDialog() +{ + delete pNumRule; +} + +void SwOutlineTabDialog::PageCreated(sal_uInt16 nPageId, SfxTabPage& rPage) +{ + switch ( nPageId ) + { + case TP_NUM_POSITION: + ((SwNumPositionTabPage&)rPage).SetWrtShell(&rWrtSh); + ((SwNumPositionTabPage&)rPage).SetOutlineTabDialog(this); + break; + case TP_OUTLINE_NUM: + ((SwOutlineSettingsTabPage&)rPage).SetWrtShell(&rWrtSh); + break; + } +} + +IMPL_LINK( SwOutlineTabDialog, CancelHdl, Button *, EMPTYARG ) +{ + if (!bModified) + rWrtSh.ResetModified(); + EndDialog(RET_CANCEL); + return 0; +} + +IMPL_LINK( SwOutlineTabDialog, FormHdl, Button *, pBtn ) +{ + //PopupMenu auffuellen + for( sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i ) + { + const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i); + if( pRules ) + aFormMenu.SetItemText(i + MN_FORMBASE, pRules->GetName()); + } + aFormMenu.SetSelectHdl(LINK(this, SwOutlineTabDialog, MenuSelectHdl)); + aFormMenu.Execute(pBtn, Rectangle(Point(0,0), pBtn->GetSizePixel()), POPUPMENU_EXECUTE_DOWN); + return 0; +} + +IMPL_LINK( SwOutlineTabDialog, MenuSelectHdl, Menu *, pMenu ) +{ + sal_uInt8 nLevelNo = 0; + switch(pMenu->GetCurItemId()) + { + case MN_FORM1: nLevelNo = 1; break; + case MN_FORM2: nLevelNo = 2; break; + case MN_FORM3: nLevelNo = 3; break; + case MN_FORM4: nLevelNo = 4; break; + case MN_FORM5: nLevelNo = 5; break; + case MN_FORM6: nLevelNo = 6; break; + case MN_FORM7: nLevelNo = 7; break; + case MN_FORM8: nLevelNo = 8; break; + case MN_FORM9: nLevelNo = 9; break; + + case MN_SAVE: + { + SwNumNamesDlg *pDlg = new SwNumNamesDlg(this); + const String *aStrArr[SwChapterNumRules::nMaxRules]; + for(sal_uInt16 i = 0; i < SwChapterNumRules::nMaxRules; ++i) + { + const SwNumRulesWithName *pRules = pChapterNumRules->GetRules(i); + if(pRules) + aStrArr[i] = &pRules->GetName(); + else + aStrArr[i] = 0; + } + pDlg->SetUserNames(aStrArr); + if(RET_OK == pDlg->Execute()) + { + const String aName(pDlg->GetName()); + pChapterNumRules->ApplyNumRules( SwNumRulesWithName( + *pNumRule, aName ), pDlg->GetCurEntryPos() ); + pMenu->SetItemText( + pDlg->GetCurEntryPos() + MN_FORMBASE, aName); + } + delete pDlg; + return 0; + + } + + } + if( nLevelNo-- ) + { + const SwNumRulesWithName *pRules = pChapterNumRules->GetRules( nLevelNo ); + if( pRules ) + { + pRules->MakeNumRule( rWrtSh, *pNumRule ); + pNumRule->SetRuleType( OUTLINE_RULE ); + } + else + *pNumRule = *rWrtSh.GetOutlineNumRule(); + } + + sal_uInt16 nPageId = GetCurPageId(); + SfxTabPage* pPage = GetTabPage( nPageId ); + pPage->Reset(*GetOutputItemSet()); + + return 0; +} + +sal_uInt16 SwOutlineTabDialog::GetLevel(const String &rFmtName) const +{ + for(sal_uInt16 i = 0; i < MAXLEVEL; ++i) + { + if(aCollNames[i] == rFmtName) + return i; + } + return MAXLEVEL;//NO_NUMBERING; //#outline level,zhaojianwei + +} + +short SwOutlineTabDialog::Ok() +{ + SfxTabDialog::Ok(); + // bei allen erzeugten Vorlagen die Ebenen setzen, muss + // geschehen, um evtl. aufgehobene Zuordnungen + // auch wieder zu loeschen + + // --> OD 2006-12-11 #130443# + // encapsulate changes into a action to avoid effects on the current cursor + // position during the changes. + rWrtSh.StartAction(); + // <-- + + const SwNumRule * pOutlineRule = rWrtSh.GetOutlineNumRule(); + + sal_uInt16 i, nCount = rWrtSh.GetTxtFmtCollCount(); + for( i = 0; i < nCount; ++i ) + { + SwTxtFmtColl &rTxtColl = rWrtSh.GetTxtFmtColl(i); + if( !rTxtColl.IsDefault() ) + { + + const SfxPoolItem & rItem = + rTxtColl.GetFmtAttr(RES_PARATR_NUMRULE, sal_False); + + if ((sal_uInt8)GetLevel(rTxtColl.GetName()) == MAXLEVEL) //add by zhaojianwei + { + if(rTxtColl.IsAssignedToListLevelOfOutlineStyle()) + { + rTxtColl.DeleteAssignmentToListLevelOfOutlineStyle(); + } + if (static_cast<const SwNumRuleItem &>(rItem).GetValue() == + pOutlineRule->GetName()) + { + rTxtColl.ResetFmtAttr(RES_PARATR_NUMRULE); + } + } + else + { + rTxtColl.AssignToListLevelOfOutlineStyle(GetLevel(rTxtColl.GetName())); + + if (static_cast<const SwNumRuleItem &>(rItem).GetValue() != + pOutlineRule->GetName()) + { + SwNumRuleItem aItem(pOutlineRule->GetName()); + rTxtColl.SetFmtAttr(aItem); + } + } //<-end,zhaojianwei + } + } + + for(i = 0; i < MAXLEVEL; ++i ) + { + String sHeadline; + ::SwStyleNameMapper::FillUIName( static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i), + sHeadline ); + SwTxtFmtColl* pColl = rWrtSh.FindTxtFmtCollByName( sHeadline ); + if( !pColl ) + { + if(aCollNames[i] != sHeadline)//->added by zhaojianwei + { + SwTxtFmtColl* pTxtColl = rWrtSh.GetTxtCollFromPool( + static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i) ); + pTxtColl->DeleteAssignmentToListLevelOfOutlineStyle(); + pTxtColl->ResetFmtAttr(RES_PARATR_NUMRULE); + + if( aCollNames[i].Len() ) + { + pTxtColl = rWrtSh.GetParaStyle( + aCollNames[i], SwWrtShell::GETSTYLE_CREATESOME); + if(pTxtColl) + { + pTxtColl->AssignToListLevelOfOutlineStyle(i); + SwNumRuleItem aItem(pOutlineRule->GetName()); + pTxtColl->SetFmtAttr(aItem); + } + } + }//<--end,zhaojianwei + } + } + + rWrtSh.SetOutlineNumRule( *pNumRule); + + // --> OD 2006-12-11 #130443# + rWrtSh.EndAction(); + // <-- + + return RET_OK; +} + +SwOutlineSettingsTabPage::SwOutlineSettingsTabPage(Window* pParent, const SfxItemSet& rSet) : + SfxTabPage(pParent, SW_RES(TP_OUTLINE_NUM), rSet), + aLevelFL( this, SW_RES(FL_LEVEL )), + aLevelLB( this, SW_RES(LB_LEVEL )), + aNumberFL(this, SW_RES(FL_NUMBER)), + aCollLbl(this, SW_RES(FT_COLL)), + aCollBox(this, SW_RES(LB_COLL)), + aNumberLbl(this, SW_RES(FT_NUMBER)), + aNumberBox(this, SW_RES(LB_NUMBER), INSERT_NUM_TYPE_NO_NUMBERING|INSERT_NUM_EXTENDED_TYPES), + aCharFmtFT(this, SW_RES(FT_CHARFMT)), + aCharFmtLB(this, SW_RES(LB_CHARFMT)), + aAllLevelFT( this, SW_RES(FT_ALL_LEVEL)), + aAllLevelNF( this, SW_RES(NF_ALL_LEVEL)), + aDelim(this, SW_RES(FT_DELIM)), + aPrefixFT(this, SW_RES(FT_PREFIX)), + aPrefixED(this, SW_RES(ED_PREFIX)), + aSuffixFT(this, SW_RES(FT_SUFFIX)), + aSuffixED(this, SW_RES(ED_SUFFIX)), + aStartLbl(this, SW_RES(FT_START)), + aStartEdit(this, SW_RES(ED_START)), + aPreviewWIN( this, SW_RES(WIN_PREVIEW )), + + aNoFmtName(SW_RES(ST_NO_COLL)), + pSh(0), + pCollNames(0), + nActLevel(1) +{ + FreeResource(); + SetExchangeSupport(); + + aCollBox.InsertEntry(aNoFmtName); + aLevelLB.SetSelectHdl(LINK(this, SwOutlineSettingsTabPage, LevelHdl)); + aAllLevelNF.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, ToggleComplete)); + aCollBox.SetSelectHdl(LINK(this, SwOutlineSettingsTabPage, CollSelect)); + aCollBox.SetGetFocusHdl(LINK(this, SwOutlineSettingsTabPage, CollSelectGetFocus)); + aNumberBox.SetSelectHdl(LINK(this, SwOutlineSettingsTabPage, NumberSelect)); + aPrefixED.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, DelimModify)); + aSuffixED.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, DelimModify)); + aStartEdit.SetModifyHdl(LINK(this, SwOutlineSettingsTabPage, StartModified)); + aCharFmtLB.SetSelectHdl(LINK(this, SwOutlineSettingsTabPage, CharFmtHdl)); + +} + +void SwOutlineSettingsTabPage::Update() +{ + // falls eine Vorlage fuer diese Ebene bereits selektiert wurde, + // diese in der ListBox auswaehlean + aCollBox.Enable(USHRT_MAX != nActLevel); + if(USHRT_MAX == nActLevel) + { + sal_Bool bSamePrefix = sal_True; + sal_Bool bSameSuffix = sal_True; + sal_Bool bSameType = sal_True; + sal_Bool bSameComplete = sal_True; + sal_Bool bSameStart = sal_True; + sal_Bool bSameCharFmt = sal_True; + + const SwNumFmt* aNumFmtArr[MAXLEVEL]; + const SwCharFmt* pFirstFmt = 0; + + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + + aNumFmtArr[ i ] = &pNumRule->Get(i); + if(i == 0) + pFirstFmt = aNumFmtArr[i]->GetCharFmt(); + else + { + bSameType &= aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[0]->GetNumberingType(); + bSameStart &= aNumFmtArr[i]->GetStart() == aNumFmtArr[0]->GetStart(); + bSamePrefix &= aNumFmtArr[i]->GetPrefix() == aNumFmtArr[0]->GetPrefix(); + bSameSuffix &= aNumFmtArr[i]->GetSuffix() == aNumFmtArr[0]->GetSuffix(); + bSameComplete &= aNumFmtArr[i]->GetIncludeUpperLevels() == aNumFmtArr[0]->GetIncludeUpperLevels(); + const SwCharFmt* pFmt = aNumFmtArr[i]->GetCharFmt(); + bSameCharFmt &= (!pFirstFmt && !pFmt) + || (pFirstFmt && pFmt && pFmt->GetName() == pFirstFmt->GetName()); + } + } + CheckForStartValue_Impl(aNumFmtArr[0]->GetNumberingType()); + if(bSameType) + aNumberBox.SelectNumberingType( aNumFmtArr[0]->GetNumberingType() ); + else + aNumberBox.SetNoSelection(); + if(bSameStart) + aStartEdit.SetValue(aNumFmtArr[0]->GetStart()); + else + aStartEdit.SetText(aEmptyStr); + if(bSamePrefix) + aPrefixED.SetText(aNumFmtArr[0]->GetPrefix()); + else + aPrefixED.SetText(aEmptyStr); + if(bSameSuffix) + aSuffixED.SetText(aNumFmtArr[0]->GetSuffix()); + else + aSuffixED.SetText(aEmptyStr); + + if(bSameCharFmt) + { + if(pFirstFmt) + aCharFmtLB.SelectEntry(pFirstFmt->GetName()); + else + aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone ); + } + else + aCharFmtLB.SetNoSelection(); + + aAllLevelFT.Enable(sal_True); + aAllLevelNF.Enable(sal_True); + aAllLevelNF.SetMax(MAXLEVEL); + if(bSameComplete) + { + aAllLevelNF.SetValue(aNumFmtArr[0]->GetIncludeUpperLevels()); + } + else + { + aAllLevelNF.SetText(aEmptyStr); + } + } + else + { + sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel); + String aColl(pCollNames[nTmpLevel]); + if(aColl.Len()) + aCollBox.SelectEntry(aColl); + else + aCollBox.SelectEntry(aNoFmtName); + const SwNumFmt &rFmt = pNumRule->Get(nTmpLevel); + + aNumberBox.SelectNumberingType( rFmt.GetNumberingType() ); + aPrefixED.SetText(rFmt.GetPrefix()); + aSuffixED.SetText(rFmt.GetSuffix()); + const SwCharFmt* pFmt = rFmt.GetCharFmt(); + if(pFmt) + aCharFmtLB.SelectEntry(pFmt->GetName()); + else + aCharFmtLB.SelectEntry( ViewShell::GetShellRes()->aStrNone ); + + if(nTmpLevel) + { + aAllLevelFT.Enable(sal_True); + aAllLevelNF.Enable(sal_True); + aAllLevelNF.SetMax(nTmpLevel + 1); + aAllLevelNF.SetValue(rFmt.GetIncludeUpperLevels()); + } + else + { + aAllLevelNF.SetText(aEmptyStr); + aAllLevelNF.Enable(sal_False); + aAllLevelFT.Enable(sal_False); + } + CheckForStartValue_Impl(rFmt.GetNumberingType()); + aStartEdit.SetValue( rFmt.GetStart() ); + } + SetModified(); +} + +IMPL_LINK( SwOutlineSettingsTabPage, LevelHdl, ListBox *, pBox ) +{ + nActLevel = 0; + if(pBox->IsEntryPosSelected( MAXLEVEL )) + { + nActLevel = 0xFFFF; + } + else + { + sal_uInt16 nMask = 1; + for( sal_uInt16 i = 0; i < MAXLEVEL; i++ ) + { + if(pBox->IsEntryPosSelected( i )) + nActLevel |= nMask; + nMask <<= 1; + } + } + Update(); + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, ToggleComplete, NumericField *, pFld ) +{ + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActLevel & nMask) + { + SwNumFmt aNumFmt(pNumRule->Get(i)); + aNumFmt.SetIncludeUpperLevels( Min( (sal_uInt8)pFld->GetValue(), + (sal_uInt8)(i + 1)) ); + pNumRule->Set(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, CollSelect, ListBox *, pBox ) +{ + sal_uInt8 i; + + const String aCollName(pBox->GetSelectEntry()); + //0xFFFF darf hier nicht sein (disable) + sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel); + String sOldName( pCollNames[nTmpLevel] ); + + for( i = 0; i < MAXLEVEL; ++i) + pCollNames[i] = aSaveCollNames[i]; + + if(aCollName == aNoFmtName) + pCollNames[nTmpLevel] = aEmptyStr; + else + { + pCollNames[nTmpLevel] = aCollName; + // wird die Vorlage bereits verwendet ? + for( i = 0; i < MAXLEVEL; ++i) + if(i != nTmpLevel && pCollNames[i] == aCollName ) + pCollNames[i] = aEmptyStr; + } + + // search the oldname and put it into the current entries + if( sOldName.Len() ) + for( i = 0; i < MAXLEVEL; ++i) + if( aSaveCollNames[ i ] == sOldName && i != nTmpLevel && + !pCollNames[ i ].Len() ) + { + sal_uInt8 n; + for( n = 0; n < MAXLEVEL; ++n ) + if( pCollNames[ n ] == sOldName ) + break; + + if( MAXLEVEL == n ) + // it was a outline leveld name and the current entries is zero. + pCollNames[ i ] = sOldName; + } + + SetModified(); + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, CollSelectGetFocus, ListBox *, EMPTYARG ) +{ + for( sal_uInt8 i = 0; i < MAXLEVEL; ++i) + aSaveCollNames[i] = pCollNames[i]; + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, NumberSelect, SwNumberingTypeListBox *, pBox ) +{ + sal_uInt16 nMask = 1; + sal_Int16 nNumberType = pBox->GetSelectedNumberingType(); + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActLevel & nMask) + { + SwNumFmt aNumFmt(pNumRule->Get(i)); + aNumFmt.SetNumberingType(nNumberType); + pNumRule->Set(i, aNumFmt); + CheckForStartValue_Impl(nNumberType); + } + nMask <<= 1; + } + SetModified(); + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, DelimModify, Edit *, EMPTYARG ) +{ + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActLevel & nMask) + { + SwNumFmt aNumFmt(pNumRule->Get(i)); + aNumFmt.SetPrefix( aPrefixED.GetText() ); + aNumFmt.SetSuffix( aSuffixED.GetText() ); + pNumRule->Set(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, StartModified, NumericField *, pFld ) +{ + sal_uInt16 nMask = 1; + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActLevel & nMask) + { + SwNumFmt aNumFmt(pNumRule->Get(i)); + aNumFmt.SetStart( (sal_uInt16)pFld->GetValue() ); + pNumRule->Set(i, aNumFmt); + } + nMask <<= 1; + } + SetModified(); + return 0; +} + +IMPL_LINK( SwOutlineSettingsTabPage, CharFmtHdl, ListBox *, EMPTYARG ) +{ + String sEntry = aCharFmtLB.GetSelectEntry(); + sal_uInt16 nMask = 1; + sal_Bool bFormatNone = sEntry == ViewShell::GetShellRes()->aStrNone; + SwCharFmt* pFmt = 0; + if(!bFormatNone) + { + sal_uInt16 nChCount = pSh->GetCharFmtCount(); + for(sal_uInt16 i = 0; i < nChCount; i++) + { + SwCharFmt& rChFmt = pSh->GetCharFmt(i); + if(rChFmt.GetName() == sEntry) + { + pFmt = &rChFmt; + break; + } + } + if(!pFmt) + { + SfxStyleSheetBasePool* pPool = pSh->GetView().GetDocShell()->GetStyleSheetPool(); + SfxStyleSheetBase* pBase; + pBase = pPool->Find(sEntry, SFX_STYLE_FAMILY_CHAR); + if(!pBase) + pBase = &pPool->Make(sEntry, SFX_STYLE_FAMILY_PAGE); + pFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt(); + + } + } + + for(sal_uInt16 i = 0; i < MAXLEVEL; i++) + { + if(nActLevel & nMask) + { + SwNumFmt aNumFmt(pNumRule->Get(i)); + if(bFormatNone) + aNumFmt.SetCharFmt(0); + else + aNumFmt.SetCharFmt(pFmt); + pNumRule->Set(i, aNumFmt); + } + nMask <<= 1; + } + return RET_OK; +} + +SwOutlineSettingsTabPage::~SwOutlineSettingsTabPage() +{ +} + +void SwOutlineSettingsTabPage::SetWrtShell(SwWrtShell* pShell) +{ + pSh = pShell; + // Erfragen der NumRules dieses Dokumentes + pNumRule = ((SwOutlineTabDialog*)GetTabDialog())->GetNumRule(); + pCollNames = ((SwOutlineTabDialog*)GetTabDialog())->GetCollNames(); + + aPreviewWIN.SetNumRule(pNumRule); + aPreviewWIN.SetOutlineNames(pCollNames); + // Startwert setzen - nActLevel muss hier 1 sein + sal_uInt16 nTmpLevel = lcl_BitToLevel(nActLevel); + const SwNumFmt& rNumFmt = pNumRule->Get( nTmpLevel ); + aStartEdit.SetValue( rNumFmt.GetStart() ); + + // Poolformate fuer Ueberschriften anlegen + String sStr; + sal_uInt16 i; + for( i = 0; i < MAXLEVEL; ++i ) + { + aCollBox.InsertEntry( SwStyleNameMapper::GetUIName( + static_cast< sal_uInt16 >(RES_POOLCOLL_HEADLINE1 + i), aEmptyStr )); + aLevelLB.InsertEntry( String::CreateFromInt32(i + 1) ); + } + sStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "1 - " )); + sStr += String::CreateFromInt32(MAXLEVEL); + aLevelLB.InsertEntry( sStr ); + + // Erfragen der Gliederungsebenen der Textvorlagen + const sal_uInt16 nCount = pSh->GetTxtFmtCollCount(); + for( i = 0; i < nCount; ++i ) + { + SwTxtFmtColl &rTxtColl = pSh->GetTxtFmtColl(i); + if(!rTxtColl.IsDefault()) + { + sStr = rTxtColl.GetName(); + if(LISTBOX_ENTRY_NOTFOUND == aCollBox.GetEntryPos( sStr )) + aCollBox.InsertEntry( sStr ); + } + } + + aNumberBox.SelectNumberingType(rNumFmt.GetNumberingType()); + sal_uInt16 nOutlinePos = pSh->GetOutlinePos(MAXLEVEL); + sal_uInt16 nTmp = 0; + if(nOutlinePos != USHRT_MAX) + { + nTmp = static_cast<sal_uInt16>(pSh->getIDocumentOutlineNodesAccess()->getOutlineLevel(nOutlinePos)); + } + aLevelLB.SelectEntryPos(nTmp-1);//nTmp);//#outline level,zhaojianwei + + // Zeichenvorlagen sammeln + aCharFmtLB.Clear(); + aCharFmtLB.InsertEntry( ViewShell::GetShellRes()->aStrNone ); + + // Zeichenvorlagen + ::FillCharStyleListBox(aCharFmtLB, + pSh->GetView().GetDocShell()); + Update(); +} + +void SwOutlineSettingsTabPage::ActivatePage(const SfxItemSet& ) +{ + nActLevel = SwOutlineTabDialog::GetActNumLevel(); + if(nActLevel != USHRT_MAX) + aLevelLB.SelectEntryPos(lcl_BitToLevel(nActLevel)); + else + aLevelLB.SelectEntryPos(MAXLEVEL); + LevelHdl(&aLevelLB); +} + +int SwOutlineSettingsTabPage::DeactivatePage(SfxItemSet*) +{ + SwOutlineTabDialog::SetActNumLevel(nActLevel); + return LEAVE_PAGE; +} + +sal_Bool SwOutlineSettingsTabPage::FillItemSet( SfxItemSet& ) +{ + return sal_True; +} + +void SwOutlineSettingsTabPage::Reset( const SfxItemSet& rSet ) +{ + ActivatePage(rSet); +} + +SfxTabPage* SwOutlineSettingsTabPage::Create( Window* pParent, + const SfxItemSet& rAttrSet) +{ + return new SwOutlineSettingsTabPage(pParent, rAttrSet); +} + +void SwOutlineSettingsTabPage::CheckForStartValue_Impl(sal_uInt16 nNumberingType) +{ + sal_Bool bIsNull = aStartEdit.GetValue() == 0; + sal_Bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC || + SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType || + SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType; + aStartEdit.SetMin(bNoZeroAllowed ? 1 : 0); + if(bIsNull && bNoZeroAllowed) + aStartEdit.GetModifyHdl().Call(&aStartEdit); +} + +sal_uInt16 lcl_DrawBullet(VirtualDevice* pVDev, + const SwNumFmt& rFmt, sal_uInt16 nXStart, + sal_uInt16 nYStart, const Size& rSize) +{ + Font aTmpFont(pVDev->GetFont()); + + Font aFont(*rFmt.GetBulletFont()); + aFont.SetSize(rSize); + aFont.SetTransparent(sal_True); + pVDev->SetFont( aFont ); + String aText(rFmt.GetBulletChar()); + pVDev->DrawText( Point(nXStart, nYStart), aText ); + sal_uInt16 nRet = (sal_uInt16)pVDev->GetTextWidth(aText); + + pVDev->SetFont(aTmpFont); + return nRet; +} + +sal_uInt16 lcl_DrawGraphic(VirtualDevice* pVDev, const SwNumFmt &rFmt, sal_uInt16 nXStart, + sal_uInt16 nYStart, sal_uInt16 nDivision) +{ + const SvxBrushItem* pBrushItem = rFmt.GetBrush(); + sal_uInt16 nRet = 0; + if(pBrushItem) + { + const Graphic* pGrf = pBrushItem->GetGraphic(); + if(pGrf) + { + Size aGSize( rFmt.GetGraphicSize()); + aGSize.Width() /= nDivision; + nRet = (sal_uInt16)aGSize.Width(); + aGSize.Height() /= nDivision; + pGrf->Draw( pVDev, Point(nXStart,nYStart), + pVDev->PixelToLogic( aGSize ) ); + } + } + return nRet; + +} + +/*-------------------------------------------------- + Vorschau der Numerierung painten +--------------------------------------------------*/ +void NumberingPreview::Paint( const Rectangle& /*rRect*/ ) +{ + Size aSize(PixelToLogic(GetOutputSizePixel())); + Rectangle aRect(Point(0,0), aSize); + + VirtualDevice* pVDev = new VirtualDevice(*this); + pVDev->SetMapMode(GetMapMode()); + pVDev->SetOutputSize( aSize ); + + // #101524# OJ + pVDev->SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); + pVDev->SetLineColor( GetSettings().GetStyleSettings().GetButtonTextColor() ); + pVDev->DrawRect(aRect); + + if(pActNum) + { + sal_uInt16 nWidthRelation; + if(nPageWidth) + { + nWidthRelation = sal_uInt16 (nPageWidth / aSize.Width()); + if(bPosition) + nWidthRelation = nWidthRelation * 2 / 3; + else + nWidthRelation = nWidthRelation / 4; + } + else + nWidthRelation = 30; // Kapiteldialog + + //Hoehe pro Ebene + sal_uInt16 nXStep = sal_uInt16(aSize.Width() / (3 * MAXLEVEL)); + if(MAXLEVEL < 10) + nXStep /= 2; + sal_uInt16 nYStart = 4; + sal_uInt16 nYStep = sal_uInt16((aSize.Height() - 6)/ MAXLEVEL); + aStdFont = OutputDevice::GetDefaultFont( + DEFAULTFONT_UI_SANS, (LanguageType)GetAppLanguage(), + DEFAULTFONT_FLAGS_ONLYONE, this ); + // #101524# OJ + aStdFont.SetColor( SwViewOption::GetFontColor() ); + + sal_uInt16 nFontHeight = nYStep * 6 / 10; + if(bPosition) + nFontHeight = nYStep * 15 / 10; + aStdFont.SetSize(Size( 0, nFontHeight )); + + sal_uInt16 nPreNum = pActNum->Get(0).GetStart(); + + if(bPosition) + { + sal_uInt16 nLineHeight = nFontHeight * 8 / 7; + sal_uInt8 nStart = 0; + while( !(nActLevel & (1<<nStart)) ) + { + nStart++; + } + if(nStart) // damit moeglichs Vorgaenger und Nachfolger gezeigt werden + nStart--; + + SwNumberTree::tNumberVector aNumVector; + sal_uInt8 nEnd = Min( (sal_uInt8)(nStart + 3), MAXLEVEL ); + for( sal_uInt8 nLevel = nStart; nLevel < nEnd; ++nLevel ) + { + const SwNumFmt &rFmt = pActNum->Get(nLevel); + aNumVector.push_back(rFmt.GetStart()); + + sal_uInt16 nXStart( 0 ); + short nTextOffset( 0 ); + sal_uInt16 nNumberXPos( 0 ); + if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION ) + { + nXStart = rFmt.GetAbsLSpace() / nWidthRelation; + nTextOffset = rFmt.GetCharTextDistance() / nWidthRelation; + nNumberXPos = nXStart; + sal_uInt16 nFirstLineOffset = (-rFmt.GetFirstLineOffset()) / nWidthRelation; + + if(nFirstLineOffset <= nNumberXPos) + nNumberXPos = nNumberXPos - nFirstLineOffset; + else + nNumberXPos = 0; + } + else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) + { + const long nTmpNumberXPos( ( rFmt.GetIndentAt() + + rFmt.GetFirstLineIndent() ) / + nWidthRelation ); + if ( nTmpNumberXPos < 0 ) + { + nNumberXPos = 0; + } + else + { + nNumberXPos = static_cast<sal_uInt16>(nTmpNumberXPos); + } + } + + sal_uInt16 nBulletWidth = 0; + if( SVX_NUM_BITMAP == rFmt.GetNumberingType() ) + { + nBulletWidth = lcl_DrawGraphic(pVDev, rFmt, + nNumberXPos, + nYStart, nWidthRelation); + } + else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() ) + { + nBulletWidth = lcl_DrawBullet(pVDev, rFmt, nNumberXPos, nYStart, aStdFont.GetSize()); + } + else + { + pVDev->SetFont(aStdFont); + if(pActNum->IsContinusNum()) + aNumVector[nLevel] = nPreNum; + // --> OD 2005-11-17 #128041# + String aText(pActNum->MakeNumString( aNumVector )); + // <-- + pVDev->DrawText( Point(nNumberXPos, nYStart), aText ); + nBulletWidth = (sal_uInt16)pVDev->GetTextWidth(aText); + nPreNum++; + } + if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT && + rFmt.GetLabelFollowedBy() == SvxNumberFormat::SPACE ) + { + pVDev->SetFont(aStdFont); + String aText(' '); + pVDev->DrawText( Point(nNumberXPos, nYStart), aText ); + nBulletWidth = nBulletWidth + (sal_uInt16)pVDev->GetTextWidth(aText); + } + + sal_uInt16 nTextXPos( 0 ); + if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION ) + { + nTextXPos = nXStart; + if(nTextOffset < 0) + nTextXPos = nTextXPos + nTextOffset; + if(nNumberXPos + nBulletWidth + nTextOffset > nTextXPos ) + nTextXPos = nNumberXPos + nBulletWidth + nTextOffset; + } + else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) + { + switch ( rFmt.GetLabelFollowedBy() ) + { + case SvxNumberFormat::LISTTAB: + { + nTextXPos = static_cast<sal_uInt16>( + rFmt.GetListtabPos() / nWidthRelation ); + if ( nTextXPos < nNumberXPos + nBulletWidth ) + { + nTextXPos = nNumberXPos + nBulletWidth; + } + } + break; + case SvxNumberFormat::SPACE: + case SvxNumberFormat::NOTHING: + { + nTextXPos = nNumberXPos + nBulletWidth; + } + break; + } + + nXStart = static_cast<sal_uInt16>( rFmt.GetIndentAt() / nWidthRelation ); + } + + + Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2)); + pVDev->SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); // Color( COL_BLACK ) ); + pVDev->DrawRect( aRect1 ); + + Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2 ), Size(aSize.Width() / 2, 2)); + pVDev->DrawRect( aRect2 ); + nYStart += 2 * nLineHeight; + } + } + else + { + SwNumberTree::tNumberVector aNumVector; + sal_uInt16 nLineHeight = nFontHeight * 3 / 2; + for( sal_uInt8 nLevel = 0; nLevel < MAXLEVEL; + ++nLevel, nYStart = nYStart + nYStep ) + { + const SwNumFmt &rFmt = pActNum->Get(nLevel); + aNumVector.push_back(rFmt.GetStart()); + sal_uInt16 nXStart( 0 ); + if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION ) + { + nXStart = rFmt.GetAbsLSpace() / nWidthRelation; + } + else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT ) + { + const long nTmpXStart( ( rFmt.GetIndentAt() + + rFmt.GetFirstLineIndent() ) / + nWidthRelation ); + if ( nTmpXStart < 0 ) + { + nXStart = 0; + } + else + { + nXStart = static_cast<sal_uInt16>(nTmpXStart); + } + } + nXStart /= 2; + nXStart += 2; + sal_uInt16 nTextOffset = 2 * nXStep; + if( SVX_NUM_BITMAP == rFmt.GetNumberingType() ) + { + lcl_DrawGraphic(pVDev, rFmt, nXStart, nYStart, nWidthRelation); + nTextOffset = nLineHeight + nXStep; + } + else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() ) + { + nTextOffset = lcl_DrawBullet(pVDev, rFmt, nXStart, nYStart, aStdFont.GetSize()); + nTextOffset = nTextOffset + nXStep; + } + else + { + pVDev->SetFont(aStdFont); + if(pActNum->IsContinusNum()) + aNumVector[nLevel] = nPreNum; + // --> OD 2005-11-17 #128041# + String aText(pActNum->MakeNumString( aNumVector )); + // <-- + pVDev->DrawText( Point(nXStart, nYStart), aText ); + nTextOffset = (sal_uInt16)pVDev->GetTextWidth(aText); + nTextOffset = nTextOffset + nXStep; + nPreNum++; + } + pVDev->SetFont(aStdFont); + + // Changed as per BugID 79541 Branding/Configuration + uno::Any MyAny = ::utl::ConfigManager::GetConfigManager(). + GetDirectConfigProperty( ::utl::ConfigManager::PRODUCTNAME ); + ::rtl::OUString aProductName; + + MyAny >>= aProductName; + String sMsg(C2S("%PRODUCTNAME")); + sMsg.SearchAndReplaceAscii( "%PRODUCTNAME" , aProductName ); + + if(pOutlineNames) + sMsg = pOutlineNames[nLevel]; + pVDev->DrawText( Point(nXStart + nTextOffset, nYStart), sMsg ); + } + } + } + DrawOutDev( Point(0,0), aSize, + Point(0,0), aSize, + *pVDev ); + delete pVDev; + +} + +NumberingPreview::~NumberingPreview() +{ +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/outline.hrc b/sw/source/ui/misc/outline.hrc new file mode 100644 index 000000000000..2f8a4a469cb4 --- /dev/null +++ b/sw/source/ui/misc/outline.hrc @@ -0,0 +1,98 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#define RB_1 1 +#define RB_2 2 +#define RB_3 3 +#define RB_4 4 +#define RB_5 5 +#define FT_1 6 +#define FT_2 7 +#define FT_3 8 +#define FT_4 9 +#define FT_5 10 +#define FI_1 11 +#define FI_2 12 +#define FI_3 13 +#define FI_4 14 +#define FI_5 15 +//#define FL_LEVEL 16 + +#define FT_COLL 20 +#define LB_COLL 21 +#define FT_NUMBER 22 +#define LB_NUMBER 23 +#define FT_DELIM 24 +#define FT_DELIM_BEVOR 25 +#define FT_DELIM_AFTER 26 +#define ED_DELIM_BEVOR 27 +#define ED_DELIM_AFTER 28 +#define CB_COMPLETE 29 +#define FL_NUMBER 30 + +#define LB_ALIGN 31 +#define FL_ALIGN 33 + +#define FT_START 40 +#define ED_START 41 +#define FL_START 42 + +#define BT_OK 100 +#define BT_CANCEL 101 +#define BT_HELP 102 +#define BT_FORM 103 +#define BT_RESET 104 +#define FL_FORM 105 +#define LB_FORM 106 +#define ED_FORM 107 +#define FT_ALL_LEVEL 108 +#define NF_ALL_LEVEL 109 + +#define MN_FORM 110 +#define MN_FORM1 111 +#define MN_FORMBASE MN_FORM1 +#define MN_FORM2 112 +#define MN_FORM3 113 +#define MN_FORM4 114 +#define MN_FORM5 115 +#define MN_FORM6 116 +#define MN_FORM7 117 +#define MN_FORM8 118 +#define MN_FORM9 119 +#define MN_SAVE 120 + +#define FL_LEVEL 130 +#define LB_LEVEL 131 +#define WIN_PREVIEW 132 +#define FT_SUFFIX 134 +#define ED_SUFFIX 135 +#define FT_PREFIX 136 +#define ED_PREFIX 137 +#define ST_NO_COLL 138 + +#define ST_FORM 140 +#define FT_CHARFMT 141 +#define LB_CHARFMT 141 diff --git a/sw/source/ui/misc/outline.src b/sw/source/ui/misc/outline.src new file mode 100644 index 000000000000..85ea42df4861 --- /dev/null +++ b/sw/source/ui/misc/outline.src @@ -0,0 +1,383 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" +#include "outline.hrc" +#include "globals.hrc" +#include "cmdid.h" +#include "helpid.h" +ModalDialog DLG_NUM_NAMES +{ + HelpID = HID_NUM_NAMES ; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 164 , 82 ) ; + Text [ en-US ] = "Save As"; + Moveable = TRUE ; + OKButton BT_OK + { + Pos = MAP_APPFONT ( 108 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + DefButton = TRUE ; + }; + CancelButton BT_CANCEL + { + Pos = MAP_APPFONT ( 108 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + HelpButton BT_HELP + { + Pos = MAP_APPFONT ( 108 , 43 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + FixedLine FL_FORM + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 96 , 8 ) ; + Text [ en-US ] = "Format" ; + }; + ListBox LB_FORM + { + HelpID = "sw:ListBox:DLG_NUM_NAMES:LB_FORM"; + Border = TRUE ; + Pos = MAP_APPFONT ( 12 , 29 ) ; + Size = MAP_APPFONT ( 84 , 42 ) ; + TabStop = TRUE ; + CurPos = 0 ; + StringList [ en-US ] = + { + < "Untitled 1" ; > ; + < "Untitled 2" ; > ; + < "Untitled 3" ; > ; + < "Untitled 4" ; > ; + < "Untitled 5" ; > ; + < "Untitled 6" ; > ; + < "Untitled 7" ; > ; + < "Untitled 8" ; > ; + < "Untitled 9" ; > ; + }; + }; + Edit ED_FORM + { + HelpID = "sw:Edit:DLG_NUM_NAMES:ED_FORM"; + Border = TRUE ; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 84 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + }; +}; +/**************************************************************************/ +/* */ +/* */ +/* */ +/**************************************************************************/ +TabDialog DLG_TAB_OUTLINE +{ + OutputSize = TRUE ; + SVLook = TRUE ; + // --> OD 2008-04-14 #outlinelevel# + // dialog title is now given by resource STR_OUTLINE_NUMBERING +// Text [ en-US ] = "Outline Numbering" ; + // <-- + Moveable = TRUE ; + TabControl 1 + { + SVLook = TRUE ; + PageList = + { + PageItem + { + Identifier = TP_OUTLINE_NUM ; + Text [ en-US ] = "Numbering" ; + }; + PageItem + { + Identifier = TP_NUM_POSITION ; + Text [ en-US ] = "Position" ; + }; + }; + }; + String ST_FORM + { + Text [ en-US ] = "~Format" ; + }; + Menu MN_FORM + { + ItemList = + { + MenuItem + { + Identifier = MN_FORM1 ; + Text [ en-US ] = "Untitled 1" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM2 ; + Text [ en-US ] = "Untitled 2" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM3 ; + Text [ en-US ] = "Untitled 3" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM4 ; + Text [ en-US ] = "Untitled 4" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM5 ; + Text [ en-US ] = "Untitled 5" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM6 ; + Text [ en-US ] = "Untitled 6" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM7 ; + Text [ en-US ] = "Untitled 7" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM8 ; + Text [ en-US ] = "Untitled 8" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Identifier = MN_FORM9 ; + Text [ en-US ] = "Untitled 9" ; + HelpID = HID_NUM_OUTL_NAMED_NUMS ; + }; + MenuItem + { + Separator = TRUE ; + }; + MenuItem + { + Identifier = MN_SAVE ; + Text [ en-US ] = "Save ~As..."; + HelpID = HID_NUM_OUTL_NUM_SAVEAS ; + }; + }; + }; +}; +/**************************************************************************/ +/* */ +/* TabPage */ +/* */ +/**************************************************************************/ +TabPage TP_OUTLINE_NUM +{ + HelpID = HID_TP_OUTLINE_NUM ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 260 , 185 ) ; + Hide = TRUE; + ListBox LB_LEVEL + { + HelpID = "sw:ListBox:TP_OUTLINE_NUM:LB_LEVEL"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 23 , 129 ) ; + TabStop = TRUE ; + DropDown = FALSE ; + Border = TRUE ; + }; + FixedLine FL_LEVEL + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 32 , 8 ) ; + Text [ en-US ] = "Level" ; + }; + FixedText FT_COLL + { + Pos = MAP_APPFONT ( 50 , 14 ) ; + Size = MAP_APPFONT ( 120 , 8 ) ; + Text [ en-US ] = "~Paragraph Style" ; + Group = TRUE ; + Left = TRUE ; + }; + ListBox LB_COLL + { + HelpID = "sw:ListBox:TP_OUTLINE_NUM:LB_COLL"; + Border = TRUE ; + Pos = MAP_APPFONT ( 50 , 25 ) ; + Size = MAP_APPFONT ( 120 , 75 ) ; + TabStop = TRUE ; + Group = TRUE ; + Sort = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + }; + FixedText FT_NUMBER + { + Pos = MAP_APPFONT ( 50 , 43 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "~Number" ; + Left = TRUE ; + }; + ListBox LB_NUMBER + { + HelpID = "sw:ListBox:TP_OUTLINE_NUM:LB_NUMBER"; + Pos = MAP_APPFONT ( 104 , 41 ) ; + Size = MAP_APPFONT ( 66 , 65 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + }; + FixedText FT_CHARFMT + { + Pos = MAP_APPFONT ( 50 , 59 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "~Character Style" ; + }; + ListBox LB_CHARFMT + { + HelpID = "sw:ListBox:TP_OUTLINE_NUM:LB_CHARFMT"; + TabStop = TRUE ; + DropDown = TRUE ; + Pos = MAP_APPFONT ( 104 , 57 ) ; + Size = MAP_APPFONT ( 66 , 65 ) ; + }; + FixedText FT_ALL_LEVEL + { + Pos = MAP_APPFONT ( 50 , 75 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "Sho~w sublevels" ; + }; + NumericField NF_ALL_LEVEL + { + HelpID = "sw:NumericField:TP_OUTLINE_NUM:NF_ALL_LEVEL"; + Border = TRUE ; + Pos = MAP_APPFONT ( 104 , 73 ) ; + Size = MAP_APPFONT ( 66 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 10 ; + Value = 1 ; + First = 1 ; + Last = 10 ; + }; + FixedText FT_DELIM + { + Pos = MAP_APPFONT ( 50 , 89 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "Separator" ; + Left = TRUE ; + }; + FixedText FT_PREFIX + { + Pos = MAP_APPFONT ( 56 , 102 ) ; + Size = MAP_APPFONT ( 46 , 8 ) ; + Text [ en-US ] = "~Before" ; + Left = TRUE ; + }; + Edit ED_PREFIX + { + HelpID = "sw:Edit:TP_OUTLINE_NUM:ED_PREFIX"; + Border = TRUE ; + Pos = MAP_APPFONT ( 104 , 100 ) ; + Size = MAP_APPFONT ( 66 , 12 ) ; + TabStop = TRUE ; + Group = TRUE ; + Left = TRUE ; + }; + FixedText FT_SUFFIX + { + Pos = MAP_APPFONT ( 56 , 117 ) ; + Size = MAP_APPFONT ( 46 , 8 ) ; + Text [ en-US ] = "~After" ; + Left = TRUE ; + }; + Edit ED_SUFFIX + { + HelpID = "sw:Edit:TP_OUTLINE_NUM:ED_SUFFIX"; + Border = TRUE ; + Pos = MAP_APPFONT ( 104 , 115 ) ; + Size = MAP_APPFONT ( 66 , 12 ) ; + TabStop = TRUE ; + Group = TRUE ; + Left = TRUE ; + }; + FixedText FT_START + { + Pos = MAP_APPFONT ( 50 , 133 ) ; + Size = MAP_APPFONT ( 52 , 8 ) ; + Text [ en-US ] = "~Start at" ; + Left = TRUE ; + }; + NumericField ED_START + { + HelpID = "sw:NumericField:TP_OUTLINE_NUM:ED_START"; + Border = TRUE ; + Pos = MAP_APPFONT ( 104 , 131 ) ; + Size = MAP_APPFONT ( 66 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Spin = TRUE ; + Repeat = TRUE ; + Maximum = 999 ; + Value = 0 ; + First = 0 ; + Last = 99 ; + SpinSize = 1 ; + }; + FixedLine FL_NUMBER + { + Pos = MAP_APPFONT ( 44 , 3 ) ; + Size = MAP_APPFONT ( 210 , 8 ) ; + Text [ en-US ] = "Numbering" ; + Group = TRUE ; + }; + Window WIN_PREVIEW + { + Pos = MAP_APPFONT ( 179 , 14 ) ; + Size = MAP_APPFONT ( 72 , 129 ) ; + }; + String ST_NO_COLL + { + Text [ en-US ] = "(none)" ; + }; +}; + diff --git a/sw/source/ui/misc/pgfnote.cxx b/sw/source/ui/misc/pgfnote.cxx new file mode 100644 index 000000000000..8d4e1e651427 --- /dev/null +++ b/sw/source/ui/misc/pgfnote.cxx @@ -0,0 +1,400 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#include <cmdid.h> +#include <hintids.hxx> +#include <tools/ref.hxx> +#include <svx/dialogs.hrc> +#include <svx/drawitem.hxx> +#include <svx/xtable.hxx> // XColorTable +#include <sal/macros.h> +#include <vcl/field.hxx> +#include <vcl/svapp.hxx> +#include <unotools/localedatawrapper.hxx> +#include <unotools/syslocale.hxx> +#include <editeng/borderline.hxx> +#include <editeng/sizeitem.hxx> +#include <svx/pageitem.hxx> +#include <svl/eitem.hxx> +#include <editeng/ulspitem.hxx> +#include <uitool.hxx> +#include <pagedesc.hxx> +#include <pgfnote.hxx> +#include <uiitems.hxx> +#include <sfx2/objsh.hxx> + +#include <globals.hrc> +#include <misc.hrc> +#include <pgfnote.hrc> + +static sal_uInt16 aPageRg[] = { + FN_PARAM_FTN_INFO, FN_PARAM_FTN_INFO, + 0 +}; + +/*------------------------------------------------------------------------ + Beschreibung: Handler fuer umschalten zwischen den unterschiedlichen + Arten, wie die Hoehe des Fussnotenbereiches angegeben + werden kann. +------------------------------------------------------------------------*/ +IMPL_LINK_INLINE_START( SwFootNotePage, HeightPage, Button *, EMPTYARG ) +{ + aMaxHeightEdit.Enable(sal_False); + return 0; +} +IMPL_LINK_INLINE_END( SwFootNotePage, HeightPage, Button *, EMPTYARG ) + + +IMPL_LINK_INLINE_START( SwFootNotePage, HeightMetric, Button *, EMPTYARG ) +{ + aMaxHeightEdit.Enable(); + aMaxHeightEdit.GrabFocus(); + return 0; +} +IMPL_LINK_INLINE_END( SwFootNotePage, HeightMetric, Button *, EMPTYARG ) + +/*------------------------------------------------------------------------ + Beschreibung: Handler Grenzwerte +------------------------------------------------------------------------*/ +IMPL_LINK( SwFootNotePage, HeightModify, MetricField *, EMPTYARG ) +{ + aMaxHeightEdit.SetMax(aMaxHeightEdit.Normalize(lMaxHeight - + (aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)) + + aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))), + FUNIT_TWIP); + if(aMaxHeightEdit.GetValue() < 0) + aMaxHeightEdit.SetValue(0); + aDistEdit.SetMax(aDistEdit.Normalize(lMaxHeight - + (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) + + aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))), + FUNIT_TWIP); + if(aDistEdit.GetValue() < 0) + aDistEdit.SetValue(0); + aLineDistEdit.SetMax(aLineDistEdit.Normalize(lMaxHeight - + (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) + + aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)))), + FUNIT_TWIP); + return 0; +} + +IMPL_LINK( SwFootNotePage, LineWidthChanged_Impl, void *, EMPTYARG ) +{ + sal_Int64 nVal = MetricField::ConvertDoubleValue( + aLineWidthEdit.GetValue( ), + aLineWidthEdit.GetDecimalDigits( ), + aLineWidthEdit.GetUnit(), MAP_TWIP ); + aLineTypeBox.SetWidth( nVal ); + + return 0; +} + +IMPL_LINK( SwFootNotePage, LineColorSelected_Impl, void *, EMPTYARG ) +{ + aLineTypeBox.SetColor( aLineColorBox.GetSelectEntryColor() ); + return 0; +} + +// CTOR / DTOR ----------------------------------------------------------- + +SwFootNotePage::SwFootNotePage(Window *pParent, const SfxItemSet &rSet) : + + SfxTabPage(pParent, SW_RES(TP_FOOTNOTE_PAGE), rSet), + aPosHeader(this, SW_RES(FL_FOOTNOTE_SIZE)), + aMaxHeightPageBtn(this, SW_RES(RB_MAXHEIGHT_PAGE)), + aMaxHeightBtn(this, SW_RES(RB_MAXHEIGHT)), + aMaxHeightEdit(this, SW_RES(ED_MAXHEIGHT)), + aDistLbl(this, SW_RES(FT_DIST)), + aDistEdit(this, SW_RES(ED_DIST)), + + aLineHeader(this, SW_RES(FL_LINE)), + aLinePosLbl(this, SW_RES(FT_LINEPOS)), + aLinePosBox(this, SW_RES(DLB_LINEPOS)), + aLineTypeLbl(this, SW_RES(FT_LINETYPE)), + aLineTypeBox(this, SW_RES(DLB_LINETYPE)), + aLineWidthLbl(this, SW_RES(FT_LINEWIDTH)), + aLineWidthEdit(this, SW_RES(ED_LINEWIDTH)), + aLineColorLbl(this, SW_RES(FT_LINECOLOR)), + aLineColorBox(this, SW_RES(DLB_LINECOLOR)), + aLineLengthLbl(this, SW_RES(FT_LINELENGTH)), + aLineLengthEdit(this, SW_RES(ED_LINELENGTH)), + aLineDistLbl(this, SW_RES(FT_LINEDIST)), + aLineDistEdit(this, SW_RES(ED_LINEDIST)) + { + FreeResource(); + + SetExchangeSupport(); + FieldUnit aMetric = ::GetDfltMetric(sal_False); + SetMetric( aMaxHeightEdit, aMetric ); + SetMetric( aDistEdit, aMetric ); + SetMetric( aLineDistEdit, aMetric ); + MeasurementSystem eSys = SvtSysLocale().GetLocaleData().getMeasurementSystemEnum(); + long nHeightValue = MEASURE_METRIC != eSys ? 1440 : 1134; + aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(nHeightValue),FUNIT_TWIP);; + aMaxHeightEdit.SetAccessibleRelationLabeledBy(&aMaxHeightBtn); +} + +SwFootNotePage::~SwFootNotePage() +{ +} + +SfxTabPage* SwFootNotePage::Create(Window *pParent, const SfxItemSet &rSet) +{ + return new SwFootNotePage(pParent, rSet); +} + +void SwFootNotePage::Reset(const SfxItemSet &rSet) +{ + // Falls noch kein Bsp vorhanden Init hier sonst im Activate + // + SwPageFtnInfo* pDefFtnInfo = 0; + const SwPageFtnInfo* pFtnInfo; + const SfxPoolItem* pItem = SfxTabPage::GetItem(rSet, FN_PARAM_FTN_INFO); + if( pItem ) + { + pFtnInfo = &((const SwPageFtnInfoItem*)pItem)->GetPageFtnInfo(); + } + else + { + // wenn "Standard" betaetigt wird, wird das Fussnotenitem geloescht, + // deswegen muss hier eine Fussnotenstruktur erzeugt werden + pDefFtnInfo = new SwPageFtnInfo(); + pFtnInfo = pDefFtnInfo; + } + // Hoehe Fussnotenbereich + SwTwips lHeight = pFtnInfo->GetHeight(); + if(lHeight) + { + aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(lHeight),FUNIT_TWIP); + aMaxHeightBtn.Check(sal_True); + } + else + { + aMaxHeightPageBtn.Check(sal_True); + aMaxHeightEdit.Enable(sal_False); + } + aMaxHeightPageBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightPage)); + aMaxHeightBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightMetric)); + Link aLk = LINK(this, SwFootNotePage, HeightModify); + aMaxHeightEdit.SetLoseFocusHdl( aLk ); + aDistEdit.SetLoseFocusHdl( aLk ); + aLineDistEdit.SetLoseFocusHdl( aLk ); + + // Separator width + aLineWidthEdit.SetModifyHdl( LINK( this, SwFootNotePage, LineWidthChanged_Impl ) ); + + sal_Int64 nWidthPt = MetricField::ConvertDoubleValue( + sal_Int64( pFtnInfo->GetLineWidth() ), aLineWidthEdit.GetDecimalDigits(), + MAP_TWIP, aLineWidthEdit.GetUnit( ) ); + aLineWidthEdit.SetValue( nWidthPt ); + + // Separator style + aLineTypeBox.SetSourceUnit( FUNIT_TWIP ); + + aLineTypeBox.SetNone( String( SW_RES( STR_NONE ) ) ); + aLineTypeBox.InsertEntry( ::editeng::SvxBorderLine::getWidthImpl( ::editeng::SOLID ), ::editeng::SOLID ); + aLineTypeBox.InsertEntry( ::editeng::SvxBorderLine::getWidthImpl( ::editeng::DOTTED ), ::editeng::DOTTED ); + aLineTypeBox.InsertEntry( ::editeng::SvxBorderLine::getWidthImpl( ::editeng::DASHED ), ::editeng::DASHED ); + aLineTypeBox.SetWidth( pFtnInfo->GetLineWidth( ) ); + aLineTypeBox.SelectEntry( pFtnInfo->GetLineStyle() ); + + // Separator Color + SfxObjectShell* pDocSh = SfxObjectShell::Current(); + const SfxPoolItem* pColorItem = NULL; + XColorTable* pColorTable = NULL; + + DBG_ASSERT( pDocSh, "DocShell not found!" ); + + if ( pDocSh ) + { + pColorItem = pDocSh->GetItem( SID_COLOR_TABLE ); + if ( pColorItem != NULL ) + pColorTable = ( (SvxColorTableItem*)pColorItem )->GetColorTable(); + } + + DBG_ASSERT( pColorTable, "ColorTable not found!" ); + + if ( pColorTable ) + { + aLineColorBox.SetUpdateMode( sal_False ); + + for ( long i = 0; i < pColorTable->Count(); ++i ) + { + XColorEntry* pEntry = pColorTable->GetColor(i); + aLineColorBox.InsertEntry( pEntry->GetColor(), pEntry->GetName() ); + } + aLineColorBox.SetUpdateMode( sal_True ); + } + + // select color in the list or add it as a user color + sal_uInt16 nSelPos = aLineColorBox.GetEntryPos( pFtnInfo->GetLineColor() ); + if( nSelPos == LISTBOX_ENTRY_NOTFOUND ) + nSelPos = aLineColorBox.InsertEntry( pFtnInfo->GetLineColor(), + String( SW_RES( RID_SVXSTR_COLOR_USER ) ) ); + + aLineColorBox.SetSelectHdl( LINK( this, SwFootNotePage, LineColorSelected_Impl ) ); + aLineColorBox.SelectEntryPos( nSelPos ); + aLineTypeBox.SetColor( pFtnInfo->GetLineColor() ); + + + // Position + aLinePosBox.SelectEntryPos( static_cast< sal_uInt16 >(pFtnInfo->GetAdj()) ); + + // Breite + Fraction aTmp( 100, 1 ); + aTmp *= pFtnInfo->GetWidth(); + aLineLengthEdit.SetValue( static_cast<long>(aTmp) ); + + // Abstand Fussnotenbereich + aDistEdit.SetValue(aDistEdit.Normalize(pFtnInfo->GetTopDist()),FUNIT_TWIP); + aLineDistEdit.SetValue( + aLineDistEdit.Normalize(pFtnInfo->GetBottomDist()), FUNIT_TWIP); + ActivatePage( rSet ); + delete pDefFtnInfo; +} + +/*-------------------------------------------------------------------- + Beschreibung: Attribute in den Set stopfen bei OK + --------------------------------------------------------------------*/ +sal_Bool SwFootNotePage::FillItemSet(SfxItemSet &rSet) +{ + SwPageFtnInfoItem aItem((const SwPageFtnInfoItem&)GetItemSet().Get(FN_PARAM_FTN_INFO)); + + // Das ist das Original + SwPageFtnInfo &rFtnInfo = aItem.GetPageFtnInfo(); + + // Hoehe Fussnotenbereich + if(aMaxHeightBtn.IsChecked()) + rFtnInfo.SetHeight( static_cast< SwTwips >( + aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)))); + else + rFtnInfo.SetHeight(0); + + // Abstand Fussnotenbereich + rFtnInfo.SetTopDist( static_cast< SwTwips >( + aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)))); + rFtnInfo.SetBottomDist( static_cast< SwTwips >( + aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))); + + // Separator style + rFtnInfo.SetLineStyle( ::editeng::SvxBorderStyle( aLineTypeBox.GetSelectEntryStyle() ) ); + + // Separator width + long nWidth = MetricField::ConvertDoubleValue( + aLineWidthEdit.GetValue( ), + aLineWidthEdit.GetDecimalDigits( ), + aLineWidthEdit.GetUnit(), MAP_TWIP ); + rFtnInfo.SetLineWidth( nWidth ); + + // Separator color + rFtnInfo.SetLineColor( aLineColorBox.GetSelectEntryColor() ); + + // Position + rFtnInfo.SetAdj((SwFtnAdj)aLinePosBox.GetSelectEntryPos()); + + // Breite + rFtnInfo.SetWidth(Fraction( static_cast< long >(aLineLengthEdit.GetValue()), 100)); + + const SfxPoolItem* pOldItem; + if(0 == (pOldItem = GetOldItem( rSet, FN_PARAM_FTN_INFO )) || + aItem != *pOldItem ) + rSet.Put(aItem); + + return sal_True; +} + +void SwFootNotePage::ActivatePage(const SfxItemSet& rSet) +{ + const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( RES_FRM_SIZE ); + lMaxHeight = rSize.GetSize().Height(); + + const SfxPoolItem* pItem; + if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_HEADERSET), sal_False, &pItem ) ) + { + const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet(); + const SfxBoolItem& rHeaderOn = + (const SfxBoolItem&)rHeaderSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_ON ) ); + + if ( rHeaderOn.GetValue() ) + { + const SvxSizeItem& rSizeItem = + (const SvxSizeItem&)rHeaderSet.Get(rSet.GetPool()->GetWhich(SID_ATTR_PAGE_SIZE)); + lMaxHeight -= rSizeItem.GetSize().Height(); + } + } + + if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_FOOTERSET), + sal_False, &pItem ) ) + { + const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet(); + const SfxBoolItem& rFooterOn = + (const SfxBoolItem&)rFooterSet.Get( SID_ATTR_PAGE_ON ); + + if ( rFooterOn.GetValue() ) + { + const SvxSizeItem& rSizeItem = + (const SvxSizeItem&)rFooterSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_SIZE ) ); + lMaxHeight -= rSizeItem.GetSize().Height(); + } + } + + if ( rSet.GetItemState( RES_UL_SPACE , sal_False ) == SFX_ITEM_SET ) + { + const SvxULSpaceItem &rUL = (const SvxULSpaceItem&)rSet.Get( RES_UL_SPACE ); + lMaxHeight -= rUL.GetUpper() + rUL.GetLower(); + } + + lMaxHeight *= 8; + lMaxHeight /= 10; + + // Maximalwerte setzen + HeightModify(0); +} + +int SwFootNotePage::DeactivatePage( SfxItemSet* _pSet) +{ + if(_pSet) + FillItemSet(*_pSet); + + return sal_True; +} + +sal_uInt16* SwFootNotePage::GetRanges() +{ + return aPageRg; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/pgfnote.hrc b/sw/source/ui/misc/pgfnote.hrc new file mode 100644 index 000000000000..3b3c8643bf8e --- /dev/null +++ b/sw/source/ui/misc/pgfnote.hrc @@ -0,0 +1,47 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#define RB_MAXHEIGHT_PAGE 1 +#define RB_MAXHEIGHT 2 +#define ED_MAXHEIGHT 3 +#define FT_DIST 4 +#define ED_DIST 5 +#define FL_FOOTNOTE_SIZE 10 + +#define FT_LINETYPE 20 +#define DLB_LINETYPE 21 +#define FT_LINEPOS 22 +#define DLB_LINEPOS 23 +#define FT_LINELENGTH 24 +#define ED_LINELENGTH 25 +#define FT_LINEDIST 26 +#define ED_LINEDIST 27 +#define FL_LINE 30 +#define FT_LINEWIDTH 31 +#define ED_LINEWIDTH 32 +#define FT_LINECOLOR 33 +#define DLB_LINECOLOR 34 diff --git a/sw/source/ui/misc/pgfnote.src b/sw/source/ui/misc/pgfnote.src new file mode 100644 index 000000000000..6164a686cddb --- /dev/null +++ b/sw/source/ui/misc/pgfnote.src @@ -0,0 +1,242 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#include "globals.hrc" +#include "pgfnote.hrc" +#include "helpid.h" +TabPage TP_FOOTNOTE_PAGE +{ + HelpID = HID_FOOTNOTE_PAGE ; + Pos = MAP_APPFONT ( 0 , 0 ) ; + Size = MAP_APPFONT ( 260 , 185 ) ; + Hide = TRUE; + RadioButton RB_MAXHEIGHT_PAGE + { + HelpID = "sw:RadioButton:TP_FOOTNOTE_PAGE:RB_MAXHEIGHT_PAGE"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 132 , 10 ) ; + Text [ en-US ] = "~Not larger than page area" ; + TabStop = TRUE ; + Group = TRUE ; + }; + RadioButton RB_MAXHEIGHT + { + HelpID = "sw:RadioButton:TP_FOOTNOTE_PAGE:RB_MAXHEIGHT"; + Pos = MAP_APPFONT ( 12 , 28 ) ; + Size = MAP_APPFONT ( 132 , 10 ) ; + Text [ en-US ] = "Maximum footnote ~height" ; + }; + MetricField ED_MAXHEIGHT + { + HelpID = "sw:MetricField:TP_FOOTNOTE_PAGE:ED_MAXHEIGHT"; + Border = TRUE ; + Pos = MAP_APPFONT ( 148 , 26 ) ; + Size = MAP_APPFONT ( 42 , 12 ) ; + TabStop = TRUE ; + Group = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 50 ; + Maximum = 99999 ; + DecimalDigits = 2 ; + Value = 200 ; + Unit = FUNIT_CM ; + First = 10 ; + Last = 99999 ; + SpinSize = 10 ; + }; + FixedText FT_DIST + { + Pos = MAP_APPFONT ( 12 , 44 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Text [ en-US ] = "Space to text" ; + Left = TRUE ; + }; + MetricField ED_DIST + { + HelpID = "sw:MetricField:TP_FOOTNOTE_PAGE:ED_DIST"; + Border = TRUE ; + Pos = MAP_APPFONT ( 148 , 42 ) ; + Size = MAP_APPFONT ( 42 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Maximum = 999 ; + DecimalDigits = 2 ; + Value = 10 ; + Unit = FUNIT_CM ; + First = 5 ; + Last = 99999 ; + SpinSize = 10 ; + }; + FixedLine FL_FOOTNOTE_SIZE + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Footnote area" ; + }; + FixedText FT_LINEPOS + { + Pos = MAP_APPFONT ( 12 , 73 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "~Position" ; + }; + ListBox DLB_LINEPOS + { + HelpID = "sw:ListBox:TP_FOOTNOTE_PAGE:DLB_LINEPOS"; + Pos = MAP_APPFONT ( 148 , 71 ) ; + Size = MAP_APPFONT ( 57 , 40 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + StringList [ en-US ] = + { + < "Left" ; Default ; > ; + < "Centered" ; Default ; > ; + < "Right" ; Default ; > ; + }; + }; + FixedText FT_LINETYPE + { + Pos = MAP_APPFONT ( 12 , 89 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Group = TRUE ; + Left = TRUE ; + Text [ en-US ] = "~Style" ; + }; + ListBox DLB_LINETYPE + { + HelpID = "sw:ListBox:TP_FOOTNOTE_PAGE:DLB_LINETYPE"; + Pos = MAP_APPFONT ( 148 , 87 ) ; + Size = MAP_APPFONT ( 57 , 50 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + }; + FixedText FT_LINEWIDTH + { + Pos = MAP_APPFONT ( 12 , 105 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Group = TRUE ; + Left = TRUE ; + Text [ en-US ] = "~Thickness" ; + }; + MetricField ED_LINEWIDTH + { + HelpID = "sw:MetricField:TP_FOOTNOTE_PAGE:ED_LINEWIDTH"; + Border = TRUE ; + Pos = MAP_APPFONT ( 148 , 103 ) ; + Size = MAP_APPFONT ( 42 , 12 ) ; + Spin = TRUE ; + Repeat = TRUE ; + SpinSize = 25 ; + First = 25 ; + Last = 900 ; + Maximum = 900 ; + Minimum = 25 ; + DecimalDigits = 2 ; + Unit = FUNIT_POINT ; + TabStop = TRUE ; + Left = TRUE ; + }; + FixedText FT_LINECOLOR + { + Pos = MAP_APPFONT ( 12 , 121 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Group = TRUE ; + Left = TRUE ; + Text [ en-US ] = "~Color" ; + }; + ListBox DLB_LINECOLOR + { + Pos = MAP_APPFONT ( 148 , 119 ) ; + Size = MAP_APPFONT ( 57 , 50 ) ; + TabStop = TRUE ; + Group = TRUE ; + DropDown = TRUE ; + DDExtraWidth = TRUE ; + Border = TRUE ; + }; + + FixedText FT_LINELENGTH + { + Pos = MAP_APPFONT ( 12 , 137 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Left = TRUE ; + Text [ en-US ] = "~Length" ; + }; + MetricField ED_LINELENGTH + { + Border = TRUE ; + Pos = MAP_APPFONT ( 148 , 135 ) ; + Size = MAP_APPFONT ( 42 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Maximum = 100 ; + Value = 100 ; + Unit = FUNIT_CUSTOM ; + CustomUnitText = "%" ; + First = 10 ; + Last = 100 ; + }; + FixedText FT_LINEDIST + { + Pos = MAP_APPFONT ( 12 , 153 ) ; + Size = MAP_APPFONT ( 132 , 8 ) ; + Text [ en-US ] = "~Spacing to footnote contents" ; + Left = TRUE ; + }; + MetricField ED_LINEDIST + { + HelpID = "sw:MetricField:TP_FOOTNOTE_PAGE:ED_LINEDIST"; + Border = TRUE ; + Pos = MAP_APPFONT ( 148 , 151 ) ; + Size = MAP_APPFONT ( 42 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Maximum = 999 ; + DecimalDigits = 2 ; + Value = 10 ; + Unit = FUNIT_CM ; + First = 5 ; + Last = 99999 ; + SpinSize = 10 ; + }; + FixedLine FL_LINE + { + Pos = MAP_APPFONT ( 6 , 60 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Separator line" ; + }; +}; diff --git a/sw/source/ui/misc/pggrid.cxx b/sw/source/ui/misc/pggrid.cxx new file mode 100644 index 000000000000..443dbea06389 --- /dev/null +++ b/sw/source/ui/misc/pggrid.cxx @@ -0,0 +1,538 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#include <sfx2/app.hxx> + +#include <cmdid.h> +#include <hintids.hxx> +#include <swtypes.hxx> +#include <globals.hrc> +#include <svx/xtable.hxx> +#include <uitool.hxx> +#include <editeng/sizeitem.hxx> +#include <editeng/lrspitem.hxx> +#include <editeng/ulspitem.hxx> +#include <editeng/boxitem.hxx> +#include <editeng/frmdiritem.hxx> +#include <svx/ruler.hxx> +#include <pggrid.hxx> +#include <tgrditem.hxx> +#include <pggrid.hrc> + +#include "wrtsh.hxx" +#include "doc.hxx" +#include "uiitems.hxx" +#include "swmodule.hxx" +#include "view.hxx" + +SwTextGridPage::SwTextGridPage(Window *pParent, const SfxItemSet &rSet) : + SfxTabPage(pParent, SW_RES(TP_TEXTGRID_PAGE), rSet), + aGridTypeFL (this, SW_RES(FL_GRID_TYPE )), + aNoGridRB (this, SW_RES(RB_NOGRID )), + aLinesGridRB (this, SW_RES(RB_LINESGRID )), + aCharsGridRB (this, SW_RES(RB_CHARSGRID )), + aSnapToCharsCB (this, SW_RES(CB_SNAPTOCHARS )), + aExampleWN (this, SW_RES(WN_EXAMPLE )), + aLayoutFL (this, SW_RES(FL_LAYOUT )), + aLinesPerPageFT (this, SW_RES(FT_LINESPERPAGE )), + aLinesPerPageNF (this, SW_RES(NF_LINESPERPAGE )), + aLinesRangeFT (this, SW_RES(FT_LINERANGE )), + aTextSizeFT (this, SW_RES(FT_TEXTSIZE )), + aTextSizeMF (this, SW_RES(MF_TEXTSIZE )), + aCharsPerLineFT (this, SW_RES(FT_CHARSPERLINE )), + aCharsPerLineNF (this, SW_RES(NF_CHARSPERLINE )), + aCharsRangeFT (this, SW_RES(FT_CHARRANGE )), + aCharWidthFT (this, SW_RES(FT_CHARWIDTH )), + aCharWidthMF (this, SW_RES(MF_CHARWIDTH )), + aRubySizeFT (this, SW_RES(FT_RUBYSIZE )), + aRubySizeMF (this, SW_RES(MF_RUBYSIZE )), + aRubyBelowCB (this, SW_RES(CB_RUBYBELOW )), + aDisplayFL (this, SW_RES(FL_DISPLAY )), + aDisplayCB (this, SW_RES(CB_DISPLAY )), + aPrintCB (this, SW_RES(CB_PRINT )), + aColorFT (this, SW_RES(FT_COLOR )), + aColorLB (this, SW_RES(LB_COLOR )), + m_nRubyUserValue(0), + m_bRubyUserValue(sal_False), + m_aPageSize(MM50, MM50), + m_bVertical(sal_False), + m_bSquaredMode(sal_False), + m_bHRulerChanged( sal_False ), + m_bVRulerChanged( sal_False ) +{ + FreeResource(); + + aControls[0] =&aLayoutFL; + aControls[1] =&aLinesPerPageFT; + aControls[2] =&aLinesPerPageNF; + aControls[3] =&aTextSizeFT; + aControls[4] =&aTextSizeMF; + aControls[5] =&aCharsPerLineFT; + aControls[6] =&aCharsPerLineNF; + aControls[7] =&aCharWidthFT; + aControls[8] =&aCharWidthMF; + aControls[9] =&aRubySizeFT; + aControls[10] =&aRubySizeMF; + aControls[11] =&aRubyBelowCB; + aControls[12] =&aDisplayFL; + aControls[13] =&aDisplayCB; + aControls[14] =&aPrintCB; + aControls[15] =&aColorFT; + aControls[16] =&aColorLB; + aControls[17] =&aLinesRangeFT; + aControls[18] =&aCharsRangeFT; + aControls[19] =0; + + Link aLink = LINK(this, SwTextGridPage, CharorLineChangedHdl); + aCharsPerLineNF.SetUpHdl(aLink); + aCharsPerLineNF.SetDownHdl(aLink); + aCharsPerLineNF.SetLoseFocusHdl(aLink); + aLinesPerPageNF.SetUpHdl(aLink); + aLinesPerPageNF.SetDownHdl(aLink); + aLinesPerPageNF.SetLoseFocusHdl(aLink); + + Link aSizeLink = LINK(this, SwTextGridPage, TextSizeChangedHdl); + aTextSizeMF.SetUpHdl(aSizeLink); + aTextSizeMF.SetDownHdl(aSizeLink); + aTextSizeMF.SetLoseFocusHdl(aSizeLink); + aRubySizeMF.SetUpHdl(aSizeLink); + aRubySizeMF.SetDownHdl(aSizeLink); + aRubySizeMF.SetLoseFocusHdl(aSizeLink); + aCharWidthMF.SetUpHdl(aSizeLink); + aCharWidthMF.SetDownHdl(aSizeLink); + aCharWidthMF.SetLoseFocusHdl(aSizeLink); + + Link aGridTypeHdl = LINK(this, SwTextGridPage, GridTypeHdl); + aNoGridRB .SetClickHdl(aGridTypeHdl); + aLinesGridRB.SetClickHdl(aGridTypeHdl); + aCharsGridRB.SetClickHdl(aGridTypeHdl); + + Link aModifyLk = LINK(this, SwTextGridPage, GridModifyHdl); + aColorLB.SetSelectHdl(aModifyLk); + aPrintCB.SetClickHdl(aModifyLk); + aRubyBelowCB.SetClickHdl(aModifyLk); + + + aDisplayCB.SetClickHdl(LINK(this, SwTextGridPage, DisplayGridHdl)); + + XColorTable* pColorTbl = XColorTable::GetStdColorTable(); + aColorLB.InsertAutomaticEntry(); + for( sal_uInt16 i = 0; i < pColorTbl->Count(); ++i ) + { + XColorEntry* pEntry = pColorTbl->GetColor( i ); + Color aColor = pEntry->GetColor(); + String sName = pEntry->GetName(); + aColorLB.InsertEntry( aColor, sName ); + } + aColorLB.SetUpdateMode( sal_True ); + //Get the default paper mode + SwView *pView = ::GetActiveView(); + if( pView ) + { + SwWrtShell* pSh = pView->GetWrtShellPtr(); + if( pSh ) + { + m_bSquaredMode = pSh->GetDoc()->IsSquaredPageMode(); + } + } + if( m_bSquaredMode ) + { + aRubySizeFT.Show(); + aRubySizeMF.Show(); + aRubyBelowCB.Show(); + aSnapToCharsCB.Hide(); + aCharWidthFT.Hide(); + aCharWidthMF.Hide(); + } + else + { + aRubySizeFT.Hide(); + aRubySizeMF.Hide(); + aRubyBelowCB.Hide(); + aSnapToCharsCB.Show(); + aCharWidthFT.Show(); + aCharWidthMF.Show(); + } +} + +SwTextGridPage::~SwTextGridPage() +{ +} + +SfxTabPage *SwTextGridPage::Create(Window *pParent, const SfxItemSet &rSet) +{ + return new SwTextGridPage(pParent, rSet); +} + +sal_Bool SwTextGridPage::FillItemSet(SfxItemSet &rSet) +{ + sal_Bool bRet = sal_False; + if(aNoGridRB.GetSavedValue() != aNoGridRB.IsChecked()|| + aLinesGridRB.GetSavedValue() != aLinesGridRB.IsChecked()|| + aLinesPerPageNF.GetSavedValue().ToInt32() + != aLinesPerPageNF.GetValue()|| + aTextSizeMF.GetSavedValue().ToInt32() != aTextSizeMF.GetValue()|| + aCharsPerLineNF.GetSavedValue().ToInt32() + != aCharsPerLineNF.GetValue()|| + aSnapToCharsCB.GetSavedValue() != aSnapToCharsCB.IsChecked() || + aRubySizeMF.GetSavedValue().ToInt32() != aRubySizeMF.GetValue()|| + aCharWidthMF.GetSavedValue().ToInt32() != aCharWidthMF.GetValue()|| + aRubyBelowCB.GetSavedValue() != aRubyBelowCB.IsChecked()|| + aDisplayCB.GetSavedValue() != aDisplayCB.IsChecked()|| + aPrintCB.GetSavedValue() != aPrintCB.IsChecked()|| + aColorLB.GetSavedValue() != aColorLB.GetSelectEntryPos()) + { + PutGridItem(rSet); + bRet = sal_True; + } + + // draw ticks of ruler + SwView * pView = ::GetActiveView(); + if ( m_bHRulerChanged ) + pView->GetHLineal().DrawTicks(); + if ( m_bVRulerChanged ) + pView->GetVLineal().DrawTicks(); + return bRet; +} + +void SwTextGridPage::Reset(const SfxItemSet &rSet) +{ + if(SFX_ITEM_AVAILABLE <= rSet.GetItemState(RES_TEXTGRID, sal_True)) + { + const SwTextGridItem& rGridItem = (const SwTextGridItem&)rSet.Get(RES_TEXTGRID); + RadioButton* pButton = 0; + switch(rGridItem.GetGridType()) + { + case GRID_NONE : pButton = &aNoGridRB; break; + case GRID_LINES_ONLY : pButton = &aLinesGridRB; break; + default: pButton = &aCharsGridRB; + } + pButton->Check(); + aDisplayCB.Check(rGridItem.IsDisplayGrid()); + GridTypeHdl(pButton); + aSnapToCharsCB.Check(rGridItem.IsSnapToChars()); + aLinesPerPageNF.SetValue(rGridItem.GetLines()); + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + m_nRubyUserValue = rGridItem.GetBaseHeight(); + m_bRubyUserValue = sal_True; + aTextSizeMF.SetValue(aTextSizeMF.Normalize(m_nRubyUserValue), FUNIT_TWIP); + aRubySizeMF.SetValue(aRubySizeMF.Normalize(rGridItem.GetRubyHeight()), FUNIT_TWIP); + aCharWidthMF.SetValue(aCharWidthMF.Normalize(rGridItem.GetBaseWidth()), FUNIT_TWIP); + aRubyBelowCB.Check(rGridItem.IsRubyTextBelow()); + aPrintCB.Check(rGridItem.IsPrintGrid()); + aColorLB.SelectEntry(rGridItem.GetColor()); + } + UpdatePageSize(rSet); + + aNoGridRB.SaveValue(); + aLinesGridRB.SaveValue(); + aSnapToCharsCB.SaveValue(); + aLinesPerPageNF.SaveValue(); + aTextSizeMF.SaveValue(); + aCharsPerLineNF.SaveValue(); + aRubySizeMF.SaveValue(); + aCharWidthMF.SaveValue(); + aRubyBelowCB.SaveValue(); + aDisplayCB.SaveValue(); + aPrintCB.SaveValue(); + aColorLB.SaveValue(); +} + +void SwTextGridPage::ActivatePage( const SfxItemSet& rSet ) +{ + aExampleWN.Hide(); + aExampleWN.UpdateExample( rSet ); + UpdatePageSize(rSet); + aExampleWN.Show(); + aExampleWN.Invalidate(); +} + +int SwTextGridPage::DeactivatePage( SfxItemSet* ) +{ + return LEAVE_PAGE; +} + +void SwTextGridPage::PutGridItem(SfxItemSet& rSet) +{ + SwTextGridItem aGridItem; + aGridItem.SetGridType(aNoGridRB.IsChecked() ? GRID_NONE : + aLinesGridRB.IsChecked() ? GRID_LINES_ONLY : GRID_LINES_CHARS ); + aGridItem.SetSnapToChars(aSnapToCharsCB.IsChecked()); + aGridItem.SetLines( static_cast< sal_uInt16 >(aLinesPerPageNF.GetValue()) ); + aGridItem.SetBaseHeight( static_cast< sal_uInt16 >( + m_bRubyUserValue ? m_nRubyUserValue : + aTextSizeMF.Denormalize(aTextSizeMF.GetValue(FUNIT_TWIP))) ); + aGridItem.SetRubyHeight( static_cast< sal_uInt16 >(aRubySizeMF.Denormalize(aRubySizeMF.GetValue(FUNIT_TWIP))) ); + aGridItem.SetBaseWidth( static_cast< sal_uInt16 >(aCharWidthMF.Denormalize(aCharWidthMF.GetValue(FUNIT_TWIP))) ); + aGridItem.SetRubyTextBelow(aRubyBelowCB.IsChecked()); + aGridItem.SetSquaredMode(m_bSquaredMode); + aGridItem.SetDisplayGrid(aDisplayCB.IsChecked()); + aGridItem.SetPrintGrid(aPrintCB.IsChecked()); + aGridItem.SetColor(aColorLB.GetSelectEntryColor()); + rSet.Put(aGridItem); +/// Amelia + SwView * pView = ::GetActiveView(); + if ( aGridItem.GetGridType() != GRID_NONE ) + { + if ( aGridItem.GetGridType() == GRID_LINES_CHARS ) + { + m_bHRulerChanged = sal_True; + } + m_bVRulerChanged = sal_True; + pView->GetHLineal().SetCharWidth((long)(aCharWidthMF.GetValue(FUNIT_TWIP)/56.7)); + pView->GetVLineal().SetLineHeight((long)(aTextSizeMF.GetValue(FUNIT_TWIP)/56.7)); + } +} + +void SwTextGridPage::UpdatePageSize(const SfxItemSet& rSet) +{ + if( SFX_ITEM_UNKNOWN != rSet.GetItemState( RES_FRAMEDIR, sal_True )) + { + const SvxFrameDirectionItem& rDirItem = + (const SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR); + m_bVertical = rDirItem.GetValue() == FRMDIR_VERT_TOP_RIGHT|| + rDirItem.GetValue() == FRMDIR_VERT_TOP_LEFT; + } + + if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_PAGE_SIZE )) + { + const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( + SID_ATTR_PAGE_SIZE); + const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get( + RES_LR_SPACE ); + const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)rSet.Get( + RES_UL_SPACE ); + const SvxBoxItem& rBox = (const SvxBoxItem&) rSet.Get(RES_BOX); + sal_Int32 nDistanceLR = rLRSpace.GetLeft() + rLRSpace.GetRight(); + sal_Int32 nDistanceUL = rULSpace.GetUpper() + rULSpace.GetLower(); + + sal_Int32 nValue1 = rSize.GetSize().Height() - nDistanceUL - + rBox.GetDistance(BOX_LINE_TOP) - + rBox.GetDistance(BOX_LINE_BOTTOM); + sal_Int32 nValue2 = rSize.GetSize().Width() - nDistanceLR - + rBox.GetDistance(BOX_LINE_LEFT) - + rBox.GetDistance(BOX_LINE_RIGHT); + if(m_bVertical) + { + m_aPageSize.Width() = nValue1; + m_aPageSize.Height() = nValue2; + } + else + { + m_aPageSize.Width() = nValue2; + m_aPageSize.Height() = nValue1; + } + + sal_Int32 nTextSize = static_cast< sal_Int32 >(m_bRubyUserValue ? + m_nRubyUserValue : + aTextSizeMF.Denormalize(aTextSizeMF.GetValue(FUNIT_TWIP))); + + if ( m_bSquaredMode ) + { + aCharsPerLineNF.SetValue(m_aPageSize.Width() / nTextSize); + aCharsPerLineNF.SetMax( aCharsPerLineNF.GetValue() ); + aLinesPerPageNF.SetMax( m_aPageSize.Height() / + ( aTextSizeMF.Denormalize(aTextSizeMF.GetValue(FUNIT_TWIP)) + + aRubySizeMF.Denormalize(aRubySizeMF.GetValue(FUNIT_TWIP)))); + SetLinesOrCharsRanges( aCharsRangeFT , aCharsPerLineNF.GetMax() ); + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + } + else + { + sal_Int32 nTextWidth = static_cast< sal_Int32 >(aCharWidthMF.Denormalize(aCharWidthMF.GetValue(FUNIT_TWIP))); + aLinesPerPageNF.SetValue(m_aPageSize.Height() / nTextSize); + if (nTextWidth) + aCharsPerLineNF.SetValue(m_aPageSize.Width() / nTextWidth); + else + aCharsPerLineNF.SetValue( 45 ); + SetLinesOrCharsRanges( aCharsRangeFT , aCharsPerLineNF.GetMax() ); + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + } + } +} + +void SwTextGridPage::SetLinesOrCharsRanges(FixedText & rField, const sal_Int32 nValue ) +{ + String aFieldStr = String::CreateFromAscii("( 1 -"); + aFieldStr += String::CreateFromInt32( nValue ); + aFieldStr += String::CreateFromAscii(" )"); + rField.SetText( aFieldStr ); +} + +sal_uInt16* SwTextGridPage::GetRanges() +{ + static sal_uInt16 aPageRg[] = { + RES_TEXTGRID, RES_TEXTGRID, + 0}; + return aPageRg; +} + +IMPL_LINK(SwTextGridPage, CharorLineChangedHdl, SpinField*, pField) +{ + //if in squared mode + if ( m_bSquaredMode ) + { + if(&aCharsPerLineNF == pField) + { + long nWidth = (long)(m_aPageSize.Width() / aCharsPerLineNF.GetValue()); + aTextSizeMF.SetValue(aTextSizeMF.Normalize(nWidth), FUNIT_TWIP); + //prevent rounding errors in the MetricField by saving the used value + m_nRubyUserValue = nWidth; + m_bRubyUserValue = sal_True; + + } + //set maximum line per page + { + sal_Int32 nMaxLines = static_cast< sal_Int32 >(m_aPageSize.Height() / + ( aTextSizeMF.Denormalize(aTextSizeMF.GetValue(FUNIT_TWIP)) + + aRubySizeMF.Denormalize(aRubySizeMF.GetValue(FUNIT_TWIP)))); + aLinesPerPageNF.SetMax(nMaxLines); + } + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + SetLinesOrCharsRanges( aCharsRangeFT , aCharsPerLineNF.GetMax() ); + } + else//in normal mode + { + if(&aLinesPerPageNF == pField) + { + long nHeight = static_cast< sal_Int32 >(m_aPageSize.Height() / aLinesPerPageNF.GetValue()); + aTextSizeMF.SetValue(aTextSizeMF.Normalize(nHeight), FUNIT_TWIP); + aRubySizeMF.SetValue(0, FUNIT_TWIP); + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + + m_nRubyUserValue = nHeight; + m_bRubyUserValue = sal_True; + } + else if (&aCharsPerLineNF == pField) + { + long nWidth = static_cast< sal_Int32 >(m_aPageSize.Width() / aCharsPerLineNF.GetValue()); + aCharWidthMF.SetValue(aCharWidthMF.Normalize(nWidth), FUNIT_TWIP); + SetLinesOrCharsRanges( aCharsRangeFT , aCharsPerLineNF.GetMax() ); + } + } + GridModifyHdl(0); + return 0; +} + +IMPL_LINK(SwTextGridPage, TextSizeChangedHdl, SpinField*, pField) +{ + //if in squared mode + if( m_bSquaredMode ) + { + if (&aTextSizeMF == pField) + { + m_bRubyUserValue = sal_False; + } + //set maximum line per page + { + sal_Int32 nMaxLines = static_cast< sal_Int32 >(m_aPageSize.Height() / + ( aTextSizeMF.Denormalize(aTextSizeMF.GetValue(FUNIT_TWIP)) + + aRubySizeMF.Denormalize(aRubySizeMF.GetValue(FUNIT_TWIP)))); + aLinesPerPageNF.SetMax(nMaxLines); + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + } + } + else + { + if (&aTextSizeMF == pField) + { + sal_Int32 nTextSize = static_cast< sal_Int32 >(aTextSizeMF.Denormalize(aTextSizeMF.GetValue(FUNIT_TWIP))); + aLinesPerPageNF.SetValue(m_aPageSize.Height() / nTextSize); + m_bRubyUserValue = sal_False; + SetLinesOrCharsRanges( aLinesRangeFT , aLinesPerPageNF.GetMax() ); + } + else if (&aCharWidthMF == pField) + { + sal_Int32 nTextWidth = static_cast< sal_Int32 >(aCharWidthMF.Denormalize(aCharWidthMF.GetValue(FUNIT_TWIP))); + sal_Int32 nMaxChar = 45 ; + if (nTextWidth) + nMaxChar = m_aPageSize.Width() / nTextWidth; + aCharsPerLineNF.SetValue( nMaxChar ); + SetLinesOrCharsRanges( aCharsRangeFT , aCharsPerLineNF.GetMax() ); + } + //rubySize is disabled + } + GridModifyHdl(0); + return 0; +} + +IMPL_LINK(SwTextGridPage, GridTypeHdl, RadioButton*, pButton) +{ + sal_Bool bEnable = &aNoGridRB != pButton; + sal_Int32 nIndex = 0; + while(aControls[nIndex]) + aControls[nIndex++]->Enable(bEnable); + //one special case + if(bEnable) + DisplayGridHdl(&aDisplayCB); + + bEnable = &aCharsGridRB == pButton; + aSnapToCharsCB.Enable(bEnable); + + bEnable = &aLinesGridRB == pButton; + if(bEnable && !m_bSquaredMode ) + { + aCharsPerLineFT.Enable(sal_False); + aCharsPerLineNF.Enable(sal_False); + aCharsRangeFT.Enable(sal_False); + aCharWidthFT.Enable(sal_False); + aCharWidthMF.Enable(sal_False); + } + + GridModifyHdl(0); + return 0; +} + +IMPL_LINK(SwTextGridPage, DisplayGridHdl, CheckBox*, EMPTYARG) +{ + aPrintCB.Enable(aDisplayCB.IsChecked()); + return 0; +} + +IMPL_LINK(SwTextGridPage, GridModifyHdl, void*, EMPTYARG) +{ + const SfxItemSet& rOldSet = GetItemSet(); + SfxItemSet aSet(rOldSet); + const SfxItemSet* pExSet = GetTabDialog()->GetExampleSet(); + if(pExSet) + aSet.Put(*pExSet); + PutGridItem(aSet); + aExampleWN.UpdateExample(aSet); + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/pggrid.hrc b/sw/source/ui/misc/pggrid.hrc new file mode 100644 index 000000000000..e736e5040dbb --- /dev/null +++ b/sw/source/ui/misc/pggrid.hrc @@ -0,0 +1,54 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#define FL_GRID_TYPE 1 +#define RB_NOGRID 2 +#define RB_LINESGRID 3 +#define RB_CHARSGRID 4 +#define WN_EXAMPLE 5 +#define FL_LAYOUT 6 +#define FT_LINESPERPAGE 7 +#define NF_LINESPERPAGE 8 +#define FT_LINESPERPAGEHINT 9 +#define FT_TEXTSIZE 10 +#define MF_TEXTSIZE 11 +#define FT_CHARSPERLINE 12 +#define NF_CHARSPERLINE 13 +#define FT_CHARSPERLINEHINT 14 +#define FT_RUBYSIZE 15 +#define MF_RUBYSIZE 16 +#define CB_RUBYBELOW 17 +#define FL_DISPLAY 18 +#define CB_DISPLAY 19 +#define CB_PRINT 20 +#define FT_COLOR 21 +#define LB_COLOR 22 +#define CB_SNAPTOCHARS 23 +#define FT_CHARWIDTH 24 +#define MF_CHARWIDTH 25 +#define FT_LINERANGE 26 +#define FT_CHARRANGE 27 diff --git a/sw/source/ui/misc/pggrid.src b/sw/source/ui/misc/pggrid.src new file mode 100644 index 000000000000..b226b4ce8bc8 --- /dev/null +++ b/sw/source/ui/misc/pggrid.src @@ -0,0 +1,256 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#include "globals.hrc" +#include "pggrid.hrc" +#include "helpid.h" +TabPage TP_TEXTGRID_PAGE +{ + HelpID = HID_TEXTGRID_PAGE; + Pos = MAP_APPFONT ( 0 , 0 ) ; + Size = MAP_APPFONT ( 260 , 185 ) ; + Hide = TRUE; + FixedLine FL_GRID_TYPE + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 164 , 8 ) ; + Text [ en-US ] = "Grid" ; + }; + RadioButton RB_NOGRID + { + HelpID = "sw:RadioButton:TP_TEXTGRID_PAGE:RB_NOGRID"; + Pos = MAP_APPFONT ( 12 , 14 ) ; + Size = MAP_APPFONT ( 158 , 10 ) ; + Text [ en-US ] = "No grid" ; + }; + RadioButton RB_LINESGRID + { + HelpID = "sw:RadioButton:TP_TEXTGRID_PAGE:RB_LINESGRID"; + Pos = MAP_APPFONT ( 12 , 27 ) ; + Size = MAP_APPFONT ( 158 , 10 ) ; + Text [ en-US ] = "Grid (lines only)" ; + }; + RadioButton RB_CHARSGRID + { + HelpID = "sw:RadioButton:TP_TEXTGRID_PAGE:RB_CHARSGRID"; + Pos = MAP_APPFONT ( 12 , 40 ) ; + Size = MAP_APPFONT ( 158 , 10 ) ; + Text [ en-US ] = "Grid (lines and characters)" ; + }; + CheckBox CB_SNAPTOCHARS + { + HelpID = "sw:CheckBox:TP_TEXTGRID_PAGE:CB_SNAPTOCHARS"; + Pos = MAP_APPFONT ( 14 , 53 ) ; + Size = MAP_APPFONT ( 158 , 10 ) ; + Text [ en-US ] = "~Snap to characters" ; + Text [ zh-CN ] = "文字对齐字符网格" ; + }; + Window WN_EXAMPLE + { + Pos = MAP_APPFONT ( 176 , 6 ) ; + Size = MAP_APPFONT ( 75 , 46 ) ; + }; + FixedLine FL_LAYOUT + { + Pos = MAP_APPFONT ( 6 , 69 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Grid layout" ; + }; + FixedText FT_LINESPERPAGE + { + Pos = MAP_APPFONT ( 12 , 82 ) ; + Size = MAP_APPFONT ( 59 , 8 ) ; + Text [ en-US ] = "Lines per page" ; + }; + NumericField NF_LINESPERPAGE + { + HelpID = "sw:NumericField:TP_TEXTGRID_PAGE:NF_LINESPERPAGE"; + Pos = MAP_APPFONT ( 74 , 80 ) ; + Size = MAP_APPFONT ( 25 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 154 ; + Value = 1 ; + First = 1 ; + Last = 154 ; + SpinSize = 1 ; + }; + FixedText FT_LINERANGE + { + Pos = MAP_APPFONT ( 103 , 82 ) ; + Size = MAP_APPFONT ( 25 , 8 ); + Text [ en-US ] = "( 1 - 48 )" ; + }; + FixedText FT_TEXTSIZE + { + Pos = MAP_APPFONT ( 133 , 82 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "Max. base text size" ; + }; + MetricField MF_TEXTSIZE + { + HelpID = "sw:MetricField:TP_TEXTGRID_PAGE:MF_TEXTSIZE"; + Pos = MAP_APPFONT ( 216 , 80 ) ; + Size = MAP_APPFONT ( 35 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 100 ; + Maximum = 5600 ; + DecimalDigits = 2 ; + Unit = FUNIT_POINT ; + First = 10 ; + Last = 5600 ; + SpinSize = 5 ; + }; + FixedText FT_CHARSPERLINE + { + Pos = MAP_APPFONT ( 12 , 98 ) ; + Size = MAP_APPFONT ( 59 , 8 ) ; + Text [ en-US ] = "Characters per line" ; + }; + NumericField NF_CHARSPERLINE + { + HelpID = "sw:NumericField:TP_TEXTGRID_PAGE:NF_CHARSPERLINE"; + Pos = MAP_APPFONT ( 74 , 96 ) ; + Size = MAP_APPFONT ( 25 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 233 ; + Value = 1 ; + First = 1 ; + Last = 233 ; + SpinSize = 1 ; + }; + FixedText FT_CHARWIDTH + { + Pos = MAP_APPFONT ( 133 , 98 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "Character ~width" ; + Text [ zh-CN ] = "字符跨度" ; + }; + MetricField MF_CHARWIDTH + { + HelpID = "sw:MetricField:TP_TEXTGRID_PAGE:MF_CHARWIDTH"; + Pos = MAP_APPFONT ( 216 , 96 ) ; + Size = MAP_APPFONT ( 35 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 100 ; + Maximum = 5600 ; + DecimalDigits = 2 ; + Unit = FUNIT_POINT; + First = 0 ; + Last = 5600 ; + SpinSize = 5 ; + }; + FixedText FT_CHARRANGE + { + Pos = MAP_APPFONT ( 103 , 96 ) ; + Size = MAP_APPFONT ( 25 , 8 ) ; + Text [ en-US ] = "( 1 - 45 )" ; + }; + FixedText FT_RUBYSIZE + { + Pos = MAP_APPFONT ( 133 , 98 ) ; + Size = MAP_APPFONT ( 80 , 8 ) ; + Text [ en-US ] = "Max. Ruby text size" ; + }; + MetricField MF_RUBYSIZE + { + HelpID = "sw:MetricField:TP_TEXTGRID_PAGE:MF_RUBYSIZE"; + Pos = MAP_APPFONT ( 216 , 96 ) ; + Size = MAP_APPFONT ( 35 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 100 ; + Maximum = 5600 ; + DecimalDigits = 2 ; + Unit = FUNIT_POINT; + First = 0 ; + Last = 5600 ; + SpinSize = 5 ; + }; + CheckBox CB_RUBYBELOW + { + HelpID = "sw:CheckBox:TP_TEXTGRID_PAGE:CB_RUBYBELOW"; + Pos = MAP_APPFONT ( 14 , 112 ) ; + Size = MAP_APPFONT ( 237 , 10 ) ; + Text [ en-US ] = "Ruby text below/left from base text" ; + }; + FixedLine FL_DISPLAY + { + Pos = MAP_APPFONT ( 6 , 128 ) ; + Size = MAP_APPFONT ( 248 , 8 ) ; + Text [ en-US ] = "Grid display" ; + }; + CheckBox CB_DISPLAY + { + HelpID = "sw:CheckBox:TP_TEXTGRID_PAGE:CB_DISPLAY"; + Pos = MAP_APPFONT ( 12 , 139 ) ; + Size = MAP_APPFONT ( 118 , 10 ) ; + Text [ en-US ] = "Display grid" ; + }; + CheckBox CB_PRINT + { + HelpID = "sw:CheckBox:TP_TEXTGRID_PAGE:CB_PRINT"; + Pos = MAP_APPFONT ( 18 , 154 ) ; + Size = MAP_APPFONT ( 112 , 10 ) ; + Text [ en-US ] = "Print grid" ; + }; + FixedText FT_COLOR + { + Pos = MAP_APPFONT ( 133 , 139 ) ; + Size = MAP_APPFONT ( 55 , 8 ) ; + Text [ en-US ] = "Grid color" ; + }; + ListBox LB_COLOR + { + HelpID = "sw:ListBox:TP_TEXTGRID_PAGE:LB_COLOR"; + Pos = MAP_APPFONT ( 191 , 137 ) ; + Size = MAP_APPFONT ( 60 , 50 ) ; + TabStop = TRUE; + Border = TRUE; + DropDown = TRUE; + }; +}; + diff --git a/sw/source/ui/misc/redlndlg.cxx b/sw/source/ui/misc/redlndlg.cxx new file mode 100644 index 000000000000..644ba83140c1 --- /dev/null +++ b/sw/source/ui/misc/redlndlg.cxx @@ -0,0 +1,1259 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" + + +#define _SVSTDARR_STRINGSSORTDTOR +#define _SVSTDARR_USHORTSSORT +#define _SVSTDARR_USHORTS + + +#include <redline.hxx> +#include <tools/datetime.hxx> +#include <vcl/msgbox.hxx> +#include <svl/svstdarr.hxx> +#include <svl/eitem.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/dispatch.hxx> +#include <svx/ctredlin.hxx> +#include <svx/postattr.hxx> +#include <swtypes.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <swmodule.hxx> +#ifndef _REDLNDLG_HXX +#define _REDLNACCEPTDLG +#include <redlndlg.hxx> +#endif +#include <swwait.hxx> +#include <uitool.hxx> + +#include <helpid.h> +#include <cmdid.h> +#include <misc.hrc> +#include <redlndlg.hrc> +#include <shells.hrc> + +// -> #111827# +#include <comcore.hrc> +#include <swundo.hxx> +#include <SwRewriter.hxx> +// <- #111827# + +#include <vector> +#include <svx/svxdlg.hxx> +#include <svx/dialogs.hrc> + +#include <unomid.h> + +#include <docsh.hxx> + +#include <IDocumentRedlineAccess.hxx> + +SFX_IMPL_MODELESSDIALOG( SwRedlineAcceptChild, FN_REDLINE_ACCEPT ) + +SV_IMPL_PTRARR(SwRedlineDataParentArr, SwRedlineDataParentPtr) +SV_IMPL_OP_PTRARR_SORT(SwRedlineDataParentSortArr, SwRedlineDataParentPtr) +SV_IMPL_PTRARR(SwRedlineDataChildArr, SwRedlineDataChildPtr) +SV_IMPL_PTRARR(SvLBoxEntryArr, SvLBoxEntryPtr) + +static sal_uInt16 nSortMode = 0xffff; +static sal_Bool bSortDir = sal_True; + +SwRedlineAcceptChild::SwRedlineAcceptChild( Window* _pParent, + sal_uInt16 nId, + SfxBindings* pBindings, + SfxChildWinInfo* pInfo ) : + SwChildWinWrapper( _pParent, nId ) +{ + pWindow = new SwModelessRedlineAcceptDlg( pBindings, this, _pParent); + + ((SwModelessRedlineAcceptDlg *)pWindow)->Initialize(pInfo); +} + +/*-------------------------------------------------------------------- + Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren + --------------------------------------------------------------------*/ +sal_Bool SwRedlineAcceptChild::ReInitDlg(SwDocShell *pDocSh) +{ + sal_Bool bRet; + + if ((bRet = SwChildWinWrapper::ReInitDlg(pDocSh)) == sal_True) // Sofort aktualisieren, Dok-Wechsel + ((SwModelessRedlineAcceptDlg*)GetWindow())->Activate(); + + return bRet; +} + +SwModelessRedlineAcceptDlg::SwModelessRedlineAcceptDlg( SfxBindings* _pBindings, + SwChildWinWrapper* pChild, + Window *_pParent) : + SfxModelessDialog(_pBindings, pChild, _pParent, SW_RES(DLG_REDLINE_ACCEPT)), + pChildWin (pChild) +{ + pImplDlg = new SwRedlineAcceptDlg(this); + + FreeResource(); +} + +void SwModelessRedlineAcceptDlg::Activate() +{ + SwView *pView = ::GetActiveView(); + + if (!pView) // Kann passieren, wenn man auf eine andere App umschaltet, wenn + return; // vorher eine Listbox im Dialog den Focus hatte (eigentlich THs Bug) + + SwDocShell *pDocSh = pView->GetDocShell(); + + if (pChildWin->GetOldDocShell() != pDocSh) + { // Dok-Wechsel + SwWait aWait( *pDocSh, sal_False ); + SwWrtShell* pSh = pView->GetWrtShellPtr(); + + pChildWin->SetOldDocShell(pDocSh); // Rekursion vermeiden (durch Modified-Hdl) + + sal_Bool bMod = pSh->IsModified(); + SfxBoolItem aShow(FN_REDLINE_SHOW, sal_True); + pSh->GetView().GetViewFrame()->GetDispatcher()->Execute( + FN_REDLINE_SHOW, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, &aShow, 0L); + if (!bMod) + pSh->ResetModified(); + pImplDlg->Init(); + + return; + } + + pImplDlg->Activate(); +} + +void SwModelessRedlineAcceptDlg::Initialize(SfxChildWinInfo *pInfo) +{ + String aStr; + if (pInfo != NULL) + pImplDlg->Initialize(pInfo->aExtraString); + + SfxModelessDialog::Initialize(pInfo); +} + +void SwModelessRedlineAcceptDlg::FillInfo(SfxChildWinInfo& rInfo) const +{ + SfxModelessDialog::FillInfo(rInfo); + pImplDlg->FillInfo(rInfo.aExtraString); +} + +void SwModelessRedlineAcceptDlg::Resize() +{ + pImplDlg->Resize(); + SfxModelessDialog::Resize(); +} + +SwModelessRedlineAcceptDlg::~SwModelessRedlineAcceptDlg() +{ + delete pImplDlg; +} + +SwRedlineAcceptDlg::SwRedlineAcceptDlg(Dialog *pParent, sal_Bool bAutoFmt) : + pParentDlg (pParent), + aTabPagesCTRL (pParent, SW_RES(CTRL_TABPAGES)), + aPopup (SW_RES(MN_REDLINE_POPUP)), + sInserted (SW_RES(STR_REDLINE_INSERTED)), + sDeleted (SW_RES(STR_REDLINE_DELETED)), + sFormated (SW_RES(STR_REDLINE_FORMATED)), + sTableChgd (SW_RES(STR_REDLINE_TABLECHG)), + sFmtCollSet (SW_RES(STR_REDLINE_FMTCOLLSET)), + sAutoFormat (SW_RES(STR_REDLINE_AUTOFMT)), + bOnlyFormatedRedlines( sal_False ), + bHasReadonlySel ( sal_False ), + bRedlnAutoFmt (bAutoFmt), + bInhibitActivate( false ) +{ + aTabPagesCTRL.SetHelpId(HID_REDLINE_CTRL); + pTPView = aTabPagesCTRL.GetViewPage(); + pTable = pTPView->GetTableControl(); + + pTPView->InsertWriterHeader(); + pTPView->SetAcceptClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptHdl)); + pTPView->SetAcceptAllClickHdl(LINK(this, SwRedlineAcceptDlg, AcceptAllHdl)); + pTPView->SetRejectClickHdl(LINK(this, SwRedlineAcceptDlg, RejectHdl)); + pTPView->SetRejectAllClickHdl(LINK(this, SwRedlineAcceptDlg, RejectAllHdl)); + pTPView->SetUndoClickHdl(LINK(this, SwRedlineAcceptDlg, UndoHdl)); + + aTabPagesCTRL.GetFilterPage()->SetReadyHdl(LINK(this, SwRedlineAcceptDlg, FilterChangedHdl)); + + ListBox *pActLB = aTabPagesCTRL.GetFilterPage()->GetLbAction(); + pActLB->InsertEntry(sInserted); + pActLB->InsertEntry(sDeleted); + pActLB->InsertEntry(sFormated); + pActLB->InsertEntry(sTableChgd); + + if (HasRedlineAutoFmt()) + { + pActLB->InsertEntry(sFmtCollSet); + pActLB->InsertEntry(sAutoFormat); + pTPView->ShowUndo(sal_True); + pTPView->DisableUndo(); // Noch gibts keine UNDO-Events + } + + pActLB->SelectEntryPos(0); + + pTable->SetStyle(pTable->GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL); + pTable->SetNodeDefaultImages(); + pTable->SetSelectionMode(MULTIPLE_SELECTION); + pTable->SetHighlightRange(1); + + static long aStaticTabs[]= + { + 4,10,70,120,170 + }; + + pTable->SetTabs(aStaticTabs); + + // Minimalgroesse setzen + Size aMinSz(aTabPagesCTRL.GetMinSizePixel()); + Point aPos(aTabPagesCTRL.GetPosPixel()); + + aMinSz.Width() += (aPos.X() * 2 - 1); + aMinSz.Height() += (aPos.Y() * 2 - 1); + pParentDlg->SetMinOutputSizePixel(aMinSz); + + if (pParentDlg->GetOutputSizePixel().Width() < aMinSz.Width()) + pParentDlg->SetOutputSizePixel(Size(aMinSz.Width(), pParentDlg->GetOutputSizePixel().Height())); + if (pParentDlg->GetOutputSizePixel().Height() < aMinSz.Height()) + pParentDlg->SetOutputSizePixel(Size(pParentDlg->GetOutputSizePixel().Width(), aMinSz.Height())); + + pTable->SortByCol(nSortMode, bSortDir); + + aOldSelectHdl = pTable->GetSelectHdl(); + aOldDeselectHdl = pTable->GetDeselectHdl(); + pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl)); + pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl)); + pTable->SetCommandHdl(LINK(this, SwRedlineAcceptDlg, CommandHdl)); + + // Flackern der Buttons vermeiden: + aDeselectTimer.SetTimeout(100); + aDeselectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl)); + + // Mehrfachselektion der selben Texte vermeiden: + aSelectTimer.SetTimeout(100); + aSelectTimer.SetTimeoutHdl(LINK(this, SwRedlineAcceptDlg, GotoHdl)); +} + +SwRedlineAcceptDlg::~SwRedlineAcceptDlg() +{ +} + +void SwRedlineAcceptDlg::Init(sal_uInt16 nStart) +{ + SwWait aWait( *::GetActiveView()->GetDocShell(), sal_False ); + pTable->SetUpdateMode(sal_False); + aUsedSeqNo.Remove((sal_uInt16)0, aUsedSeqNo.Count()); + + if (nStart) + RemoveParents(nStart, aRedlineParents.Count() - 1); + else + { + pTable->Clear(); + aRedlineChilds.DeleteAndDestroy(0, aRedlineChilds.Count()); + aRedlineParents.DeleteAndDestroy(nStart, aRedlineParents.Count() - nStart); + } + + // Parents einfuegen + InsertParents(nStart); + InitAuthors(); + + pTable->SetUpdateMode(sal_True); + // #i69618# this moves the list box to the right position, visually + SvLBoxEntry* pSelEntry = pTable->FirstSelected(); + if( pSelEntry ) + pTable->MakeVisible( pSelEntry, sal_True ); //#i70937#, force the scroll +} + +void SwRedlineAcceptDlg::InitAuthors() +{ + SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr(); + + SvxTPFilter *pFilterPage = aTabPagesCTRL.GetFilterPage(); + + String sAuthor; + SvStringsSortDtor aStrings; + String sOldAuthor(pFilterPage->GetSelectedAuthor()); + pFilterPage->ClearAuthors(); + + String sParent; + sal_uInt16 nCount = pSh->GetRedlineCount(); + + bOnlyFormatedRedlines = sal_True; + bHasReadonlySel = sal_False; + sal_Bool bIsNotFormated = sal_False; + sal_uInt16 i; + + // Autoren ermitteln + for ( i = 0; i < nCount; i++) + { + const SwRedline& rRedln = pSh->GetRedline(i); + + if( bOnlyFormatedRedlines && nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType() ) + bOnlyFormatedRedlines = sal_False; + + String *pAuthor = new String(rRedln.GetAuthorString()); + if (!aStrings.Insert(pAuthor)) + delete pAuthor; + + for (sal_uInt16 nStack = 1; nStack < rRedln.GetStackCount(); nStack++) + { + pAuthor = new String(rRedln.GetAuthorString(nStack)); + if (!aStrings.Insert(pAuthor)) + delete pAuthor; + } + } + + for (i = 0; i < aStrings.Count(); i++) + pFilterPage->InsertAuthor(*aStrings[i]); + + if (pFilterPage->SelectAuthor(sOldAuthor) == LISTBOX_ENTRY_NOTFOUND && aStrings.Count()) + pFilterPage->SelectAuthor(*aStrings[0]); + + sal_Bool bEnable = pTable->GetEntryCount() != 0 && !pSh->getIDocumentRedlineAccess()->GetRedlinePassword().getLength(); + sal_Bool bSel = pTable->FirstSelected() != 0; + + SvLBoxEntry* pSelEntry = pTable->FirstSelected(); + while (pSelEntry) + { + sal_uInt16 nPos = GetRedlinePos(*pSelEntry); + const SwRedline& rRedln = pSh->GetRedline( nPos ); + + bIsNotFormated |= nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType(); + pSelEntry = pTable->NextSelected(pSelEntry); + } + + pTPView->EnableAccept( bEnable && bSel ); + pTPView->EnableReject( bEnable && bIsNotFormated && bSel ); + pTPView->EnableAcceptAll( bEnable && !bHasReadonlySel ); + pTPView->EnableRejectAll( bEnable && !bHasReadonlySel && + !bOnlyFormatedRedlines ); +} + +String SwRedlineAcceptDlg::GetRedlineText( const SwRedline& rRedln, + DateTime &rDateTime, sal_uInt16 nStack) +{ + String sEntry(GetActionText(rRedln, nStack)); + sEntry += '\t'; + sEntry += rRedln.GetAuthorString(nStack); + sEntry += '\t'; + + const DateTime &rDT = rRedln.GetTimeStamp(nStack); + rDateTime = rDT; + + sEntry += GetAppLangDateTimeString( rDT ); + sEntry += '\t'; + + sEntry += rRedln.GetComment(nStack); + + return sEntry; +} + +const String &SwRedlineAcceptDlg::GetActionText(const SwRedline& rRedln, sal_uInt16 nStack) +{ + switch( rRedln.GetType(nStack) ) + { + case nsRedlineType_t::REDLINE_INSERT: return sInserted; + case nsRedlineType_t::REDLINE_DELETE: return sDeleted; + case nsRedlineType_t::REDLINE_FORMAT: return sFormated; + case nsRedlineType_t::REDLINE_TABLE: return sTableChgd; + case nsRedlineType_t::REDLINE_FMTCOLL: return sFmtCollSet; + default:;//prevent warning + } + + return aEmptyStr; +} + +void SwRedlineAcceptDlg::Resize() +{ + Size aSz(pParentDlg->GetOutputSizePixel()); + + Point aPos(aTabPagesCTRL.GetPosPixel()); + + aSz.Width() -= (aPos.X() * 2 - 1); + aSz.Height() -= (aPos.Y() * 2 - 1); + + aTabPagesCTRL.SetOutputSizePixel(aSz); +} + +/*-------------------------------------------------------------------- + Beschreibung: Nach Aktivierung neu initialisieren + --------------------------------------------------------------------*/ +void SwRedlineAcceptDlg::Activate() +{ + // prevent update if flag is set (#102547#) + if( bInhibitActivate ) + return; + + SwView *pView = ::GetActiveView(); + SwWait aWait( *pView->GetDocShell(), sal_False ); + + aUsedSeqNo.Remove((sal_uInt16)0, aUsedSeqNo.Count()); + + if (!pView) // Kann passieren, wenn man auf eine andere App umschaltet, wenn + return; // vorher eine Listbox im Dialog den Focus hatte (eigentlich THs Bug) + + // Hat sich was geaendert? + SwWrtShell* pSh = pView->GetWrtShellPtr(); + sal_uInt16 nCount = pSh->GetRedlineCount(); + + // Anzahl und Pointer ueberpruefen + SwRedlineDataParent *pParent = 0; + sal_uInt16 i; + + for ( i = 0; i < nCount; i++) + { + const SwRedline& rRedln = pSh->GetRedline(i); + + if (i >= aRedlineParents.Count()) + { + // Neue Eintraege wurden angehaengt + Init(i); + return; + } + + pParent = aRedlineParents[i]; + if (&rRedln.GetRedlineData() != pParent->pData) + { + // Redline-Parents wurden eingefuegt, geaendert oder geloescht + if ((i = CalcDiff(i, sal_False)) == USHRT_MAX) + return; + continue; + } + + const SwRedlineData *pRedlineData = rRedln.GetRedlineData().Next(); + const SwRedlineDataChild *pBackupData = pParent->pNext; + + if (!pRedlineData && pBackupData) + { + // Redline-Childs wurden geloescht + if ((i = CalcDiff(i, sal_True)) == USHRT_MAX) + return; + continue; + } + else + { + while (pRedlineData) + { + if (pRedlineData != pBackupData->pChild) + { + // Redline-Childs wurden eingefuegt, geaendert oder geloescht + if ((i = CalcDiff(i, sal_True)) == USHRT_MAX) + return; + continue; + } + if (pBackupData) + pBackupData = pBackupData->pNext; + pRedlineData = pRedlineData->Next(); + } + } + } + + if (nCount != aRedlineParents.Count()) + { + // Redlines wurden am Ende geloescht + Init(nCount); + return; + } + + // Kommentar ueberpruefen + for (i = 0; i < nCount; i++) + { + const SwRedline& rRedln = pSh->GetRedline(i); + pParent = aRedlineParents[i]; + + if(!rRedln.GetComment().Equals(pParent->sComment)) + { + if (pParent->pTLBParent) + { + // Nur Kommentar aktualisieren + String sComment(rRedln.GetComment()); + sComment.SearchAndReplaceAll((sal_Unicode)_LF,(sal_Unicode)' '); + pTable->SetEntryText(sComment, pParent->pTLBParent, 3); + } + pParent->sComment = rRedln.GetComment(); + } + } + + InitAuthors(); +} + +sal_uInt16 SwRedlineAcceptDlg::CalcDiff(sal_uInt16 nStart, sal_Bool bChild) +{ + if (!nStart) + { + Init(); + return USHRT_MAX; + } + + pTable->SetUpdateMode(sal_False); + SwView *pView = ::GetActiveView(); + SwWrtShell* pSh = pView->GetWrtShellPtr(); + sal_uInt16 nAutoFmt = HasRedlineAutoFmt() ? nsRedlineType_t::REDLINE_FORM_AUTOFMT : 0; + SwRedlineDataParent *pParent = aRedlineParents[nStart]; + const SwRedline& rRedln = pSh->GetRedline(nStart); + + if (bChild) // Sollte eigentlich nie vorkommen, aber sicher ist sicher... + { + // Alle Childs des Eintrags wegwerfen und neu initialisieren + SwRedlineDataChildPtr pBackupData = (SwRedlineDataChildPtr)pParent->pNext; + SwRedlineDataChildPtr pNext; + + while (pBackupData) + { + pNext = (SwRedlineDataChildPtr)pBackupData->pNext; + if (pBackupData->pTLBChild) + pTable->RemoveEntry(pBackupData->pTLBChild); + + aRedlineChilds.DeleteAndDestroy(aRedlineChilds.GetPos(pBackupData), 1); + pBackupData = pNext; + } + pParent->pNext = 0; + + // Neue Childs einfuegen + InsertChilds(pParent, rRedln, nAutoFmt); + + pTable->SetUpdateMode(sal_True); + return nStart; + } + + // Wurden Eintraege geloescht? + const SwRedlineData *pRedlineData = &rRedln.GetRedlineData(); + sal_uInt16 i; + for ( i = nStart + 1; i < aRedlineParents.Count(); i++) + { + if (aRedlineParents[i]->pData == pRedlineData) + { + // Eintraege von nStart bis i-1 entfernen + RemoveParents(nStart, i - 1); + pTable->SetUpdateMode(sal_True); + return nStart - 1; + } + } + + // Wurden Eintraege eingefuegt? + sal_uInt16 nCount = pSh->GetRedlineCount(); + pRedlineData = aRedlineParents[nStart]->pData; + + for (i = nStart + 1; i < nCount; i++) + { + if (&pSh->GetRedline(i).GetRedlineData() == pRedlineData) + { + // Eintraege von nStart bis i-1 einfuegen + InsertParents(nStart, i - 1); + pTable->SetUpdateMode(sal_True); + return nStart - 1; + } + } + + pTable->SetUpdateMode(sal_True); + Init(nStart); // Alle Eintraege bis zum Ende abgleichen + return USHRT_MAX; +} + +void SwRedlineAcceptDlg::InsertChilds(SwRedlineDataParent *pParent, const SwRedline& rRedln, const sal_uInt16 nAutoFmt) +{ + String sChild; + SwRedlineDataChild *pLastRedlineChild = 0; + const SwRedlineData *pRedlineData = &rRedln.GetRedlineData(); + sal_Bool bAutoFmt = (rRedln.GetRealType() & nAutoFmt) != 0; + + const String *pAction = &GetActionText(rRedln); + sal_Bool bValidParent = !sFilterAction.Len() || sFilterAction == *pAction; + bValidParent = bValidParent && pTable->IsValidEntry(&rRedln.GetAuthorString(), &rRedln.GetTimeStamp(), &rRedln.GetComment()); + if (nAutoFmt) + { + sal_uInt16 nPos; + + if (pParent->pData->GetSeqNo() && !aUsedSeqNo.Insert(pParent, nPos)) // Gibts schon + { + if (pParent->pTLBParent) + { + pTable->SetEntryText(sAutoFormat, aUsedSeqNo[nPos]->pTLBParent, 0); + pTable->RemoveEntry(pParent->pTLBParent); + pParent->pTLBParent = 0; + } + return; + } + bValidParent = bValidParent && bAutoFmt; + } + sal_Bool bValidTree = bValidParent; + + for (sal_uInt16 nStack = 1; nStack < rRedln.GetStackCount(); nStack++) + { + pRedlineData = pRedlineData->Next(); + + SwRedlineDataChildPtr pRedlineChild = new SwRedlineDataChild; + pRedlineChild->pChild = pRedlineData; + aRedlineChilds.Insert(pRedlineChild, aRedlineChilds.Count()); + + if ( pLastRedlineChild ) + pLastRedlineChild->pNext = pRedlineChild; + else + pParent->pNext = pRedlineChild; + + pAction = &GetActionText(rRedln, nStack); + sal_Bool bValidChild = !sFilterAction.Len() || sFilterAction == *pAction; + bValidChild = bValidChild && pTable->IsValidEntry(&rRedln.GetAuthorString(nStack), &rRedln.GetTimeStamp(nStack), &rRedln.GetComment()); + if (nAutoFmt) + bValidChild = bValidChild && bAutoFmt; + bValidTree |= bValidChild; + + if (bValidChild) + { + RedlinData *pData = new RedlinData; + pData->pData = pRedlineChild; + pData->bDisabled = sal_True; + sChild = GetRedlineText(rRedln, pData->aDateTime, nStack); + + SvLBoxEntry* pChild = pTable->InsertEntry(sChild, pData, pParent->pTLBParent); + + pRedlineChild->pTLBChild = pChild; + if (!bValidParent) + pTable->Expand(pParent->pTLBParent); + } + else + pRedlineChild->pTLBChild = 0; + + pLastRedlineChild = pRedlineChild; + } + + if (pLastRedlineChild) + pLastRedlineChild->pNext = 0; + + if (!bValidTree && pParent->pTLBParent) + { + pTable->RemoveEntry(pParent->pTLBParent); + pParent->pTLBParent = 0; + if (nAutoFmt) + aUsedSeqNo.Remove(pParent); + } +} + +void SwRedlineAcceptDlg::RemoveParents(sal_uInt16 nStart, sal_uInt16 nEnd) +{ + SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr(); + sal_uInt16 nCount = pSh->GetRedlineCount(); + + SvLBoxEntryArr aLBoxArr; + + // Wegen Bug der TLB, die bei Remove den SelectHandler IMMER ruft: + pTable->SetSelectHdl(aOldSelectHdl); + pTable->SetDeselectHdl(aOldDeselectHdl); + sal_Bool bChildsRemoved = sal_False; + pTable->SelectAll(sal_False); + + // Hinter dem letzten Eintrag Cursor setzen, da sonst Performance-Problem in TLB. + // TLB wuerde sonst bei jedem Remove den Cursor erneut umsetzen (teuer) + sal_uInt16 nPos = Min((sal_uInt16)nCount, (sal_uInt16)aRedlineParents.Count()); + SvLBoxEntry *pCurEntry = NULL; + while( ( pCurEntry == NULL ) && ( nPos > 0 ) ) + { + --nPos; + pCurEntry = aRedlineParents[nPos]->pTLBParent; + } + + if (pCurEntry) + pTable->SetCurEntry(pCurEntry); + + SvLBoxTreeList* pModel = pTable->GetModel(); + + for (sal_uInt16 i = nStart; i <= nEnd; i++) + { + if (!bChildsRemoved && aRedlineParents[i]->pNext) + { + SwRedlineDataChildPtr pChildPtr = (SwRedlineDataChildPtr)aRedlineParents[i]->pNext; + sal_uInt16 nChildPos = aRedlineChilds.GetPos(pChildPtr); + + if (nChildPos != USHRT_MAX) + { + sal_uInt16 nChilds = 0; + + while (pChildPtr) + { + pChildPtr = (SwRedlineDataChildPtr)pChildPtr->pNext; + nChilds++; + } + + aRedlineChilds.DeleteAndDestroy(nChildPos, nChilds); + bChildsRemoved = sal_True; + } + } + SvLBoxEntry *pEntry = aRedlineParents[i]->pTLBParent; + if (pEntry) + { + long nIdx = aLBoxArr.Count() - 1L; + sal_uLong nAbsPos = pModel->GetAbsPos(pEntry); + while (nIdx >= 0 && + pModel->GetAbsPos(aLBoxArr[ static_cast< sal_uInt16 >(nIdx) ]) > nAbsPos) + nIdx--; + aLBoxArr.Insert( pEntry, static_cast< sal_uInt16 >(++nIdx) ); + } + } + + // TLB von hinten abraeumen + long nIdx = (long)aLBoxArr.Count() - 1L; + while (nIdx >= 0) + pTable->RemoveEntry(aLBoxArr[ static_cast< sal_uInt16 >(nIdx--) ]); + + pTable->SetSelectHdl(LINK(this, SwRedlineAcceptDlg, SelectHdl)); + pTable->SetDeselectHdl(LINK(this, SwRedlineAcceptDlg, DeselectHdl)); + // Durch Remove wurde leider wieder dauernd von der TLB selektiert... + pTable->SelectAll(sal_False); + + aRedlineParents.DeleteAndDestroy( nStart, nEnd - nStart + 1); +} + +void SwRedlineAcceptDlg::InsertParents(sal_uInt16 nStart, sal_uInt16 nEnd) +{ + SwView *pView = ::GetActiveView(); + SwWrtShell* pSh = pView->GetWrtShellPtr(); + sal_uInt16 nAutoFmt = HasRedlineAutoFmt() ? nsRedlineType_t::REDLINE_FORM_AUTOFMT : 0; + + String sParent; + sal_uInt16 nCount = pSh->GetRedlineCount(); + nEnd = Min((sal_uInt16)nEnd, (sal_uInt16)(nCount - 1)); // Handelt auch nEnd=USHRT_MAX (bis zum Ende) ab + + if (nEnd == USHRT_MAX) + return; // Keine Redlines im Dokument + + RedlinData *pData; + SvLBoxEntry *pParent; + SwRedlineDataParentPtr pRedlineParent; + const SwRedline* pCurrRedline; + if( !nStart && !pTable->FirstSelected() ) + { + pCurrRedline = pSh->GetCurrRedline(); + if( !pCurrRedline ) + { + pSh->SwCrsrShell::Push(); + if( 0 == (pCurrRedline = pSh->SelNextRedline())) + pCurrRedline = pSh->SelPrevRedline(); + pSh->SwCrsrShell::Pop( sal_False ); + } + } + else + pCurrRedline = 0; + + for (sal_uInt16 i = nStart; i <= nEnd; i++) + { + const SwRedline& rRedln = pSh->GetRedline(i); + const SwRedlineData *pRedlineData = &rRedln.GetRedlineData(); + + pRedlineParent = new SwRedlineDataParent; + pRedlineParent->pData = pRedlineData; + pRedlineParent->pNext = 0; + String sComment(rRedln.GetComment()); + sComment.SearchAndReplaceAll((sal_Unicode)_LF,(sal_Unicode)' '); + pRedlineParent->sComment = sComment; + aRedlineParents.Insert(pRedlineParent, i); + + pData = new RedlinData; + pData->pData = pRedlineParent; + pData->bDisabled = sal_False; + + sParent = GetRedlineText(rRedln, pData->aDateTime); + pParent = pTable->InsertEntry(sParent, pData, 0, i); + if( pCurrRedline == &rRedln ) + { + pTable->SetCurEntry( pParent ); + pTable->Select( pParent ); + pTable->MakeVisible( pParent ); + } + + pRedlineParent->pTLBParent = pParent; + + InsertChilds(pRedlineParent, rRedln, nAutoFmt); + } +} + +void SwRedlineAcceptDlg::CallAcceptReject( sal_Bool bSelect, sal_Bool bAccept ) +{ + SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr(); + SvLBoxEntry* pEntry = bSelect ? pTable->FirstSelected() : pTable->First(); + sal_uLong nPos = LONG_MAX; + + typedef std::vector<SvLBoxEntry*> ListBoxEntries_t; + ListBoxEntries_t aRedlines; + + // don't activate + OSL_ENSURE( bInhibitActivate == false, + "recursive call of CallAcceptReject?"); + bInhibitActivate = true; + + // collect redlines-to-be-accepted/rejected in aRedlines vector + while( pEntry ) + { + if( !pTable->GetParent( pEntry ) ) + { + if( bSelect && LONG_MAX == nPos ) + nPos = pTable->GetModel()->GetAbsPos( pEntry ); + + RedlinData *pData = (RedlinData *)pEntry->GetUserData(); + + if( !pData->bDisabled ) + aRedlines.push_back( pEntry ); + } + + pEntry = bSelect ? pTable->NextSelected(pEntry) : pTable->Next(pEntry); + } + + sal_Bool (SwEditShell:: *FnAccRej)( sal_uInt16 ) = &SwEditShell::AcceptRedline; + if( !bAccept ) + FnAccRej = &SwEditShell::RejectRedline; + + SwWait aWait( *pSh->GetView().GetDocShell(), sal_True ); + pSh->StartAction(); + + // #111827# + if (aRedlines.size() > 1) + { + String aTmpStr; + { + SwRewriter aRewriter; + aRewriter.AddRule(UNDO_ARG1, + String::CreateFromInt32(aRedlines.size())); + aTmpStr = aRewriter.Apply(String(SW_RES(STR_N_REDLINES))); + } + + SwRewriter aRewriter; + aRewriter.AddRule(UNDO_ARG1, aTmpStr); + + pSh->StartUndo(bAccept? UNDO_ACCEPT_REDLINE : UNDO_REJECT_REDLINE, + &aRewriter); + } + + // accept/reject the the redlines in aRedlines. The absolute + // position may change during the process (e.g. when two redlines + // are merged in result of another one being deleted), so the + // position must be resolved late and checked before using it. + // (cf #102547#) + ListBoxEntries_t::iterator aEnd = aRedlines.end(); + for( ListBoxEntries_t::iterator aIter = aRedlines.begin(); + aIter != aEnd; + ++aIter ) + { + sal_uInt16 nPosition = GetRedlinePos( **aIter ); + if( nPosition != USHRT_MAX ) + (pSh->*FnAccRej)( nPosition ); + } + + // #111827# + if (aRedlines.size() > 1) + { + pSh->EndUndo(); + } + + pSh->EndAction(); + + bInhibitActivate = false; + Activate(); + + if( ULONG_MAX != nPos && pTable->GetEntryCount() ) + { + if( nPos >= pTable->GetEntryCount() ) + nPos = pTable->GetEntryCount() - 1; + pEntry = pTable->GetEntry( nPos ); + if( !pEntry && nPos-- ) + pEntry = pTable->GetEntry( nPos ); + if( pEntry ) + { + pTable->Select( pEntry ); + pTable->MakeVisible( pEntry ); + pTable->SetCurEntry(pEntry); + } + } + pTPView->EnableUndo(); +} + +sal_uInt16 SwRedlineAcceptDlg::GetRedlinePos( const SvLBoxEntry& rEntry ) const +{ + SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr(); + return pSh->FindRedlineOfData( *((SwRedlineDataParent*)((RedlinData *) + rEntry.GetUserData())->pData)->pData ); +} + +IMPL_LINK( SwRedlineAcceptDlg, AcceptHdl, void*, EMPTYARG) +{ + CallAcceptReject( sal_True, sal_True ); + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, AcceptAllHdl, void*, EMPTYARG ) +{ + CallAcceptReject( sal_False, sal_True ); + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, RejectHdl, void*, EMPTYARG ) +{ + CallAcceptReject( sal_True, sal_False ); + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, RejectAllHdl, void*, EMPTYARG ) +{ + CallAcceptReject( sal_False, sal_False ); + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, UndoHdl, void*, EMPTYARG ) +{ + SwView * pView = ::GetActiveView(); + pView->GetViewFrame()->GetDispatcher()-> + Execute(SID_UNDO, SFX_CALLMODE_SYNCHRON); + pTPView->EnableUndo(pView->GetSlotState(SID_UNDO) != 0); + + Activate(); + + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, FilterChangedHdl, void*, EMPTYARG ) +{ + SvxTPFilter *pFilterTP = aTabPagesCTRL.GetFilterPage(); + + if (pFilterTP->IsAction()) + sFilterAction = pFilterTP->GetLbAction()->GetSelectEntry(); + else + sFilterAction = aEmptyStr; + + Init(); + + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, DeselectHdl, void*, EMPTYARG ) +{ + // Flackern der Buttons vermeiden: + aDeselectTimer.Start(); + + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, SelectHdl, void*, EMPTYARG ) +{ + aDeselectTimer.Stop(); + aSelectTimer.Start(); + + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, GotoHdl, void*, EMPTYARG ) +{ + SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr(); + aSelectTimer.Stop(); + + sal_Bool bIsNotFormated = sal_False; + sal_Bool bSel = sal_False; + + //#98883# don't select redlines while the dialog is not focussed + //#107938# But not only ask pTable if it has the focus. To move + // the selection to the selected redline any child of pParentDlg + // may the focus. + SvLBoxEntry* pSelEntry = 0; + + if (pParentDlg->HasChildPathFocus()) + pSelEntry = pTable->FirstSelected(); + + if( pSelEntry ) + { + SvLBoxEntry* pActEntry = pSelEntry; + pSh->StartAction(); + pSh->EnterStdMode(); + pSh->SetCareWin(pParentDlg); + + while (pSelEntry) + { + if (pTable->GetParent(pSelEntry)) + { + pActEntry = pTable->GetParent(pSelEntry); + + if (pTable->IsSelected(pActEntry)) + { + pSelEntry = pActEntry = pTable->NextSelected(pSelEntry); + continue; // Nicht zweimal selektieren + } + } + else + bSel = sal_True; + + // #98864# find the selected redline (ignore, if the redline is already gone) + sal_uInt16 nPos = GetRedlinePos(*pActEntry); + if( nPos != USHRT_MAX ) + { + + const SwRedline& rRedln = pSh->GetRedline( nPos ); + bIsNotFormated |= nsRedlineType_t::REDLINE_FORMAT != rRedln.GetType(); + + if (pSh->GotoRedline(nPos, sal_True)) + { + pSh->SetInSelect(); + pSh->EnterAddMode(); + } + } + + pSelEntry = pActEntry = pTable->NextSelected(pSelEntry); + } + + pSh->LeaveAddMode(); + pSh->EndAction(); + pSh->SetCareWin(NULL); + } + sal_Bool bEnable = !pSh->getIDocumentRedlineAccess()->GetRedlinePassword().getLength(); + pTPView->EnableAccept( bEnable && bSel /*&& !bReadonlySel*/ ); + pTPView->EnableReject( bEnable && bSel && bIsNotFormated /*&& !bReadonlySel*/ ); + pTPView->EnableRejectAll( bEnable && !bOnlyFormatedRedlines && !bHasReadonlySel ); + + return 0; +} + +IMPL_LINK( SwRedlineAcceptDlg, CommandHdl, void*, EMPTYARG ) +{ + const CommandEvent aCEvt(pTable->GetCommandEvent()); + + switch ( aCEvt.GetCommand() ) + { + case COMMAND_CONTEXTMENU: + { + SwWrtShell* pSh = ::GetActiveView()->GetWrtShellPtr(); + SvLBoxEntry* pEntry = pTable->FirstSelected(); + const SwRedline *pRed = 0; + + if (pEntry) + { + SvLBoxEntry* pTopEntry = pEntry; + + if (pTable->GetParent(pEntry)) + pTopEntry = pTable->GetParent(pEntry); + + sal_uInt16 nPos = GetRedlinePos(*pTopEntry); + + // Bei geschuetzten Bereichen kommentieren disablen + if ((pRed = pSh->GotoRedline(nPos, sal_True)) != 0) + { + if( pSh->IsCrsrPtAtEnd() ) + pSh->SwapPam(); + pSh->SetInSelect(); + } + } + + aPopup.EnableItem( MN_EDIT_COMMENT, pEntry && pRed && + !pTable->GetParent(pEntry) && + !pTable->NextSelected(pEntry) +//JP 27.9.2001: make no sense if we handle readonly sections +// && pRed->HasReadonlySel() + ); + + aPopup.EnableItem( MN_SUB_SORT, pTable->First() != 0 ); + sal_uInt16 nColumn = pTable->GetSortedCol(); + if (nColumn == 0xffff) + nColumn = 4; + + PopupMenu *pSubMenu = aPopup.GetPopupMenu(MN_SUB_SORT); + if (pSubMenu) + { + for (sal_uInt16 i = MN_SORT_ACTION; i < MN_SORT_ACTION + 5; i++) + pSubMenu->CheckItem(i, sal_False); + + pSubMenu->CheckItem(nColumn + MN_SORT_ACTION); + } + + sal_uInt16 nRet = aPopup.Execute(pTable, aCEvt.GetMousePosPixel()); + + switch( nRet ) + { + case MN_EDIT_COMMENT: + { + String sComment; + if (pEntry) + { + if (pTable->GetParent(pEntry)) + pEntry = pTable->GetParent(pEntry); + + sal_uInt16 nPos = GetRedlinePos(*pEntry); + const SwRedline &rRedline = pSh->GetRedline(nPos); + + + /* enable again once we have redline comments in the margin + sComment = rRedline.GetComment(); + if ( !sComment.Len() ) + GetActiveView()->GetDocShell()->Broadcast(SwRedlineHint(&rRedline,SWREDLINE_INSERTED)); + const_cast<SwRedline&>(rRedline).Broadcast(SwRedlineHint(&rRedline,SWREDLINE_FOCUS)); + */ + + sComment = rRedline.GetComment(); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + OSL_ENSURE(pFact, "Dialogdiet fail!"); + ::DialogGetRanges fnGetRange = pFact->GetDialogGetRangesFunc( RID_SVXDLG_POSTIT ); + OSL_ENSURE(fnGetRange, "Dialogdiet fail! GetRanges()"); + SfxItemSet aSet( pSh->GetAttrPool(), fnGetRange() ); + + aSet.Put(SvxPostItTextItem(sComment.ConvertLineEnd(), SID_ATTR_POSTIT_TEXT)); + aSet.Put(SvxPostItAuthorItem(rRedline.GetAuthorString(), SID_ATTR_POSTIT_AUTHOR)); + + aSet.Put(SvxPostItDateItem( GetAppLangDateTimeString( + rRedline.GetRedlineData().GetTimeStamp() ), + SID_ATTR_POSTIT_DATE )); + + AbstractSvxPostItDialog* pDlg = pFact->CreateSvxPostItDialog( pParentDlg, aSet, sal_False ); + OSL_ENSURE(pDlg, "Dialogdiet fail!"); + + pDlg->HideAuthor(); + + sal_uInt16 nResId = 0; + switch( rRedline.GetType() ) + { + case nsRedlineType_t::REDLINE_INSERT: + nResId = STR_REDLINE_INSERTED; + break; + case nsRedlineType_t::REDLINE_DELETE: + nResId = STR_REDLINE_DELETED; + break; + case nsRedlineType_t::REDLINE_FORMAT: + nResId = STR_REDLINE_FORMATED; + break; + case nsRedlineType_t::REDLINE_TABLE: + nResId = STR_REDLINE_TABLECHG; + break; + default:;//prevent warning + } + String sTitle(SW_RES(STR_REDLINE_COMMENT)); + if( nResId ) + sTitle += SW_RESSTR( nResId ); + pDlg->SetText(sTitle); + + pSh->SetCareWin(pDlg->GetWindow()); + + if ( pDlg->Execute() == RET_OK ) + { + const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); + String sMsg(((const SvxPostItTextItem&)pOutSet->Get(SID_ATTR_POSTIT_TEXT)).GetValue()); + + // Kommentar einfuegen bzw aendern + pSh->SetRedlineComment(sMsg); + sMsg.SearchAndReplaceAll((sal_Unicode)_LF,(sal_Unicode)' '); + pTable->SetEntryText(sMsg, pEntry, 3); + } + + delete pDlg; + pSh->SetCareWin(NULL); + } + + } + break; + + case MN_SORT_ACTION: + case MN_SORT_AUTHOR: + case MN_SORT_DATE: + case MN_SORT_COMMENT: + case MN_SORT_POSITION: + { + bSortDir = sal_True; + if (nRet - MN_SORT_ACTION == 4 && pTable->GetSortedCol() == 0xffff) + break; // Haben wir schon + + nSortMode = nRet - MN_SORT_ACTION; + if (nSortMode == 4) + nSortMode = 0xffff; // unsortiert bzw sortiert nach Position + + if (pTable->GetSortedCol() == nSortMode) + bSortDir = !pTable->GetSortDirection(); + + SwWait aWait( *::GetActiveView()->GetDocShell(), sal_False ); + pTable->SortByCol(nSortMode, bSortDir); + if (nSortMode == 0xffff) + Init(); // Alles neu fuellen + } + break; + } + } + break; + } + + return 0; +} + +void SwRedlineAcceptDlg::Initialize(const String& rExtraData) +{ + if (rExtraData.Len()) + { + sal_uInt16 nPos = rExtraData.Search(C2S("AcceptChgDat:")); + + // Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn + // er nicht vorhanden ist, liegt eine "altere Version vor + if (nPos != STRING_NOTFOUND) + { + sal_uInt16 n1 = rExtraData.Search('(', nPos); + if (n1 != STRING_NOTFOUND) + { + sal_uInt16 n2 = rExtraData.Search(')', n1); + if (n2 != STRING_NOTFOUND) + { + // Alignment-String herausschneiden + String aStr = rExtraData.Copy(nPos, n2 - nPos + 1); + aStr.Erase(0, n1 - nPos + 1); + + if (aStr.Len()) + { + sal_uInt16 nCount = static_cast< sal_uInt16 >(aStr.ToInt32()); + + for (sal_uInt16 i = 0; i < nCount; i++) + { + sal_uInt16 n3 = aStr.Search(';'); + aStr.Erase(0, n3 + 1); + pTable->SetTab(i, aStr.ToInt32(), MAP_PIXEL); + } + } + } + } + } + } +} + +void SwRedlineAcceptDlg::FillInfo(String &rExtraData) const +{ + rExtraData.AppendAscii("AcceptChgDat:("); + + sal_uInt16 nCount = pTable->TabCount(); + + rExtraData += String::CreateFromInt32(nCount); + rExtraData += ';'; + for(sal_uInt16 i = 0; i < nCount; i++) + { + rExtraData += String::CreateFromInt32( pTable->GetTab(i) ); + rExtraData += ';'; + } + rExtraData += ')'; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/redlndlg.hrc b/sw/source/ui/misc/redlndlg.hrc new file mode 100644 index 000000000000..838b79f37d48 --- /dev/null +++ b/sw/source/ui/misc/redlndlg.hrc @@ -0,0 +1,38 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#define CTRL_TABPAGES 1 + +#define MN_EDIT_COMMENT 1 +#define MN_SUB_SORT 2 +#define MN_SORT_ACTION 3 +#define MN_SORT_AUTHOR 4 +#define MN_SORT_DATE 5 +#define MN_SORT_COMMENT 6 +#define MN_SORT_POSITION 7 + +#define XBORDER 3 +#define YBORDER 3 diff --git a/sw/source/ui/misc/redlndlg.src b/sw/source/ui/misc/redlndlg.src new file mode 100644 index 000000000000..861b1b4c3fe5 --- /dev/null +++ b/sw/source/ui/misc/redlndlg.src @@ -0,0 +1,147 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +/* StarView ressource file */ + +#include "redlndlg.hrc" +#include "misc.hrc" +#include "helpid.h" + +#define WIDTH 297 +#define HEIGHT 169 + +#define REDLNDLG \ + OutputSize = TRUE ; \ + SVLook = TRUE ; \ + Size = MAP_APPFONT ( WIDTH , HEIGHT ) ; \ + Moveable = TRUE ; \ + Closeable = TRUE ; \ + Sizeable = TRUE ; \ + Hide = TRUE ; \ + Control CTRL_TABPAGES\ + {\ + Pos = MAP_APPFONT ( XBORDER , YBORDER ) ; \ + Size = MAP_APPFONT ( WIDTH - XBORDER * 2 , HEIGHT - YBORDER * 2 ) ; \ + HelpID = HID_REDLINE_CTRL ; \ + TabStop = TRUE ; \ + }; + +ModelessDialog DLG_REDLINE_ACCEPT +{ + HelpID = HID_REDLINE_ACCEPT ; + Text [ en-US ] = "Accept or Reject Changes" ; + REDLNDLG +}; + +ModalDialog DLG_MOD_REDLINE_ACCEPT +{ + HelpID = HID_REDLINE_AUTOFMT_ACCEPT ; + REDLNDLG + Text [ en-US ] = "Accept or Reject AutoCorrect Changes"; +}; + +Menu MN_REDLINE_POPUP +{ + ItemList = + { + MenuItem + { + Identifier = MN_EDIT_COMMENT ; + HelpID = HID_EDIT_COMMENT ; + Text [ en-US ] = "Edit Comment..." ; + }; + MenuItem + { + Identifier = MN_SUB_SORT ; + RadioCheck = TRUE ; + SubMenu = Menu + { + ItemList = + { + MenuItem + { + Identifier = MN_SORT_ACTION ; + HelpID = HID_SORT_ACTION ; + RadioCheck = TRUE ; + Text [ en-US ] = "Action" ; + }; + MenuItem + { + Identifier = MN_SORT_AUTHOR ; + HelpID = HID_SORT_AUTHOR ; + RadioCheck = TRUE ; + Text [ en-US ] = "Author" ; + }; + MenuItem + { + Identifier = MN_SORT_DATE ; + HelpID = HID_SORT_DATE ; + RadioCheck = TRUE ; + Text [ en-US ] = "Date" ; + }; + MenuItem + { + Identifier = MN_SORT_COMMENT ; + HelpID = HID_SORT_COMMENT ; + RadioCheck = TRUE ; + Text [ en-US ] = "Comment" ; + }; + MenuItem + { + Identifier = MN_SORT_POSITION ; + HelpID = HID_SW_SORT_POSITION ; + RadioCheck = TRUE ; + Text [ en-US ] = "Document position" ; + }; + }; + }; + Text [ en-US ] = "Sort By" ; + }; + }; +}; + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/srtdlg.cxx b/sw/source/ui/misc/srtdlg.cxx new file mode 100644 index 000000000000..ad6fc7830e57 --- /dev/null +++ b/sw/source/ui/misc/srtdlg.cxx @@ -0,0 +1,519 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + +#include "srtdlg.hxx" + +#include <vcl/msgbox.hxx> +#include <svl/intitem.hxx> +#include <svl/eitem.hxx> +#include <sfx2/dispatch.hxx> +#include <svx/svxids.hrc> +#include <editeng/unolingu.hxx> +#include <svx/svxdlg.hxx> +#include <svx/dialogs.hrc> +#include <unotools/collatorwrapper.hxx> +#include <svtools/collatorres.hxx> +#include <swwait.hxx> +#include <view.hxx> +#include <cmdid.h> +#include <wrtsh.hxx> +#include <misc.hrc> +#include <srtdlg.hrc> +#include <swtable.hxx> +#include <node.hxx> +#include <tblsel.hxx> +#include <sfx2/request.hxx> + +// sw/inc/tblsel.hxx +SV_IMPL_PTRARR( _FndBoxes, _FndBox* ) +SV_IMPL_PTRARR( _FndLines, _FndLine* ) + +static sal_Bool bCheck1 = sal_True; +static sal_Bool bCheck2 = sal_False; +static sal_Bool bCheck3 = sal_False; + +static sal_uInt16 nCol1 = 1; +static sal_uInt16 nCol2 = 1; +static sal_uInt16 nCol3 = 1; + +static sal_uInt16 nType1 = 0; +static sal_uInt16 nType2 = 0; +static sal_uInt16 nType3 = 0; + +static sal_uInt16 nLang = LANGUAGE_NONE; + +static sal_Bool bAsc1 = sal_True; +static sal_Bool bAsc2 = sal_True; +static sal_Bool bAsc3 = sal_True; +static sal_Bool bCol = sal_False; +static sal_Bool bCsSens= sal_False; + +static sal_Unicode cDeli = '\t'; + +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using ::rtl::OUString; + +void lcl_ClearLstBoxAndDelUserData( ListBox& rLstBox ) +{ + void* pDel; + for( sal_uInt16 n = 0, nEnd = rLstBox.GetEntryCount(); n < nEnd; ++n ) + if( 0 != ( pDel = rLstBox.GetEntryData( n )) ) + delete (String*)pDel; + rLstBox.Clear(); +} + +/*-------------------------------------------------------------------- + Beschreibung: Fuer Tabellenselektion sel. Zeilen und Spalten + feststellen + --------------------------------------------------------------------*/ +sal_Bool lcl_GetSelTbl( SwWrtShell &rSh, sal_uInt16& rX, sal_uInt16& rY ) +{ + const SwTableNode* pTblNd = rSh.IsCrsrInTbl(); + if( !pTblNd ) + return sal_False; + + _FndBox aFndBox( 0, 0 ); + + // suche alle Boxen / Lines + { + SwSelBoxes aSelBoxes; + ::GetTblSel( rSh, aSelBoxes ); + _FndPara aPara( aSelBoxes, &aFndBox ); + const SwTable& rTbl = pTblNd->GetTable(); + ((SwTableLines&)rTbl.GetTabLines()).ForEach( &_FndLineCopyCol, &aPara ); + } + rX = aFndBox.GetLines().Count(); + if( !rX ) + return sal_False; + + rY = aFndBox.GetLines()[0]->GetBoxes().Count(); + return sal_True; +} + +/*-------------------------------------------------------------------- + Beschreibung: Init-Liste + --------------------------------------------------------------------*/ +SwSortDlg::SwSortDlg(Window* pParent, SwWrtShell &rShell) : + + SvxStandardDialog(pParent, SW_RES(DLG_SORTING)), + + aColLbl(this, SW_RES(FT_COL )), + aTypLbl(this, SW_RES(FT_KEYTYP)), + aDirLbl(this, SW_RES(FT_DIR )), + aSortFL(this, SW_RES(FL_SORT_2 )), + + + aKeyCB1(this, SW_RES(CB_KEY1 )), + aColEdt1(this, SW_RES(ED_KEY1 )), + aTypDLB1(this, SW_RES(DLB_KEY1 )), + aSortUpRB(this, SW_RES(RB_UP )), + aSortDnRB(this, SW_RES(RB_DN )), + + aKeyCB2(this, SW_RES(CB_KEY2 )), + aColEdt2(this, SW_RES(ED_KEY2 )), + aTypDLB2(this, SW_RES(DLB_KEY2 )), + aSortUp2RB(this, SW_RES(RB_UP2 )), + aSortDn2RB(this, SW_RES(RB_DN2 )), + + aKeyCB3(this, SW_RES(CB_KEY3 )), + aColEdt3(this, SW_RES(ED_KEY3 )), + aTypDLB3(this, SW_RES(DLB_KEY3 )), + aSortUp3RB(this, SW_RES(RB_UP3 )), + aSortDn3RB(this, SW_RES(RB_DN3 )), + aDirFL(this, SW_RES(FL_DIR )), + + aColumnRB(this, SW_RES(RB_COL )), + aRowRB(this, SW_RES(RB_ROW )), + + aDelimFL(this, SW_RES(FL_DELIM )), + aDelimTabRB(this, SW_RES(RB_TAB )), + aDelimFreeRB(this, SW_RES(RB_TABCH )), + aDelimEdt(this, SW_RES(ED_TABCH )), + aDelimPB(this, SW_RES( PB_DELIM)), + + aLangFL(this, SW_RES( FL_LANG )), + aLangLB(this, SW_RES( LB_LANG )), + + aSortOptFL(this, SW_RES( FL_SORT )), + aCaseCB(this, SW_RES( CB_CASE )), + + aOkBtn(this, SW_RES(BT_OK )), + aCancelBtn(this, SW_RES(BT_CANCEL)), + aHelpBtn(this, SW_RES(BT_HELP )), + + aColTxt( SW_RES(STR_COL)), + aRowTxt( SW_RES(STR_ROW)), + aNumericTxt( SW_RES(STR_NUMERIC)), + rSh(rShell), + pColRes( 0 ), + nX( 99 ), + nY( 99 ) +{ + aColEdt1.SetAccessibleName(aColLbl.GetText()); + aColEdt2.SetAccessibleName(aColLbl.GetText()); + aColEdt3.SetAccessibleName(aColLbl.GetText()); + aTypDLB1.SetAccessibleName(aTypLbl.GetText()); + aTypDLB2.SetAccessibleName(aTypLbl.GetText()); + aTypDLB3.SetAccessibleName(aTypLbl.GetText()); + aSortUpRB.SetAccessibleRelationMemberOf( &aKeyCB1 ); + aSortDnRB.SetAccessibleRelationMemberOf( &aKeyCB1 ); + aSortUp2RB.SetAccessibleRelationMemberOf( &aKeyCB2 ); + aSortDn2RB.SetAccessibleRelationMemberOf( &aKeyCB2 ); + aSortUp3RB.SetAccessibleRelationMemberOf( &aKeyCB3 ); + aSortDn3RB.SetAccessibleRelationMemberOf( &aKeyCB3 ); + + aDelimEdt.SetMaxTextLen( 1 ); + if(rSh.GetSelectionType() & + (nsSelectionType::SEL_TBL|nsSelectionType::SEL_TBL_CELLS) ) + { + aColumnRB.Check(bCol); + aColLbl.SetText(bCol ? aRowTxt : aColTxt); + aRowRB.Check(!bCol); + aDelimTabRB.Enable(sal_False); + aDelimFreeRB.Enable(sal_False); + aDelimEdt.Enable(sal_False); + } + else + { + aColumnRB.Enable(sal_False); + aRowRB.Check(sal_True); + aColLbl.SetText(aColTxt); + } + + // Initialisieren + Link aLk = LINK(this,SwSortDlg, CheckHdl); + aKeyCB1.SetClickHdl( aLk ); + aKeyCB2.SetClickHdl( aLk ); + aKeyCB3.SetClickHdl( aLk ); + aColumnRB.SetClickHdl( aLk ); + aRowRB.SetClickHdl( aLk ); + + aLk = LINK(this,SwSortDlg, DelimHdl); + aDelimFreeRB.SetClickHdl(aLk); + aDelimTabRB.SetClickHdl(aLk); + + aDelimPB.SetClickHdl( LINK( this, SwSortDlg, DelimCharHdl )); + + aKeyCB1.Check(bCheck1); + aKeyCB2.Check(bCheck2); + aKeyCB3.Check(bCheck3); + + aColEdt1.SetValue(nCol1); + aColEdt2.SetValue(nCol2); + aColEdt3.SetValue(nCol3); + + // first initialise the language, then select the + if( LANGUAGE_NONE == nLang || LANGUAGE_DONTKNOW == nLang ) + nLang = (sal_uInt16)GetAppLanguage(); + + aLangLB.SetLanguageList( LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN, sal_True, sal_False); + aLangLB.SelectLanguage( nLang ); + + LanguageHdl( 0 ); + aLangLB.SetSelectHdl( LINK( this, SwSortDlg, LanguageHdl )); + + aSortUpRB.Check(bAsc1); + aSortDnRB.Check(!bAsc1); + aSortUp2RB.Check(bAsc2); + aSortDn2RB.Check(!bAsc2); + aSortUp3RB.Check(bAsc3); + aSortDn3RB.Check(!bAsc3); + + aCaseCB.Check( bCsSens ); + + aDelimTabRB.Check(cDeli == '\t'); + if(!aDelimTabRB.IsChecked()) + { + aDelimEdt.SetText(cDeli); + aDelimFreeRB.Check(sal_True); + DelimHdl(&aDelimFreeRB); + } + else + DelimHdl(&aDelimTabRB); + + FreeResource(); + if( ::lcl_GetSelTbl( rSh, nX, nY) ) + { + sal_uInt16 nMax = aRowRB.IsChecked()? nY : nX; + aColEdt1.SetMax(nMax); + aColEdt2.SetMax(nMax); + aColEdt3.SetMax(nMax); + } + + aDelimEdt.SetAccessibleRelationLabeledBy(&aDelimFreeRB); + aDelimPB.SetAccessibleRelationLabeledBy(&aDelimFreeRB); + aDelimPB.SetAccessibleRelationMemberOf(&aDelimFL); + + aColEdt1.SetAccessibleRelationMemberOf(&aKeyCB1); + aColEdt1.SetAccessibleRelationLabeledBy(&aColLbl); + aTypDLB1.SetAccessibleRelationMemberOf(&aKeyCB1); + aTypDLB1.SetAccessibleRelationLabeledBy(&aTypLbl); + + aColEdt2.SetAccessibleRelationMemberOf(&aKeyCB2); + aColEdt2.SetAccessibleRelationLabeledBy(&aColLbl); + aTypDLB2.SetAccessibleRelationMemberOf(&aKeyCB2); + aTypDLB2.SetAccessibleRelationLabeledBy(&aTypLbl); + + aColEdt3.SetAccessibleRelationMemberOf(&aKeyCB3); + aColEdt3.SetAccessibleRelationLabeledBy(&aColLbl); + aTypDLB3.SetAccessibleRelationMemberOf(&aKeyCB3); + aTypDLB3.SetAccessibleRelationLabeledBy(&aTypLbl); +} + +SwSortDlg::~SwSortDlg() +{ + ::lcl_ClearLstBoxAndDelUserData( aTypDLB1 ); + ::lcl_ClearLstBoxAndDelUserData( aTypDLB2 ); + ::lcl_ClearLstBoxAndDelUserData( aTypDLB3 ); + delete pColRes; +} + +sal_Unicode SwSortDlg::GetDelimChar() const +{ + sal_Unicode cRet = '\t'; + if( !aDelimTabRB.IsChecked() ) + { + String aTmp( aDelimEdt.GetText() ); + if( aTmp.Len() ) + cRet = aTmp.GetChar( 0 ); + } + return cRet; +} + +/*-------------------------------------------------------------------- + Beschreibung: An die Core weiterreichen + --------------------------------------------------------------------*/ +void SwSortDlg::Apply() +{ + // Alte Einstellung speichern + // + bCheck1 = aKeyCB1.IsChecked(); + bCheck2 = aKeyCB2.IsChecked(); + bCheck3 = aKeyCB3.IsChecked(); + + nCol1 = (sal_uInt16)aColEdt1.GetValue(); + nCol2 = (sal_uInt16)aColEdt2.GetValue(); + nCol3 = (sal_uInt16)aColEdt3.GetValue(); + + nType1 = aTypDLB1.GetSelectEntryPos(); + nType2 = aTypDLB2.GetSelectEntryPos(); + nType3 = aTypDLB3.GetSelectEntryPos(); + + bAsc1 = aSortUpRB.IsChecked(); + bAsc2 = aSortUp2RB.IsChecked(); + bAsc3 = aSortUp3RB.IsChecked(); + bCol = aColumnRB.IsChecked(); + nLang = aLangLB.GetSelectLanguage(); + cDeli = GetDelimChar(); + bCsSens = aCaseCB.IsChecked(); + + void* pUserData; + SwSortOptions aOptions; + if( bCheck1 ) + { + String sEntry( aTypDLB1.GetSelectEntry() ); + if( sEntry == aNumericTxt ) + sEntry.Erase(); + else if( 0 != (pUserData = aTypDLB1.GetEntryData( + aTypDLB1.GetSelectEntryPos())) ) + sEntry = *(String*)pUserData; + + SwSortKey *pKey = new SwSortKey( nCol1, sEntry, + bAsc1 ? SRT_ASCENDING : SRT_DESCENDING ); + aOptions.aKeys.C40_INSERT(SwSortKey, pKey, aOptions.aKeys.Count()); + } + + if( bCheck2 ) + { + String sEntry( aTypDLB2.GetSelectEntry() ); + if( sEntry == aNumericTxt ) + sEntry.Erase(); + else if( 0 != (pUserData = aTypDLB2.GetEntryData( + aTypDLB2.GetSelectEntryPos())) ) + sEntry = *(String*)pUserData; + + SwSortKey *pKey = new SwSortKey( nCol2, sEntry, + bAsc2 ? SRT_ASCENDING : SRT_DESCENDING ); + aOptions.aKeys.C40_INSERT( SwSortKey, pKey, aOptions.aKeys.Count() ); + } + + if( bCheck3 ) + { + String sEntry( aTypDLB3.GetSelectEntry() ); + if( sEntry == aNumericTxt ) + sEntry.Erase(); + else if( 0 != (pUserData = aTypDLB3.GetEntryData( + aTypDLB3.GetSelectEntryPos())) ) + sEntry = *(String*)pUserData; + + SwSortKey *pKey = new SwSortKey( nCol3, sEntry, + bAsc3 ? SRT_ASCENDING : SRT_DESCENDING ); + aOptions.aKeys.C40_INSERT( SwSortKey, pKey, aOptions.aKeys.Count() ); + } + + aOptions.eDirection = bCol ? SRT_COLUMNS : SRT_ROWS; + aOptions.cDeli = cDeli; + aOptions.nLanguage = nLang; + aOptions.bTable = rSh.IsTableMode(); + aOptions.bIgnoreCase = !bCsSens; + + sal_Bool bRet; + { + SwWait aWait( *rSh.GetView().GetDocShell(), sal_True ); + rSh.StartAllAction(); + if( 0 != (bRet = rSh.Sort( aOptions ))) + rSh.SetModified(); + rSh.EndAllAction(); + } + + if( !bRet ) + InfoBox( this->GetParent(), SW_RES(MSG_SRTERR)).Execute(); +} + +IMPL_LINK( SwSortDlg, DelimHdl, RadioButton*, pButton ) +{ + sal_Bool bEnable = pButton == &aDelimFreeRB && aDelimFreeRB.IsEnabled(); + aDelimEdt.Enable( bEnable ); + aDelimPB.Enable( bEnable ); + return 0; +} + +IMPL_LINK( SwSortDlg, DelimCharHdl, PushButton*, EMPTYARG ) +{ + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if(pFact) + { + SfxAllItemSet aSet( rSh.GetAttrPool() ); + aSet.Put( SfxInt32Item( SID_ATTR_CHAR, GetDelimChar() ) ); + SfxAbstractDialog* pMap = pFact->CreateSfxDialog( &aDelimPB, aSet, + rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); + if( RET_OK == pMap->Execute() ) + { + SFX_ITEMSET_ARG( pMap->GetOutputItemSet(), pItem, SfxInt32Item, SID_ATTR_CHAR, sal_False ); + if ( pItem ) + aDelimEdt.SetText( sal_Unicode ( pItem->GetValue() ) ); + } + + delete pMap; + } + return 0; +} + +IMPL_LINK( SwSortDlg, CheckHdl, CheckBox *, pCheck ) +{ + if( pCheck == ( CheckBox* ) &aRowRB) + { + aColLbl.SetText(aColTxt); + aColEdt1.SetMax(nY); + aColEdt2.SetMax(nY); + aColEdt3.SetMax(nY); + + aColEdt1.SetAccessibleName(aColTxt); + aColEdt2.SetAccessibleName(aColTxt); + aColEdt3.SetAccessibleName(aColTxt); + } + else if( pCheck == ( CheckBox* ) &aColumnRB) + { + aColLbl.SetText(aRowTxt); + aColEdt1.SetMax(nX); + aColEdt2.SetMax(nX); + aColEdt3.SetMax(nX); + + aColEdt1.SetAccessibleName(aRowTxt); + aColEdt2.SetAccessibleName(aRowTxt); + aColEdt3.SetAccessibleName(aRowTxt); + } + else if(!aKeyCB1.IsChecked() && + !aKeyCB2.IsChecked() && + !aKeyCB3.IsChecked()) + pCheck->Check(sal_True); + return 0; +} + +IMPL_LINK( SwSortDlg, LanguageHdl, ListBox*, pLBox ) +{ + Locale aLcl( SvxCreateLocale( aLangLB.GetSelectLanguage() ) ); + Sequence < OUString > aSeq( + GetAppCollator().listCollatorAlgorithms( aLcl )); + + if( !pColRes ) + pColRes = new CollatorRessource(); + + const sal_uInt16 nLstBoxCnt = 3; + ListBox* aLstArr[ nLstBoxCnt ] = { &aTypDLB1, &aTypDLB2, &aTypDLB3 }; + sal_uInt16* aTypeArr[ nLstBoxCnt ] = { &nType1, &nType2, &nType3 }; + String aOldStrArr[ nLstBoxCnt ]; + sal_uInt16 n; + + void* pUserData; + for( n = 0; n < nLstBoxCnt; ++n ) + { + ListBox* pL = aLstArr[ n ]; + if( 0 != (pUserData = pL->GetEntryData( pL->GetSelectEntryPos())) ) + aOldStrArr[ n ] = *(String*)pUserData; + ::lcl_ClearLstBoxAndDelUserData( *pL ); + } + + sal_uInt16 nInsPos; + String sAlg, sUINm; + for( long nCnt = 0, nEnd = aSeq.getLength(); nCnt <= nEnd; ++nCnt ) + { + if( nCnt < nEnd ) + sUINm = pColRes->GetTranslation( sAlg = aSeq[ nCnt ] ); + else + sUINm = sAlg = aNumericTxt; + + for( n = 0; n < nLstBoxCnt; ++n ) + { + ListBox* pL = aLstArr[ n ]; + nInsPos = pL->InsertEntry( sUINm ); + pL->SetEntryData( nInsPos, new String( sAlg )); + if( pLBox && sAlg == aOldStrArr[ n ] ) + pL->SelectEntryPos( nInsPos ); + } + } + + for( n = 0; n < nLstBoxCnt; ++n ) + { + ListBox* pL = aLstArr[ n ]; + if( !pLBox ) + pL->SelectEntryPos( *aTypeArr[n] ); + else if( LISTBOX_ENTRY_NOTFOUND == pL->GetSelectEntryPos() ) + pL->SelectEntryPos( 0 ); + } + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/srtdlg.hrc b/sw/source/ui/misc/srtdlg.hrc new file mode 100644 index 000000000000..101f819b8739 --- /dev/null +++ b/sw/source/ui/misc/srtdlg.hrc @@ -0,0 +1,65 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ +#define BT_OK 1 +#define BT_CANCEL 2 +#define FT_COL 3 +#define FT_KEYTYP 4 +#define CB_KEY1 5 +#define ED_KEY1 6 +#define DLB_KEY1 7 +#define CB_KEY2 8 +#define ED_KEY2 9 +#define DLB_KEY2 10 +#define CB_KEY3 11 +#define ED_KEY3 12 +#define DLB_KEY3 13 +#define FL_SORT_2 14 +#define RB_COL 15 +#define RB_ROW 16 +#define FL_DIR 17 +#define RB_UP 18 +#define RB_DN 19 +#define FL_ORDER 20 +#define RB_TAB 21 +#define RB_TABCH 22 +#define ED_TABCH 23 +#define FL_DELIM 24 +#define STR_ROW 25 +#define STR_COL 26 +#define BT_HELP 27 +#define FT_DIR 28 +#define RB_UP2 29 +#define RB_DN2 30 +#define RB_UP3 31 +#define RB_DN3 32 +#define STR_NUMERIC 33 +#define PB_DELIM 34 +#define FL_LANG 35 +#define LB_LANG 36 +#define FL_SORT 37 +#define CB_CASE 38 + diff --git a/sw/source/ui/misc/srtdlg.src b/sw/source/ui/misc/srtdlg.src new file mode 100644 index 000000000000..90ce866a3b20 --- /dev/null +++ b/sw/source/ui/misc/srtdlg.src @@ -0,0 +1,403 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#include "misc.hrc" +#include "srtdlg.hrc" +#include "cmdid.h" +#include "helpid.h" + +ModalDialog DLG_SORTING +{ + HelpID = CMD_FN_SORTING_DLG ; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 268 , 193 ) ; + Text [ en-US ] = "Sort" ; + Moveable = TRUE ; + OKButton BT_OK + { + Pos = MAP_APPFONT ( 212 , 6 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + DefButton = TRUE ; + }; + CancelButton BT_CANCEL + { + Pos = MAP_APPFONT ( 212 , 23 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + HelpButton BT_HELP + { + Pos = MAP_APPFONT ( 212 , 43 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + TabStop = TRUE ; + }; + FixedText FT_COL + { + Pos = MAP_APPFONT ( 68 , 12 ) ; + Size = MAP_APPFONT ( 25 , 8 ) ; + Text [ en-US ] = "Column" ; + Left = TRUE ; + }; + FixedText FT_KEYTYP + { + Pos = MAP_APPFONT ( 101, 12 ) ; + Size = MAP_APPFONT ( 48 , 8 ) ; + Text [ en-US ] = "Key type" ; + Left = TRUE ; + }; + FixedText FT_DIR + { + Pos = MAP_APPFONT ( 155 , 12 ) ; + Size = MAP_APPFONT ( 49 , 10 ) ; + Text [ en-US ] = "Order" ; + }; + CheckBox CB_KEY1 + { + HelpID = "sw:CheckBox:DLG_SORTING:CB_KEY1"; + Pos = MAP_APPFONT ( 12 , 25 ) ; + Size = MAP_APPFONT ( 49 , 8 ) ; + Text [ en-US ] = "Key ~1" ; + Check = TRUE ; + }; + NumericField ED_KEY1 + { + HelpID = "sw:NumericField:DLG_SORTING:ED_KEY1"; + Border = TRUE ; + Pos = MAP_APPFONT ( 66 , 23 ) ; + Size = MAP_APPFONT ( 25 , 12 ) ; + Text = "10" ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 99 ; + Value = 1 ; + First = 1 ; + Last = 99 ; + SpinSize = 1 ; + }; + String STR_NUMERIC + { + Text [ en-US ] = "Numeric"; + }; + ListBox DLB_KEY1 + { + HelpID = "sw:ListBox:DLG_SORTING:DLB_KEY1"; + Pos = MAP_APPFONT ( 96 , 23 ) ; + Size = MAP_APPFONT ( 55 , 45 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + Sort = TRUE; + }; + RadioButton RB_UP + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_UP"; + Pos = MAP_APPFONT ( 155 , 23 ) ; + Size = MAP_APPFONT ( 50 , 10 ) ; + Text [ en-US ] = "~Ascending" ; + TabStop = TRUE ; + Check = TRUE ; + }; + RadioButton RB_DN + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_DN"; + Pos = MAP_APPFONT ( 155 , 35 ) ; + Size = MAP_APPFONT ( 50 , 10 ) ; + Text [ en-US ] = "~Descending" ; + TabStop = TRUE ; + }; + CheckBox CB_KEY2 + { + HelpID = "sw:CheckBox:DLG_SORTING:CB_KEY2"; + Pos = MAP_APPFONT ( 12 , 52 ) ; + Size = MAP_APPFONT ( 49 , 8 ) ; + Text [ en-US ] = "Key ~2" ; + }; + NumericField ED_KEY2 + { + HelpID = "sw:NumericField:DLG_SORTING:ED_KEY2"; + Border = TRUE ; + Pos = MAP_APPFONT ( 66 , 50 ) ; + Size = MAP_APPFONT ( 25 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 99 ; + Value = 1 ; + First = 1 ; + Last = 99 ; + SpinSize = 1 ; + }; + ListBox DLB_KEY2 + { + HelpID = "sw:ListBox:DLG_SORTING:DLB_KEY2"; + Pos = MAP_APPFONT ( 96 , 50 ) ; + Size = MAP_APPFONT ( 55 , 45 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + Sort = TRUE; + }; + RadioButton RB_UP2 + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_UP2"; + Pos = MAP_APPFONT ( 155 , 50 ) ; + Size = MAP_APPFONT ( 50 , 10 ) ; + Text [ en-US ] = "Ascending" ; + TabStop = TRUE ; + Check = TRUE ; + }; + RadioButton RB_DN2 + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_DN2"; + Pos = MAP_APPFONT ( 155 , 62 ) ; + Size = MAP_APPFONT ( 50 , 10 ) ; + Text [ en-US ] = "Descending" ; + TabStop = TRUE ; + }; + CheckBox CB_KEY3 + { + HelpID = "sw:CheckBox:DLG_SORTING:CB_KEY3"; + Pos = MAP_APPFONT ( 12 , 81 ) ; + Size = MAP_APPFONT ( 49 , 8 ) ; + Text [ en-US ] = "Key ~3" ; + }; + NumericField ED_KEY3 + { + HelpID = "sw:NumericField:DLG_SORTING:ED_KEY3"; + Border = TRUE ; + Pos = MAP_APPFONT ( 66 , 79 ) ; + Size = MAP_APPFONT ( 25 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 99 ; + Value = 1 ; + First = 1 ; + Last = 99 ; + SpinSize = 1 ; + }; + ListBox DLB_KEY3 + { + HelpID = "sw:ListBox:DLG_SORTING:DLB_KEY3"; + Pos = MAP_APPFONT ( 96 , 79 ) ; + Size = MAP_APPFONT ( 55 , 45 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + Sort = TRUE; + }; + RadioButton RB_UP3 + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_UP3"; + Pos = MAP_APPFONT ( 155 , 79 ) ; + Size = MAP_APPFONT ( 50 , 10 ) ; + Text [ en-US ] = "Ascending" ; + TabStop = TRUE ; + Check = TRUE ; + }; + RadioButton RB_DN3 + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_DN3"; + Pos = MAP_APPFONT ( 155 , 91 ) ; + Size = MAP_APPFONT ( 50 , 10 ) ; + Text [ en-US ] = "Descending" ; + TabStop = TRUE ; + }; + FixedLine FL_SORT_2 + { + Pos = MAP_APPFONT ( 6 , 3 ) ; + Size = MAP_APPFONT ( 200 , 8 ) ; + Text [ en-US ] = "Sort criteria" ; + }; + RadioButton RB_COL + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_COL"; + Pos = MAP_APPFONT ( 12 , 120 ) ; + Size = MAP_APPFONT ( 38 , 10 ) ; + Text [ en-US ] = "Col~umns" ; + TabStop = TRUE ; + }; + RadioButton RB_ROW + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_ROW"; + Pos = MAP_APPFONT ( 12 , 133 ) ; + Size = MAP_APPFONT ( 34 , 10 ) ; + Text [ en-US ] = "~Rows" ; + TabStop = TRUE ; + Check = TRUE ; + }; + FixedLine FL_DIR + { + Pos = MAP_APPFONT ( 6 , 108 ) ; + Size = MAP_APPFONT ( 95 , 8 ) ; + Text [ en-US ] = "Direction" ; + }; + RadioButton RB_TAB + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_TAB"; + Pos = MAP_APPFONT ( 113 , 120 ) ; + Size = MAP_APPFONT ( 44 , 9 ) ; + Text [ en-US ] = "~Tabs" ; + TabStop = TRUE ; + Check = TRUE ; + }; + RadioButton RB_TABCH + { + HelpID = "sw:RadioButton:DLG_SORTING:RB_TABCH"; + Pos = MAP_APPFONT ( 113 , 133 ) ; + Size = MAP_APPFONT ( 38 , 10 ) ; + Text [ en-US ] = "~Character" ; + TabStop = TRUE ; + }; + Edit ED_TABCH + { + HelpID = "sw:Edit:DLG_SORTING:ED_TABCH"; + Border = TRUE ; + Pos = MAP_APPFONT ( 180 , 133 ) ; + Size = MAP_APPFONT ( 12 , 12 ) ; + TabStop = TRUE ; + Left = TRUE ; + }; + FixedLine FL_DELIM + { + Pos = MAP_APPFONT ( 107 , 108 ) ; + Size = MAP_APPFONT ( 99 , 8 ) ; + Text [ en-US ] = "Separator" ; + }; + String STR_ROW + { + Text [ en-US ] = "Rows" ; + }; + String STR_COL + { + Text [ en-US ] = "Column" ; + }; + PushButton PB_DELIM + { + HelpID = "sw:PushButton:DLG_SORTING:PB_DELIM"; + Pos = MAP_APPFONT ( 195 , 133 ) ; + Size = MAP_APPFONT ( 12 , 12 ) ; + TabStop = TRUE ; + Text = "..."; + }; + FixedLine FL_LANG + { + Pos = MAP_APPFONT ( 6 , 147 ) ; + Size = MAP_APPFONT ( 95 , 8 ) ; + Text [ en-US ] = "Language"; + }; + ListBox LB_LANG + { + HelpID = "sw:ListBox:DLG_SORTING:LB_LANG"; + Pos = MAP_APPFONT ( 12 , 158 ) ; + Size = MAP_APPFONT ( 83 , 61 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + Sort = TRUE ; + }; + FixedLine FL_SORT + { + Pos = MAP_APPFONT ( 107 , 147 ) ; + Size = MAP_APPFONT ( 99 , 8 ) ; + Text [ en-US ] = "Setting"; + }; + CheckBox CB_CASE + { + HelpID = "sw:CheckBox:DLG_SORTING:CB_CASE"; + Pos = MAP_APPFONT ( 113 , 159 ) ; + Size = MAP_APPFONT ( 147 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Match case"; + }; + +}; +InfoBox MSG_SRTERR +{ + BUTTONS = WB_OK ; + DEFBUTTON = WB_DEF_OK ; + Message [ en-US ] = "Cannot sort selection" ; +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sw/source/ui/misc/swmodalredlineacceptdlg.cxx b/sw/source/ui/misc/swmodalredlineacceptdlg.cxx new file mode 100644 index 000000000000..0fd7cf7c9f11 --- /dev/null +++ b/sw/source/ui/misc/swmodalredlineacceptdlg.cxx @@ -0,0 +1,119 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#define _SVSTDARR_STRINGSSORTDTOR +#define _SVSTDARR_USHORTSSORT +#define _SVSTDARR_USHORTS + + +#include <redline.hxx> +#include <tools/datetime.hxx> +#include <vcl/msgbox.hxx> +#include <svl/svstdarr.hxx> +#include <svl/eitem.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/dispatch.hxx> +#include <svx/ctredlin.hxx> +#include <svx/postattr.hxx> +#include <swtypes.hxx> +#include <wrtsh.hxx> +#include <view.hxx> +#include <swmodule.hxx> +#include <swwait.hxx> +#include <uitool.hxx> + +#include <helpid.h> +#include <cmdid.h> +#include <misc.hrc> +#include <redlndlg.hrc> +#include <shells.hrc> + +#include <vector> +#ifndef _REDLNDLG_HXX +#define _REDLNACCEPTDLG +#include <redlndlg.hxx> +#endif +#include "swmodalredlineacceptdlg.hxx" + +#include <unomid.h> + +SwModalRedlineAcceptDlg::SwModalRedlineAcceptDlg(Window *pParent) : + SfxModalDialog(pParent, SW_RES(DLG_MOD_REDLINE_ACCEPT)) +{ + pImplDlg = new SwRedlineAcceptDlg(this, sal_True); + + pImplDlg->Initialize(GetExtraData()); + pImplDlg->Activate(); // Zur Initialisierung der Daten + + FreeResource(); +} + +SwModalRedlineAcceptDlg::~SwModalRedlineAcceptDlg() +{ + AcceptAll(sal_False); // Alles uebriggebliebene ablehnen + pImplDlg->FillInfo(GetExtraData()); + + delete pImplDlg; +} + +void SwModalRedlineAcceptDlg::Activate() +{ +} + +void SwModalRedlineAcceptDlg::Resize() +{ + pImplDlg->Resize(); + SfxModalDialog::Resize(); +} + +void SwModalRedlineAcceptDlg::AcceptAll( sal_Bool bAccept ) +{ + SvxTPFilter* pFilterTP = pImplDlg->GetChgCtrl()->GetFilterPage(); + + if (pFilterTP->IsDate() || pFilterTP->IsAuthor() || + pFilterTP->IsRange() || pFilterTP->IsAction()) + { + pFilterTP->CheckDate(sal_False); // Alle Filter abschalten + pFilterTP->CheckAuthor(sal_False); + pFilterTP->CheckRange(sal_False); + pFilterTP->CheckAction(sal_False); + pImplDlg->FilterChangedHdl(); + } + + pImplDlg->CallAcceptReject( sal_False, bAccept ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/titlepage.cxx b/sw/source/ui/misc/titlepage.cxx new file mode 100644 index 000000000000..f41bc49c9d63 --- /dev/null +++ b/sw/source/ui/misc/titlepage.cxx @@ -0,0 +1,367 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.) + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): Caolán McNamara <caolanm@redhat.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + +#include <sfx2/viewfrm.hxx> +#include <vcl/msgbox.hxx> +#include <view.hxx> +#include <swmodule.hxx> +#include <wrtsh.hxx> +#include <poolfmt.hxx> +#include <docsh.hxx> +#include <charfmt.hxx> +#include <docstyle.hxx> + +#include "fldbas.hxx" +#include "lineinfo.hxx" +#include "globals.hrc" +#include "titlepage.hrc" +#include "titlepage.hxx" +#include "uitool.hxx" +#include "fmtpdsc.hxx" +#include "pagedesc.hxx" + +#include <IDocumentStylePoolAccess.hxx> + +namespace +{ + bool lcl_GetPageDesc(SwWrtShell *pSh, sal_uInt16 &rPageNo, const SwFmtPageDesc **ppPageFmtDesc) + { + bool bRet = false; + SfxItemSet aSet( pSh->GetAttrPool(), RES_PAGEDESC, RES_PAGEDESC ); + if (pSh->GetCurAttr( aSet )) + { + const SfxPoolItem* pItem(0); + if (SFX_ITEM_SET == aSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) && pItem) + { + rPageNo = ((const SwFmtPageDesc *)pItem)->GetNumOffset(); + if (ppPageFmtDesc) + (*ppPageFmtDesc) = (const SwFmtPageDesc *)(pItem->Clone()); + bRet = true; + } + } + return bRet; + } + + bool lcl_SkipNPages(SwWrtShell *pSh, sal_uInt16 nNoPages) + { + bool bAllOk = true; + for (sal_uInt16 nI = 0; nI < nNoPages && bAllOk; ++nI) + bAllOk = pSh->SttNxtPg(); + return bAllOk; + } + + void lcl_ChangePage(SwWrtShell *pSh, sal_uInt16 nNewNumber, + const SwPageDesc *pNewDesc) + { + const sal_uInt16 nCurIdx = pSh->GetCurPageDesc(); + const SwPageDesc &rCurrentDesc = pSh->GetPageDesc( nCurIdx ); + + const SwFmtPageDesc *pPageFmtDesc(0); + sal_uInt16 nDontCare; + lcl_GetPageDesc(pSh, nDontCare, &pPageFmtDesc); + + //If we want a new number then set it, otherwise reuse the existing one + sal_uInt16 nPgNo = nNewNumber ? + nNewNumber : ( pPageFmtDesc ? pPageFmtDesc->GetNumOffset() : 0 ); + + //If we want a new descriptior then set it, otherwise reuse the existing one + if (!pNewDesc) + { + SwFmtPageDesc aPageFmtDesc(pPageFmtDesc ? *pPageFmtDesc : &rCurrentDesc); + if (nPgNo) aPageFmtDesc.SetNumOffset(nPgNo); + pSh->SetAttr(aPageFmtDesc); + } + else + { + SwFmtPageDesc aPageFmtDesc(pNewDesc); + if (nPgNo) aPageFmtDesc.SetNumOffset(nPgNo); + pSh->SetAttr(aPageFmtDesc); + } + + delete pPageFmtDesc; + } + + void lcl_PushCursor(SwWrtShell *pSh) + { + pSh->LockView( sal_True ); + pSh->StartAllAction(); + pSh->SwCrsrShell::Push(); + } + + void lcl_PopCursor(SwWrtShell *pSh) + { + pSh->SwCrsrShell::Pop( sal_False ); + pSh->EndAllAction(); + pSh->LockView( sal_False ); + } + + sal_uInt16 lcl_GetCurrentPage(SwWrtShell *pSh) + { + String sDummy; + sal_uInt16 nPhyNum=1, nVirtNum=1; + pSh->GetPageNumber(0, true, nPhyNum, nVirtNum, sDummy); + return nPhyNum; + } +} + +/* + * Only include the Index page in the list if the page count implies one + * to reduce confusing things + */ +void SwTitlePageDlg::FillList() +{ + sal_uInt16 nTitlePages = aPageCountNF.GetValue(); + aPagePropertiesLB.Clear(); + if (mpTitleDesc) + aPagePropertiesLB.InsertEntry(mpTitleDesc->GetName()); + if (nTitlePages > 1 && mpIndexDesc) + aPagePropertiesLB.InsertEntry(mpIndexDesc->GetName()); + if (mpNormalDesc) + aPagePropertiesLB.InsertEntry(mpNormalDesc->GetName()); + aPagePropertiesLB.SelectEntryPos(0); +} + +sal_uInt16 SwTitlePageDlg::GetInsertPosition() const +{ + sal_uInt16 nPage = 1; + if (aPageStartNF.IsEnabled()) + nPage = aPageStartNF.GetValue(); + return nPage; +} + +SwTitlePageDlg::SwTitlePageDlg( Window *pParent ) : + SfxModalDialog( pParent, SW_RES(DLG_TITLEPAGE) ), +#ifdef MSC +#pragma warning (disable : 4355) +#endif + aMakeInsertFL ( this, SW_RES( FL_MAKEINSERT )), + aUseExistingPagesRB ( this, SW_RES( RB_USE_EXISTING_PAGES )), + aInsertNewPagesRB ( this, SW_RES( RB_INSERT_NEW_PAGES )), + aPageCountFT ( this, SW_RES( FT_PAGE_COUNT )), + aPageCountNF ( this, SW_RES( NF_PAGE_COUNT )), + aPagePagesFT ( this, SW_RES( FT_PAGE_PAGES )), + aPageStartFT ( this, SW_RES( FT_PAGE_START )), + aDocumentStartRB ( this, SW_RES( RB_DOCUMENT_START )), + aPageStartRB ( this, SW_RES( RB_PAGE_START )), + aPageStartNF ( this, SW_RES( NF_PAGE_START )), + aNumberingFL ( this, SW_RES( FL_NUMBERING )), + aRestartNumberingCB ( this, SW_RES( CB_RESTART_NUMBERING )), + aRestartNumberingFT ( this, SW_RES( FT_RESTART_NUMBERING )), + aRestartNumberingNF ( this, SW_RES( NF_RESTART_NUMBERING )), + aSetPageNumberCB ( this, SW_RES( CB_SET_PAGE_NUMBER )), + aSetPageNumberFT ( this, SW_RES( FT_SET_PAGE_NUMBER )), + aSetPageNumberNF ( this, SW_RES( NF_SET_PAGE_NUMBER )), + aPagePropertiesFL ( this, SW_RES( FL_PAGE_PROPERTIES )), + aPagePropertiesLB ( this, SW_RES( LB_PAGE_PROPERTIES )), + aPagePropertiesPB ( this, SW_RES( PB_PAGE_PROPERTIES )), + aBottomFL ( this, SW_RES( FL_BOTTOM )), + aOkPB ( this, SW_RES( PB_OK )), + aCancelPB ( this, SW_RES( PB_CANCEL )), + aHelpPB ( this, SW_RES( PB_HELP )), + mpPageFmtDesc (0) +#ifdef MSC +#pragma warning (default : 4355) +#endif +{ + FreeResource(); + + aOkPB.SetClickHdl(LINK(this, SwTitlePageDlg, OKHdl)); + aRestartNumberingCB.SetClickHdl(LINK(this, SwTitlePageDlg, RestartNumberingHdl)); + aSetPageNumberCB.SetClickHdl(LINK(this, SwTitlePageDlg, SetPageNumberHdl)); + + sal_uInt16 nSetPage = 1; + sal_uInt16 nResetPage = 1; + sal_uInt16 nTitlePages = 1; + mpSh = ::GetActiveView()->GetWrtShellPtr(); + lcl_PushCursor(mpSh); + + SwView& rView = mpSh->GetView(); + rView.InvalidateRulerPos(); + + bool bMaybeResetNumbering = false; + + mpTitleDesc = mpSh->GetPageDescFromPool(RES_POOLPAGE_FIRST); + mpIndexDesc = mpSh->GetPageDescFromPool(RES_POOLPAGE_REGISTER); + mpNormalDesc = mpSh->GetPageDescFromPool(RES_POOLPAGE_STANDARD); + + mpSh->SttDoc(); + if (lcl_GetPageDesc( mpSh, nSetPage, &mpPageFmtDesc )) + { + if (mpPageFmtDesc->GetPageDesc() == mpTitleDesc) + { + while (mpSh->SttNxtPg()) + { + const sal_uInt16 nCurIdx = mpSh->GetCurPageDesc(); + const SwPageDesc &rPageDesc = mpSh->GetPageDesc( nCurIdx ); + + if (mpIndexDesc != &rPageDesc) + { + mpNormalDesc = &rPageDesc; + bMaybeResetNumbering = lcl_GetPageDesc(mpSh, nResetPage, NULL); + break; + } + ++nTitlePages; + } + } + } + lcl_PopCursor(mpSh); + + aUseExistingPagesRB.Check(); + aPageCountNF.SetValue(nTitlePages); + aPageCountNF.SetUpHdl(LINK(this, SwTitlePageDlg, UpHdl)); + aPageCountNF.SetDownHdl(LINK(this, SwTitlePageDlg, DownHdl)); + + aDocumentStartRB.Check(); + aPageStartNF.Enable(false); + aPageStartNF.SetValue(lcl_GetCurrentPage(mpSh)); + Link aStartPageHdl = LINK(this, SwTitlePageDlg, StartPageHdl); + aDocumentStartRB.SetClickHdl(aStartPageHdl); + aPageStartRB.SetClickHdl(aStartPageHdl); + + if (bMaybeResetNumbering && nResetPage > 0) + { + aRestartNumberingCB.Check(); + aRestartNumberingNF.SetValue(nResetPage); + } + aRestartNumberingNF.Enable(aRestartNumberingCB.IsChecked()); + + aSetPageNumberNF.SetValue(nSetPage); + if (nSetPage > 1) + aSetPageNumberCB.Check(); + aSetPageNumberNF.Enable(aSetPageNumberCB.IsChecked()); + + FillList(); + aPagePropertiesPB.SetClickHdl(LINK(this, SwTitlePageDlg, EditHdl)); +} + +IMPL_LINK(SwTitlePageDlg, UpHdl, NumericField *, EMPTYARG) +{ + if (aPageCountNF.GetValue() == 2) + FillList(); + return 0; +} + +IMPL_LINK(SwTitlePageDlg, DownHdl, NumericField *, EMPTYARG) +{ + if (aPageCountNF.GetValue() == 1) + FillList(); + return 0; +} + +IMPL_LINK(SwTitlePageDlg, RestartNumberingHdl, CheckBox*, EMPTYARG) +{ + aRestartNumberingNF.Enable(aRestartNumberingCB.IsChecked()); + return 0; +} + +IMPL_LINK(SwTitlePageDlg, SetPageNumberHdl, CheckBox*, EMPTYARG) +{ + aSetPageNumberNF.Enable(aSetPageNumberCB.IsChecked()); + return 0; +} + +IMPL_LINK(SwTitlePageDlg, StartPageHdl, RadioButton*, EMPTYARG) +{ + aPageStartNF.Enable(aPageStartRB.IsChecked()); + return 0; +} + +SwTitlePageDlg::~SwTitlePageDlg() +{ + delete mpPageFmtDesc; +} + +IMPL_LINK( SwTitlePageDlg, EditHdl, Button *, /*pBtn*/ ) +{ + SwView& rView = mpSh->GetView(); + rView.GetDocShell()->FormatPage(aPagePropertiesLB.GetSelectEntry(), false, mpSh); + rView.InvalidateRulerPos(); + + return 0; +} + +IMPL_LINK( SwTitlePageDlg, OKHdl, Button *, /*pBtn*/ ) +{ + lcl_PushCursor(mpSh); + + mpSh->StartUndo(); + + SwFmtPageDesc aTitleDesc(mpTitleDesc); + + if (aSetPageNumberCB.IsChecked()) + aTitleDesc.SetNumOffset(aSetPageNumberNF.GetValue()); + else if (mpPageFmtDesc) + aTitleDesc.SetNumOffset(mpPageFmtDesc->GetNumOffset()); + + sal_uInt16 nNoPages = aPageCountNF.GetValue(); + if (!aUseExistingPagesRB.IsChecked()) + { + mpSh->GotoPage(GetInsertPosition(), false); + for (sal_uInt16 nI=0; nI < nNoPages; ++nI) + mpSh->InsertPageBreak(); + } + + mpSh->GotoPage(GetInsertPosition(), false); + for (sal_uInt16 nI=1; nI < nNoPages; ++nI) + { + if (mpSh->SttNxtPg()) + lcl_ChangePage(mpSh, 0, mpIndexDesc); + } + + mpSh->GotoPage(GetInsertPosition(), false); + mpSh->SetAttr(aTitleDesc); + + if (nNoPages > 1 && mpSh->GotoPage(GetInsertPosition() + nNoPages, false)) + { + SwFmtPageDesc aPageFmtDesc(mpNormalDesc); + mpSh->SetAttr(aPageFmtDesc); + } + + if (aRestartNumberingCB.IsChecked() || nNoPages > 1) + { + sal_uInt16 nPgNo = aRestartNumberingCB.IsChecked() ? aRestartNumberingNF.GetValue() : 0; + const SwPageDesc *pNewDesc = nNoPages > 1 ? mpNormalDesc : 0; + mpSh->GotoPage(GetInsertPosition() + nNoPages, false); + lcl_ChangePage(mpSh, nPgNo, pNewDesc); + } + + mpSh->EndUndo(); + lcl_PopCursor(mpSh); + if (!aUseExistingPagesRB.IsChecked()) + mpSh->GotoPage(GetInsertPosition(), false); + EndDialog( RET_OK ); + return 0; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/ui/misc/titlepage.hrc b/sw/source/ui/misc/titlepage.hrc new file mode 100644 index 000000000000..63678427cfca --- /dev/null +++ b/sw/source/ui/misc/titlepage.hrc @@ -0,0 +1,50 @@ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.) + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): Caolán McNamara <caolanm@redhat.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ +#define FL_MAKEINSERT 1 +#define RB_USE_EXISTING_PAGES 2 +#define RB_INSERT_NEW_PAGES 3 +#define FT_PAGE_COUNT 4 +#define NF_PAGE_COUNT 5 +#define FT_PAGE_PAGES 6 +#define FT_PAGE_START 7 +#define RB_DOCUMENT_START 8 +#define RB_PAGE_START 9 +#define NF_PAGE_START 10 +#define FL_NUMBERING 11 +#define CB_RESTART_NUMBERING 12 +#define FT_RESTART_NUMBERING 13 +#define NF_RESTART_NUMBERING 14 +#define CB_SET_PAGE_NUMBER 15 +#define FT_SET_PAGE_NUMBER 16 +#define NF_SET_PAGE_NUMBER 17 +#define FL_PAGE_PROPERTIES 18 +#define LB_PAGE_PROPERTIES 19 +#define PB_PAGE_PROPERTIES 20 +#define FL_BOTTOM 21 +#define PB_OK 22 +#define PB_CANCEL 23 +#define PB_HELP 24 diff --git a/sw/source/ui/misc/titlepage.src b/sw/source/ui/misc/titlepage.src new file mode 100644 index 000000000000..1f61be16144a --- /dev/null +++ b/sw/source/ui/misc/titlepage.src @@ -0,0 +1,244 @@ +/* + * Version: MPL 1.1 / GPLv3+ / LGPLv3+ + * + * The contents of this file are subject to the Mozilla Public 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.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Initial Developer of the Original Code is + * Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.) + * Portions created by the Initial Developer are Copyright (C) 2010 the + * Initial Developer. All Rights Reserved. + * + * Contributor(s): Caolán McNamara <caolanm@redhat.com> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 3 or later (the "GPLv3+"), or + * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), + * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable + * instead of those above. + */ + +#include "misc.hrc" +#include "titlepage.hrc" +#include "globals.hrc" +#include "cmdid.h" +#include "helpid.h" + +ModalDialog DLG_TITLEPAGE +{ + HelpID = HID_TITLEPAGE ; + OutputSize = TRUE ; + SVLook = TRUE ; + Size = MAP_APPFONT ( 216 , 229 ) ; + Text [ en-US ] = "Title Pages" ; + Moveable = TRUE ; + + FixedLine FL_MAKEINSERT + { + Pos = MAP_APPFONT ( 6 , 5 ) ; + Size = MAP_APPFONT ( 204 , 8 ) ; + Text [ en-US ] = "Make Title Pages" ; + Text [ x-comment ] = " "; + }; + RadioButton RB_USE_EXISTING_PAGES + { + Pos = MAP_APPFONT ( 12 , 18 ) ; + Size = MAP_APPFONT ( 198 , 10 ) ; + Text [ en-US ] = "Convert existing pages to title pages" ; + TabStop = TRUE ; + Check = TRUE ; + Text [ x-comment ] = " "; + }; + RadioButton RB_INSERT_NEW_PAGES + { + Pos = MAP_APPFONT ( 12 , 34 ) ; + Size = MAP_APPFONT ( 198 , 10 ) ; + Text [ en-US ] = "Insert new title pages" ; + Text [ x-comment ] = " "; + }; + FixedText FT_PAGE_COUNT + { + Pos = MAP_APPFONT ( 12 , 50 ) ; + Size = MAP_APPFONT ( 82 , 8 ) ; + Text [ en-US ] = "Number of title pages" ; + Text [ x-comment ] = " "; + }; + NumericField NF_PAGE_COUNT + { + Pos = MAP_APPFONT ( 100 , 50 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 65535; + First = 1 ; + Last = 65535; + SpinSize = 1 ; + }; + FixedText FT_PAGE_PAGES + { + Pos = MAP_APPFONT ( 136 , 50 ) ; + Size = MAP_APPFONT ( 80 , 10 ) ; + Text [ en-US ] = "pages" ; + Text [ x-comment ] = " "; + }; + FixedText FT_PAGE_START + { + Pos = MAP_APPFONT ( 12 , 66 ) ; + Size = MAP_APPFONT ( 82 , 8 ) ; + Text [ en-US ] = "Place title pages at" ; + Text [ x-comment ] = " "; + }; + RadioButton RB_DOCUMENT_START + { + Pos = MAP_APPFONT ( 100 , 66 ) ; + Size = MAP_APPFONT ( 110 , 10 ) ; + Text [ en-US ] = "Document Start" ; + TabStop = TRUE ; + Check = TRUE ; + Text [ x-comment ] = " "; + }; + RadioButton RB_PAGE_START + { + Pos = MAP_APPFONT ( 100 , 78 ) ; + Size = MAP_APPFONT ( 30 , 10 ) ; + Text [ en-US ] = "Page" ; + Text [ x-comment ] = " "; + }; + NumericField NF_PAGE_START + { + Pos = MAP_APPFONT ( 131 , 78 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 65535; + First = 1 ; + Last = 65535; + SpinSize = 1 ; + }; + FixedLine FL_NUMBERING + { + Pos = MAP_APPFONT ( 6 , 98 ) ; + Size = MAP_APPFONT ( 204 , 8 ) ; + Text [ en-US ] = "Page Numbering" ; + Text [ x-comment ] = " "; + }; + CheckBox CB_RESTART_NUMBERING + { + Pos = MAP_APPFONT ( 12, 111 ) ; + Size = MAP_APPFONT ( 198 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Reset Page Numbering after title pages" ; + Text [ x-comment ] = " "; + }; + FixedText FT_RESTART_NUMBERING + { + Pos = MAP_APPFONT ( 20 , 125 ) ; + Size = MAP_APPFONT ( 74 , 10 ) ; + Text [ en-US ] = "Page Number" ; + Text [ x-comment ] = " "; + }; + NumericField NF_RESTART_NUMBERING + { + Pos = MAP_APPFONT ( 100 , 125 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 65535; + First = 1 ; + Last = 65535; + SpinSize = 1 ; + }; + CheckBox CB_SET_PAGE_NUMBER + { + Pos = MAP_APPFONT ( 12 , 139 ) ; + Size = MAP_APPFONT ( 198 , 10 ) ; + TabStop = TRUE ; + Text [ en-US ] = "Set Page Number for first title page" ; + Text [ x-comment ] = " "; + }; + FixedText FT_SET_PAGE_NUMBER + { + Pos = MAP_APPFONT ( 20 , 153 ) ; + Size = MAP_APPFONT ( 74 , 10 ) ; + Text [ en-US ] = "Page Number" ; + Text [ x-comment ] = " "; + }; + NumericField NF_SET_PAGE_NUMBER + { + Pos = MAP_APPFONT ( 100 , 153 ) ; + Size = MAP_APPFONT ( 30 , 12 ) ; + Border = TRUE ; + TabStop = TRUE ; + Left = TRUE ; + Repeat = TRUE ; + Spin = TRUE ; + Minimum = 1 ; + Maximum = 65535; + First = 1 ; + Last = 65535; + SpinSize = 1 ; + }; + FixedLine FL_PAGE_PROPERTIES + { + Pos = MAP_APPFONT ( 6 , 169 ) ; + Size = MAP_APPFONT ( 204 , 8 ) ; + Text [ en-US ] = "Edit Page Properties" ; + Text [ x-comment ] = " "; + }; + ListBox LB_PAGE_PROPERTIES + { + Border = TRUE ; + Pos = MAP_APPFONT ( 12 , 182 ) ; + Size = MAP_APPFONT ( 132 , 80 ) ; + TabStop = TRUE ; + DropDown = TRUE ; + CurPos = 0 ; + }; + PushButton PB_PAGE_PROPERTIES + { + Pos = MAP_APPFONT ( 150 , 182 ) ; + Size = MAP_APPFONT ( 50 , 12 ) ; + Text [ en-US ] = "Edit..." ; + }; + FixedLine FL_BOTTOM + { + Pos = MAP_APPFONT ( 6 , 198 ) ; + Size = MAP_APPFONT ( 204 , 8 ) ; + }; + OKButton PB_OK + { + Pos = MAP_APPFONT ( 54 , 209 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + DefButton = TRUE ; + }; + CancelButton PB_CANCEL + { + Pos = MAP_APPFONT ( 107 , 209 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + DefButton = TRUE ; + }; + HelpButton PB_HELP + { + Pos = MAP_APPFONT ( 160 , 209 ) ; + Size = MAP_APPFONT ( 50 , 14 ) ; + }; +}; |