32 using namespace Drawing;
38 : TextState(
fc), item_num(0), datCurrent()
44 HexViewArea::HexViewArea(
const Rect& r, FontCache&
fc)
45 : ScrollableContainer(r),
HexView(fc),
50 vsbVertical.SetSmallDelta(1);
52 vsbVertical.GetTrack().GetScroll() += [
this](ScrollEventArgs&& e){
53 LocateViewPosition(round(e.GetValue()));
55 FetchEvent<KeyDown>(*this) += [
this](KeyEventArgs&& e){
56 using namespace KeyCodes;
58 const auto& k(e.GetKeys());
66 t = ScrollCategory::SmallIncrement;
68 t = ScrollCategory::LargeDecrement;
70 t = ScrollCategory::LargeIncrement;
73 vsbVertical.LocateThumb(k[Up] || k[Down]
74 ? vsbVertical.GetSmallDelta() : vsbVertical.GetLargeDelta(), t);
87 model = make_unique<File>(path);
92 if(n_total_ln > GetItemNum())
94 vsbVertical.SetMaxValue(n_total_ln - GetItemNum());
95 vsbVertical.SetLargeDelta(GetItemNum());
111 using namespace Text;
117 ScrollableContainer::Refresh(std::move(e));
123 const SDst lh(GetItemHeight()),
h(GetHeight()),
124 w_all(GetWidth() - vsbVertical.GetWidth()
126 w_blank(w_all / (10 + ItemPerLine * 3)),
127 w_ch((w_all - w_blank * (1 + ItemPerLine)) / (8 + ItemPerLine * 2)),
128 w_addr(w_ch * 8 + w_blank),
129 w_item(w_ch * 2 + w_blank);
130 const int fsize(model.GetSize());
133 auto pos(model.GetPosition());
136 while(y <
h && pos < fsize && i_data <
datCurrent.end())
143 char straddr[(32 >> 2) + 1];
145 std::sprintf(straddr,
"%08X", pos);
150 const auto n(min<IndexType>(fsize - pos, ItemPerLine));
155 PutLine(tr, &*i_data, &*i_data + 2);
164 vsbVertical.SetValue(0);
166 UpdateItemNum(GetHeight());
173 if(model.IsValid() && pos < model.GetSize())
175 const DataType::size_type n(
ItemPerLine * GetItemNum() * 2);
177 model.SetPosition(pos, SEEK_SET);
183 while(!model.CheckEOF() && b != e)
185 byte c(std::fgetc(model.GetPtr()));
188 yunseq(h = (c >> 4 & 0x0F) +
'0', l = (c & 0x0F) +
'0');
189 *b++ = h >
'9' ? h +
'A' -
'9' - 1 :
h;
190 *b++ = l >
'9' ? l +
'A' -
'9' - 1 : l;
194 model.SetPosition(pos, SEEK_SET);
201 ViewChanged(
ViewArgs(*
this, is_active));