#!/usr/bin/env python
# -*- coding: utf-8 -*-
import elementary
import e_dbus, dbus
import gettext
from re import escape
from functools import partial
from ecore import timer_add
import time

try:
	cat = gettext.Catalog("opimd-notes")
	_ = cat.gettext
except IOError:
	_ = lambda x: x
# define some nice dbus helper, which I really like, cause make code easier to read :)
def getDbusObject (bus, busname , objectpath , interface):
        dbusObject = bus.get_object(busname, objectpath)
        return dbus.Interface(dbusObject, dbus_interface=interface)

bus = dbus.SystemBus(mainloop = e_dbus.DBusEcoreMainLoop())

elementary.init()

displayedNotes = []

notes = getDbusObject (bus, "org.freesmartphone.opimd", "/org/freesmartphone/PIM/Notes", "org.freesmartphone.PIM.Notes")

def dbus_ok(*args, **kwargs):
  pass

def dbus_err(x): 
  print "dbus error: " + str(x)

def clearNotes(*args, **kargs):
  global displayedNotes
  for bubble in displayedNotes:
    try:
      bubble.delete()
    except:
      print _("bubble.delete() failed")
      try:
        bubble.hide()
      except:
        print _("bubble.hide() failed")
  displayedNotes = []

def destroy(win, *args, **kargs):
#  print "kabum"
  elementary.exit()

def nothing(*args, **kwargs):
  print _("nothing called")

def anchorClicked (tags, obj, sth, *args, **kargs):
  print tags
  print obj
  print sth
  print args
  print kargs
  obj.hover_end()
  dia = elementary.InnerWindow(win)
  win.resize_object_add(dia)
  dia.show()
  dia.style_set('minimal')
  label = elementary.Label(win)
  label.label_set(_("Not yet implemented"))
  label.show()
  dia.content_set(label)
  dia.activate()
  timer_add(2, partial(inwin_close, dia))      

def makeAnchorsFromTags(tags, *args, **kwargs):
  #tags = ['brak', 'la', 'li', 'lo', 'le', 'lu', 'ugabuga', 'ala', 'ma', 'kota', 'a', 'kot', 'ma', 'ale', 'jestem', 'sobie', 'dos', 'la', 'la', 'la', 'la', 'la']
  if tags==None:
    return ''
  if not isinstance(tags, list) and not isinstance(tags, dbus.Array):
    tags = [tags]
  text = ''
  i = 0
  for tag in tags:
# TODO: FIXME: make use from anchors when python-elementary will support that
    text = text+'<a href='+str(i)+'>'+tag+'</a>, '
#    text = text + tag + ', '
    i += 1
  text = text[:len(text)-2]
  return text

def renderNote(*args, **kargs):
  data = kargs.get('data')
  path = kargs.get('path')
  if not data:
    note = getDbusObject (bus, "org.freesmartphone.opimd", path, "org.freesmartphone.PIM.Note")
    data = note.GetContent()
  bubble = elementary.Bubble(win)
  icon = elementary.Icon(win)
  icon.file_set("/usr/share/pixmaps/opimd-utils/note.png")
  icon.show()
  bubble.icon_set(icon)

  title = data.get('Title')
  if not title:
    title = ''
  bubble.label_set(title)
  if data.get('Timestamp'):
    timestamp = time.strftime('%d %b %Y',time.localtime(float(data['Timestamp'])))
    bubble.info_set(timestamp)
  content = data.get('Content')
  if not content:
    content = ''
  content = elementary.Entry.utf8_to_markup(content)
  if not content:
    content = ''
  text = elementary.AnchorBlock(win)
  text.size_hint_weight_set(1.0, 0.0)
  text.size_hint_align_set(-1.0, -1.0)
  text.text_set(content)
  text.show()
  box = elementary.Box(win)
  box.show()
  box.pack_start(text)
  frame = elementary.Frame(win)
  frame.style_set("outdent_bottom")
  frame.size_hint_weight_set(1.0, 0.0)
  frame.size_hint_align_set(-1.0, 0.0)
  framebox = elementary.Box(win)
  framebox.horizontal_set(True)
  framebox.show()
  frame.content_set(framebox)
  frame.show()

  atags = elementary.AnchorBlock(win)
  atags._callback_add('anchor,clicked', partial(anchorClicked, data.get('Tag')))
  tags=makeAnchorsFromTags(data.get('Tag'))
  atags.text_set('<b>Tags:</b> '+tags)
  atags.size_hint_weight_set(1.0, 0.0)
  atags.size_hint_align_set(-1.0, -1.0)
  if tags:
    atags.show()
  framebox.pack_start(atags)

  editbtn = elementary.Button(win)
