1116 lines
33 KiB
C
1116 lines
33 KiB
C
#include "../general.h"
|
|
#include "../prefs.h"
|
|
#include "../file/file.h"
|
|
#include "../file/delete.h"
|
|
#include "catalog_entry.h"
|
|
#include "catalog_mini_entry.h"
|
|
#include "../zedit/zedit.h"
|
|
#include "../ztext.h"
|
|
#include "../mfdb.h"
|
|
#include "../infobox.h"
|
|
#include "../menu.h"
|
|
#include "../txt_data.h"
|
|
#include "../custom_font.h"
|
|
#include "catalog_icons.h"
|
|
#include "catalog_keyb.h"
|
|
#include "catalog_mouse.h"
|
|
#include "catalog_slider.h"
|
|
#include "catalog_size.h"
|
|
#include "catalog_iconify.h"
|
|
#include "catalog_other_event.h"
|
|
|
|
/* Global variable */
|
|
int16 border_size = 5;
|
|
int16 old_browser_size = 200;
|
|
int16 old_preview_area_size = 200;
|
|
int16 old_border_size = 5;
|
|
int16 x_space = 5;
|
|
int16 y_space = 4;
|
|
int16 hcell = 8;
|
|
int16 need_frame_slider = 0;
|
|
int16 draw_frame_slider = 1;
|
|
OBJECT *frame_slider_root;
|
|
|
|
/* local variable */
|
|
static int16 dum, xw, yw, ww, hw;
|
|
|
|
|
|
/* Prototype */
|
|
static void WinCatalog_Close( WINDOW *win);
|
|
static void WinCatalog_Redraw( WINDOW *wind);
|
|
static void WinCatalog_Tool( WINDOW *win);
|
|
void WinCatalog_Refresh( WINDOW *win);
|
|
int WindMakePreview_needed( WINDOW *win);
|
|
void WindMakePreview( WINDOW *win);
|
|
int WinCatalog( void);
|
|
void WinCatalog_filelist_redraw( void);
|
|
void WinCatalog_set_thumbnails_size( WINDOW *win);
|
|
|
|
|
|
extern void save_dialog( const char *fullfilename);
|
|
|
|
/*==================================================================================*
|
|
* int WindMakePreview_needed: *
|
|
* Look if a preview making is needed. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* '1' if needed else '0' *
|
|
*==================================================================================*/
|
|
|
|
int WindMakePreview_needed( WINDOW *win)
|
|
{
|
|
int16 i, h;
|
|
WINDICON *wicones = ( WINDICON *)DataSearch( win, WD_ICON);
|
|
|
|
WindGet ( win, WF_WORKXYWH, &dum, &dum, &dum, &h);
|
|
|
|
for (i = 0 ; i < wicones->nbr_icons ; i++)
|
|
{
|
|
if ( icon_is_visible( &wicones->entry[i], h) == FALSE)
|
|
continue;
|
|
|
|
if ( ( wicones->entry[i].type == ET_IMAGE) && ( wicones->entry[i].preview.page == 0))
|
|
return( 1);
|
|
}
|
|
return ( 0);
|
|
}
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* void WindMakePreview: *
|
|
* Create picture's preview for each visible picture files in the folder. *
|
|
* If preview is already done, we skip it. *
|
|
* If preview making is impossible, we change the file's type from ET_IMAGE *
|
|
* to ET_FILE. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
void WindMakePreview( WINDOW *win)
|
|
{
|
|
int16 i, h;
|
|
char extention[4];
|
|
WINDICON *wicones = ( WINDICON *)DataSearch( win, WD_ICON);
|
|
|
|
draw_frame_slider = 0;
|
|
|
|
WindGet ( win, WF_WORKXYWH, &dum, &dum, &dum, &h);
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
for (i = 0 ; i < wicones->nbr_icons ; i++)
|
|
{
|
|
|
|
if ( icon_is_visible( &wicones->entry[i], h) == FALSE)
|
|
continue;
|
|
|
|
if ( ( wicones->entry[i].type == ET_IMAGE) && ( wicones->entry[i].preview.page == 0))
|
|
{
|
|
wicones->entry[i].preview.view_mode = preview_mode;
|
|
wicones->entry[i].preview.progress_bar = 0;
|
|
|
|
// MenuDisable();
|
|
|
|
/* get the file extention */
|
|
strcpy ( extention, wicones->entry[i].name + strlen( wicones->entry[i].name) - 3);
|
|
str2upper( extention);
|
|
|
|
if( pic_load( wicones->entry[i].name, extention, &wicones->entry[i].preview))
|
|
redraw_icon( win, &wicones->entry[i]);
|
|
else
|
|
wicones->entry[i].type = ET_FILE;
|
|
}
|
|
|
|
// evnt_timer( 100L);
|
|
}
|
|
|
|
draw_frame_slider = 1;
|
|
graf_mouse( ARROW, NULL);
|
|
// MenuEnable();
|
|
}
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* WINDOW *WinCatalog: *
|
|
* Create the Window and bind the severals event for it. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* -- *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* '0' if error, else '1'. *
|
|
*==================================================================================*/
|
|
|
|
int WinCatalog( void)
|
|
{
|
|
WINDICON *wicones;
|
|
OBJECT *menu;
|
|
int16 w, h;
|
|
|
|
if ( win_catalog)
|
|
return( 0);
|
|
|
|
if ( !icons_init())
|
|
{
|
|
errshow( "", NO_ICON);
|
|
applexit();
|
|
}
|
|
|
|
if ( ( wicones = ( WINDICON *) gmalloc( sizeof( WINDICON))) == NULL)
|
|
{
|
|
errshow( "", ENOMEM);
|
|
return( 0);
|
|
}
|
|
|
|
if ( ( win_catalog = WindCreate( WINATTRIB, app.x, app.y, app.w, app.h)) == NULL)
|
|
{
|
|
gfree( wicones);
|
|
errshow( "", ALERT_WINDOW);
|
|
return( 0);
|
|
}
|
|
|
|
|
|
/* Set some wicones's parameters */
|
|
wicones -> case_h = thumbnail[thumbnail_size][1] + hcell + y_space + y_space + y_space;
|
|
|
|
if ( show_size)
|
|
wicones -> case_h += hcell + y_space;
|
|
|
|
wicones -> case_w = thumbnail[thumbnail_size][0] + ( x_space << 1);
|
|
wicones -> nbr_icons = 0;
|
|
wicones -> edit = NULL;
|
|
wicones -> h_u = 18; /* 1 + mini_entry's icon + 1 */
|
|
wicones -> ypos = 0;
|
|
wicones -> ypos_max = 1;
|
|
|
|
DataAttach( win_catalog, WD_ICON, wicones);
|
|
|
|
if ( !scan_mini_drv( win_catalog))
|
|
{
|
|
zdebug( "can't scan the drive");
|
|
gfree( wicones);
|
|
DataDelete( win_catalog, WD_ICON);
|
|
WindDelete( win_catalog);
|
|
return( 0);
|
|
}
|
|
|
|
check_mini_dir( wicones->nbr_child, wicones->root);
|
|
|
|
if( !scan_dir( win_catalog, "C:\\"))
|
|
{
|
|
zdebug( "can't scan the dir");
|
|
WinCatalog_Close( win_catalog);
|
|
return( 0);
|
|
}
|
|
|
|
EvntAttach( win_catalog, WM_REDRAW, WinCatalog_Redraw);
|
|
EvntAttach( win_catalog, WM_DESTROY, WinCatalog_Close);
|
|
EvntAttach( win_catalog, WM_SIZED, WinCatalog_Size);
|
|
EvntAttach( win_catalog, WM_ARROWED, WinCatalog_Arrow);
|
|
EvntAttach( win_catalog, WM_UPPAGE, WinCatalog_UpPage);
|
|
EvntAttach( win_catalog, WM_DNPAGE, WinCatalog_DownPage);
|
|
EvntAttach( win_catalog, WM_UPLINE, WinCatalog_UpLine);
|
|
EvntAttach( win_catalog, WM_DNLINE, WinCatalog_DownLine);
|
|
EvntAttach( win_catalog, WM_VSLID , WinCatalog_VSlide);
|
|
EvntAttach( win_catalog, WM_FULLED, WinCatalog_Fulled);
|
|
// EvntAttach( win_catalog, AP_DRAGDROP, WinCatalog_DragDrop);
|
|
EvntAdd( win_catalog, WM_ICONIFY, catalog_iconify, EV_TOP);
|
|
EvntAdd( win_catalog, WM_UNICONIFY, catalog_uniconify, EV_TOP);
|
|
EvntAdd( win_catalog, WM_TOPPED, WinCatalog_top, EV_BOT);
|
|
EvntAdd( win_catalog, WM_BOTTOMED, WinCatalog_bottom, EV_BOT);
|
|
|
|
EvntAttach( win_catalog, WM_XBUTTON, WinCatalog_Mouse);
|
|
EvntAttach( win_catalog, WM_XKEYBD, WinCatalog_Keyb);
|
|
|
|
WindSetStr( win_catalog, WF_NAME, wicones->directory);
|
|
WindSetPtr( win_catalog, WF_TOOLBAR, get_tree( TOOLBAR), WinCatalog_Tool);
|
|
WindSetStr( win_catalog, WF_ICONDRAW, draw_window_iconified);
|
|
|
|
WindCalc( WC_BORDER, win_catalog, 0, 0, wicones->case_w + border_size + browser_frame_width, wicones->case_h, &dum, &dum, &w, &h);
|
|
|
|
/* Set win's parameters */
|
|
win_catalog -> h_min = h;
|
|
win_catalog -> w_min = w;
|
|
win_catalog -> h_max = app.h;
|
|
win_catalog -> w_max = app.w;
|
|
win_catalog -> h_u = wicones -> case_h;
|
|
win_catalog -> w_u = wicones -> case_w;
|
|
win_catalog -> tool.root[TOOLBAR_BACK].ob_width = app.w;
|
|
|
|
/* install userdraw for the toolbar */
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_UP, draw_icon_up, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_RELOAD, draw_icon_reload, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_BIG, draw_icon_greater, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_SMALL, draw_icon_smaller, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_PRINT, draw_icon_printer, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_OPEN, draw_icon_open, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_INFO, draw_icon_info, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_DELETE, draw_icon_delete, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, win_catalog, TOOLBAR_SAVE, draw_icon_save, NULL);
|
|
|
|
/* get the frame slider's address */
|
|
rsrc_gaddr( 0, SLIDERS, &frame_slider_root);
|
|
|
|
if( !browser_w && !browser_h)
|
|
{
|
|
browser_x = app.x;
|
|
browser_y = app.y;
|
|
browser_w = app.w;
|
|
browser_h = app.h;
|
|
}
|
|
|
|
if( !WindOpen( win_catalog, browser_x, browser_y, browser_w, browser_h))
|
|
{
|
|
WinCatalog_Close( win_catalog);
|
|
errshow( "", ALERT_WINDOW);
|
|
return( 0);
|
|
}
|
|
|
|
|
|
menu = get_tree( MENU_BAR);
|
|
|
|
menu_ienable( menu, MENU_BAR_BROWSER, 0);
|
|
menu_ienable( menu, MENU_BAR_CLOSE, 1);
|
|
menu_ienable( menu, MENU_BAR_SELECT_ALL, 1);
|
|
menu_ienable( menu, MENU_BAR_BY_NAME, 1);
|
|
menu_ienable( menu, MENU_BAR_BY_SIZE, 1);
|
|
menu_ienable( menu, MENU_BAR_BY_DATE, 1);
|
|
menu_ienable( menu, MENU_BAR_SHOW_BROWSER, 1);
|
|
menu_ienable( menu, MENU_BAR_SHOW, 1);
|
|
menu_ienable( menu, MENU_BAR_LONG_THUMB, 1);
|
|
menu_ienable( menu, MENU_BAR_LARGE_THUMB, 1);
|
|
menu_ienable( menu, MENU_BAR_INFORMATION, 0);
|
|
menu_ienable( menu, MENU_BAR_SAVE, 0);
|
|
|
|
if( WindMakePreview_needed( win_catalog))
|
|
{
|
|
EvntRedraw( win_catalog);
|
|
WindMakePreview( win_catalog);
|
|
}
|
|
|
|
return ( 1);
|
|
}
|
|
|
|
/*==================================================================================*
|
|
* WinCatalog_Close: *
|
|
* Destroy the WINDOW *win and free up memory. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void WinCatalog_Close( WINDOW *win)
|
|
{
|
|
int16 i;
|
|
OBJECT *menu = get_tree( MENU_BAR);
|
|
|
|
WINDICON *wicones = ( WINDICON *)DataSearch( win, WD_ICON);
|
|
|
|
if( !( win->status & WS_ICONIFY))
|
|
{
|
|
WindGet ( win, WF_CURRXYWH, &xw, &yw, &ww, &hw);
|
|
|
|
browser_x = xw;
|
|
browser_y = yw;
|
|
browser_w = ww;
|
|
browser_h = hw;
|
|
}
|
|
|
|
for ( i = 0 ; i < wicones->nbr_icons ; i++)
|
|
{
|
|
delete_txt_data( &wicones->entry[i].preview);
|
|
delete_mfdb( wicones->entry[i].preview.image, 1);
|
|
}
|
|
|
|
if ( wicones->edit)
|
|
edit_free( wicones->edit);
|
|
|
|
/* free allocated data structures */
|
|
if ( wicones->nbr_icons > 0)
|
|
gfree( wicones->entry);
|
|
|
|
if( wicones->root)
|
|
{
|
|
for ( i = 0; i < wicones->nbr_child; i++)
|
|
{
|
|
if ( wicones->root[i].nbr_child)
|
|
delete_mini_entry_child( &wicones->root[i]);
|
|
}
|
|
|
|
gfree( wicones->root);
|
|
}
|
|
|
|
gfree( wicones);
|
|
|
|
DataDelete( win, WD_ICON);
|
|
|
|
WindDelete( win);
|
|
|
|
if( wglb.first)
|
|
{
|
|
menu_ienable( menu, MENU_BAR_CLOSE, 1);
|
|
menu_ienable( menu, MENU_BAR_SAVE, 1);
|
|
}
|
|
else
|
|
{
|
|
menu_ienable( menu, MENU_BAR_SAVE, 0);
|
|
menu_ienable( menu, MENU_BAR_INFORMATION, 0);
|
|
}
|
|
|
|
menu_ienable( menu, MENU_BAR_SELECT_ALL, 0);
|
|
menu_ienable( menu, MENU_BAR_BY_NAME, 0);
|
|
menu_ienable( menu, MENU_BAR_BY_SIZE, 0);
|
|
menu_ienable( menu, MENU_BAR_BY_DATE, 0);
|
|
menu_ienable( menu, MENU_BAR_SHOW, 0);
|
|
menu_ienable( menu, MENU_BAR_SHOW_BROWSER, 0);
|
|
menu_ienable( menu, MENU_BAR_DELETE, 0);
|
|
menu_ienable( menu, MENU_BAR_LONG_THUMB, 0);
|
|
menu_ienable( menu, MENU_BAR_LARGE_THUMB, 0);
|
|
menu_ienable( menu, MENU_BAR_BROWSER, 1);
|
|
|
|
win_catalog = NULL;
|
|
}
|
|
|
|
|
|
/*==================================================================================*
|
|
* WinCatalog_tool: *
|
|
* Toolbar binding. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void WinCatalog_Tool( WINDOW *win)
|
|
{
|
|
WINDICON *wicones = ( WINDICON *)DataSearch( win, WD_ICON);
|
|
Mini_Entry *old_selected;
|
|
char temp[MAX_PATH + 256];
|
|
int16 i;
|
|
|
|
WindGet ( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
|
|
switch( evnt.buff[4])
|
|
{
|
|
case TOOLBAR_UP:
|
|
if ( !dir_parent( wicones->directory, temp))
|
|
break;
|
|
|
|
old_selected = wicones->mini_selected;
|
|
wicones->mini_selected = NULL;
|
|
|
|
if ( old_selected && browser_frame_width)
|
|
redraw_mini_entry( win, old_selected);
|
|
|
|
( void)scan_dir( win, wicones->directory);
|
|
WindSetStr ( win, WF_NAME, wicones->directory);
|
|
|
|
win->ypos = 0;
|
|
|
|
for (i = 0 ; i < wicones->nbr_icons ; i++)
|
|
{
|
|
if ( strcmp( wicones->entry[i].name, temp) == 0)
|
|
{
|
|
wicones->first_selected = &wicones->entry[i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
WinCatalog_Refresh( win);
|
|
|
|
if ( wicones->first_selected->txt_pos.y2 > hw)
|
|
{
|
|
while ( wicones->first_selected->txt_pos.y2 > hw)
|
|
{
|
|
wicones->first_selected->txt_pos.y2 -= win->h_u;
|
|
win->ypos++;
|
|
}
|
|
}
|
|
|
|
draw_page( win, xw + browser_frame_width + border_size , yw, ww - ( browser_frame_width + border_size), hw);
|
|
WindMakePreview( win);
|
|
|
|
break;
|
|
|
|
case TOOLBAR_SMALL:
|
|
if ( thumbnail_size && thumbnail_size != 4)
|
|
{
|
|
thumbnail_size--;
|
|
|
|
WinCatalog_set_thumbnails_size( win);
|
|
|
|
if( thumbnail_size == 6 || thumbnail_size == 2)
|
|
ObjcDraw( OC_TOOLBAR, win, TOOLBAR_BIG, 1);
|
|
}
|
|
break;
|
|
|
|
case TOOLBAR_BIG:
|
|
if ( thumbnail_size < 7 && thumbnail_size != 3)
|
|
{
|
|
thumbnail_size++;
|
|
|
|
WinCatalog_set_thumbnails_size( win);
|
|
|
|
if( thumbnail_size == 1 || thumbnail_size == 5)
|
|
ObjcDraw( OC_TOOLBAR, win, TOOLBAR_SMALL, 1);
|
|
}
|
|
break;
|
|
|
|
case TOOLBAR_RELOAD:
|
|
( void)scan_dir( win, wicones->directory);
|
|
win->ypos = 0;
|
|
draw_page( win, xw + browser_frame_width + border_size , yw + 1, ww - ( browser_frame_width + border_size), hw - 1);
|
|
WindMakePreview( win);
|
|
break;
|
|
|
|
case TOOLBAR_OPEN:
|
|
Menu_open_image();
|
|
break;
|
|
|
|
case TOOLBAR_INFO:
|
|
if( wicones->first_selected)
|
|
infobox();
|
|
break;
|
|
|
|
case TOOLBAR_SAVE:
|
|
if( wicones->first_selected && wicones->first_selected->type == ET_IMAGE)
|
|
{
|
|
if( wicones->edit)
|
|
exit_edit_mode( win, wicones->first_selected);
|
|
|
|
strcpy( temp, wicones->directory);
|
|
strcat( temp, wicones->first_selected->name);
|
|
save_dialog( temp);
|
|
break;
|
|
}
|
|
break;
|
|
case TOOLBAR_DELETE:
|
|
if( wicones->first_selected)
|
|
{
|
|
if( wicones->edit)
|
|
exit_edit_mode( win, wicones->first_selected);
|
|
|
|
delete_entry( win);
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ObjcChange( OC_TOOLBAR, win, evnt.buff[4], NORMAL, 1);
|
|
}
|
|
|
|
|
|
/*==================================================================================*
|
|
* WinCatalog_Refresh: *
|
|
* Perform a redraw without draw anything in screen.. usefull for refresh *
|
|
* icons positions ( need for various opertaions) *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
void WinCatalog_Refresh( WINDOW *win)
|
|
{
|
|
int16 icon_w, icon_h, i, x, y, ytext, xtext, lines = 0, width;
|
|
|
|
WINDICON *wicones = ( WINDICON *)DataSearch( win, WD_ICON);
|
|
|
|
WindGet ( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
|
|
wicones -> columns = 0;
|
|
wicones -> icons_last_line = 0;
|
|
|
|
if( browser_frame_width) /* browser active ? */
|
|
{
|
|
for ( i = 0 ; i < wicones->nbr_child; i++)
|
|
{
|
|
lines++;
|
|
lines += calc_mini_entry_line( &wicones->root[i]);
|
|
}
|
|
|
|
wicones -> ypos_max = lines;
|
|
|
|
/* compute the frame slider's coordinates even if we don't need it */
|
|
frame_slider_root->ob_x = xw + browser_frame_width - 15;
|
|
frame_slider_root->ob_y = yw + 2;
|
|
frame_slider_root->ob_height = hw - 3;
|
|
frame_slider_root[SLIDERS_BACK].ob_height = hw - 31;
|
|
frame_slider_root[SLIDERS_UP].ob_y = frame_slider_root->ob_height - 31;
|
|
frame_slider_root[SLIDERS_DOWN].ob_y = frame_slider_root->ob_height - 15;
|
|
|
|
calc_mini_entry_slider( wicones, frame_slider_root);
|
|
}
|
|
|
|
lines = 1;
|
|
x = xw + border_size + browser_frame_width;
|
|
y = yw - ( ( int16)win->ypos * wicones -> case_h);
|
|
|
|
for ( i = 0 ; i < wicones->nbr_icons; i++)
|
|
{
|
|
if ( ( !show_non_image) && ( wicones->entry[i].type != ET_IMAGE && wicones->entry[i].type != ET_DIR && wicones->entry[i].type != ET_PDF))
|
|
continue;
|
|
|
|
if ( x + wicones->case_w > xw + ww)
|
|
{
|
|
x = xw + border_size + browser_frame_width;
|
|
y += wicones -> case_h; /* Jump to next line */
|
|
lines++;
|
|
wicones->icons_last_line = 1;
|
|
}
|
|
else
|
|
{
|
|
wicones -> icons_last_line++;
|
|
if ( wicones -> columns < wicones -> icons_last_line)
|
|
wicones -> columns++;
|
|
}
|
|
|
|
icon_w = wicones->entry[i].preview.page ? wicones->entry[i].preview.image->fd_w : wicones->entry[i].icon->fd_w;
|
|
icon_h = wicones->entry[i].preview.page ? wicones->entry[i].preview.image->fd_h : wicones->entry[i].icon->fd_h;
|
|
|
|
|
|
ytext = y + thumbnail[thumbnail_size][1] + ( y_space << 1);
|
|
|
|
/* save the case position in the structure */
|
|
wicones->entry[i].case_pos.x1 = x - xw;
|
|
wicones->entry[i].case_pos.y1 = y - yw;
|
|
wicones->entry[i].case_pos.x2 = wicones->entry[i].case_pos.x1 + wicones->case_w;
|
|
wicones->entry[i].case_pos.y2 = wicones->entry[i].case_pos.y1 + wicones->case_h;
|
|
|
|
if( wicones->edit && check_selected_entry( wicones, &wicones->entry[i]))
|
|
{
|
|
int16 txt_width = get_text_width( wicones->edit->top->buf);
|
|
|
|
width = MAX( txt_width, 16);
|
|
|
|
}
|
|
else
|
|
width = wicones->entry[i].icon_txt_w;
|
|
|
|
|
|
xtext = x + (( wicones->case_w - 1 - width) >> 1);
|
|
|
|
/* save the text position in the structure */
|
|
wicones->entry[i].txt_pos.x1 = xtext - xw - 2;
|
|
wicones->entry[i].txt_pos.y1 = ytext - 1 - yw;
|
|
wicones->entry[i].txt_pos.x2 = wicones->entry[i].txt_pos.x1 + width + 4;
|
|
wicones->entry[i].txt_pos.y2 = wicones->entry[i].txt_pos.y1 + hcell + 2;
|
|
|
|
/* save the icon position in the structure */
|
|
wicones->entry[i].icn_pos.x1 = ( x + (( wicones->case_w - icon_w) >> 1)) - xw;
|
|
wicones->entry[i].icn_pos.y1 = ( y + y_space + (( thumbnail[thumbnail_size][1] - icon_h) >> 1) + 1) - yw;
|
|
wicones->entry[i].icn_pos.x2 = wicones->entry[i].icn_pos.x1 + icon_w - 1;
|
|
wicones->entry[i].icn_pos.y2 = wicones->entry[i].txt_pos.y1;
|
|
|
|
x += wicones->case_w;
|
|
}
|
|
|
|
win -> ypos_max = lines;
|
|
win -> xpos_max = wicones->columns;
|
|
|
|
}
|
|
|
|
|
|
/*==================================================================================*
|
|
* WinCatalog_Redraw: *
|
|
* redraw event for the WINDOW *win. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void WinCatalog_Redraw( WINDOW *wind)
|
|
{
|
|
int16 icon_w, icon_h, i, x, y, xtext, ytext, pxy[4], lines = 0, extent[10];
|
|
RECT16 dst_rect;
|
|
WINDICON *wicones = (WINDICON *)DataSearch( wind, WD_ICON);
|
|
|
|
WindGet( wind, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
|
|
wicones -> columns = 0;
|
|
wicones -> icons_last_line = 0;
|
|
|
|
if( browser_frame_width) /* browser active ? */
|
|
{
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + browser_frame_width;
|
|
pxy[3] = pxy[1] + hw - 1;
|
|
|
|
/* clean browser frame */
|
|
vsf_color( wind->graf.handle, WHITE);
|
|
v_bar( wind->graf.handle, pxy);
|
|
|
|
wicones -> border_position[0] = browser_frame_width;
|
|
wicones -> border_position[1] = browser_frame_width + border_size;
|
|
|
|
|
|
/* Draw the 1st frame ( navigation folder) */
|
|
y = 0 - ( ( int16)wicones -> ypos * wicones -> h_u);
|
|
|
|
for ( i = 0 ; i < wicones->nbr_child; i++)
|
|
{
|
|
wicones->root[i].arrow_position.x1 = 3;
|
|
wicones->root[i].arrow_position.y1 = y + 3;
|
|
wicones->root[i].arrow_position.x2 = wicones->root[i].arrow_position.x1 + 11;
|
|
wicones->root[i].arrow_position.y2 = wicones->root[i].arrow_position.y1 + 11;
|
|
|
|
wicones->root[i].icon_position.x1 = 15;
|
|
wicones->root[i].icon_position.y1 = y + 1;
|
|
wicones->root[i].icon_position.x2 = wicones->root[i].icon_position.x1 + 15 + x_space + wicones->root[i].icon_txt_w;
|
|
wicones->root[i].icon_position.y2 = wicones->root[i].icon_position.y1 + 15;
|
|
|
|
draw_mini_entry( wind, wicones->mini_selected, &wicones->root[i], xw, yw, hw);
|
|
|
|
lines++;
|
|
y += wicones -> h_u;
|
|
|
|
dum = draw_mini_entry_child( wind, wicones->mini_selected, &wicones->root[i], 15, y, xw, yw, hw);
|
|
|
|
y += ( dum * wicones -> h_u);
|
|
|
|
lines += dum;
|
|
}
|
|
|
|
wicones -> ypos_max = lines;
|
|
|
|
/* Look if we need a frame slider */
|
|
if( ( wicones -> ypos_max * wicones -> h_u) >= hw)
|
|
{
|
|
if ( draw_frame_slider)
|
|
{
|
|
frame_slider_root->ob_x = xw + browser_frame_width - 15;
|
|
frame_slider_root->ob_y = yw + 2;
|
|
frame_slider_root->ob_height = hw - 3;
|
|
frame_slider_root[SLIDERS_BACK].ob_height = hw - 31;
|
|
frame_slider_root[SLIDERS_UP].ob_y = frame_slider_root->ob_height - 31;
|
|
frame_slider_root[SLIDERS_DOWN].ob_y = frame_slider_root->ob_height - 15;
|
|
|
|
calc_mini_entry_slider( wicones, frame_slider_root);
|
|
objc_draw( frame_slider_root, SLIDERS_BOX, 2, clip.g_x, clip.g_y, clip.g_w, clip.g_h);
|
|
}
|
|
|
|
need_frame_slider = 1;
|
|
}
|
|
else
|
|
need_frame_slider = 0;
|
|
|
|
/* Draw the frame border */
|
|
pxy[0] = pxy[2];
|
|
vsl_color( wind->graf.handle, BLACK);
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
vsl_color( wind->graf.handle, WHITE);
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
vsl_color( wind->graf.handle, LWHITE);
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
vsl_color( wind->graf.handle, BLACK);
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
|
|
/* Draw the 2nd frame ( the file) */
|
|
pxy[2] = pxy[0] + ww - ( browser_frame_width + border_size) - 1;
|
|
vsf_color( wind->graf.handle, WHITE);
|
|
v_bar( wind->graf.handle, pxy);
|
|
|
|
pxy[3] = yw;
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
pxy[0] = xw;
|
|
pxy[2] = pxy[0] + browser_frame_width;
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
}
|
|
else
|
|
{
|
|
/* clean browser frame */
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + ww - 1;
|
|
pxy[3] = pxy[1] + hw - 1;
|
|
|
|
vsf_color( wind->graf.handle, WHITE);
|
|
v_bar( wind->graf.handle, pxy);
|
|
|
|
/* Draw a horizontal line at the window top */
|
|
pxy[3] = pxy[1];
|
|
vsl_color( wind->graf.handle, BLACK);
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
}
|
|
|
|
// yw++;
|
|
// hw--;
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* MAKE THE FIRST PASS */
|
|
/* WE DRAW ONLY ALL THE ICONS BUT NOT THE TEXT OF THE SELECTED'S ONE */
|
|
/* IF WE DRAW ALL THE TEXTS NOW, THE MULTILINES TEXT AREN'T VISIBLE */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/* Draw the folder's content */
|
|
x = xw + border_size + browser_frame_width;
|
|
y = yw - ( ( int16)wind->ypos * wicones -> case_h);
|
|
lines = 1;
|
|
|
|
for ( i = 0 ; i < wicones->nbr_icons; i++)
|
|
{
|
|
if ( ( !show_non_image) && ( wicones->entry[i].type != ET_IMAGE && wicones->entry[i].type != ET_DIR && wicones->entry[i].type != ET_PDF))
|
|
continue;
|
|
|
|
if ( x + wicones->case_w > xw + ww)
|
|
{
|
|
x = xw + border_size + browser_frame_width;
|
|
y += wicones -> case_h; /* Jump to next line */
|
|
lines++;
|
|
wicones->icons_last_line = 1;
|
|
}
|
|
else
|
|
{
|
|
wicones -> icons_last_line++;
|
|
|
|
if ( wicones -> columns < wicones -> icons_last_line)
|
|
wicones -> columns++;
|
|
}
|
|
|
|
icon_w = wicones->entry[i].preview.page ? wicones->entry[i].preview.image->fd_w : wicones->entry[i].icon->fd_w;
|
|
icon_h = wicones->entry[i].preview.page ? wicones->entry[i].preview.image->fd_h : wicones->entry[i].icon->fd_h;
|
|
|
|
dst_rect.x1 = x + (( wicones->case_w - icon_w) >> 1);
|
|
dst_rect.y1 = y + y_space + (( thumbnail[thumbnail_size][1] - icon_h) >> 1) + 1;
|
|
dst_rect.x2 = dst_rect.x1 + icon_w - 1;
|
|
dst_rect.y2 = dst_rect.y1 + icon_h - 1;
|
|
|
|
/* save the case position in the structure */
|
|
wicones->entry[i].case_pos.x1 = x - xw;
|
|
wicones->entry[i].case_pos.y1 = y - yw;
|
|
wicones->entry[i].case_pos.x2 = wicones->entry[i].case_pos.x1 + wicones->case_w;
|
|
wicones->entry[i].case_pos.y2 = wicones->entry[i].case_pos.y1 + wicones->case_h;
|
|
|
|
xtext = x + (( wicones->case_w - 1 - wicones->entry[i].icon_txt_w) >> 1);
|
|
ytext = y + thumbnail[thumbnail_size][1] + y_space + y_space;
|
|
|
|
/* save the text position in the structure */
|
|
wicones->entry[i].txt_pos.x1 = xtext - xw - 2;
|
|
wicones->entry[i].txt_pos.y1 = ytext - 1 - yw;
|
|
wicones->entry[i].txt_pos.x2 = wicones->entry[i].txt_pos.x1 + wicones->entry[i].icon_txt_w + 4;
|
|
wicones->entry[i].txt_pos.y2 = wicones->entry[i].txt_pos.y1 + hcell + 2;
|
|
|
|
/* save the icon position in the structure */
|
|
wicones->entry[i].icn_pos.x1 = dst_rect.x1 - xw;
|
|
wicones->entry[i].icn_pos.y1 = dst_rect.y1 - yw;
|
|
wicones->entry[i].icn_pos.x2 = wicones->entry[i].icn_pos.x1 + icon_w - 1;
|
|
wicones->entry[i].icn_pos.y2 = wicones->entry[i].txt_pos.y1;
|
|
|
|
if( y < yw || y >= yw + hw)
|
|
{
|
|
x += wicones->case_w;
|
|
continue;
|
|
}
|
|
|
|
if ( !check_selected_entry( wicones, &wicones->entry[i]))
|
|
{
|
|
draw_icon( wind->graf.handle, &wicones->entry[i], FALSE, &dst_rect);
|
|
draw_text( wind->graf.handle, xtext, ytext, BLACK, wicones->entry[i].name_shown);
|
|
vsl_color( wind->graf.handle, LWHITE);
|
|
}
|
|
else
|
|
{
|
|
draw_icon( wind->graf.handle, &wicones->entry[i], TRUE, &dst_rect);
|
|
}
|
|
|
|
/* Draw the case 'contour' */
|
|
pxy[1] = y + 1;
|
|
pxy[3] = y + wicones->case_h - 2;
|
|
pxy[0] = x + 1;
|
|
pxy[2] = x + wicones->case_w - 2;
|
|
|
|
extent[0] = pxy[0];
|
|
extent[1] = pxy[1];
|
|
extent[2] = pxy[0];
|
|
extent[3] = pxy[3];
|
|
extent[4] = pxy[2];
|
|
extent[5] = pxy[3];
|
|
extent[6] = pxy[2];
|
|
extent[7] = pxy[1];
|
|
extent[8] = pxy[0];
|
|
extent[9] = pxy[1];
|
|
|
|
v_pline( wind->graf.handle, 5, extent);
|
|
vsl_color( wind->graf.handle, BLACK);
|
|
|
|
|
|
/* if ( !check_selected_entry( wicones, &wicones->entry[i]))
|
|
{
|
|
draw_icon( wind->graf.handle, &wicones->entry[i], FALSE, &dst_rect);
|
|
draw_text( wind->graf.handle, xtext, ytext, BLACK, wicones->entry[i].name_shown);
|
|
}
|
|
else
|
|
{
|
|
pxy[1] = y + 1;
|
|
pxy[3] = y + wicones->case_h - 2;
|
|
pxy[0] = x + 1;
|
|
pxy[2] = x + wicones->case_w - 2;
|
|
|
|
extent[0] = pxy[0];
|
|
extent[1] = pxy[1];
|
|
extent[2] = pxy[0];
|
|
extent[3] = pxy[3];
|
|
extent[4] = pxy[2];
|
|
extent[5] = pxy[3];
|
|
extent[6] = pxy[2];
|
|
extent[7] = pxy[1];
|
|
extent[8] = pxy[0];
|
|
extent[9] = pxy[1];
|
|
|
|
v_pline( wind->graf.handle, 5, extent);
|
|
|
|
draw_icon( wind->graf.handle, &wicones->entry[i], TRUE, &dst_rect);
|
|
}
|
|
*/
|
|
|
|
if ( show_size)
|
|
{
|
|
if ( !S_ISDIR( wicones->entry[i].stat.st_mode))
|
|
{
|
|
int16 size_x_pos = x + (( wicones->case_w - 1 - get_text_width( wicones->entry[i].size))>> 1);
|
|
draw_text( wind->graf.handle, size_x_pos, ytext + y_space + hcell, LBLACK, wicones->entry[i].size);
|
|
}
|
|
}
|
|
|
|
x += wicones->case_w;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------------------*/
|
|
/* MAKE THE SECOND PASS */
|
|
/* WE DRAW THE TEXT OF THE SELECTED'S ICON AND THE ICONS IN EDIT MODE */
|
|
/*----------------------------------------------------------------------*/
|
|
|
|
/* Draw the folder's content */
|
|
x = xw + border_size + browser_frame_width;
|
|
y = yw - ( ( int16)wind->ypos * wicones -> case_h);
|
|
|
|
|
|
for ( i = 0 ; i < wicones->nbr_icons; i++)
|
|
{
|
|
if ( ( !show_non_image) && ( wicones->entry[i].type != ET_IMAGE && wicones->entry[i].type != ET_DIR && wicones->entry[i].type != ET_PDF))
|
|
continue;
|
|
|
|
if ( x + wicones->case_w > xw + ww)
|
|
{
|
|
x = xw + border_size + browser_frame_width;
|
|
y += wicones -> case_h; /* Jump to next line */
|
|
}
|
|
|
|
if( y < yw || y >= yw + hw)
|
|
{
|
|
x += wicones->case_w;
|
|
continue;
|
|
}
|
|
|
|
ytext = y + thumbnail[thumbnail_size][1] + ( y_space << 1);
|
|
|
|
if ( check_selected_entry( wicones, &wicones->entry[i])) /* Look if the icon is selected */
|
|
{
|
|
pxy[1] = wicones->entry[i].txt_pos.y1 + yw;
|
|
pxy[3] = wicones->entry[i].txt_pos.y2 + yw;
|
|
|
|
if( wicones->edit)
|
|
{
|
|
int16 hc, xc;
|
|
int16 txt_width = get_text_width( wicones->edit->top->buf);
|
|
int16 width = MAX( txt_width, 16);
|
|
|
|
xtext = x + (( wicones->case_w - 1 - txt_width) >> 1);
|
|
|
|
pxy[0] = x + (( wicones->case_w - 1 - width) >> 1) - 2;
|
|
pxy[2] = pxy[0] + width + 4;
|
|
vsf_color( wind->graf.handle, LWHITE);
|
|
v_bar( wind->graf.handle, pxy);
|
|
|
|
extent[0] = pxy[0];
|
|
extent[1] = pxy[1];
|
|
extent[2] = pxy[0];
|
|
extent[3] = pxy[3];
|
|
extent[4] = pxy[2];
|
|
extent[5] = pxy[3];
|
|
extent[6] = pxy[2];
|
|
extent[7] = pxy[1];
|
|
extent[8] = pxy[0];
|
|
extent[9] = pxy[1];
|
|
|
|
v_pline( wind->graf.handle, 5, extent);
|
|
|
|
draw_text( wind->graf.handle, xtext, ytext, BLACK, wicones->edit->top->buf);
|
|
|
|
cursor_position( wind, &xc, &dum, &dum, &hc);
|
|
|
|
pxy[0] += 3 + xc - xw;
|
|
pxy[2] = pxy[0];
|
|
pxy[1] = ytext + 1;
|
|
pxy[3] = pxy[1] + hc - 2;
|
|
|
|
v_pline( wind->graf.handle, 2, pxy);
|
|
|
|
/* save the text position in the structure */
|
|
wicones->entry[i].txt_pos.x1 = xtext - 2 - xw;
|
|
wicones->entry[i].txt_pos.y1 = ytext - 1 - yw;
|
|
wicones->entry[i].txt_pos.x2 = wicones->entry[i].txt_pos.x1 + width + 4;
|
|
wicones->entry[i].txt_pos.y2 = wicones->entry[i].txt_pos.y1 + hcell + 2;
|
|
}
|
|
else
|
|
{
|
|
xtext = x + (( wicones->case_w - 1 - wicones->entry[i].icon_txt_w)>> 1);
|
|
|
|
pxy[0] = xtext - 1;
|
|
pxy[2] = pxy[0] + wicones->entry[i].icon_txt_w + 2;
|
|
|
|
vsf_color( wind->graf.handle, LBLACK);
|
|
v_bar( wind->graf.handle, pxy);
|
|
|
|
draw_text( wind->graf.handle, xtext, ytext, WHITE, wicones->entry[i].name_shown);
|
|
}
|
|
}
|
|
|
|
x += wicones->case_w;
|
|
}
|
|
|
|
|
|
wind -> ypos_max = lines;
|
|
wind -> xpos_max = wicones->columns;
|
|
|
|
WindSlider ( wind, VSLIDER);
|
|
}
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* void WinCatalog_filelist_redraw: *
|
|
* Deselect all the icons, exit edition mode and Redraw the entire window... *
|
|
* usefull, for exemple, after a WM_FULLED message. *
|
|
* We delete also the timer if exist. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* -- *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
void WinCatalog_filelist_redraw( void)
|
|
{
|
|
WINDICON *wicones = (WINDICON *)DataSearch( win_catalog, WD_ICON);
|
|
|
|
if ( wicones->edit)
|
|
exit_edit_mode( win_catalog, wicones->first_selected);
|
|
|
|
if ( wicones->first_selected)
|
|
{
|
|
while ( wicones->first_selected)
|
|
remove_selected_entry( wicones, wicones->first_selected);
|
|
}
|
|
|
|
win_catalog->ypos = 0;
|
|
|
|
WindGet ( win_catalog, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
draw_page( win_catalog, xw + browser_frame_width + border_size , yw, ww - ( browser_frame_width + border_size), hw);
|
|
WindMakePreview( win_catalog);
|
|
|
|
}
|
|
|
|
/*==================================================================================*
|
|
* void WinCatalog_set_thumbnails_size: *
|
|
* Set new thumbnails's size, resize the window if necessary and redraw it *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
void WinCatalog_set_thumbnails_size( WINDOW *win)
|
|
{
|
|
int16 x, y, w, h;
|
|
WINDICON *wicones = (WINDICON *)DataSearch( win_catalog, WD_ICON);
|
|
|
|
Entry *entry = wicones->first_selected;
|
|
|
|
WindGet ( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
|
|
if ( wicones->edit)
|
|
exit_edit_mode( win, wicones->first_selected);
|
|
|
|
wicones -> case_w = thumbnail[thumbnail_size][0] + ( x_space << 1);
|
|
wicones -> case_h = thumbnail[thumbnail_size][1] + hcell + y_space + y_space + y_space;;
|
|
|
|
if ( show_size)
|
|
wicones -> case_h += hcell + y_space;
|
|
|
|
WindCalc( WC_BORDER, win, xw, yw, wicones->case_w + border_size + browser_frame_width, wicones->case_h, &x, &y, &w, &h);
|
|
|
|
win -> h_min = h;
|
|
win -> w_min = w;
|
|
win -> h_u = wicones -> case_h;
|
|
win -> w_u = wicones -> case_w;
|
|
win -> ypos = 0;
|
|
|
|
( void)scan_dir( win, wicones->directory);
|
|
wicones->first_selected = entry;
|
|
|
|
if( ( w > ww) && ( h > hw))
|
|
{
|
|
wind_set( win->handle, WF_CURRXYWH, x, y, win -> w_min, win -> h_min);
|
|
WindGet ( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
}
|
|
else if ( w > ww)
|
|
{
|
|
WindGet( win, WF_CURRXYWH, &dum, &dum, &dum, &h);
|
|
wind_set( win->handle, WF_CURRXYWH, x, y, w, h);
|
|
WindGet ( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
}
|
|
else if ( h > hw)
|
|
{
|
|
WindGet( win, WF_CURRXYWH, &dum, &dum, &w, &dum);
|
|
wind_set( win->handle, WF_CURRXYWH, x, y, w, h);
|
|
WindGet ( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
}
|
|
|
|
draw_page( win, xw + browser_frame_width + border_size , yw + 1, ww - ( browser_frame_width + border_size), hw - 1);
|
|
|
|
WindMakePreview( win);
|
|
}
|