Jeżeli potrafimy powiedzieć, co rozumiemy przez “bezczynność” sesji dokumentu, to da się wymusić jej zamknięcie po upływie określonego czasu “bezczynności”.
W poniższym studium bezczynność oznacza brak aktywności klawiatury (naciskanie/zwalnianie klawiszy) oraz myszki (naciskanie/zwalnianie przycisków). Nie obejmuje natomiast innych zdarzeń, takich jak: poruszanie myszką (niezależnie od stanu klawiszy), przytrzymywanie wciśniętego klawisza, operacji na menu i oknach dialogowych, a także pracy na dokumentach wykorzystujących bieżący dokument. Ani też działalności nieinteraktywnej (dostęp zdalny albo działanie makra na dokumencie). Część tego wszystkiego da się dość łatwo określić i dokonfigurować, część wymaga namysłu.
Czas życia sesji dokumentu (w sekundach) jest zadany w stałej maxTime.
Dla celów demonstracyjnych w komórce A1 pierwszego arkusza wyświetlany jest czas, jaki pozostał do zamknięcia sesji. Zakomentowanie lub usunięcie tej instrukcji jest wskazane.
Aktywne śledzenie czasu rozpoczyna się z chwilą uruchomienia procedury nazwanej start(). Z poziomu zarządzania dokumentem można zlecić jej automatyczne uruchomienie w chwili załadowania dokumentu: Narzędzia→Dostosuj→Zdarzenia→Otwórz dokument→Makro→.... start()
Kod: Zaznacz cały
global idleTime
const maxTime = 60
sub start()
idleTime = 0
c = thisComponent.CurrentController
c.addKeyHandler(CreateUnoListener("reset_", "com.sun.star.awt.XKeyHandler") )
c.addMouseClickHandler(CreateUnoListener("reset_", "com.sun.star.awt.XMouseClickHandler"))
run_timer(maxTime)
end sub
sub run_timer(dt)
do
thisComponent.Sheets.getByIndex(0).getCellbyposition(0,0).Value = dt - idleTime
idleTime = idleTime + 1
wait 1000
if idleTime >= dt then
finalize()
exit do
end if
loop while 1
end sub
sub finalize()
thisComponent.store()
thisComponent.close(true)
end sub
function reset_keyPressed(event) as boolean
idleTime = 0
reset_keyPressed = false
end function
function reset_keyReleased(event) as boolean
idleTime = 0
reset_keyReleased = false
end function
function reset_mousePressed(event) as boolean
idleTime = 0
reset_mousePressed = false
end function
function reset_mouseReleased(event) as boolean
idleTime = 0
reset_mousePressed = false
end function
Funkcja Wait gwarantuje wstrzymanie pracy na określony czas, ale cała procedura nie gwarantuje synchronizacji wywołań z zegarem. Tak że dokładność pomiaru upływu czasu jest problematyczna.
Większą precyzję (choć nie regularność wywołań) uzyskamy, wykorzystując odczyt zegara systemowego -- w Basicu funkcja timevalue(time()) zwraca czas w dobach -- zamiast powiększania stanu zmiennej o 1.