#  editbtn.label_set('Edit')
  editicon = elementary.Icon(editbtn)
  editicon.scale_set(1,1)
  editicon.smooth_set(0)
  editicon.file_set("/usr/share/pixmaps/opimd-utils/editnote.png")
  editicon.show()
  editbtn.icon_set(editicon)
  editbtn._callback_add('clicked', partial(composeNote, data = data, path = data['Path']))
  editbtn.show()
  framebox.pack_end(editbtn)

  delbtn = elementary.Button(win)
  delicon = elementary.Icon(delbtn)
  delicon.file_set("/usr/share/pixmaps/opimd-utils/delete.png")
  delicon.scale_set(1,1)
  delicon.smooth_set(0)
  delicon.show()
  delbtn.icon_set(delicon)
#  delbtn.label_set('Delete')
  delbtn._callback_add('clicked', partial(noteDelete, 
data['Path'], bubble))
  delbtn.show()
  framebox.pack_end(delbtn)

  box.pack_end(frame)
  bubble.content_set(box)
  bubble.size_hint_weight_set(1.0, 0.0)
  bubble.size_hint_align_set(-1.0, 0.0)
  bubble.show()
  if kargs.get('start'):
    scrbox.pack_start(bubble)
  else:
    scrbox.pack_end(bubble)
  displayedNotes.append(bubble)

def pager_pop(pager, *args, **kwargs):
  pager.content_pop()

def inwin_close(dia, *args, **kwargs):
  if kwargs.get('callback'):
    kwargs['callback']()
  dia.hide()
  dia.delete()
  return False

def focusToContent(content, *args, **kargs):
  print "enter"
  content.focus()

def sure(dia, callback, *args, **kwargs):
  dia.delete()
  callback()

def notsure(dia, *args, **kwargs):
  dia.delete()

def are_you_sure(callback, *args, **kwargs):
  dia = elementary.InnerWindow(win)
  win.resize_object_add(dia)
  dia.show()
  dia.style_set('minimal')
  box = elementary.Box(dia)
  dia.content_set(box)
  label = elementary.Label(dia)
  label.label_set(_("Are you sure?"))
  label.show()
  box.pack_start(label)
  box.show()
  box2 = elementary.Box(dia)
  box2.horizontal_set(True)
  box2.homogenous_set(True)
  box2.show()
  btnyes = elementary.Button(dia)
  btnyes.label_set(_("Yes"))
  btnyes._callback_add('clicked', partial(sure, dia, callback))
  btnyes.show()
  box2.pack_start(btnyes)
  btnno = elementary.Button(dia)
  btnno.label_set(_("No"))
  btnno._callback_add('clicked', partial(notsure, dia))
  btnno.show()
  box2.pack_end(btnno)
  box.pack_end(box2)
  dia.activate()

def noteDelete (path, bubble = None, *args, **kargs):
  are_you_sure(partial(noteDelete2, path, bubble))

def noteDeleted(bubble, *args, **kargs):
  global displayedNotes
  if bubble:
    displayedNotes.remove(bubble)
    bubble.delete()

def noteNotDeleted(bubble, x, *args, **kargs):
  print str(x)
  if bubble:
    bubble.show()

def noteDelete2(path, bubble, *args, **kargs):
  note = getDbusObject (bus, "org.freesmartphone.opimd", path, "org.freesmartphone.PIM.Note")
  note.Delete(reply_handler=partial(noteDeleted, bubble), error_handler=partial(noteNotDeleted, bubble))
  if bubble:
    bubble.hide()
  else:
    clearNotes()
    displayNotes()

