diff options
Diffstat (limited to '')
-rw-r--r-- | vcl/source/treelist/iconview.cxx | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/vcl/source/treelist/iconview.cxx b/vcl/source/treelist/iconview.cxx new file mode 100644 index 000000000..162096bff --- /dev/null +++ b/vcl/source/treelist/iconview.cxx @@ -0,0 +1,221 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <vcl/treelistentry.hxx> +#include <vcl/viewdataentry.hxx> +#include <iconview.hxx> +#include "iconviewimpl.hxx" + +IconView::IconView( vcl::Window* pParent, WinBits nBits ) + : SvTreeListBox( pParent, nBits ) +{ + nColumns = 1; + mbCenterAndClipText = true; + SetEntryHeight( 100 ); + SetEntryWidth( 100 ); + + pImpl.reset( new IconViewImpl( this, GetModel(), GetStyle() ) ); +} + +void IconView::Resize() +{ + Size aBoxSize = Control::GetParent()->GetOutputSizePixel(); + + if ( !aBoxSize.Width() ) + return; + + SetSizePixel( aBoxSize ); + + nColumns = aBoxSize.Width() / nEntryWidth; + + SvTreeListBox::Resize(); +} + +tools::Rectangle IconView::GetFocusRect(const SvTreeListEntry*, long nEntryPos) +{ + Size aSize; + aSize.setHeight( nEntryHeight ); + aSize.setWidth( nEntryWidth ); + + Point aPos; + aPos.setX( 0 ); + aPos.setY( 0 ); + + tools::Rectangle aRect; + + short nCols = GetColumnsCount(); + + if(nCols) + { + aPos.setY( ( nEntryPos / nCols ) * nEntryHeight ); + aPos.setX( ( nEntryPos % nCols ) * nEntryWidth ); + } + + aRect.SetPos( aPos ); + aRect.SetSize( aSize ); + + return aRect; +} + +void IconView::PaintEntry(SvTreeListEntry& rEntry, long nX, long nY, + vcl::RenderContext& rRenderContext) +{ + + tools::Rectangle aRect; // multi purpose + + PreparePaint(rRenderContext, rEntry); + + pImpl->UpdateContextBmpWidthMax(&rEntry); + + short nTempEntryHeight = GetEntryHeight(); + short nTempEntryWidth = GetEntryWidth(); + + Point aEntryPos; + + Color aBackupTextColor(rRenderContext.GetTextColor()); + vcl::Font aBackupFont(rRenderContext.GetFont()); + Color aBackupColor = rRenderContext.GetFillColor(); + + bool bCurFontIsSel = false; + const WinBits nWindowStyle = GetStyle(); + const bool bHideSelection = (nWindowStyle & WB_HIDESELECTION) !=0 && !HasFocus(); + const StyleSettings& rSettings = rRenderContext.GetSettings().GetStyleSettings(); + + vcl::Font aHighlightFont(rRenderContext.GetFont()); + const Color aHighlightTextColor(rSettings.GetHighlightTextColor()); + aHighlightFont.SetColor(aHighlightTextColor); + + Size aRectSize(nTempEntryWidth, nTempEntryHeight); + + SvViewDataEntry* pViewDataEntry = GetViewDataEntry( &rEntry ); + + sal_uInt16 nItemCount = rEntry.ItemCount(); + sal_uInt16 nCurItem = 0; + sal_uInt16 nIconItem = nItemCount; + + while (nCurItem < nItemCount) + { + SvLBoxItem* pItem = nCurItem < nItemCount ? &rEntry.GetItem(nCurItem) : nullptr; + SvLBoxItemType nItemType = pItem->GetType(); + + if (nItemType == SvLBoxItemType::ContextBmp) + { + nIconItem = nCurItem; + nCurItem++; + continue; + } + + auto nItemHeight = SvLBoxItem::GetHeight(pViewDataEntry, nCurItem); + + aEntryPos.setX( nX ); + aEntryPos.setY( nY ); + + // set background pattern/color + + Wallpaper aWallpaper = rRenderContext.GetBackground(); + + if (pViewDataEntry->IsHighlighted()) + { + Color aNewWallColor = rSettings.GetHighlightColor(); + // if the face color is bright then the deactivate color is also bright + // -> so you can't see any deactivate selection + if (bHideSelection && !rSettings.GetFaceColor().IsBright() + && aWallpaper.GetColor().IsBright() != rSettings.GetDeactiveColor().IsBright()) + { + aNewWallColor = rSettings.GetDeactiveColor(); + } + // set font color to highlight + if (!bCurFontIsSel) + { + rRenderContext.SetTextColor(aHighlightTextColor); + rRenderContext.SetFont(aHighlightFont); + bCurFontIsSel = true; + } + aWallpaper.SetColor(aNewWallColor); + } + else // no selection + { + if (bCurFontIsSel) + { + bCurFontIsSel = false; + rRenderContext.SetTextColor(aBackupTextColor); + rRenderContext.SetFont(aBackupFont); + } + else + { + aWallpaper.SetColor(rEntry.GetBackColor()); + } + } + + // draw background + if (!(nTreeFlags & SvTreeFlags::USESEL)) + { + aRect.SetPos(aEntryPos); + aRect.SetSize(aRectSize); + + Color aBackgroundColor = aWallpaper.GetColor(); + if (aBackgroundColor != COL_TRANSPARENT) + { + rRenderContext.SetFillColor(aBackgroundColor); + // this case may occur for smaller horizontal resizes + if (aRect.Left() < aRect.Right()) + rRenderContext.DrawRect(aRect); + } + } + + // center vertically + aEntryPos.AdjustY((nTempEntryHeight - nItemHeight) / 2 ); + + aEntryPos.AdjustY(15 ); + + pItem->Paint(aEntryPos, *this, rRenderContext, pViewDataEntry, rEntry); + + rRenderContext.SetFillColor(aBackupColor); + + nCurItem++; + } + + // draw icon + if(nIconItem != nItemCount && nIconItem < nItemCount) + { + SvLBoxItem* pItem = &rEntry.GetItem(nIconItem); + auto nItemWidth = pItem->GetWidth(this, pViewDataEntry, nIconItem); + auto nItemHeight = SvLBoxItem::GetHeight(pViewDataEntry, nIconItem); + + aEntryPos.setX( nX ); + aEntryPos.setY( nY ); + + // center horizontally + aEntryPos.AdjustX((nTempEntryWidth - nItemWidth) / 2 ); + // center vertically + aEntryPos.AdjustY((nTempEntryHeight - nItemHeight) / 2 ); + + aEntryPos.AdjustY( -10 ); + + pItem->Paint(aEntryPos, *this, rRenderContext, pViewDataEntry, rEntry); + } + + if (bCurFontIsSel) + { + rRenderContext.SetTextColor(aBackupTextColor); + rRenderContext.SetFont(aBackupFont); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |