1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _POSTITMGR_HXX 25 #define _POSTITMGR_HXX 26 27 #include <list> 28 #include <vector> 29 #include <editeng/outlobj.hxx> 30 #include <tools/string.hxx> 31 #include <tools/link.hxx> 32 #include <tools/debug.hxx> 33 #include <swrect.hxx> 34 #include <unotools/configitem.hxx> 35 #include <unotools/options.hxx> 36 #include <com/sun/star/util/SearchOptions.hpp> 37 #include <com/sun/star/uno/Any.hxx> 38 #include <SidebarWindowsTypes.hxx> 39 #include <svl/lstner.hxx> 40 41 class SwWrtShell; 42 class SwDoc; 43 class SwView; 44 class SwPostItField; 45 class SwFmtFld; 46 class SwField; 47 class SfxBroadcaster; 48 class SfxHint; 49 class SwEditWin; 50 class Color; 51 class SvxSearchItem; 52 class SvxLanguageItem; 53 namespace sw { namespace annotation { 54 class SwAnnotationWin; 55 }} 56 namespace sw { namespace sidebarwindows { 57 class SwSidebarWin; 58 class SwFrmSidebarWinContainer; 59 }} 60 class SwSidebarItem; 61 class SwFrm; 62 class Window; 63 64 #define SORT_POS 1 65 #define SORT_AUTHOR 2 66 #define SORT_DATE 3 67 68 #define COL_NOTES_SIDEPANE_ARROW_ENABLED RGB_COLORDATA(0,0,0) 69 #define COL_NOTES_SIDEPANE_ARROW_DISABLED RGB_COLORDATA(172,168,153) 70 71 typedef std::list<SwSidebarItem*> SwSidebarItem_list; 72 typedef std::list<SwSidebarItem*>::iterator SwSidebarItem_iterator; 73 74 75 struct SwPostItPageItem 76 { 77 bool bScrollbar; 78 sw::sidebarwindows::SidebarPosition eSidebarPosition; 79 long lOffset; 80 SwRect mPageRect; 81 SwSidebarItem_list* mList; 82 SwPostItPageItem(): bScrollbar(false),lOffset(0) 83 { 84 mList = new SwSidebarItem_list; 85 } 86 ~SwPostItPageItem() 87 { 88 mList->clear(); 89 delete mList; 90 } 91 92 }; 93 94 struct FieldShadowState 95 { 96 const SwPostItField* mpShadowFld; 97 bool bCursor; 98 bool bMouse; 99 FieldShadowState(): mpShadowFld(0),bCursor(false),bMouse(false) 100 { 101 } 102 }; 103 104 class SwNoteProps: public utl::ConfigItem 105 { 106 private: 107 bool bIsShowAnchor; 108 public: 109 SwNoteProps() 110 : ConfigItem(::rtl::OUString::createFromAscii("Office.Writer/Notes")) 111 , bIsShowAnchor(false) 112 { 113 const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rNames = GetPropertyNames(); 114 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > aValues = GetProperties(rNames); 115 const ::com::sun::star::uno::Any* pValues = aValues.getConstArray(); 116 DBG_ASSERT(aValues.getLength() == rNames.getLength(), "GetProperties failed"); 117 if (aValues.getLength()) 118 pValues[0]>>=bIsShowAnchor; 119 } 120 121 bool IsShowAnchor() 122 { 123 return bIsShowAnchor; 124 } 125 ::com::sun::star::uno::Sequence< ::rtl::OUString >& GetPropertyNames() 126 { 127 static ::com::sun::star::uno::Sequence< ::rtl::OUString > aNames; 128 if(!aNames.getLength()) 129 { 130 static const char* aPropNames[] = 131 { 132 "ShowAnkor" 133 }; 134 const int nCount = sizeof(aPropNames)/sizeof(const char*); 135 aNames.realloc(nCount); 136 ::rtl::OUString* pNames = aNames.getArray(); 137 for(int i = 0; i < nCount; i++) 138 pNames[i] = ::rtl::OUString::createFromAscii(aPropNames[i]); 139 } 140 return aNames; 141 } 142 143 virtual void Commit(); 144 virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); 145 }; 146 147 class SwPostItMgr: public SfxListener 148 { 149 private: 150 SwView* mpView; 151 SwWrtShell* mpWrtShell; 152 SwEditWin* mpEditWin; 153 std::list< SwSidebarItem*> mvPostItFlds; 154 std::vector<SwPostItPageItem*> mPages; 155 sal_uLong mnEventId; 156 bool mbWaitingForCalcRects; 157 sw::sidebarwindows::SwSidebarWin* mpActivePostIt; 158 bool mbLayout; 159 long mbLayoutHeight; 160 long mbLayouting; 161 bool mbReadOnly; 162 bool mbDeleteNote; 163 FieldShadowState mShadowState; 164 OutlinerParaObject* mpAnswer; 165 bool mbIsShowAnchor; 166 167 // data structure to collect the <SwSidebarWin> instances for certain <SwFrm> instances. 168 sw::sidebarwindows::SwFrmSidebarWinContainer* mpFrmSidebarWinContainer; 169 170 typedef std::list<sw::sidebarwindows::SwSidebarWin*>::iterator SwSidebarWin_iterator; 171 172 void AddPostIts(bool bCheckExistance = true,bool bFocus = true); 173 //void AddRedlineComments(bool bCheckExistance, bool bFocus); 174 void RemoveSidebarWin(); 175 void PreparePageContainer(); 176 void Scroll(const long lScroll,const unsigned long aPage ); 177 void AutoScroll(const sw::sidebarwindows::SwSidebarWin* pPostIt,const unsigned long aPage ); 178 bool ScrollbarHit(const unsigned long aPage,const Point &aPoint); 179 bool LayoutByPage( std::list<sw::sidebarwindows::SwSidebarWin*> &aVisiblePostItList, 180 const Rectangle aBorder, 181 long lNeededHeight); 182 void CheckForRemovedPostIts(); 183 bool ArrowEnabled(sal_uInt16 aDirection,unsigned long aPage) const; 184 bool BorderOverPageBorder(unsigned long aPage) const; 185 bool HasScrollbars() const; 186 void Focus(SfxBroadcaster& rBC); 187 188 sal_Int32 GetInitialAnchorDistance() const; 189 sal_Int32 GetScrollSize() const; 190 sal_Int32 GetSpaceBetween() const; 191 void SetReadOnlyState(); 192 DECL_LINK( CalcHdl, void*); 193 194 sw::sidebarwindows::SwSidebarWin* GetSidebarWin(const SfxBroadcaster* pBroadcaster) const; 195 196 void InsertItem( SfxBroadcaster* pItem, bool bCheckExistance, bool bFocus); 197 void RemoveItem( SfxBroadcaster* pBroadcast ); 198 199 void Sort(const short aType); 200 201 public: 202 SwPostItMgr(SwView* aDoc); 203 ~SwPostItMgr(); 204 205 typedef std::list< SwSidebarItem* >::const_iterator const_iterator; 206 const_iterator begin() const { return mvPostItFlds.begin(); } 207 const_iterator end() const { return mvPostItFlds.end(); } 208 209 void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); 210 211 void LayoutPostIts(); 212 bool CalcRects(); 213 214 void MakeVisible( const sw::sidebarwindows::SwSidebarWin* pPostIt, 215 long aPage = -1); 216 217 bool ShowScrollbar(const unsigned long aPage) const; 218 bool HasNotes() const ; 219 bool ShowNotes() const; 220 bool IsShowAnchor() { return mbIsShowAnchor;} 221 unsigned long GetSidebarWidth(bool bPx = false) const; 222 unsigned long GetSidebarBorderWidth(bool bPx = false) const; 223 unsigned long GetNoteWidth(); 224 225 void PrepareView(bool bIgnoreCount = false); 226 227 void CorrectPositions(); 228 229 void SetLayout() { mbLayout = true; }; 230 void Delete(String aAuthor); 231 void Delete(); 232 233 #if 0 234 void Hide( SwPostItField* pPostItField ); 235 #endif 236 void Hide( const String& rAuthor ); 237 void Hide(); 238 void Show(); 239 240 void Rescale(); 241 242 Rectangle GetBottomScrollRect(const unsigned long aPage) const; 243 Rectangle GetTopScrollRect(const unsigned long aPage) const; 244 245 bool IsHit(const Point &aPointPixel); 246 Color GetArrowColor(sal_uInt16 aDirection,unsigned long aPage) const; 247 248 sw::annotation::SwAnnotationWin* GetAnnotationWin(const SwPostItField* pFld) const; 249 250 sw::sidebarwindows::SwSidebarWin* GetNextPostIt( sal_uInt16 aDirection, 251 sw::sidebarwindows::SwSidebarWin* aPostIt); 252 long GetNextBorder(); 253 254 sw::sidebarwindows::SwSidebarWin* GetActiveSidebarWin() { return mpActivePostIt; } 255 void SetActiveSidebarWin( sw::sidebarwindows::SwSidebarWin* p); 256 bool HasActiveSidebarWin() const; 257 bool HasActiveAnnotationWin() const; 258 void GrabFocusOnActiveSidebarWin(); 259 void UpdateDataOnActiveSidebarWin(); 260 void DeleteActiveSidebarWin(); 261 void HideActiveSidebarWin(); 262 void ToggleInsModeOnActiveSidebarWin(); 263 264 sal_Int32 GetMinimumSizeWithMeta() const; 265 sal_Int32 GetSidebarScrollerHeight() const; 266 267 void SetShadowState(const SwPostItField* pFld,bool bCursor = true); 268 269 void SetSpellChecking(); 270 271 Color GetColorDark(sal_uInt16 aAuthorIndex); 272 Color GetColorLight(sal_uInt16 aAuthorIndex); 273 Color GetColorAnchor(sal_uInt16 aAuthorIndex); 274 275 276 void RegisterAnswer(OutlinerParaObject* pAnswer) { mpAnswer = pAnswer;} 277 OutlinerParaObject* IsAnswer() {return mpAnswer;} 278 void CheckMetaText(); 279 void StartSpelling(); 280 281 sal_uInt16 Replace(SvxSearchItem* pItem); 282 sal_uInt16 SearchReplace(const SwFmtFld &pFld, const ::com::sun::star::util::SearchOptions& rSearchOptions,bool bSrchForward); 283 sal_uInt16 FinishSearchReplace(const ::com::sun::star::util::SearchOptions& rSearchOptions,bool bSrchForward); 284 285 // get the PostIt window by index 286 sal_Int32 GetPostItCount() {return mvPostItFlds.size();}; 287 void AssureStdModeAtShell(); 288 289 void ConnectSidebarWinToFrm( const SwFrm& rFrm, 290 const SwFmtFld& rFmtFld, 291 sw::sidebarwindows::SwSidebarWin& rSidebarWin ); 292 void DisconnectSidebarWinFromFrm( const SwFrm& rFrm, 293 sw::sidebarwindows::SwSidebarWin& rSidebarWin ); 294 bool HasFrmConnectedSidebarWins( const SwFrm& rFrm ); 295 Window* GetSidebarWinForFrmByIndex( const SwFrm& rFrm, 296 const sal_Int32 nIndex ); 297 void GetAllSidebarWinForFrm( const SwFrm& rFrm, 298 std::vector< Window* >* pChildren ); 299 }; 300 301 #endif 302 303 304 305 306