def noteNext (pager, dia, titlee, contente, *args, **kargs):
  dict = {}
  dict['Title'] = titlee.markup_to_utf8(titlee.entry_get())
  dict['Content'] = contente.markup_to_utf8(contente.entry_get())
  dict['Timestamp'] = int(time.time())
  dict['Timezone'] = time.tzname[time.daylight]
  if kargs.get('tags'):
    if len(kargs['tags'])==1:
      dict['Tag'] = kargs['tags'][0]
    elif len(kargs['tags'])>1:
      dict['Tag'] = kargs['tags']
  sdia = elementary.InnerWindow(win)
  sdia.style_set('minimal')
  win.resize_object_add(sdia)
  lab = elementary.Label(win)
  lab.show()
  sdia.content_set(lab)
  if not kargs.get('path'):
    lab.label_set(_("Adding..."))
    notes.Add(dict, reply_handler=partial(noteAdded, sdia, dia), error_handler=dbus_err)
  else:
    lab.label_set(_("Editing..."))
    note = getDbusObject (bus, "org.freesmartphone.opimd", kargs['path'], "org.freesmartphone.PIM.Note")
    note.Update(dict, reply_handler=partial(noteUpdated, sdia, dia), error_handler=dbus_err)
  sdia.show()
  sdia.activate()

def noteSaved(dia, *args, **kargs):
  clearNotes()
  displayNotes()
  inwin_close(dia)

def noteAdded(sdia, dia, path, *args, **kargs):
  inwin_close(sdia)
  noteSaved(dia)

def noteUpdated(sdia, dia, *args, **kargs):
  inwin_close(sdia)
  noteSaved(dia)

def composeNote(*args, **kargs):
  data = kargs.get('data')
  path = kargs.get('path')
  if not data and path:
    note = getDbusObject (bus, "org.freesmartphone.opimd", path, "org.freesmartphone.PIM.Note")
    data = note.GetContent()
  if data and not path:
    path = data['Path']

  dia = elementary.InnerWindow(win)
  pager = elementary.Pager(win)
  pager.show()
  box = elementary.Box(win)
  box.size_hint_weight_set(1.0, 1.0)
  box.size_hint_align_set(-1.0, -1.0)
  box.show()
  pager.content_push(box)
  dia.content_set(pager)

  titlescr = elementary.Scroller(win)
  titlescr.content_min_limit(0,1)
  titlescr.bounce_set(0, 0)
  titlescr.policy_set(elementary.ELM_SCROLLER_POLICY_OFF, elementary.ELM_SCROLLER_POLICY_OFF)
  titlescr.size_hint_weight_set(1.0, -1.0)
  titlescr.size_hint_align_set(-1.0, -1.0)
  title = elementary.Entry(win)
  title.show()
  title.size_hint_weight_set(1.0, 0.0)
  title.size_hint_align_set(-1.0, -1.0)
  title.single_line_set(True)
  if data:
    if data.get('Title'):
      title.entry_set(title.utf8_to_markup(data['Title']))
  else:
    title.focus()
  title.scale_set(1.2)
  titlescr.content_set(title)
  titlescr.show()

  contentframe = elementary.Frame(win)
  contentframe.style_set('pad_small')
  contentframe.size_hint_weight_set(1.0, 1.0)
  contentframe.size_hint_align_set(-1.0, -1.0)
  contentframe.show()

  contentscr = elementary.Scroller(win)
  contentscr.bounce_set(0, 0)
  contentscr.size_hint_weight_set(1.0, 1.0)
  contentscr.size_hint_align_set(-1.0, -1.0)
  contentscr.show()
  content = elementary.Entry(win)
  content.show()
  if data:
    if data.get('Content'):
      content.entry_set(content.utf8_to_markup(data['Content']))
    content.focus()
  content.size_hint_weight_set(1.0, 1.0)
  content.size_hint_align_set(-1.0, -1.0)
  contentscr.content_set(content)

  title._callback_add('key,enter', partial(focusToContent, content))

  box.pack_start(titlescr)
  contentframe.content_set(contentscr)
  box.pack_end(contentframe)

  downbox = elementary.Box(win)
  downbox.horizontal_set(True)
  downbox.homogenous_set(True)
  downbox.size_hint_weight_set(1.0, 0.0)
  downbox.size_hint_align_set(-1.0, 0.0)
  downbox.show()
  box.pack_end(downbox)

  next = elementary.Button(win)
  nexticon = elementary.Icon(win)
  nexticon.scale_set(1,1)
  nexticon.smooth_set(0)
  nexticon.show()
  next.icon_set(nexticon)

