+ if(backward){
+ event_viewer_data->append = FALSE;
+ do{
+ if(direction == SCROLL_PAGE_UP){
+ minNum = list_height - event_viewer_data->start_event_index ;
+ }else{
+ minNum = 1;
+ }
+
+ first = event_viewer_data->raw_trace_data_queue->head;
+ if(!first)break;
+ raw_data = (RawTraceData*)g_list_nth_data(first,0);
+ end = raw_data->time;
+ end.tv_nsec--;
+ ltt_event_position_get(raw_data->ep, &block_num, &event_num, &tf);
+ if(size !=0){
+ if(event_num > minNum){
+ backward_num = event_num > RESERVE_SMALL_SIZE
+ ? event_num - RESERVE_SMALL_SIZE : 1;
+ ltt_event_position_set(raw_data->ep, block_num, backward_num);
+ ltt_tracefile_seek_position(tf, raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ maxNum = RESERVE_SMALL_SIZE_CUBE;
+ }else{
+ if(block_num > 1){
+ ltt_event_position_set(raw_data->ep, block_num-1, 1);
+ ltt_tracefile_seek_position(tf, raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ }else{
+ start.tv_sec = 0;
+ start.tv_nsec = 0;
+ }
+ maxNum = RESERVE_SMALL_SIZE_CUBE;
+ }
+ }else{
+ if(block_num > count){
+ ltt_event_position_set(raw_data->ep, block_num-count, 1);
+ ltt_tracefile_seek_position(tf, raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ }else{
+ start.tv_sec = 0;
+ start.tv_nsec = 0;
+ }
+ maxNum = RESERVE_SMALL_SIZE_CUBE;
+ }
+
+ event_viewer_data->current_event_index = event_viewer_data->start_event_index;
+ get_events(event_viewer_data, start, end, maxNum, &size);
+ event_viewer_data->start_event_index = event_viewer_data->current_event_index;
+
+ if(size < minNum && (start.tv_sec !=0 || start.tv_nsec !=0))
+ need_backward_again = TRUE;
+ else need_backward_again = FALSE;
+ if(size == 0){
+ count++;
+ }else{
+ count = 0;
+ }
+ }while(need_backward_again);
+ }
+ if(direction == SCROLL_STEP_UP)
+ event_number = event_viewer_data->start_event_index - 1;
+ else
+ event_number = event_viewer_data->start_event_index - list_height;
+ break;
+ case SCROLL_STEP_DOWN:
+ if(event_viewer_data->end_event_index == event_viewer_data->number_of_events - 1){
+ event_viewer_data->append = TRUE;
+ first = event_viewer_data->raw_trace_data_queue->head;
+ if(!first)break;
+ raw_data = (RawTraceData*)g_list_nth_data(first,event_viewer_data->number_of_events - 1);
+ start = raw_data->time;
+ start.tv_nsec++;
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE, &size);
+ if(size == 0){
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size);
+ if(size == 0)
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size);
+ }
+ }else size = 1;
+ if(size > 0) event_number = event_viewer_data->start_event_index + 1;
+ else event_number = event_viewer_data->start_event_index;
+ break;
+ case SCROLL_PAGE_DOWN:
+ i = event_viewer_data->number_of_events - 1 - list_height;
+ if((gint)(event_viewer_data->end_event_index) >= i){
+ event_viewer_data->append = TRUE;
+ first = event_viewer_data->raw_trace_data_queue->head;
+ if(!first)break;
+ raw_data = (RawTraceData*)g_list_nth_data(first,event_viewer_data->number_of_events - 1);
+ start = raw_data->time;
+ start.tv_nsec++;
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE,&size);
+ if(size == 0){
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size);
+ if(size == 0)
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size);
+ }
+ }
+ if(list_height <= event_viewer_data->number_of_events - 1 - event_viewer_data->end_event_index)
+ event_number = event_viewer_data->start_event_index + list_height - 1;
+ else
+ event_number = event_viewer_data->number_of_events - 1 - list_height;
+ break;
+ case SCROLL_JUMP:
+ event_viewer_data->append = TRUE;
+ remove_all_items_from_queue(event_viewer_data->raw_trace_data_queue);
+ end.tv_sec = G_MAXULONG;
+ end.tv_nsec = G_MAXULONG;
+ time = ltt_time_from_double(time_value / NANOSECONDS_PER_SECOND);
+ start = ltt_time_add(event_viewer_data->time_span.startTime, time);
+ event_viewer_data->previous_value = time_value;
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE,&size);
+ if(size < list_height && size > 0){
+ event_viewer_data->append = FALSE;
+ first = event_viewer_data->raw_trace_data_queue->head;
+ if(!first)break;
+ raw_data = (RawTraceData*)g_list_nth_data(first,0);
+ end = raw_data->time;
+ end.tv_nsec--;
+ ltt_event_position_get(raw_data->ep, &block_num, &event_num, &tf);
+
+ if(event_num > list_height - size){
+ backward_num = event_num > RESERVE_SMALL_SIZE
+ ? event_num - RESERVE_SMALL_SIZE : 1;
+ ltt_event_position_set(raw_data->ep, block_num, backward_num);
+ ltt_tracefile_seek_position(tf, raw_data->ep);
+ ev = ltt_tracefile_read(tf);
+ start = ltt_event_time(ev);
+ maxNum = RESERVE_SMALL_SIZE_CUBE;
+ event_viewer_data->current_event_index = 0;
+ get_events(event_viewer_data, start, end, maxNum, &size);
+ event_viewer_data->start_event_index = event_viewer_data->current_event_index;
+ }
+ event_number = event_viewer_data->raw_trace_data_queue->length - list_height;
+ }else if(size == 0){
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_SQUARE,&size);
+ if(size == 0)
+ get_events(event_viewer_data, start, end, RESERVE_SMALL_SIZE_CUBE,&size);
+ event_number = 0;
+ }else{
+ event_number = 0;
+ }
+ break;
+ case SCROLL_NONE:
+ event_number = event_viewer_data->current_event_index;
+ break;
+ default:
+ break;
+ }