YSTest: HexBrowser.cpp 源文件

YSTest PreAlpha_b700_20160611 The YSLib Test Project

- 首页
- 相关页面
- 模块
- 命名空间
- 类
- 文件

- 文件列表
- 文件成员

HexBrowser.cpp
浏览该文件的文档.
1 /*
2 © 2011-2015 FrankHB.
3
4 This file is part of the YSLib project, and may only be used,
5 modified, and distributed under the terms of the YSLib project
6 license, LICENSE.TXT. By continuing to use, modify, or distribute
7 this file you indicate that you have read the license and
8 understand and accept it fully.
9 */
10
28 #include "HexBrowser.h"
29 #include <new>
30
31 namespace YSLib
32 {
33
34 using namespace Drawing;
35 using namespace Text;
36
37 namespace UI
38 {
39
40 HexModel::HexModel(const char* path)
41 {
42 source.open(Nonnull(path), std::ios_base::ate | std::ios_base::binary
43 | std::ios_base::in);
44 size = GetPosition();
45 }
46
47 HexView::HexView(FontCache& fc)
48 : TextState(fc), item_num(0), datCurrent()
49 {
50 TextState.Color = ColorSpace::Black;
51 }
52
53
54 HexViewArea::HexViewArea(const Rect& r, FontCache& fc)
55 : ScrollableContainer(r), HexView(fc),
56 model()
57 {
58 SetVisibleOf(hsbHorizontal, false);
59 SetVisibleOf(vsbVertical, true);
60 vsbVertical.SetSmallDelta(1);
61 yunseq(
62 vsbVertical.GetTrackRef().Scroll += [this](ScrollEventArgs&& e){
63 LocateViewPosition(round(e.GetValue()));
64 },
65 FetchEvent<KeyDown>(*this) += [this](KeyEventArgs&& e){
66 using namespace KeyCodes;
67
68 const auto& k(e.GetKeys());
69
70 if(k.count() != 1)
71 return;
72
73 ScrollCategory t(ScrollCategory::SmallDecrement);
74
75 if(k[Down])
76 t = ScrollCategory::SmallIncrement;
77 else if(k[PgUp])
78 t = ScrollCategory::LargeDecrement;
79 else if(k[PgDn])
80 t = ScrollCategory::LargeIncrement;
81 else if(!k[Up])
82 return;
83 vsbVertical.LocateThumb(k[Up] || k[Down] ? vsbVertical.GetSmallDelta()
84 : vsbVertical.GetLargeDelta(), t);
85 RequestFocus(*this);
86 e.Handled = true;
87 },
88 FetchEvent<KeyHeld>(*this) += OnKeyHeld
89 );
90 Reset();
91 }
92
93 void
94 HexViewArea::Load(const char* path)
95 {
96 model = HexModel(path);
97 Reset();
98
99 if(model)
100 {
101 const IndexType n_total_ln((model.GetSize() + ItemPerLine - 1)
102 / ItemPerLine);
103
104 if(n_total_ln > GetItemNum())
105 {
106 vsbVertical.SetMaxValue(n_total_ln - GetItemNum());
107 vsbVertical.SetLargeDelta(GetItemNum());
108 return;
109 }
110 }
111 SetVisibleOf(vsbVertical, {});
112 }
113
114 void
115 HexViewArea::LocateViewPosition(size_t line)
116 {
117 UpdateData(std::uint32_t(ItemPerLine * line));
118 UpdateView(true);
119 }
120
121 void
122 HexViewArea::Refresh(PaintEventArgs&& e)
123 {
124 using namespace Text;
125
126 // TODO: Refresh for 'rect' properly.
127 // Background(PaintEventArgs(*this, e.Target, e.Location, Rect(e.Location,
128 // GetWidth(), GetHeight())));
129 // Background(PaintEventArgs(*this, e));
130 ScrollableContainer::Refresh(std::move(e));
131 TextState.ResetPen();
132
133 auto& y(TextState.Pen.Y);
134 const SDst lh(GetItemHeight()), h(GetHeight()),
135 w_all(GetWidth() - vsbVertical.GetWidth()
136 - GetHorizontalOf(TextState.Margin)),
137 w_blank(w_all / (10 + ItemPerLine * 3)),
138 w_ch((w_all - w_blank * (1 + ItemPerLine)) / (8 + ItemPerLine * 2)),
139 w_addr(w_ch * 8 + w_blank),
140 w_item(w_ch * 2 + w_blank);
141 const auto fsize(model.GetSize());
142 auto& pen_x(TextState.Pen.X);
143 TextRenderer tr(TextState, e.Target);
144 auto pos(model.GetPosition());
145 auto i_data(datCurrent.cbegin());
146
147 while((y < 0 || SDst(y) < h) && pos < fsize && i_data < datCurrent.cend())
148 {
149 pen_x = TextState.Margin.Left;
150
151 auto x(pen_x);
152
153 {
154 char straddr[(32 >> 2) + 1];
155
156 std::sprintf(straddr, "%08tX", pos);
157 PutLine(tr, straddr);
158 }
159 // XXX: Conversion to 'SPos' might be implementation-defined.
160 x += SPos(w_addr);
161
162 const auto n(min<IndexType>(fsize - pos, IndexType(ItemPerLine)));
163
164 // XXX: Conversion to 'ptrdiff_t' might be implementation-defined.
165 for(IndexType j(0); j < n;
166 yunseq(++j, i_data += 2, x += ptrdiff_t(w_item)))
167 {
168 pen_x = x;
169 PutLine(tr, &*i_data, &*i_data + 2);
170 }
171 // XXX: Conversion to 'SPos' might be implementation-defined.
172 yunseq(y += SPos(lh + TextState.LineGap), pos += ItemPerLine);
173 }
174 }
175
176 void
177 HexViewArea::Reset()
178 {
179 vsbVertical.SetValue(0);
180 datCurrent.clear();
181 UpdateItemNum(GetHeight());
182 UpdateView();
183 }
184
185 void
186 HexViewArea::UpdateData(std::uint32_t pos)
187 {
188 if(model.IsValid() && pos < model.GetSize())
189 {
190 const DataType::size_type n(ItemPerLine * GetItemNum());
191 DataType v_buf(n);
192
193 if(YB_UNLIKELY(v_buf.empty()))
194 {
195 YTraceDe(Notice, "Give up empty view area.");
196 return;
197 }
198 // XXX: Conversion to 'std::streamoff' might be implementation-defined.
199 model.Seek(std::streamoff(pos));
200 v_buf.resize(DataType::size_type(model.Fill(&v_buf[0],
201 std::streamsize(n))));
202 datCurrent.resize(v_buf.size() * 2);
203
204 if(YB_UNLIKELY(datCurrent.empty()))
205 {
206 YTraceDe(Warning, "Empty data read.");
207 return;
208 }
209
210 auto b(&datCurrent[0]);
211
212 for(const char c : v_buf)
213 {
214 char h, l;
215
216 yunseq(h = (c >> 4 & 0x0F) + '0', l = (c & 0x0F) + '0');
217 *b++ = h > '9' ? h + 'A' - '9' - 1 : h;
218 *b++ = l > '9' ? l + 'A' - '9' - 1 : l;
219 }
220 // vsbVertical.SetValue(pos / ItemPerLine);
221 // NOTE: 'Refresh' needs this to check if it is towards EOF.
222 // XXX: Conversion to 'std::streamoff' might be implementation-defined.
223 model.Seek(std::streamoff(pos));
224 }
225 }
226
227 void
228 HexViewArea::UpdateView(bool is_active)
229 {
230 ViewChanged(ViewArgs(*this, is_active));
231 Invalidate(*this);
232 }
233
234 } // namespace UI;
235
236 } // namespace YSLib;
237
YSLib::UI::fc
fc
Definition: Console.h:93
YSLib::UI::HexViewArea::UpdateView
void UpdateView(bool={})
更新视图。
Definition: HexBrowser.cpp:228
platform::KeyCodes::DS::PgUp
static yconstexpr const NativeSet PgUp
Definition: Keys.h:237
platform::Nonnull
_type && Nonnull(_type &&p) ynothrow
断言并返回非空指针。
Definition: Debug.h:411
platform::Descriptions::Warning
Definition: YCommon.h:157
YSLib::UI::HexViewArea::LocateViewPosition
void LocateViewPosition(size_t)
定位视图顶端至指定竖直位置（行数）。
Definition: HexBrowser.cpp:115
YSLib::UI::HexView
十六进制视图。
Definition: HexBrowser.h:101
YSLib::Drawing::TextState::Pen
Point Pen
笔坐标。
Definition: TextBase.h:98
YSLib::Consoles::Black
Definition: YConsole.h:53
platform::KeyCodes
本机按键编码。
Definition: Keys.h:203
YSLib::Drawing::FontCache
字体缓存。
Definition: Font.h:460
YSLib
YSLib 命名空间。
Definition: AndroidHost.h:45
YSLib::UI::ATrack::Scroll
GEvent< void(ScrollEventArgs &&)> Scroll
滚动事件。
Definition: Scroll.h:167
YSLib::UI::HexView::ItemPerLine
static yconstexpr const size_t ItemPerLine
每行数据总数（字节）。
Definition: HexBrowser.h:104
YSLib::UI::HexViewArea::ViewArgs
GValueEventArgs< bool > ViewArgs
视图参数类型。
Definition: HexBrowser.h:155
YSLib::UI::ScrollEventArgs
滚动事件参数类。
Definition: Scroll.h:67
YSLib::Drawing::GBinaryGroup::X
_type X
Definition: YGDIBase.h:63
YSLib::Drawing::PutLine
_tIter PutLine(_tRenderer &rd, _tIter s)
打印迭代器指定的起始字符的字符串，直至行尾或字符迭代终止。
Definition: TextRenderer.h:170
YSLib::Drawing::TextRenderer
文本渲染器：简单实现。
Definition: TextRenderer.h:398
YSLib::UI::HexView::HexView
HexView(FontCache &=FetchDefaultFontCache())
Definition: HexBrowser.cpp:47
YSLib::UI::ScrollCategory
ScrollCategory
滚动类别。
Definition: Scroll.h:49
YSLib::UI::HexView::DataType
vector< char > DataType
显示数据类型。
Definition: HexBrowser.h:107
YSLib::Drawing::GBinaryGroup::Y
_type Y
分量。
Definition: YGDIBase.h:63
YSLib::UI::HexViewArea::UpdateData
void UpdateData(std::uint32_t)
Definition: HexBrowser.cpp:186
YSLib::UI::ScrollBar::GetTrackRef
ATrack GetTrackRef()) DefGetterMem(const ynothrow
CHRLib::c
c
Definition: CharacterProcessing.h:81
YSLib::UI::HexViewArea::model
HexModel model
模型。
Definition: HexBrowser.h:161
YSLib::UI::Invalidate
YF_API void Invalidate(IWidget &, const Rect &)
无效化：使相对部件的指定区域在直接和间接的窗口缓冲区中无效。
Definition: YWidget.cpp:108
YTraceDe
#define YTraceDe(...)
YCLib 默认调试跟踪。
Definition: Debug.h:305
YSLib::Drawing::PenStyle::Color
Drawing::Color Color
笔颜色。
Definition: TextBase.h:58
YSLib::UI::HexViewArea::Reset
void Reset()
Definition: HexBrowser.cpp:177
YB_UNLIKELY
#define YB_UNLIKELY(_expr)
分支预测提示。
Definition: ydef.h:438
YSLib::UI::ScrollableContainer::vsbVertical
ScrollBar vsbVertical
Definition: Scroll.h:419
YSLib::UI::OnKeyHeld
YF_API void OnKeyHeld(KeyEventArgs &&)
处理键接触保持事件。
Definition: YControl.cpp:109
YSLib::UI::x
SPos x
Definition: YWidget.cpp:43
ystdex::size
auto size(const _tRange &c) -> decltype(c.size())
类容器访问。
Definition: range.hpp:233
YSLib::UI::Widget::SDst
SDst
Definition: YWidget.h:454
YSLib::Drawing::TextState::ResetPen
PDefHOp(TextState &,=, const PenStyle &ps) ImplRet(PenStyle void ResetPen()
赋值：笔样式。
Definition: TextBase.h:145
yunseq
#define yunseq
无序列依赖表达式组求值。
Definition: ydef.h:996
YSLib::path
YF_API const char * path
Definition: Initialization.h:74
YSLib::UI::Widget::Refresh
virtual void Refresh(PaintEventArgs &&)
刷新：按指定参数绘制界面并更新状态。
Definition: YWidget.cpp:264
YSLib::Drawing::GetHeight
tr GetHeight())) inline PDefH(void
按字体高度和行距调整文本区域的底边距。
YSLib::Drawing::Rect
屏幕标准矩形：表示屏幕矩形区域。
Definition: YGDIBase.h:540
YSLib::UI::BorderArea::Down
YSLib::UI::ScrollableContainer
带滚动条的容器。
Definition: Scroll.h:407
YSLib::Drawing::r
The boundary is out of the const Graphics const Rect const Point const Point Color c const Rect const Rect & r
Definition: YDraw.h:174
YSLib::UI::HexViewArea::Refresh
void Refresh(PaintEventArgs &&) override
刷新：按指定参数绘制界面并更新状态。
Definition: HexBrowser.cpp:122
YSLib::Drawing::TextState::LineGap
std::uint8_t LineGap
行距。
Definition: TextBase.h:99
YSLib::Drawing::TextState::Margin
Padding Margin
边距：文本区域到显示区域的距离。
Definition: TextBase.h:93
YSLib::UI::HexView::datCurrent
DataType datCurrent
当前显示的数据。
Definition: HexBrowser.h:120
YSLib::UI::ScrollCategory::LargeIncrement
滚动框大距离增量移动。
Drawing
UI
YSLib::UI::y
SPos SPos y
Definition: YWidget.cpp:44
YSLib::UI::HexViewArea::HexViewArea
HexViewArea(const Drawing::Rect &={}, FontCache &=FetchDefaultFontCache())
Definition: HexBrowser.cpp:54
YSLib::UI::HexView::IndexType
std::uintptr_t IndexType
索引类型。
Definition: HexBrowser.h:106
YSLib::UI::Widget::SPos
Renderer AView SPos
Definition: YWidget.h:459
YSLib::UI::e
void e
Definition: YWidget.h:352
Text
HexBrowser.h
十六进制浏览器。
YSLib::UI::PaintEventArgs
部件绘制参数。
Definition: YWidgetEvent.h:323
platform::KeyCodes::DS::PgDn
static yconstexpr const NativeSet PgDn
Definition: Keys.h:237
YSLib::UI::BorderArea::Up
YSLib::UI::ScrollCategory::SmallDecrement
滚动框小距离减量移动。
YSLib::Drawing::Padding::Left
SPos Left
空白距离：左、右、上、下。
Definition: YGDI.h:52
YSLib::UI::ScrollableContainer::hsbHorizontal
ScrollBar hsbHorizontal
控制水平和竖直可视区域的水平滚动条。
Definition: Scroll.h:419
YSLib::Drawing::TextState
文本状态。
Definition: TextBase.h:86
YSLib::UI::ScrollCategory::SmallIncrement
滚动框小距离增量移动。
platform::Descriptions::Notice
Definition: YCommon.h:158
YSLib::UI::HexViewArea::ViewChanged
GEvent< void(ViewArgs)> ViewChanged
视图变更事件。
Definition: HexBrowser.h:168
YSLib::UI::KeyEventArgs
按键输入事件参数类。
Definition: YWidgetEvent.h:186
YSLib::UI::ScrollCategory::LargeDecrement
滚动框大距离减量移动。
platform::n
size_t n
Definition: YCLib/FileSystem.cpp:321
platform::SDst
std::uint16_t SDst
屏幕坐标距离。
Definition: Video.h:43
YSLib::UI::HexModel
十六进制模型：十六进制视图区域数据源。
Definition: HexBrowser.h:48