#  if not data:
  nexticon.file_set("/usr/share/pixmaps/opimd-utils/next.png")
  next.label_set(_("Next"))
  next._callback_add('clicked', partial(editTags, pager, dia, title, content, data = data, path = path))
#  else:
#    nexticon.file_set("/usr/share/pixmaps/opimd-utils/editnote.png")
#    next.label_set('Edit')
#    next.clicked = partial(noteNext, pager, dia, title, content, data = data, path = path)
  next.size_hint_weight_set(1.0, 0.0)
  next.size_hint_align_set(-1.0, 0.0)
  next.show()

  back = elementary.Button(win)
  back.label_set(_("Back"))
  backicon = elementary.Icon(win)
  backicon.scale_set(1,1)
  backicon.smooth_set(0)
  backicon.show()
  back.icon_set(backicon)
  backicon.file_set("/usr/share/pixmaps/opimd-utils/quit.png")
  back.size_hint_weight_set(1.0, 0.0)
  back.size_hint_align_set(-1.0, 0.0)
  back._callback_add('clicked', partial(inwin_close, dia))
  back.show()

  downbox.pack_start(next)
  downbox.pack_end(back)
  
  win.resize_object_add(dia)
  dia.show()
  dia.activate()

def delTag(list, tags, tag, item, *args, **kargs):
  tags.remove(tag)
  item.delete()
  list.go()

def saveTag(list, tags, dia, tag, *args, **kargs):
  if isinstance(tag, elementary.Entry):
    tag = tag.markup_to_utf8(tag.entry_get())
  if not tag in tags:
    tags.append(tag)
    delbtn = elementary.Button(win)
    delbtn.show()
    delic = elementary.Icon(win)
    delic.scale_set(1,1)
    delic.smooth_set(1)
    delic.file_set('/usr/share/pixmaps/opimd-utils/delete.png')
    delic.show()
    delbtn.icon_set(delic)
    item = list.item_prepend(tag, None, delbtn, None)
    delbtn._callback_add('clicked', partial(delTag, list, tags, tag, item))
    list.go()
  if dia:
    dia.delete()

def addTag(list, tags, item, *args, **kargs):
  #item.selected_set(False)
  dia = elementary.InnerWindow(win)
  win.resize_object_add(dia)
