| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_shell.hxx" |
| |
| #ifdef _MSC_VER |
| #pragma warning (disable : 4786 4503) |
| #endif |
| |
| //------------------------------------ |
| // include |
| //------------------------------------ |
| #include "listviewbuilder.hxx" |
| #include "document_statistic.hxx" |
| #include "internal/utilities.hxx" |
| #include "internal/config.hxx" |
| |
| #if defined _MSC_VER |
| #pragma warning(push, 1) |
| #endif |
| #include <commctrl.h> |
| #if defined _MSC_VER |
| #pragma warning(pop) |
| #endif |
| #include <commctrl.h> |
| #include <tchar.h> |
| #include "internal/resource.h" |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| list_view_builder_ptr create_list_view_builder( |
| HWND hwnd_lv, const std::wstring& col1, const std::wstring& col2) |
| { |
| if (is_windows_xp_or_above()) |
| return list_view_builder_ptr(new winxp_list_view_builder(hwnd_lv, col1, col2)); |
| else |
| return list_view_builder_ptr(new list_view_builder(hwnd_lv, col1, col2)); |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| list_view_builder::list_view_builder( |
| HWND hwnd_list_view, |
| const std::wstring& column1_title, |
| const std::wstring& column2_title) : |
| hwnd_list_view_(hwnd_list_view), |
| row_index_(-1), |
| column1_title_(column1_title), |
| column2_title_(column2_title) |
| { |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| list_view_builder::~list_view_builder() |
| { |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void list_view_builder::build(statistic_group_list_t& gl) |
| { |
| setup_list_view(); |
| |
| statistic_group_list_t::iterator group_iter = gl.begin(); |
| statistic_group_list_t::iterator group_iter_end = gl.end(); |
| |
| for (/**/; group_iter != group_iter_end; ++group_iter) |
| { |
| statistic_item_list_t::iterator item_iter = group_iter->second.begin(); |
| statistic_item_list_t::iterator item_iter_end = group_iter->second.end(); |
| |
| if (item_iter != item_iter_end) |
| insert_group(group_iter->first); |
| |
| for (/**/; item_iter != item_iter_end; ++item_iter) |
| insert_item(item_iter->title_, item_iter->value_, item_iter->editable_); |
| } |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void list_view_builder::setup_list_view() |
| { |
| HIMAGELIST h_ils = ImageList_Create(16,15,ILC_MASK, 7, 0); |
| HBITMAP h_bmp = LoadBitmap(GetModuleHandle(MODULE_NAME), MAKEINTRESOURCE(IDB_PROPERTY_IMAGES)); |
| ImageList_AddMasked(h_ils, h_bmp, RGB(255, 0, 255)); |
| |
| ListView_SetImageList(hwnd_list_view_, h_ils, LVSIL_SMALL); |
| |
| std::wstring header = GetResString(IDS_PROPERTY); |
| |
| LVCOLUMN lvc; |
| lvc.mask = LVCF_FMT | |
| LVCF_WIDTH | |
| LVCF_TEXT | |
| LVCF_SUBITEM; |
| |
| lvc.iSubItem = 0; |
| lvc.pszText = const_cast<wchar_t*>(header.c_str()); |
| lvc.cx = 120; |
| lvc.fmt = LVCFMT_LEFT; |
| |
| ListView_InsertColumn(hwnd_list_view_, 0, &lvc); |
| lvc.iSubItem = 1; |
| header = GetResString(IDS_PROPERTY_VALUE); |
| lvc.pszText = const_cast<wchar_t*>(header.c_str()); |
| ListView_InsertColumn(hwnd_list_view_, 1, &lvc); |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void list_view_builder::insert_group(const std::wstring& /*title*/) |
| { |
| insert_item(L"", L"", false); |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void list_view_builder::insert_item(const std::wstring& title, const std::wstring& value, bool is_editable) |
| { |
| LVITEM lvi; |
| |
| lvi.iItem = ++row_index_; |
| lvi.iSubItem = 0; |
| lvi.mask = LVIF_TEXT; |
| lvi.state = 0; |
| lvi.cchTextMax = title.size() + 1; |
| lvi.stateMask = 0; |
| lvi.pszText = const_cast<wchar_t*>(title.c_str()); |
| |
| if (title.length() > 0) |
| { |
| lvi.mask |= LVIF_IMAGE; |
| |
| if (is_editable) |
| lvi.iImage = 4; |
| else |
| lvi.iImage = 3; |
| } |
| |
| ListView_InsertItem(hwnd_list_view_, &lvi); |
| |
| lvi.mask = LVIF_TEXT; |
| lvi.iSubItem = 1; |
| lvi.pszText = const_cast<wchar_t*>(value.c_str()); |
| |
| ListView_SetItem(hwnd_list_view_, &lvi); |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| HWND list_view_builder::get_list_view() const |
| { |
| return hwnd_list_view_; |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| winxp_list_view_builder::winxp_list_view_builder( |
| HWND hwnd_list_view, |
| const std::wstring& column1_title, |
| const std::wstring& column2_title) : |
| list_view_builder(hwnd_list_view, column1_title, column2_title), |
| group_count_(-1), |
| row_count_(0) |
| { |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void winxp_list_view_builder::setup_list_view() |
| { |
| list_view_builder::setup_list_view(); |
| |
| ListView_EnableGroupView(get_list_view(), TRUE); |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void winxp_list_view_builder::insert_group(const std::wstring& name) |
| { |
| LVGROUP lvg; |
| |
| ZeroMemory(&lvg, sizeof(lvg)); |
| |
| lvg.cbSize = sizeof(lvg); |
| lvg.mask = LVGF_HEADER | LVGF_STATE | LVGF_GROUPID; |
| lvg.pszHeader = const_cast<wchar_t*>(name.c_str()); |
| lvg.cchHeader = name.size() + 1; |
| lvg.iGroupId = ++group_count_; |
| lvg.state = LVGS_NORMAL; |
| lvg.uAlign = LVGA_HEADER_CENTER; |
| |
| ListView_InsertGroup(get_list_view(), row_count_++, &lvg); |
| } |
| |
| //------------------------------------ |
| // |
| //------------------------------------ |
| |
| void winxp_list_view_builder::insert_item( |
| const std::wstring& title, const std::wstring& value, bool is_editable) |
| { |
| LVITEM lvi; |
| |
| lvi.iItem = ++row_index_; |
| lvi.iSubItem = 0; |
| lvi.mask = LVIF_TEXT | LVIF_GROUPID; |
| lvi.state = 0; |
| lvi.stateMask = 0; |
| lvi.pszText = const_cast<wchar_t*>(title.c_str()); |
| lvi.iGroupId = group_count_; |
| |
| if (title.length() > 0) |
| { |
| lvi.mask |= LVIF_IMAGE; |
| |
| if (is_editable) |
| lvi.iImage = 4; |
| else |
| lvi.iImage = 3; |
| } |
| |
| ListView_InsertItem(get_list_view(), &lvi); |
| |
| lvi.mask = LVIF_TEXT; |
| lvi.iSubItem = 1; |
| lvi.pszText = const_cast<wchar_t*>(value.c_str()); |
| |
| ListView_SetItem(get_list_view(), &lvi); |
| |
| row_count_++; |
| } |