// ====================================================== scrollbars
-
-BC_ListBoxYScroll::BC_ListBoxYScroll(BC_ListBox *listbox,
- int total_height,
- int view_height,
- int position)
- : BC_ScrollBar(listbox->get_yscroll_x(),
- listbox->get_yscroll_y(),
- SCROLL_VERT,
- listbox->get_yscroll_height(),
- total_height,
- position,
- view_height)
+BC_ListBoxYScroll::BC_ListBoxYScroll(BC_ListBox *listbox)
+ : BC_ScrollBar(listbox->get_yscroll_x(), listbox->get_yscroll_y(),
+ listbox->yscroll_orientation, listbox->get_yscroll_height(),
+ listbox->items_h, listbox->yposition, listbox->view_h)
{
this->listbox = listbox;
}
return 1;
}
-
-
-
-
-
-
-BC_ListBoxXScroll::BC_ListBoxXScroll(BC_ListBox *listbox,
- int total_width,
- int view_width,
- int position)
- : BC_ScrollBar(listbox->get_xscroll_x(),
- listbox->get_xscroll_y(),
- SCROLL_HORIZ,
- listbox->get_xscroll_width(),
- total_width,
- position,
- view_width)
+BC_ListBoxXScroll::BC_ListBoxXScroll(BC_ListBox *listbox)
+ : BC_ScrollBar(listbox->get_xscroll_x(), listbox->get_xscroll_y(),
+ listbox->xscroll_orientation, listbox->get_xscroll_width(),
+ listbox->items_w, listbox->xposition, listbox->view_w)
{
this->listbox = listbox;
}
}
-
-
-
-
-
-
BC_ListBoxToggle::BC_ListBoxToggle(BC_ListBox *listbox,
BC_ListBoxItem *item,
int x,
new_value = 0;
need_xscroll = 0;
need_yscroll = 0;
+ xscroll_orientation = SCROLL_HORIZ;
+ yscroll_orientation = SCROLL_VERT;
bg_tile = 0;
bg_draw = 1;
drag_popup = 0;
// reset the search engine
//printf("BC_ListBox::BC_ListBox 4\n");
+ show_query = 0;
reset_query();
//printf("BC_ListBox::BC_ListBox 5\n");
}
// Lowest right icon coordinate.
current_icon_x = item->icon_x;
if(current_icon_x > *icon_x) *icon_x = current_icon_x;
- if(current_icon_x + get_item_w(item) > *next_icon_x)
+ if(current_icon_x + get_item_w(item) > *next_icon_x) {
*next_icon_x = current_icon_x + get_item_w(item);
-
+ *next_icon_y = 0;
+ }
current_icon_y = item->icon_y + get_item_h(item);
if(current_icon_y > *next_icon_y)
*next_icon_y = current_icon_y;
int BC_ListBox::get_text_h(BC_ListBoxItem *item)
{
int h = item->get_text_h();
- if( h < 0 ) item->set_text_h(h = get_text_height(MEDIUMFONT));
+ if( h < 0 ) item->set_text_h(h = get_text_height(MEDIUMFONT, item->get_text()));
return h;
}
int x, y, w, h;
BC_ListBoxItem *item = data[master_column].values[j];
- if(display_format == LISTBOX_ICONS)
- {
+ if( display_format == LISTBOX_ICONS ||
+ display_format == LISTBOX_ICON_LIST ) {
get_icon_mask(item, x, y, w, h);
if(y + h + yposition > highest) highest = y + h + yposition;
{
get_text_mask(item, x, y, w, h);
*result += h;
-
-
// Descend into sublist
if(item->get_sublist() &&
item->get_expand())
}
}
- if((display_format == LISTBOX_TEXT ||
- display_format == LISTBOX_ICON_LIST) &&
- top_level)
+ if( display_format == LISTBOX_TEXT && top_level )
{
highest = LISTBOX_MARGIN + *result;
}
}
+void BC_ListBox::set_scroll_stretch(int xv, int yv)
+{
+ if( xv >= 0 ) xscroll_orientation =
+ !xv ? SCROLL_HORIZ : SCROLL_HORIZ + SCROLL_STRETCH;
+ if( yv >= 0 ) yscroll_orientation =
+ !yv ? SCROLL_VERT : SCROLL_VERT + SCROLL_STRETCH;
+}
int BC_ListBox::get_yscroll_x()
{
{
w = get_text_width(MEDIUMFONT, item->text) + LISTBOX_MARGIN * 2;
h = row_height;
+ int ih = get_icon_h(item);
+ if( h < ih ) h = ih;
}
return 0;
}
void BC_ListBox::clamp_positions()
{
items_w = get_items_width();
+ if( xscroll_orientation & SCROLL_STRETCH )
+ items_w += view_w / 4;
items_h = get_items_height(data, columns);
+ if( yscroll_orientation & SCROLL_STRETCH )
+ items_h += view_h / 4;
if(yposition < 0) yposition = 0;
else
{
if(!xscrollbar)
{
- destination->add_subwindow(xscrollbar =
- new BC_ListBoxXScroll(this,
- w_needed,
- view_w,
- xposition));
+ xscrollbar = new BC_ListBoxXScroll(this);
+ destination->add_subwindow(xscrollbar);
xscrollbar->show_window(0);
xscrollbar->bound_to = this;
}
{
if(!yscrollbar)
{
- destination->add_subwindow(yscrollbar =
- new BC_ListBoxYScroll(this,
- h_needed,
- view_h,
- yposition));
+ yscrollbar = new BC_ListBoxYScroll(this);
+ destination->add_subwindow(yscrollbar);
yscrollbar->show_window(0);
yscrollbar->bound_to = this;
}
void BC_ListBox::move_selection(ArrayList<BC_ListBoxItem*> *dst,
ArrayList<BC_ListBoxItem*> *src)
{
- for(int i = 0; i < src[master_column].total; i++)
+ for(int i = 0; i < src[master_column].total; )
{
BC_ListBoxItem *item = src[master_column].values[i];
dst[j].append(src[j].values[i]);
src[j].remove_number(i);
}
+ continue;
}
- else
// Descend into sublist
if(item->get_sublist())
{
move_selection(dst,
item->get_sublist());
}
+ ++i;
}
}
int temp = -1;
if(!counter) counter = &temp;
- if(destination < 0)
+ if(destination < 0 || destination >= data[master_column].total)
{
for(int j = 0; j < columns; j++)
{
}
}
}
- else
+ else if( gui ) {
// Text is treed
- {
// Cursor is inside items rectangle
if(cursor_x >= 0 &&
cursor_x < (yscrollbar ?
return rectangle_scroll_event();
break;
+ case DRAG_ITEM:
case SELECT:
if(duration == get_resources()->scroll_repeat)
return select_scroll_event();
case NO_OPERATION:
// Show tooltip
- if(button_highlighted && is_popup && !tooltip_done &&
+ if(button_highlighted && is_popup &&
tooltip_text && tooltip_text[0] != 0 &&
duration == get_resources()->tooltip_delay)
{
show_tooltip();
- tooltip_done = 1;
return 1;
}
break;
//printf("BC_ListBox::button_release_event 10\n");
unset_repeat(get_resources()->scroll_repeat);
current_operation = NO_OPERATION;
- translate_coordinates(top_level->event_win,
- gui->win,
- gui->get_cursor_x(),
- gui->get_cursor_y(),
- &cursor_x,
- &cursor_y);
-
- selection_number1 =
- selection_number =
- get_cursor_item(data, cursor_x, cursor_y);
+ if( gui ) {
+ translate_coordinates(top_level->event_win, gui->win,
+ gui->get_cursor_x(), gui->get_cursor_y(),
+ &cursor_x, &cursor_y);
+ selection_number1 = selection_number =
+ get_cursor_item(data, cursor_x, cursor_y);
//printf("BC_ListBox::button_release_event %d %d\n", selection_number2, selection_number1);
+ }
if(is_popup)
{
switch(current_operation)
{
case SELECT:
- if(gui &&
- gui->is_event_win() &&
- allow_drag)
+ if( gui && gui->is_event_win() && allow_drag )
{
BC_ListBoxItem *item_return = 0;
selection_number = get_cursor_item(data,
if(selection_number >= 0)
{
-
- if (item_return->icon_vframe)
- {
+ int cx, cy;
+ get_abs_cursor_xy(cx, cy);
+ cx -= item_return->icon_vframe->get_w() / 2,
+ cy -= item_return->icon_vframe->get_h() / 2;
+ if( item_return->icon_vframe )
drag_popup = new BC_DragWindow(this,
- item_return->icon_vframe /*,
- get_abs_cursor_x(0) - item_return->icon_vframe->get_w() / 2,
- get_abs_cursor_y(0) - item_return->icon_vframe->get_h() / 2 */);
- }
+ item_return->icon_vframe, cx, cy);
else
// this probably works not!
- if (item_return->icon)
- {
+ if( item_return->icon )
drag_popup = new BC_DragWindow(this,
- item_return->icon /*,
- get_abs_cursor_x(0) - item_return->icon->get_w() / 2,
- get_abs_cursor_y(0) - item_return->icon->get_h() / 2 */);
- }
+ item_return->icon, cx, cy);
else
- {
drag_popup = new BC_DragWindow(this,
- drag_icon_vframe /*,
- get_abs_cursor_x(0) - drag_icon_vframe->get_w() / 2,
- get_abs_cursor_y(0) - drag_icon_vframe->get_h() / 2 */);
- }
-
+ drag_icon_vframe, cx, cy);
current_operation = DRAG_ITEM;
+// require shift down for scrolling
+ if( allow_drag < 0 && shift_down() )
+ set_repeat(get_resources()->scroll_repeat);
return 1;
}
}
case COLUMN_DN:
if(gui && gui->is_event_win() && allow_drag_column)
{
+ int cx, cy;
+ get_abs_cursor_xy(cx, cy);
+ cx -= drag_column_icon_vframe->get_w() / 2,
+ cy -= drag_column_icon_vframe->get_h() / 2;
drag_popup = new BC_DragWindow(this,
- drag_column_icon_vframe /*,
- get_abs_cursor_x(0) - drag_column_icon_vframe->get_w() / 2,
- get_abs_cursor_y(0) - drag_column_icon_vframe->get_h() / 2 */);
+ drag_column_icon_vframe, cx, cy);
dragged_title = highlighted_title;
current_operation = COLUMN_DRAG;
draw_titles(1);
}
return drag_popup->cursor_motion_event();
- break;
}
case COLUMN_DRAG:
draw_titles(1);
}
return drag_popup->cursor_motion_event();
- break;
}
}
return 0;
switch(current_operation)
{
case DRAG_ITEM:
+ unset_repeat(get_resources()->scroll_repeat);
// Inside window boundary
if(top_level->cursor_x > 0 &&
top_level->cursor_x < gui->get_w() - drag_popup->get_w() / 2 &&
{
reposition_item(data,
selection_number,
- top_level->cursor_x +
- drag_popup->get_offset_x() -
- LISTBOX_MARGIN -
- 2 +
- xposition,
- top_level->cursor_y +
- drag_popup->get_offset_y() -
- LISTBOX_MARGIN -
- 2 +
- yposition);
+ top_level->cursor_x + drag_popup->get_offset_x() -
+ LISTBOX_MARGIN - 2 + xposition,
+ top_level->cursor_y + drag_popup->get_offset_y() -
+ LISTBOX_MARGIN - 2 + yposition);
}
else
// Move rows
if(process_drag)
{
-// Get destination
- int destination = highlighted_item = item_to_index(data,
- highlighted_ptr);
-//printf("BC_ListBox::drag_stop_event 1 %p %d\n", highlighted_ptr, destination);
-
// Move selected items from data to temporary
ArrayList<BC_ListBoxItem*> *src_items =
new ArrayList<BC_ListBoxItem*>[columns];
-
move_selection(src_items, data);
-
+// Get destination
+ int destination = highlighted_item = item_to_index(data,
+ highlighted_ptr);
// Insert items from temporary to data
- put_selection(data,
- src_items,
- destination);
-
+ put_selection(data, src_items, destination);
delete [] src_items;
set_autoplacement(data, 0, 1);
if(!is_popup)
{
- if(w != -1) popup_w = w;
- if(h != -1) popup_h = h;
if(xscrollbar)
xscrollbar->reposition_window(get_xscroll_x(),
get_xscroll_y(),
int BC_ListBox::deactivate()
{
+ hide_tooltip();
// printf("BC_ListBox::deactivate %d this=%p gui=%p active=%d\n",
// __LINE__,
// this,
int BC_ListBox::activate(int take_focus)
{
-//printf("BC_ListBox::activate %d %p\n", __LINE__, this);
- if(!active)
- {
- if(take_focus)
- {
- top_level->active_subwindow = this;
- active = 1;
- }
-
- button_releases = 0;
-
-// Test for existence of GUI in case this was previously called without
-// take_focus & again with take_focus
- if(is_popup && !gui)
- {
- Window tempwin;
- int x, y;
- int new_x, new_y;
- y = get_y() + get_h();
- if(justify == LISTBOX_RIGHT)
- {
- x = get_x() - popup_w + get_w();
- }
- else
- {
- x = get_x();
- }
-
-
- XTranslateCoordinates(top_level->display,
- parent_window->win,
- top_level->rootwin,
- x,
- y,
- &new_x,
- &new_y,
- &tempwin);
-
- if(new_x < 0) new_x = 0;
- if(new_y + popup_h > top_level->get_root_h(0))
- new_y -= get_h() + popup_h;
-
- add_subwindow(gui = new BC_Popup(this,
- new_x,
- new_y,
- popup_w,
- popup_h,
- -1,
- 0,
- 0));
-// Avoid top going out of screen
- if(new_y < 0 )
- new_y = 2;
-//printf("BC_ListBox::activate %d this=%p %p\n", __LINE__, this, gui->win);
- draw_items(1);
- gui->show_window(1);
- }
-//printf("BC_ListBox::activate %d %p\n", __LINE__, this);
-//sleep(1);
- }
+ if( active ) return 0;
+ active = 1;
+ if( take_focus )
+ set_active_subwindow(this);
+ button_releases = 0;
+ if( !is_popup || gui ) return 0;
+ int wx = get_x(), wy = get_y() + get_h();
+ if( justify == LISTBOX_RIGHT ) wx += get_w() - popup_w;
+ Window xwin;
+ int abs_x, abs_y;
+ XTranslateCoordinates(top_level->display,
+ parent_window->win, top_level->rootwin,
+ wx, wy, &abs_x, &abs_y, &xwin);
+ if( x <= 0 ) x = 2;
+ if( y <= 0 ) y = 2;
+ return activate(abs_x, abs_y);
+}
+
+int BC_ListBox::activate(int x, int y, int w, int h)
+{
+ if( !is_popup || gui ) return 0;
+ active = 1;
+ if(w != -1) popup_w = w;
+ if(h != -1) popup_h = h;
+ reset_query();
+ if( y + popup_h > top_level->get_root_h(0) )
+ y -= get_h() + popup_h;
+ add_subwindow(gui = new BC_Popup(this,
+ x, y, popup_w, popup_h, -1, 0, 0));
+ draw_items(1);
+ gui->show_window(1);
return 0;
}
+int BC_ListBox::is_active()
+{
+ return active;
+}
+
int BC_ListBox::keypress_event()
{
if(!active) return 0;
{
case ESC:
case RETURN:
- case BACKSPACE:
top_level->deactivate();
// If user is manipulating popup with keyboard, don't pass on event.
if(query_len > 0) query[--query_len] = 0;
new_selection = query_list();
}
-
+ if( show_query ) {
+ if( query_len > 0 )
+ show_tooltip(query);
+ else
+ hide_tooltip();
+ }
redraw = 1;
result = 1;
}
void BC_ListBox::update_format(int display_format, int redraw)
{
this->display_format = display_format;
+ xposition = 0; yposition = 0;
if( redraw && gui ) draw_items(1, 1);
}
gui->set_color(row_color);
gui->draw_box(x, y, column_width, h);
gui->set_color(BLACK);
- int yy = y, xx = x + column_width-1;
- gui->draw_line(x, yy, xx, yy);
- yy = y + row_height;
+ int xx = x + column_width-1;
+ gui->draw_line(x, y, xx, y);
+ int hh = h;
+ if( display_format == LISTBOX_ICON_LIST ) {
+ int ih = get_icon_h(item);
+ if( ih > hh ) hh = ih;
+ }
+ int yy = y + hh-1;
gui->draw_line(x, yy, xx, yy);
}
image_number = 2;
}
- int column_offset = get_column_offset(number) - xposition + LISTBOX_BORDER;
- int column_width = get_column_width(number, 1);
gui->draw_3segmenth(get_column_offset(number) - xposition + LISTBOX_BORDER,
LISTBOX_BORDER,
get_column_width(number, 1) + get_resources()->listbox_title_overlap,
column_bg[image_number]);
-// Column title sort order
- if(number == sort_column)
- {
- BC_Pixmap *src;
- if(sort_order == SORT_ASCENDING)
- src = column_sort_dn;
- else
- src = column_sort_up;
+ int title_x = -xposition + get_column_offset(number) +
+ LISTBOX_MARGIN + LISTBOX_BORDER;
+ title_x += get_resources()->listbox_title_margin;
- int x = column_offset +
- column_width -
- LISTBOX_BORDER;
- if(x > items_w) x = items_w;
- x -= 5 + src->get_w();
+ gui->set_color(get_resources()->listbox_title_color);
+ gui->draw_text(title_x,
+ LISTBOX_MARGIN + LISTBOX_BORDER + get_text_ascent(MEDIUMFONT),
+ column_titles[number]);
+
+// Column sort order
+ if(number == sort_column) {
+ BC_Pixmap *src = sort_order == SORT_ASCENDING ?
+ column_sort_dn : column_sort_up;
+
+// int column_offset = get_column_offset(number) - xposition + LISTBOX_BORDER;
+// int column_width = get_column_width(number, 1);
+// int toggle_x = column_offset + column_width - LISTBOX_BORDER;
+// if( toggle_x > items_w ) toggle_x = items_w;
+// toggle_x -= 5 + src->get_w();
+
+ int x = title_x +
+ get_text_width(MEDIUMFONT, column_titles[number]) +
+ LISTBOX_MARGIN;
+
gui->draw_pixmap(src,
x,
title_h / 2 - src->get_h() / 2 + LISTBOX_BORDER);
}
-
-
- int x = -xposition +
- get_column_offset(number) +
- LISTBOX_MARGIN +
- LISTBOX_BORDER;
- x += get_resources()->listbox_title_margin;
-
- gui->set_color(get_resources()->listbox_title_color);
- gui->draw_text(x,
- LISTBOX_MARGIN + LISTBOX_BORDER + get_text_ascent(MEDIUMFONT),
- _(column_titles[number]));
}
int BC_ListBox::draw_titles(int flash)