#  dia.style_set('minimal_vertical')
  dia.show()
  dia.activate()
  box = elementary.Box(win)
  box.show()
  dia.content_set(box)
  label1 = elementary.Label(win)
  label1.label_set(_("Enter name of tag..."))
  label1.show()
  label1.size_hint_align_set(-1.0, -1.0)
  box.pack_start(label1)

  titlescr = elementary.Scroller(win)
  titlescr.content_min_limit(0,1)
  titlescr.bounce_set(0, 0)
  titlescr.policy_set(elementary.ELM_SCROLLER_POLICY_OFF, elementary.ELM_SCROLLER_POLICY_OFF)
  titlescr.size_hint_weight_set(1.0, -1.0)
  titlescr.size_hint_align_set(-1.0, -1.0)
  title = elementary.Entry(win)
  title.show()
  title.size_hint_weight_set(1.0, 0.0)
  title.size_hint_align_set(-1.0, -1.0)
  title.single_line_set(True)
  title.scale_set(1.2)
  titlescr.content_set(title)
  titlescr.show()
  box.pack_end(titlescr)

  label2 = elementary.Label(win)
  label2.label_set(_("...or select it from list below:"))
  label2.show()
  label2.size_hint_align_set(-1.0, -1.0)
  box.pack_end(label2)

  relist = elementary.List(win)
  relist.size_hint_weight_set(1.0, 1.0)
  relist.size_hint_align_set(-1.0, -1.0)
  relist.show()
  retags = notes.GetUsedTags()
  for tag in retags:
    if not tag in tags:
      relist.item_append(tag, None, None, partial(saveTag, list, tags, dia, tag))
  box.pack_end(relist)
  relist.go()

  downbox = elementary.Box(win)
  downbox.horizontal_set(True)
  downbox.homogenous_set(True)
  downbox.size_hint_weight_set(1.0, 0.0)
  downbox.size_hint_align_set(-1.0, -1.0)
  downbox.show()
  box.pack_end(downbox)

  next = elementary.Button(win)
  nexticon = elementary.Icon(win)
  nexticon.scale_set(1,1)
  nexticon.smooth_set(0)
  nexticon.show()
  next.icon_set(nexticon)

  nexticon.file_set("/usr/share/pixmaps/opimd-utils/newtag.png")
  next.label_set(_("Add"))
  next.size_hint_weight_set(1.0, 0.0)
  next.size_hint_align_set(-1.0, 0.0)
  next._callback_add('clicked', partial(saveTag, list, tags, dia, title))
  next.show()

  downbox.pack_start(next)

  back = elementary.Button(win)
  back.label_set(_("Back"))
  backicon = elementary.Icon(win)
  backicon.file_set('/usr/share/pixmaps/opimd-utils/prev.png')
  backicon.scale_set(1, 1)
  backicon.smooth_set(1)
  backicon.show()
  back.icon_set(backicon)
  back.size_hint_weight_set(1.0, 0.0)
  back.size_hint_align_set(-1.0, 0.0)
  back.show()
  back._callback_add('clicked', partial(inwin_close, dia))
  downbox.pack_end(back)

def editTags(pager, dia, titlee, contente, *args, **kargs):
  data = kargs.get('data')
  path = kargs.get('path')
  if not data and path:
    note = getDbusObject (bus, "org.freesmartphone.opimd", path, "org.freesmartphone.PIM.Note")
    data = note.GetContent()
  if data and not path:
    path = data['Path']

  box = elementary.Box(win)

  frame = elementary.Frame(win)
  frame.label_set(_("Select tags for note:"))
  frame.show()

  tlist = elementary.List(win)
  frame.content_set(tlist)
  frame.size_hint_weight_set(1.0, 1.0)
  frame.size_hint_align_set(-1.0, -1.0)
  box.pack_start(frame)
  tlist.size_hint_weight_set(1.0, 1.0)
  tlist.size_hint_align_set(-1.0, -1.0)
#  tlist.item_append("All", None, None, partial(viewTag, None, pager))
#  for tag in tags:
  if data and data.get('Tag'):
    if not isinstance(data['Tag'], list) and not isinstance(data['Tag'], dbus.Array):
      tags = [ data['Tag'] ]
    else:
      tags = data['Tag']
  else:
    tags = []
  for tag in tags:
    delbtn = elementary.Button(win)
    delbtn.show()
    delic = elementary.Icon(win)
    delic.scale_set(1,1)
    delic.smooth_set(1)
    delic.file_set('/usr/share/pixmaps/opimd-utils/delete.png')
    delic.show()
    delbtn.icon_set(delic)
    item = tlist.item_prepend(tag, None, delbtn, None)
    delbtn._callback_add('clicked', partial(delTag, tlist, tags, tag, item))
  newtag = elementary.Icon(win)
  newtag.file_set('/usr/share/pixmaps/opimd-utils/newtag.png')
  newtag.scale_set(1, 1)
  newtag.smooth_set(1)
  newtag.show()
  tlist.item_append(_("Add new tag..."), None, newtag,  partial(addTag, tlist, tags))
  tlist.show()
  tlist.go()
  downbox = elementary.Box(win)
  downbox.horizontal_set(True)
  downbox.homogenous_set(True)
  downbox.show()
  box.pack_end(downbox)

  next = elementary.Button(win)
  nexticon = elementary.Icon(win)
  nexticon.scale_set(1,1)
  nexticon.smooth_set(0)
  nexticon.show()
  next.icon_set(nexticon)

  if not data:
    nexticon.file_set("/usr/share/pixmaps/opimd-utils/newnote.png")
    next.label_set(_("Save"))
  else:
    nexticon.file_set("/usr/share/pixmaps/opimd-utils/editnote.png")
    next.label_set(_("Edit"))
  next.size_hint_weight_set(1.0, 0.0)
  next.size_hint_align_set(-1.0, 0.0)
  next._callback_add('clicked', partial(noteNext, pager, dia, titlee, contente, data = data, path = path, tags = tags))
  next.show()
  
  downbox.pack_start(next)

  back = elementary.Button(win)
  back.label_set(_("Back"))
  backicon = elementary.Icon(win)
  backicon.file_set('/usr/share/pixmaps/opimd-utils/prev.png')
  backicon.scale_set(1, 1)
  backicon.smooth_set(1)
  backicon.show()
  back.icon_set(backicon)
  back.size_hint_weight_set(1.0, 0.0)
  back.size_hint_align_set(-1.0, 0.0)
  back.show()
  back._callback_add('clicked', partial(pager_pop, pager))
  downbox.pack_end(back)
  downbox.size_hint_weight_set(1.0, 0.0)
  downbox.size_hint_align_set(-1.0, 0.0)
  pager.content_push(box)

