using fwt
using gfx
** Sidebar to show recent documents
class RecentPane : ContentPane
{
Frame frame
ItemList picker
new make(Frame frame)
{
this.frame = frame
content = BgEdgePane
{
top = BgLabel
{
text = "Recent Items (Modif+Number)"
}
picker = RecentItemList(frame, frame.history.items)
center = picker
}
}
Void update(History history)
{
picker.items = history.items
}
Void hide()
{
this.visible = false
parent.relayout
if( ! frame.helpPane.visible)
{
parent.visible = false
parent.parent.relayout
}
}
Void show()
{
this.visible = true
parent.relayout
if(parent.visible == false)
{
parent.visible = true
parent.parent.relayout
}
}
Void toggle()
{
if (this.visible)
hide
else
show
}
}
class RecentItemList : ItemList
{
new make(Frame frame, Item[] items) : super(frame, items) {}
override Void paintItem(Graphics g, Item item, Int x, Int y)
{
index := y / itemh
if(index > 0 && index < 10)
g.drawText(index.toStr, x, y)
x += 20
g.brush = fontColor
if (item.icon != null)
g.drawImage(item.icon, x, y)
g.drawText(item.dis, x+20, y)
if(item.space != null)
{
g.brush = wallpaperColor
g.fillRect(size.w - 110, y, size.w, y + itemh)
g.brush = fontColor
dis := item.space.dis
if(dis.contains("/"))
dis = dis.split('/').last
g.drawText(dis, size.w - 100, y)
}
}
}
class History
{
|History|[] pushListeners := [,]
**
** Log navigation to the specified resource
** into the history. Return this.
**
This push(Space space, FileItem link)
{
if(link.file.isDir) return this
// create history item
item := FileItem.makeFile(link.file).setSpace(space)
if(link.icon != null)
item.icon = link.icon
// remove any item that matches file (regardless of space)
dup := items.findAll{it is FileItem}.findIndex |x|
{
//item.space.typeof == x.space.typeof &&
item.file.normalize == (x as FileItem).file.normalize
}
if (dup != null) items.removeAt(dup)
// keep size below max
while (items.size >= max) items.removeAt(-1)
// push into most recent position
items.insert(0, item)
pushListeners.each {it.call(this)}
return this
}
**
** The first item is the most recent navigation and the last
** item is the oldest navigation.
**
FileItem[] items := [,] { private set }
private Int max := 40
}