def viewTag(tag, pager, *args, **kargs):
  pager.content_pop()
  clearNotes()
  if tag:
    displayNotes(query = {'Tag':tag})
  else:
    displayNotes()

def selectTag(pager, *args, **kargs):
  tags = notes.GetUsedTags()
  box = elementary.Box(win)
  list = elementary.List(win)
  box.pack_start(list)
  list.size_hint_weight_set(1.0, 1.0)
  list.size_hint_align_set(-1.0, -1.0)
#  list.item_append("All", None, None, partial(viewTag, None, pager))
  for tag in tags:
    list.item_append(tag, None, None, partial(viewTag, tag, pager))
  list.show()
  list.go()
  back = elementary.Button(win)
  back.label_set(_("Back"))
  backicon = elementary.Icon(win)
  backicon.file_set('/usr/share/pixmaps/opimd-utils/quit.png')
  backicon.scale_set(1, 1)
  backicon.smooth_set(1)
  backicon.show()
  back.icon_set(backicon)
  back.size_hint_weight_set(1.0, 0.0)
  back.size_hint_align_set(-1.0, 0.0)
  back.show()
  back._callback_add('clicked', partial(pager_pop, pager))
  box.pack_end(back)
  box.show()
  pager.content_push(box)

def doSearch(title, titles, regexps, dia, *args, **kargs):
  text = title.entry_get()
  text = title.markup_to_utf8(text)
  if not regexps.state_get():
    text = escape(text)

  clearNotes()
  dict = {}
  if not titles.state_get():
    dict['Content']=text
  else:
    dict['Title']=text
    dict['Content']=text
    dict['_at_least_one']=True
  displayNotes(query = dict)
  if dia:
    dia.delete()

def search(*args, **kargs):
  dia = elementary.InnerWindow(win)
  win.resize_object_add(dia)
  dia.show()
  dia.style_set('minimal_vertical')
  box = elementary.Box(win)
  box.show()
  label = elementary.Label(win)
  label.label_set(_("Enter text:"))
  label.size_hint_align_set(-1.0, -1.0)
  label.show()
  box.pack_start(label)

  titlescr = elementary.Scroller(win)
  titlescr.content_min_limit(0,1)
  titlescr.bounce_set(0, 0)
  titlescr.policy_set(elementary.ELM_SCROLLER_POLICY_OFF, elementary.ELM_SCROLLER_POLICY_OFF)
  titlescr.size_hint_weight_set(1.0, -1.0)
  titlescr.size_hint_align_set(-1.0, -1.0)
  title = elementary.Entry(win)
  title.show()
  title.size_hint_weight_set(1.0, 0.0)
  title.size_hint_align_set(-1.0, -1.0)
  title.single_line_set(True)
  title.scale_set(1.2)
  title.focus()
  titlescr.content_set(title)
  titlescr.show()
  box.pack_end(titlescr)

  regexp = elementary.Check(win)
  regexp.label_set(_("regular expression"))
  regexp.size_hint_weight_set(1.0, 0.0)
  regexp.size_hint_align_set(-1.0, 0.0)
  regexp.show()
  box.pack_end(regexp)

  titles = elementary.Check(win)
  titles.label_set(_("search also in titles"))
  titles.size_hint_weight_set(1.0, 0.0)
  titles.size_hint_align_set(-1.0, 0.0)
  titles.show()
  box.pack_end(titles)

  downbox = elementary.Box(win)
  downbox.horizontal_set(True)
  downbox.homogenous_set(True)
  downbox.size_hint_weight_set(1.0, 0.0)
  downbox.size_hint_align_set(-1.0, 0.0)
  downbox.show()
  box.pack_end(downbox)
  next = elementary.Button(win)
  nexticon = elementary.Icon(win)
  nexticon.scale_set(1,1)
  nexticon.smooth_set(0)
  nexticon.show()
  next.icon_set(nexticon)
  nexticon.file_set("/usr/share/pixmaps/opimd-utils/search.png")
  next.label_set(_("Search"))
  next._callback_add('clicked', partial(doSearch, title, titles, regexp, dia))
  next.size_hint_weight_set(1.0, 0.0)
  next.size_hint_align_set(-1.0, 0.0)
  next.show()

  back = elementary.Button(win)
  back.label_set(_("Back"))
  backicon = elementary.Icon(win)
  backicon.scale_set(1,1)
  backicon.smooth_set(0)
  backicon.show()
  back.icon_set(backicon)
  backicon.file_set("/usr/share/pixmaps/opimd-utils/quit.png")
  back.size_hint_weight_set(1.0, 0.0)
  back.size_hint_align_set(-1.0, 0.0)
  back._callback_add('clicked', partial(inwin_close, dia))
  back.show()

  downbox.pack_start(next)
  downbox.pack_end(back)


  dia.content_set(box)
  dia.activate()

win = elementary.Window("opimd-notes", 0)
win.title_set(_("Notes"))

bg = elementary.Background(win)
win.resize_object_add(bg)
bg.show()

pager = elementary.Pager(win)
win.resize_object_add(pager)
pager.show()

mainbox = elementary.Box(win)
mainbox.show()
pager.content_push(mainbox)

win.callback_destroy_add(destroy)

scr = elementary.Scroller(win)
scr.size_hint_align_set(-1.0, -1.0)
scr.size_hint_weight_set(1.0, 1.0)
scr.bounce_set(0, 0)
mainbox.pack_start(scr)
scr.show()

scrbox = elementary.Box(win)
scrbox.size_hint_weight_set(1.0, 0.0)
scrbox.size_hint_align_set(-1.0, 0.0)
scr.content_set(scrbox)
scrbox.show()

status = None

def displayStatus(stat, *args, **kargs):
  global status

  if status:
    hideStatus()

  status = elementary.Frame(win)
  status.style_set('outdent_top')
  status.size_hint_weight_set(1.0, 0.0)
  status.size_hint_align_set(-1.0, -1.0)
  status.show()

  upbox = elementary.Box(win)
  upbox.horizontal_set(True)
  upbox.size_hint_weight_set(1.0, 0.0)
  upbox.size_hint_align_set(-1.0, -1.0)
  upbox.show()

  text = elementary.AnchorBlock(win)
  text.text_set(stat)
  text.size_hint_weight_set(1.0, 0.0)
  text.size_hint_align_set(-1.0, 0.5)
  text.show()
  upbox.pack_start(text)

  delbtn = elementary.Button(win)
  delicon = elementary.Icon(delbtn)
  delicon.file_set("/usr/share/pixmaps/opimd-utils/quit.png")
  delicon.scale_set(1,1)
  delicon.smooth_set(0)
  delicon.show()
  delbtn.icon_set(delicon)
  delbtn._callback_add('clicked', displayAllNotes)
  delbtn.show()
  upbox.pack_end(delbtn)

  status.content_set(upbox)
  mainbox.pack_start(status)

def displayAllNotes(*args, **kwargs):
  clearNotes()
  displayNotes()

def hideStatus(*args, **kargs):
  global status
  if status:
    status.delete()
    status = None

def displayNotes(*args, **kargs):
  if not kargs.get('query'):
    dict = {}
    hideStatus()
  else:
    dict = kargs['query']
    status = ''
    if kargs['query'].get('Tag'):
      status = status + '<b>Tag:</b> '+elementary.Entry.utf8_to_markup(kargs['query']['Tag'])+'<br>'
    if kargs['query'].get('Title'):
      status = status + '<b>Title:</b> '+elementary.Entry.utf8_to_markup(kargs['query']['Title'])+'<br>'
    if kargs['query'].get('Content'):
      status = status + '<b>Content:</b> '+elementary.Entry.utf8_to_markup(kargs['query']['Content'])+'<br>'
    if not status:
      status = '<b>Detailed view</b>'
    displayStatus(status)
  dia = elementary.InnerWindow(win)
  dia.style_set('minimal')
  lab = elementary.Label(win)
  lab.label_set(_("Searching..."))
  lab.show()
  dia.content_set(lab)
  win.resize_object_add(dia)
  dia.show()
  dia.activate()
  dict['_sortby'] = 'Timestamp'
  dict['_sortdesc'] = True
  notes.Query(dict, reply_handler=partial(displayNotesQuery, dia), error_handler=dbus_err)

def displayNotesQuery(dia, x, *args, **kargs):
  #print "Query: " + x
  query = getDbusObject (bus, "org.freesmartphone.opimd", x, "org.freesmartphone.PIM.NoteQuery")
  query.GetResultCount(reply_handler=partial(displayNotesCount, dia, query), error_handler=dbus_err )

def displayNotesCount(dia, query, count, *args, **kargs):
  query.GetMultipleResults(count, reply_handler=partial(displayNotesResults, dia, query), error_handler=dbus_err)

def displayNotesResults(dia, query, results, *args, **kargs):
  for result in results:
    renderNote(data = result)
  if dia:
    dia.delete()
  query.Dispose(reply_handler = dbus_ok, error_handler = dbus_err)

def make_downbox():
  global downbox
  downbox = elementary.Box(win)
  downbox.show()
  downbox.size_hint_weight_set(1.0, 0.0)
  downbox.size_hint_align_set(-1.0, 0.0)
  downbox.horizontal_set(True)
  downbox.homogenous_set(True)
  mainbox.pack_end(downbox)

  newbtn = elementary.Button(win)
  newbtn.label_set(_("New"))
  downbox.pack_start(newbtn)
  newicon = elementary.Icon(win)
  newicon.scale_set(1,1)
  newicon.smooth_set(0)
  newicon.file_set("/usr/share/pixmaps/opimd-utils/newnote.png")
  newicon.show()
  newbtn.icon_set(newicon)
  newbtn.size_hint_weight_set(1.0, 0.0)
  newbtn.size_hint_align_set(-1.0, 0.0)
  newbtn._callback_add('clicked', composeNote)
  newbtn.show()

  tagsbtn = elementary.Button(win)
  tagsbtn.label_set(_("Tags"))
  tagsbtn._callback_add('clicked', partial(selectTag, pager))
  downbox.pack_end(tagsbtn)
  tagsicon = elementary.Icon(win)
  tagsicon.scale_set(1,1)
  tagsicon.smooth_set(0)
  tagsicon.file_set("/usr/share/pixmaps/opimd-utils/tags.png")
  tagsicon.show()
  tagsbtn.icon_set(tagsicon)
  tagsbtn.size_hint_weight_set(1.0, 0.0)
  tagsbtn.size_hint_align_set(-1.0, 0.0)
  tagsbtn.show()

  searchbtn = elementary.Button(win)
  searchbtn.label_set(_("Search"))
  downbox.pack_end(searchbtn)
  searchicon = elementary.Icon(win)
  searchicon.file_set("/usr/share/pixmaps/opimd-utils/search.png")
  searchicon.show()
  searchicon.scale_set(1,1)
  searchicon.smooth_set(0)
  searchbtn.icon_set(searchicon)

  searchbtn.show()
  searchbtn.size_hint_weight_set(1.0, 0.0)
  searchbtn.size_hint_align_set(-1.0, 0.0)
  searchbtn._callback_add('clicked', search)

displayNotes()
make_downbox()

win.show()

elementary.run()
elementary.shutdown()

