1485 lines
43 KiB
C
1485 lines
43 KiB
C
#include "general.h"
|
|
#include "prefs.h"
|
|
#include "mfdb.h"
|
|
#include "txt_data.h"
|
|
#include "pic_load.h"
|
|
#include "winimg.h"
|
|
#include "full_scr.h"
|
|
#include "pdf_load.h"
|
|
#include "menu.h"
|
|
#include "infobox.h"
|
|
#include "pdf/pdflib.h"
|
|
#include "pic_resize.h"
|
|
#include "wintimer.h"
|
|
#include "ztext.h"
|
|
#include "custom_font.h"
|
|
#include "catalog/catalog.h"
|
|
#include "catalog/catalog_other_event.h"
|
|
#include "catalog/catalog_icons.h"
|
|
#include "catalog/catalog_slider.h"
|
|
|
|
|
|
static int16 dum;
|
|
static OBJECT *menu;
|
|
|
|
/* Prototype */
|
|
void calc_slider( WINDATA *windata, OBJECT *slider_root);
|
|
|
|
|
|
/*==================================================================================*
|
|
* void WindPdfSize: *
|
|
* this function handle the WM_SIZED event for the WINDOW win *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> The target window. *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void WindPdfSize( WINDOW *win)
|
|
{
|
|
int16 x, y, w, h, old_h, rdw_frame = 0;
|
|
uint32 old_frame_ypos;
|
|
WINDATA *windata = ( WINDATA *)DataSearch( win, WD_DATA);
|
|
|
|
x = MAX( evnt.buff[6], win -> w_min);
|
|
y = MAX( evnt.buff[7], win -> h_min);
|
|
|
|
w = MIN( x, win -> w_max);
|
|
h = MIN( y, win -> h_max);
|
|
|
|
WindGet( win, WF_WORKXYWH, &dum, &dum, &dum, &old_h);
|
|
|
|
wind_set( evnt.buff[3], WF_CURRXYWH, evnt.buff[4], evnt.buff[5], w, h);
|
|
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
|
|
old_frame_ypos = windata -> ypos;
|
|
|
|
if( ( uint16)h > windata -> ypos_max * windata -> h_u)
|
|
windata -> ypos = 0;
|
|
else
|
|
windata -> ypos = MIN( windata -> ypos, windata -> ypos_max - h / windata -> h_u);
|
|
|
|
if( ( uint16)h > win -> ypos_max * win -> h_u)
|
|
win -> ypos = 0;
|
|
else
|
|
win -> ypos = MIN( win -> ypos, win -> ypos_max - h / win -> h_u);
|
|
|
|
if( ( uint16)w > win -> xpos_max * win -> w_u)
|
|
win -> xpos = 0;
|
|
else
|
|
win -> xpos = MIN( win -> xpos, win -> xpos_max - w / win -> w_u);
|
|
|
|
|
|
if( old_frame_ypos != windata -> ypos)
|
|
rdw_frame = 1;
|
|
|
|
win->status &= ~WS_FULLSIZE;
|
|
|
|
draw_page( win, x + windata->frame_width + windata->border_width , y, w - ( windata->frame_width + windata->border_width), h);
|
|
|
|
if( ( old_h != h) && windata->frame_width)
|
|
{
|
|
if( rdw_frame)
|
|
draw_page( win, x, y, windata->frame_width, h);
|
|
else
|
|
draw_page( win, x + windata->frame_width - 16, y, 16, h);
|
|
}
|
|
|
|
WindSlider( win, VSLIDER|HSLIDER);
|
|
}
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* void move_bookmark_work: *
|
|
* this function moves the 'bookmark' frame work area of the window. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> The target window. *
|
|
* dy -> The step fo the move. *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void move_bookmark_work( WINDOW *win, int16 dy, WINDATA *windata)
|
|
{
|
|
int16 x, y, w, h, absolute_dy;
|
|
GRECT rect, r1, r2, screen;
|
|
|
|
absolute_dy = abs( dy);
|
|
|
|
if ( dy)
|
|
{
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
y++;
|
|
h--;
|
|
w = windata->frame_width - 16;
|
|
|
|
while( !wind_update(BEG_UPDATE));
|
|
graf_mouse( M_OFF, 0L);
|
|
rc_set( &rect, x + 1, y, w, h);
|
|
wind_get_grect( 0, WF_CURRXYWH, &screen);
|
|
wind_get( win -> handle, WF_FIRSTXYWH, &r1.g_x, &r1.g_y, &r1.g_w, &r1.g_h);
|
|
|
|
while ( r1.g_w && r1.g_h)
|
|
{
|
|
if( rc_intersect( &rect, &r1) && rc_intersect( &screen, &r1))
|
|
{
|
|
if ( ( absolute_dy < r1.g_h) )
|
|
{
|
|
r2 = r1; /* save */
|
|
|
|
if ( dy > 0)
|
|
{
|
|
r1.g_y += dy;
|
|
r1.g_h -= dy;
|
|
}
|
|
else
|
|
r1.g_h += dy;
|
|
|
|
move_area( win->graf.handle, &r1, 0, -dy);
|
|
|
|
if ( dy)
|
|
{
|
|
r1 = r2 ; /* restore */
|
|
|
|
if (dy > 0)
|
|
{
|
|
r1.g_y += r1.g_h - dy;
|
|
r1.g_h = dy;
|
|
}
|
|
else
|
|
r1.g_h = -dy;
|
|
|
|
rc_clip_on( win->graf.handle, &r1);
|
|
EvntExec( win, WM_REDRAW);
|
|
rc_clip_off( win->graf.handle);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
rc_clip_on( win->graf.handle, &r1);
|
|
EvntExec( win, WM_REDRAW);
|
|
rc_clip_off( win->graf.handle);
|
|
}
|
|
}
|
|
wind_get( win->handle, WF_NEXTXYWH, &r1.g_x, &r1.g_y, &r1.g_w, &r1.g_h);
|
|
}
|
|
wind_update(END_UPDATE);
|
|
graf_mouse( M_ON, 0L);
|
|
|
|
if ( dy)
|
|
{
|
|
calc_slider( windata, windata->frame_slider);
|
|
|
|
/* check it in the windom source, I'm not sure if the clipping area must be clip.g_x, clip.g_y, clip.g_w, clip.g_h or not */
|
|
ObjcWindDraw( win, windata->frame_slider, SLIDERS_BACK, 2, x + windata->frame_width - 15, y, 16, h - 31);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* redraw_mini_entry: *
|
|
* Send a redraw event for a mini_entry in the WINDOW *win. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win = the target window *
|
|
* entry = the icon to be redraw *
|
|
*----------------------------------------------------------------------------------*
|
|
* return: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void redraw_bookmark( WINDOW *win, int16 frame_width, Bookmark *entry, int16 xw, int16 yw, int16 hw)
|
|
{
|
|
int16 x, y, w, h;
|
|
|
|
x = entry->arrow_position.x1;
|
|
y = entry->arrow_position.y1 - 5;
|
|
w = entry->arrow_position.x2 + x_space + entry->txt_width + 20;
|
|
h = entry->arrow_position.y2 - y + 10;
|
|
|
|
x += xw;
|
|
y += yw;
|
|
|
|
/* send the redraw event only if the bookmark is visible */
|
|
if (( y + entry->arrow_position.y2 > yw) && ( y < yw + hw))
|
|
draw_page( win, x, y, MIN( w, frame_width), h);
|
|
}
|
|
|
|
|
|
static int16 find_bookmark_child_on_mouse( WINDOW *win, WINDATA *windata, Bookmark *entry, int16 mouse_x, int16 mouse_y, int16 x, int16 y, int16 w, int16 h)
|
|
{
|
|
int16 i, zoom;
|
|
char temp[20];
|
|
double scale = 1.0;
|
|
|
|
if( entry->child == NULL)
|
|
return( 0);
|
|
|
|
for ( i = 0; i < entry->nbr_child ; i++)
|
|
{
|
|
if ( entry->child[i].valid == FALSE)
|
|
continue;
|
|
|
|
if ( entry->child[i].state == ON)
|
|
if ( find_bookmark_child_on_mouse( win, windata, &entry->child[i], mouse_x, mouse_y, x, y, w, h))
|
|
return ( 1);
|
|
|
|
if (( mouse_x >= entry->child[i].arrow_position.x2 + x_space && mouse_x <= entry->child[i].arrow_position.x2 + x_space + entry->child[i].txt_width && mouse_y >= entry->child[i].arrow_position.y1 && mouse_y <= entry->child[i].arrow_position.y2))
|
|
{
|
|
if ( windata->selected != &entry->child[i])
|
|
{
|
|
Bookmark *old_selected = windata->selected;
|
|
windata->selected = &entry->child[i];
|
|
|
|
if ( old_selected)
|
|
redraw_bookmark( win, windata->frame_width, old_selected, x, y, h);
|
|
|
|
redraw_bookmark( win, windata->frame_width, windata->selected, x, y, h);
|
|
}
|
|
|
|
if( entry->child[i].linked_page == windata->page_to_show || entry->child[i].linked_page > windata->img.page || entry->child[i].linked_page < 0)
|
|
return( 1);
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
if( windata->img.image[windata->page_to_show].fd_addr != NULL)
|
|
{
|
|
gfree( windata->img.image[windata->page_to_show].fd_addr);
|
|
windata->img.image[windata->page_to_show].fd_addr = NULL;
|
|
}
|
|
|
|
if( pdf_fit_to_win)
|
|
scale = get_scale_value( &windata->img, entry->child[i].linked_page + 1, w - ( windata->frame_width + windata->border_width + 20), h - 20);
|
|
|
|
zoom = windata->zoom_level;
|
|
|
|
if( read_pdf( &windata->img, entry->child[i].linked_page + 1, scale))
|
|
{
|
|
scale = scale * 100.0;
|
|
sprintf( temp, "%.0f%%", scale);
|
|
windata->zoom_level = ( int16)scale;
|
|
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PERCENT, 1);
|
|
|
|
sprintf( temp, "%d of %d", entry->child[i].linked_page + 1, windata->img.page);
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PAGE, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PAGE, 1);
|
|
|
|
windata->page_to_show = entry->child[i].linked_page;
|
|
|
|
win -> ypos_max = ( int32)( ( windata->img.image[windata->page_to_show].fd_h) >> 3);
|
|
win -> xpos_max = ( int32)( ( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PREVIOUS, 1);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_NEXT, 1);
|
|
|
|
if( zoom >= 200 && windata->zoom_level < 200)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_BIG, 1);
|
|
|
|
if( zoom <= 25 && windata->zoom_level > 25)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_SMALL, 1);
|
|
}
|
|
|
|
win -> ypos = 0;
|
|
win -> xpos = 0;
|
|
|
|
draw_page( win, x + windata->frame_width + windata->border_width, y, w - ( windata->frame_width + windata->border_width) , h);
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
return( 1);
|
|
}
|
|
else if ( entry->child[i].state != UNKNOWN)
|
|
{
|
|
if (( mouse_x >= entry->child[i].arrow_position.x1 && mouse_x <= entry->child[i].arrow_position.x2 && mouse_y >= entry->child[i].arrow_position.y1 && mouse_y <= entry->child[i].arrow_position.y2))
|
|
{
|
|
entry->child[i].state = ( entry->child[i].state == ON) ? OFF : ON;
|
|
|
|
draw_page( win, x, y, windata->frame_width, h);
|
|
|
|
return( 1);
|
|
}
|
|
}
|
|
}
|
|
return( 0);
|
|
}
|
|
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* void WindPdfMouse: *
|
|
* this function handle the mouse event for the winview WINDOW *
|
|
* catalog ( the entries). *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> The window to handle. *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void WindPdfMouse( WINDOW *win)
|
|
{
|
|
WINDATA *windata = ( WINDATA *)DataSearch( win, WD_DATA);
|
|
GRECT mouse;
|
|
int16 zoom, x, y, w, h, old_x, old_y, i = 0, nb_click, in_frame_border = 0, in_bookmark_frame = 0;
|
|
char temp[20];
|
|
double scale = 1.0;
|
|
// Entry *entry_ptr = NULL, *old_selected = wicones->first_selected;
|
|
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
|
|
mouse.g_x = evnt.mx - x;
|
|
mouse.g_y = evnt.my - y;
|
|
old_x = evnt.mx;
|
|
old_y = evnt.my;
|
|
nb_click = evnt.nb_click;
|
|
|
|
if ( windata->frame_width && ( mouse.g_x >= windata->frame_width && mouse.g_x <= windata->frame_width + windata->border_width))
|
|
{ /* mouse on frame border */
|
|
in_frame_border = 1;
|
|
}
|
|
else if ( windata->frame_width && ( mouse.g_x < windata->frame_width + windata->border_width))
|
|
{ /* mouse on browser */
|
|
in_bookmark_frame = 1;
|
|
}
|
|
|
|
if ( in_frame_border && evnt.mbut == 1)
|
|
{
|
|
int16 last_mouse_x;
|
|
|
|
graf_mouse( FLAT_HAND, NULL);
|
|
|
|
while( !wind_update( BEG_MCTRL));
|
|
|
|
graf_dragbox( windata->border_width, h, x + windata->frame_width, y, x + 100, y, w - ( 180), h, &last_mouse_x, &dum );
|
|
|
|
/* Set the new toolbar position */
|
|
if ( last_mouse_x != x + windata->frame_width)
|
|
{
|
|
windata->frame_width = last_mouse_x - x;
|
|
|
|
win -> w_min = windata->frame_width + windata->border_width + 80;
|
|
win -> xpos_max = ( int32)( ( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width - 1) >> 3);
|
|
|
|
EvntRedraw( win);
|
|
WindSlider ( win, HSLIDER);
|
|
}
|
|
|
|
wind_update( END_MCTRL);
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
}
|
|
else if ( in_bookmark_frame)
|
|
{
|
|
if( ( ( windata -> ypos_max * windata -> h_u) >= h) && ( mouse.g_x > windata->frame_width - 15) && ( mouse.g_x < windata->frame_width))
|
|
{
|
|
int16 res;
|
|
|
|
windata->frame_slider->ob_x = x + windata->frame_width - 15;
|
|
windata->frame_slider->ob_y = y + 2;
|
|
|
|
res = objc_find( windata->frame_slider, SLIDERS_BOX, 2, evnt.mx, evnt.my);
|
|
|
|
if( res != -1)
|
|
{
|
|
int32 pos, old_ypos = windata->ypos;
|
|
int16 dy, selected_object, page, redraw_arrow_slider = 0;
|
|
|
|
switch ( res)
|
|
{
|
|
case SLIDERS_UP:
|
|
do
|
|
{
|
|
if ( windata -> ypos > 0L)
|
|
{
|
|
if( redraw_arrow_slider == 0)
|
|
ObjcWindChange( win, windata->frame_slider, SLIDERS_UP, windata->frame_slider->ob_x, windata->frame_slider[SLIDERS_UP].ob_y + y, windata->frame_slider[SLIDERS_UP].ob_width + 1, windata->frame_slider[SLIDERS_UP].ob_height + 1, SELECTED);
|
|
|
|
windata -> ypos--;
|
|
move_bookmark_work( win, -windata->h_u, windata);
|
|
redraw_arrow_slider = 1;
|
|
}
|
|
|
|
graf_mkstate( &dum, &dum, &res, &dum);
|
|
|
|
}while( res);
|
|
|
|
if( redraw_arrow_slider)
|
|
{
|
|
windata->frame_slider[SLIDERS_UP].ob_state &= ~SELECTED;
|
|
ObjcWindDraw( win, windata->frame_slider, SLIDERS_UP, 1, windata->frame_slider->ob_x, windata->frame_slider[SLIDERS_UP].ob_y + y, windata->frame_slider[SLIDERS_UP].ob_width + 1, windata->frame_slider[SLIDERS_UP].ob_height + 1);
|
|
}
|
|
break;
|
|
|
|
case SLIDERS_DOWN:
|
|
do
|
|
{
|
|
if (( windata -> ypos < windata -> ypos_max - h / windata -> h_u) && ( windata -> ypos_max > h / windata -> h_u ))
|
|
{
|
|
if( redraw_arrow_slider == 0)
|
|
ObjcWindChange( win, windata->frame_slider, SLIDERS_DOWN, windata->frame_slider->ob_x, windata->frame_slider[SLIDERS_DOWN].ob_y + y, windata->frame_slider[SLIDERS_DOWN].ob_width + 1, windata->frame_slider[SLIDERS_DOWN].ob_height + 1, SELECTED);
|
|
|
|
windata -> ypos++;
|
|
move_bookmark_work( win, windata->h_u, windata);
|
|
redraw_arrow_slider = 1;
|
|
}
|
|
|
|
graf_mkstate( &dum, &dum, &res, &dum);
|
|
|
|
} while( res);
|
|
|
|
if( redraw_arrow_slider)
|
|
{
|
|
windata->frame_slider[SLIDERS_DOWN].ob_state &= ~SELECTED;
|
|
ObjcWindDraw( win, windata->frame_slider, SLIDERS_DOWN, 1, windata->frame_slider->ob_x, windata->frame_slider[SLIDERS_DOWN].ob_y + y, windata->frame_slider[SLIDERS_DOWN].ob_width + 1, windata->frame_slider[SLIDERS_DOWN].ob_height + 1);
|
|
}
|
|
break;
|
|
|
|
case SLIDERS_MOVER:
|
|
if( app.aes4 & AES4_XGMOUSE)
|
|
graf_mouse( M_SAVE, 0L);
|
|
|
|
graf_mouse( FLAT_HAND, NULL);
|
|
|
|
while( !wind_update( BEG_MCTRL));
|
|
|
|
res = graf_slidebox( windata->frame_slider, SLIDERS_BACK, SLIDERS_MOVER, 1);
|
|
|
|
wind_update( END_MCTRL);
|
|
|
|
pos = ( int32)( windata->ypos_max - h / windata->h_u) * res / 1000L;
|
|
|
|
if ( pos < 0)
|
|
pos = 0;
|
|
|
|
dy = ( int16)(( pos - windata->ypos) * windata->h_u);
|
|
|
|
windata->ypos = pos;
|
|
|
|
if( dy && ( old_ypos != windata->ypos))
|
|
move_bookmark_work( win, dy, windata);
|
|
|
|
if( app.aes4 & AES4_XGMOUSE)
|
|
graf_mouse( M_RESTORE, 0L);
|
|
|
|
graf_mouse( ARROW,NULL);
|
|
|
|
break;
|
|
|
|
case SLIDERS_BACK:
|
|
objc_offset( windata->frame_slider, SLIDERS_MOVER, &dum, &dy);
|
|
|
|
dum = ( evnt.my < dy) ? WA_UPPAGE : WA_DNPAGE;
|
|
selected_object = ( evnt.my < dy) ? SLIDERS_UP : SLIDERS_DOWN;
|
|
|
|
while( !wind_update( BEG_MCTRL));
|
|
|
|
windata->frame_slider[selected_object].ob_state |= SELECTED;
|
|
|
|
if( dum == WA_DNPAGE)
|
|
{
|
|
do
|
|
{
|
|
page = h / windata -> h_u;
|
|
|
|
if ( windata -> ypos < windata -> ypos_max - page)
|
|
{
|
|
windata -> ypos = MIN( windata->ypos_max, windata->ypos) + page;
|
|
windata -> ypos = MIN( windata -> ypos, windata -> ypos_max - page);
|
|
dy = ( int16) (( windata->ypos - old_ypos) * windata->h_u);
|
|
move_bookmark_work( win, dy, windata);
|
|
}
|
|
|
|
graf_mkstate( &dum, &dum, &res, &dum);
|
|
} while( res);
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
if ( windata -> ypos > 0L)
|
|
{
|
|
pos = MAX( 0L, windata->ypos - h / windata->h_u);
|
|
dy = ( int16) (( pos - windata->ypos) * windata->h_u);
|
|
windata->ypos = pos;
|
|
move_bookmark_work( win, dy, windata);
|
|
}
|
|
|
|
graf_mkstate( &dum, &dum, &res, &dum);
|
|
} while( res);
|
|
}
|
|
|
|
windata->frame_slider[selected_object].ob_state &= ~SELECTED;
|
|
|
|
ObjcWindDraw( win, windata->frame_slider, selected_object, 1, x, y, w, h);
|
|
|
|
wind_update( END_MCTRL);
|
|
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for ( i = 0; i < windata->nbr_bookmark; i++)
|
|
{
|
|
if( windata->root[i].valid == FALSE)
|
|
continue;
|
|
|
|
if ( windata->root[i].state == ON)
|
|
if ( find_bookmark_child_on_mouse( win, windata, &windata->root[i], mouse.g_x, mouse.g_y, x, y, w, h))
|
|
break;
|
|
|
|
if (( mouse.g_x >= windata->root[i].arrow_position.x2 + x_space && mouse.g_x <= windata->root[i].arrow_position.x2 + x_space + windata->root[i].txt_width && mouse.g_y >= windata->root[i].arrow_position.y1 && mouse.g_y <= windata->root[i].arrow_position.y2))
|
|
{
|
|
if ( windata->selected != &windata->root[i])
|
|
{
|
|
Bookmark *old_selected = windata->selected;
|
|
windata->selected = &windata->root[i];
|
|
|
|
if ( old_selected)
|
|
redraw_bookmark( win, windata->frame_width, old_selected, x, y, h);
|
|
|
|
redraw_bookmark( win, windata->frame_width, windata->selected, x, y, h);
|
|
}
|
|
|
|
if( windata->root[i].linked_page == windata->page_to_show || windata->root[i].linked_page > windata->img.page || windata->root[i].linked_page < 0)
|
|
break;
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
if( windata->img.image[windata->page_to_show].fd_addr != NULL)
|
|
{
|
|
gfree( windata->img.image[windata->page_to_show].fd_addr);
|
|
windata->img.image[windata->page_to_show].fd_addr = NULL;
|
|
}
|
|
|
|
if( pdf_fit_to_win)
|
|
scale = get_scale_value( &windata->img, windata->root[i].linked_page + 1, w - ( windata->frame_width + windata->border_width + 20) , h - 20);
|
|
|
|
zoom = windata->zoom_level;
|
|
|
|
if( read_pdf( &windata->img, windata->root[i].linked_page + 1, scale))
|
|
{
|
|
scale = scale * 100.0;
|
|
sprintf( temp, "%.0f%%", scale);
|
|
windata->zoom_level = ( int16)scale;
|
|
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PERCENT, 1);
|
|
|
|
sprintf( temp, "%d of %d", windata->root[i].linked_page + 1, windata->img.page);
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PAGE, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PAGE, 1);
|
|
|
|
windata->page_to_show = windata->root[i].linked_page;
|
|
|
|
win -> ypos_max = ( int32)( ( windata->img.image[windata->page_to_show].fd_h) >> 3);
|
|
win -> xpos_max = ( int32)( ( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PREVIOUS, 1);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_NEXT, 1);
|
|
|
|
if( zoom >= 200 && windata->zoom_level < 200)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_BIG, 1);
|
|
|
|
if( zoom <= 25 && windata->zoom_level > 25)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_SMALL, 1);
|
|
}
|
|
|
|
win -> ypos = 0;
|
|
win -> xpos = 0;
|
|
|
|
draw_page( win, x + windata->frame_width + windata->border_width, y, w - ( windata->frame_width + windata->border_width) , h);
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
|
|
break;
|
|
}
|
|
else if( windata->root[i].state != UNKNOWN)
|
|
{
|
|
if (( mouse.g_x >= windata->root[i].arrow_position.x1 && mouse.g_x <= windata->root[i].arrow_position.x2 && mouse.g_y >= windata->root[i].arrow_position.y1 && mouse.g_y <= windata->root[i].arrow_position.y2))
|
|
{
|
|
windata->root[i].state = ( windata->root[i].state == ON) ? OFF : ON;
|
|
|
|
draw_page( win, x, y, windata->frame_width, h);
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* a wait loop while the mouse button is pressed */
|
|
while(( evnt.mbut == 1) || ( evnt.mbut == 2))
|
|
graf_mkstate( &evnt.mx, &evnt.my, &evnt.mbut, &evnt.mkstate);
|
|
}
|
|
|
|
/*
|
|
static void size_popup( WINDOW *win, int obj_index)
|
|
{
|
|
int16 x, y;
|
|
int choice;
|
|
char *items[] = { "200%", "150%", "100%", "50%", "25%", "-------------", "Fit to window"};
|
|
|
|
objc_offset( win->tool.root, obj_index, &x, &y);
|
|
|
|
choice = MenuPopUp ( items, x, y, 7, -1, smooth_thumbnail + 1 , P_LIST + P_WNDW + P_CHCK);
|
|
|
|
if( choice < 0)
|
|
return;
|
|
|
|
smooth_thumbnail = choice - 1;
|
|
|
|
strcpy( pref_dialog[PREFS_SMOOTH_METHOD].ob_spec.free_string, items[smooth_thumbnail]);
|
|
ObjcDraw( OC_FORM, win, PREFS_SMOOTH_METHOD, 1);
|
|
}
|
|
*/
|
|
|
|
/*==================================================================================*
|
|
* WindPdfTool: *
|
|
* Toolbar binding. *
|
|
*----------------------------------------------------------------------------------*
|
|
* input: *
|
|
* win -> Pointer to the target window *
|
|
*----------------------------------------------------------------------------------*
|
|
* returns: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
void WindViewTop( WINDOW *win);
|
|
static void WindPdfTool( WINDOW *win)
|
|
{
|
|
WINDATA *windata = ( WINDATA *)DataSearch( win, WD_DATA);
|
|
IMAGE *img = &windata->img;
|
|
int16 x, y, w, h, zoom, object = evnt.buff[4];
|
|
double scale = 1.0;
|
|
char temp[20];
|
|
|
|
switch( object)
|
|
{
|
|
case PDFTOOLBAR_OPEN:
|
|
Menu_open_image();
|
|
break;
|
|
|
|
case PDFTOOLBAR_INFO:
|
|
WindViewTop( win);
|
|
infobox();
|
|
break;
|
|
|
|
case PDFTOOLBAR_SMALL:
|
|
zoom = windata->zoom_level;
|
|
|
|
if( windata->zoom_level <= 25)
|
|
return;
|
|
else if( windata->zoom_level > 200)
|
|
windata->zoom_level = 200;
|
|
else if( windata->zoom_level > 150)
|
|
windata->zoom_level = 150;
|
|
else if( windata->zoom_level > 100)
|
|
windata->zoom_level = 100;
|
|
else if( windata->zoom_level > 50)
|
|
windata->zoom_level = 50;
|
|
else if( windata->zoom_level > 25)
|
|
windata->zoom_level = 25;
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
if( img->image[windata->page_to_show].fd_addr != NULL)
|
|
{
|
|
gfree( img->image[windata->page_to_show].fd_addr);
|
|
img->image[windata->page_to_show].fd_addr = NULL;
|
|
}
|
|
|
|
scale = ( scale / 100.0) * ( double)windata->zoom_level;
|
|
|
|
if( read_pdf( img, windata->page_to_show + 1, scale))
|
|
{
|
|
sprintf( temp, "%d%%", windata->zoom_level);
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PERCENT, 1);
|
|
|
|
win -> ypos_max = ( int32)( windata->img.image[windata->page_to_show].fd_h >> 3);
|
|
win -> xpos_max = ( int32)(( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
}
|
|
|
|
win -> ypos = 0;
|
|
win -> xpos = 0;
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
draw_page( win, x + windata->frame_width + windata->border_width, y, w - ( windata->frame_width + windata->border_width) , h);
|
|
|
|
|
|
if( zoom >= 200 && windata->zoom_level < 200)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_BIG, 1);
|
|
break;
|
|
|
|
case PDFTOOLBAR_BIG:
|
|
zoom = windata->zoom_level;
|
|
|
|
if( windata->zoom_level >= 200)
|
|
return;
|
|
else if( windata->zoom_level < 25)
|
|
windata->zoom_level = 25;
|
|
else if( windata->zoom_level < 50)
|
|
windata->zoom_level = 50;
|
|
else if( windata->zoom_level < 100)
|
|
windata->zoom_level = 100;
|
|
else if( windata->zoom_level < 150)
|
|
windata->zoom_level = 150;
|
|
else if( windata->zoom_level < 200)
|
|
windata->zoom_level = 200;
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
if( img->image[windata->page_to_show].fd_addr != NULL)
|
|
{
|
|
gfree( img->image[windata->page_to_show].fd_addr);
|
|
img->image[windata->page_to_show].fd_addr = NULL;
|
|
}
|
|
|
|
scale = ( scale / 100.0) * ( double)windata->zoom_level;
|
|
|
|
if( read_pdf( img, windata->page_to_show + 1, scale))
|
|
{
|
|
sprintf( temp, "%d%%", windata->zoom_level);
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PERCENT, 1);
|
|
|
|
win -> ypos_max = ( int32)( windata->img.image[windata->page_to_show].fd_h >> 3);
|
|
win -> xpos_max = ( int32)(( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
}
|
|
|
|
win -> ypos = 0;
|
|
win -> xpos = 0;
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
draw_page( win, x + windata->frame_width + windata->border_width, y, w - ( windata->frame_width + windata->border_width) , h);
|
|
|
|
if( zoom <= 25 && windata->zoom_level > 25)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_SMALL, 1);
|
|
break;
|
|
|
|
case PDFTOOLBAR_NEXT:
|
|
if( windata->page_to_show == windata->img.page - 1)
|
|
return;
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
if( img->image[windata->page_to_show].fd_addr != NULL)
|
|
{
|
|
gfree( img->image[windata->page_to_show].fd_addr);
|
|
img->image[windata->page_to_show].fd_addr = NULL;
|
|
}
|
|
|
|
windata->page_to_show++;
|
|
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
|
|
if( pdf_fit_to_win)
|
|
scale = get_scale_value( img, windata->page_to_show + 1, w - ( windata->frame_width + windata->border_width + 20) , h - 20);
|
|
|
|
zoom = windata->zoom_level;
|
|
|
|
if( read_pdf( img, windata->page_to_show + 1, scale))
|
|
{
|
|
scale = scale * 100.0;
|
|
sprintf( temp, "%.0f%%", scale);
|
|
windata->zoom_level = ( int16)scale;
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PERCENT, 1);
|
|
|
|
sprintf( temp, "%d of %d", windata->page_to_show + 1, img->page);
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PAGE, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PAGE, 1);
|
|
|
|
win -> ypos_max = ( int32)( windata->img.image[windata->page_to_show].fd_h >> 3);
|
|
win -> xpos_max = ( int32)(( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
|
|
if( zoom >= 200 && windata->zoom_level < 200)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_BIG, 1);
|
|
|
|
if( zoom <= 25 && windata->zoom_level > 25)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_SMALL, 1);
|
|
}
|
|
|
|
win -> ypos = 0;
|
|
win -> xpos = 0;
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PREVIOUS, 1);
|
|
draw_page( win, x + windata->frame_width + windata->border_width, y, w - ( windata->frame_width + windata->border_width) , h);
|
|
|
|
break;
|
|
|
|
case PDFTOOLBAR_PREVIOUS:
|
|
if( windata->page_to_show == 0)
|
|
return;
|
|
|
|
graf_mouse( BUSYBEE, NULL);
|
|
|
|
if( img->image[windata->page_to_show].fd_addr != NULL)
|
|
{
|
|
gfree( img->image[windata->page_to_show].fd_addr);
|
|
img->image[windata->page_to_show].fd_addr = NULL;
|
|
}
|
|
|
|
windata->page_to_show--;
|
|
|
|
WindGet( win, WF_WORKXYWH, &x, &y, &w, &h);
|
|
|
|
if( pdf_fit_to_win)
|
|
scale = get_scale_value( img, windata->page_to_show + 1, w - ( windata->frame_width + windata->border_width + 20) , h - 20);
|
|
|
|
zoom = windata->zoom_level;
|
|
|
|
if( read_pdf( img, windata->page_to_show + 1, scale))
|
|
{
|
|
sprintf( temp, "%d of %d", windata->page_to_show + 1, img->page);
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PAGE, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PAGE, 1);
|
|
|
|
scale = scale * 100.0;
|
|
sprintf( temp, "%.0f%%", scale);
|
|
windata->zoom_level = ( int16)scale;
|
|
ObjcStrCpy( win->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_PERCENT, 1);
|
|
|
|
win -> ypos_max = ( int32)( windata->img.image[windata->page_to_show].fd_h >> 3);
|
|
win -> xpos_max = ( int32)(( windata->img.image[windata->page_to_show].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
|
|
if( zoom >= 200 && windata->zoom_level < 200)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_BIG, 1);
|
|
|
|
if( zoom <= 25 && windata->zoom_level > 25)
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_SMALL, 1);
|
|
|
|
}
|
|
|
|
win -> ypos = 0;
|
|
win -> xpos = 0;
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
|
|
ObjcDraw( OC_TOOLBAR, win, PDFTOOLBAR_NEXT, 1);
|
|
draw_page( win, x + windata->frame_width + windata->border_width, y, w - ( windata->frame_width + windata->border_width) , h);
|
|
|
|
break;
|
|
|
|
|
|
case PDFTOOLBAR_PERCENT:
|
|
// size_popup( win, object);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
ObjcChange( OC_TOOLBAR, win, object, NORMAL, 1);
|
|
}
|
|
|
|
|
|
static void WindPdfTop( WINDOW *win)
|
|
{
|
|
menu = get_tree( MENU_BAR);
|
|
|
|
menu_ienable( menu, MENU_BAR_SHOW_FULLSCREEN, 1);
|
|
menu_ienable( menu, MENU_BAR_INFORMATION, 1);
|
|
menu_ienable( menu, MENU_BAR_SAVE, 0);
|
|
menu_ienable( menu, MENU_BAR_DELETE, 0);
|
|
WindSet( win, WF_TOP, win->handle, 0, 0, 0);
|
|
wglb.appfront = wglb.front = win;
|
|
}
|
|
|
|
|
|
static void WindPdfKeyb( WINDOW *win)
|
|
{
|
|
switch ( evnt.keybd >> 8)
|
|
{
|
|
case SC_UPARW:
|
|
if( !( evnt.mkstate & ( K_LSHIFT|K_RSHIFT)))
|
|
snd_arrw( win, WA_UPLINE);
|
|
else
|
|
case SC_PGUP:
|
|
snd_arrw( win, WA_UPPAGE);
|
|
break;
|
|
|
|
case SC_DWARW:
|
|
if( !( evnt.mkstate & ( K_LSHIFT|K_RSHIFT)))
|
|
snd_arrw( win, WA_DNLINE);
|
|
else
|
|
case SC_PGDN: /* page down */
|
|
snd_arrw( win, WA_DNPAGE);
|
|
break;
|
|
|
|
case SC_LFARW:
|
|
if( !( evnt.mkstate & ( K_LSHIFT|K_RSHIFT)))
|
|
snd_arrw( win, WA_LFLINE);
|
|
else
|
|
snd_arrw( win, WA_LFPAGE);
|
|
break;
|
|
|
|
case SC_RTARW:
|
|
if( !( evnt.mkstate & ( K_LSHIFT|K_RSHIFT)))
|
|
snd_arrw( win, WA_RTLINE);
|
|
else
|
|
snd_arrw( win, WA_RTPAGE);
|
|
break;
|
|
|
|
case SC_MINUS:
|
|
// WindViewZoom( win, 2);
|
|
// ObjcDraw( OC_TOOLBAR, win, VIEWTOOLBAR_SMALL, 1);
|
|
break;
|
|
|
|
case SC_PLUS:
|
|
// WindViewZoom( win, 1);
|
|
// ObjcDraw( OC_TOOLBAR, win, VIEWTOOLBAR_BIG, 1);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*==================================================================================*
|
|
* draw_bookmark: *
|
|
* draw one bookmark in the WINDOW *win. *
|
|
*----------------------------------------------------------------------------------*
|
|
* return: *
|
|
* -- *
|
|
*==================================================================================*/
|
|
|
|
static void draw_bookmark( WINDOW *win, Bookmark *selected, Bookmark *entry, int16 x, int16 y, int16 h)
|
|
{
|
|
int16 xy[8], xtext, ytext;
|
|
|
|
if( ( entry->arrow_position.y1 + y) < y || ( entry->arrow_position.y1 + y) >= y + h)
|
|
return;
|
|
|
|
/* DRAW ARROW IS NEEDED */
|
|
if ( entry->state != UNKNOWN)
|
|
{
|
|
if ( entry->state == ON)
|
|
{
|
|
xy[0] = entry->arrow_position.x1 + x;
|
|
xy[1] = entry->arrow_position.y1 + 3 + y;
|
|
xy[2] = xy[0] + 10;
|
|
xy[3] = xy[1];
|
|
xy[4] = xy[0] + 5;
|
|
xy[5] = xy[1] + 5;
|
|
}
|
|
else
|
|
{
|
|
xy[0] = entry->arrow_position.x1 + x + 4;
|
|
xy[1] = entry->arrow_position.y1 + y;
|
|
xy[2] = xy[0];
|
|
xy[3] = xy[1] + 10;
|
|
xy[4] = xy[0] + 5;
|
|
xy[5] = xy[1] + 5;
|
|
}
|
|
|
|
vsf_color( win->graf.handle, LBLACK);
|
|
v_fillarea( win->graf.handle, 3, xy);
|
|
}
|
|
|
|
/* DRAW TEXT */
|
|
xtext = entry->arrow_position.x2 + x + x_space;
|
|
ytext = entry->arrow_position.y1 + y + 2;
|
|
|
|
if ( entry == selected)
|
|
{
|
|
xy[0] = xtext - 2;
|
|
xy[2] = xy[0] + entry->txt_width + 4;
|
|
xy[1] = ytext - 1;
|
|
xy[3] = xy[1] + hcell + 2;
|
|
|
|
vsf_color( win->graf.handle, BLACK);
|
|
v_bar( win->graf.handle, xy);
|
|
|
|
draw_text( win->graf.handle, xtext, ytext, WHITE, entry->name);
|
|
}
|
|
else
|
|
draw_text( win->graf.handle, xtext, ytext, BLACK, entry->name);
|
|
}
|
|
|
|
|
|
|
|
/*==================================================================================*
|
|
* draw_bookmark_child: *
|
|
* draw every bookmark's childs in the WINDOW *win. *
|
|
*----------------------------------------------------------------------------------*
|
|
* return: *
|
|
* number of lines drawn *
|
|
*==================================================================================*/
|
|
|
|
static int16 draw_bookmark_child( WINDOW *win, Bookmark *selected, Bookmark *entry, int16 x, int16 y, int16 xw, int16 yw, int16 hw)
|
|
{
|
|
int16 i, lines = 0;
|
|
|
|
if( entry->child == NULL)
|
|
return lines;
|
|
|
|
for ( i = 0; i < entry->nbr_child ; i++)
|
|
{
|
|
if( entry->child[i].valid == FALSE)
|
|
continue;
|
|
|
|
entry->child[i].arrow_position.x1 = x + 3;
|
|
entry->child[i].arrow_position.y1 = y + 3;
|
|
entry->child[i].arrow_position.x2 = x + 14;
|
|
entry->child[i].arrow_position.y2 = y + 14;
|
|
|
|
draw_bookmark( win, selected, &entry->child[i], xw, yw, hw);
|
|
lines++;
|
|
y += 18;
|
|
|
|
if( entry->child[i].state != ON)
|
|
continue;
|
|
|
|
dum = draw_bookmark_child( win, selected, &entry->child[i], x + 15, y, xw, yw, hw);
|
|
|
|
y += ( dum * 18);
|
|
|
|
lines += dum;
|
|
}
|
|
|
|
return lines;
|
|
}
|
|
|
|
|
|
void calc_slider( WINDATA *windata, OBJECT *slider_root)
|
|
{
|
|
int16 max_mover_size = slider_root[SLIDERS_BACK].ob_height;
|
|
int16 full_win_size = windata->ypos_max * windata->h_u;
|
|
int16 win_h = slider_root->ob_height + 3;
|
|
|
|
if ( win_h >= full_win_size)
|
|
{
|
|
windata -> ypos = 0;
|
|
|
|
slider_root[SLIDERS_MOVER].ob_y = 0;
|
|
slider_root[SLIDERS_MOVER].ob_height = max_mover_size;
|
|
|
|
}
|
|
else
|
|
{
|
|
int16 ligne_reste;
|
|
float mover_position = 0L;
|
|
float position_step = 0L;
|
|
float mover_size = MAX( ( float)max_mover_size * ( ( float)win_h / ( float)full_win_size), 10L);
|
|
|
|
if( windata->ypos)
|
|
{
|
|
ligne_reste = windata->ypos_max - ( win_h / windata->h_u);
|
|
position_step = (( float)max_mover_size - mover_size) / ( float)ligne_reste;
|
|
mover_position = position_step * ( float)windata->ypos;
|
|
|
|
while( (( int16)mover_size + ( int16)mover_position > max_mover_size) && windata->ypos > 0)
|
|
{
|
|
windata->ypos--;
|
|
mover_position -= position_step;
|
|
}
|
|
}
|
|
|
|
slider_root[SLIDERS_MOVER].ob_height = ( int16)mover_size;
|
|
slider_root[SLIDERS_MOVER].ob_y = ( int16)mover_position;
|
|
}
|
|
}
|
|
|
|
|
|
static void WindPdfRedraw( WINDOW *win)
|
|
{
|
|
int16 lines = 0, y, i, xw, yw, ww, hw, tmp, xy[8], pxy[4], page;
|
|
WINDATA *windata = ( WINDATA *)DataSearch( win, WD_DATA);
|
|
MFDB *picture, screen = {0};
|
|
|
|
page = windata->page_to_show;
|
|
|
|
WindGet( win, WF_WORKXYWH, &xw, &yw, &ww, &hw);
|
|
|
|
/* Multipages ? */
|
|
if( windata->frame_width) /* browser active */
|
|
{
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + windata->frame_width;
|
|
pxy[3] = pxy[1] + hw - 1;
|
|
|
|
/* clean the first frame */
|
|
vsf_color( win->graf.handle, WHITE);
|
|
v_bar( win->graf.handle, pxy);
|
|
|
|
|
|
/* Draw the 1st frame ( navigation folder) */
|
|
y = 0 - ( ( int16)windata -> ypos * windata -> h_u);
|
|
|
|
for ( i = 0 ; i < windata->nbr_bookmark; i++)
|
|
{
|
|
if( windata->root[i].valid == FALSE)
|
|
continue;
|
|
|
|
windata->root[i].arrow_position.x1 = 3;
|
|
windata->root[i].arrow_position.y1 = y + 3;
|
|
windata->root[i].arrow_position.x2 = 14;
|
|
windata->root[i].arrow_position.y2 = y + 14;
|
|
|
|
draw_bookmark( win, windata->selected, &windata->root[i], xw, yw, hw);
|
|
|
|
lines++;
|
|
|
|
y += windata -> h_u;
|
|
|
|
if( windata->root[i].state != ON)
|
|
continue;
|
|
|
|
dum = draw_bookmark_child( win, windata->selected, &windata->root[i], 15, y, xw, yw, hw);
|
|
|
|
y += ( dum * windata -> h_u);
|
|
|
|
lines += dum;
|
|
}
|
|
|
|
windata -> ypos_max = lines;
|
|
|
|
/* Draw the frame border */
|
|
pxy[0] = pxy[2];
|
|
vsl_color( win->graf.handle, BLACK);
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
vsl_color( win->graf.handle, WHITE);
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
vsl_color( win->graf.handle, LWHITE);
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
pxy[0]++;
|
|
pxy[2] = pxy[0];
|
|
vsl_color( win->graf.handle, BLACK);
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + windata->frame_width - 1;
|
|
pxy[3] = yw;
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
if( ( windata -> ypos_max * windata -> h_u) >= hw)
|
|
{
|
|
windata->frame_slider->ob_x = xw + windata->frame_width - 15;
|
|
windata->frame_slider->ob_y = yw + 2;
|
|
windata->frame_slider->ob_height = hw - 3;
|
|
windata->frame_slider[SLIDERS_BACK].ob_height = hw - 31;
|
|
windata->frame_slider[SLIDERS_UP].ob_y = windata->frame_slider->ob_height - 31;
|
|
windata->frame_slider[SLIDERS_DOWN].ob_y = windata->frame_slider->ob_height - 15;
|
|
|
|
calc_slider( windata, windata->frame_slider);
|
|
objc_draw( windata->frame_slider, SLIDERS_BOX, 2, clip.g_x, clip.g_y, clip.g_w, clip.g_h);
|
|
}
|
|
|
|
xw += ( windata->frame_width + border_size);
|
|
ww -= ( windata->frame_width + border_size);
|
|
}
|
|
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + ww - 1;
|
|
pxy[3] = yw;
|
|
|
|
vsl_color( win->graf.handle, BLACK);
|
|
v_pline( win->graf.handle, 2, pxy);
|
|
|
|
yw++;
|
|
|
|
/* if the picture or the zoomed picture don't exist, we draw a gray rectangle and we exit the function */
|
|
if( windata->zoom_picture.fd_addr)
|
|
picture = &windata->zoom_picture;
|
|
else if( windata->img.image[page].fd_addr)
|
|
picture = &windata->img.image[page];
|
|
else
|
|
{
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + ww - 1;
|
|
pxy[3] = pxy[1] + hw - 1;
|
|
|
|
vsf_color( win->graf.handle, LWHITE);
|
|
v_bar( win->graf.handle, pxy);
|
|
return;
|
|
}
|
|
|
|
xy[0] = ( int16)win->xpos * win->w_u;
|
|
xy[4] = xw;
|
|
|
|
if( picture->fd_w < ww)
|
|
xy[4] += ( ( ww - picture->fd_w) >> 1);
|
|
|
|
tmp = MIN( ww, ( ( picture->fd_w) - xy[0]));
|
|
|
|
xy[2] = xy[0] + tmp - 1;
|
|
xy[6] = xy[4] + tmp - 1;
|
|
|
|
|
|
xy[1] = ( int16)win->ypos * win->h_u;
|
|
xy[5] = yw;
|
|
|
|
if( picture->fd_h < hw)
|
|
xy[5] += ( ( hw - picture->fd_h) >> 1);
|
|
|
|
tmp = MIN( hw, ( ( picture->fd_h) - xy[1]));
|
|
|
|
xy[3] = xy[1] + tmp - 1;
|
|
xy[7] = xy[5] + tmp - 1;
|
|
|
|
if(( xy[6] <= ( xw + ww)) || ( xy[7] <= ( yw + hw)))
|
|
{
|
|
pxy[0] = xw;
|
|
pxy[1] = yw;
|
|
pxy[2] = pxy[0] + ww - 1;
|
|
pxy[3] = pxy[1] + hw - 1;
|
|
|
|
vsf_color( win->graf.handle, LWHITE);
|
|
v_bar( win->graf.handle, pxy);
|
|
}
|
|
|
|
if ( picture->fd_nplanes == 1)
|
|
{
|
|
int16 color[2] = { BLACK, WHITE};
|
|
|
|
vrt_cpyfm( win->graf.handle, MD_REPLACE, xy, picture, &screen, color);
|
|
}
|
|
else
|
|
vro_cpyfm( win->graf.handle, S_ONLY, xy, picture, &screen);
|
|
|
|
WindSlider ( win, VSLIDER|HSLIDER);
|
|
}
|
|
|
|
|
|
|
|
static void WindPdfClose( WINDOW *win)
|
|
{
|
|
WINDATA *windata = ( WINDATA *)DataSearch( win, WD_DATA);
|
|
IMAGE *img = &windata->img;
|
|
|
|
delete_txt_data( img);
|
|
delete_mfdb( img->image, img->page);
|
|
|
|
if( windata->icon.fd_addr != NULL)
|
|
gfree( windata->icon.fd_addr);
|
|
|
|
// if( windata->zoom_picture.fd_addr != NULL)
|
|
// gfree( windata->zoom_picture.fd_addr);
|
|
|
|
pdf_quit( img);
|
|
|
|
if( windata->root)
|
|
{
|
|
int i;
|
|
|
|
for ( i = 0; i < windata->nbr_bookmark; i++)
|
|
{
|
|
if ( windata->root[i].nbr_child)
|
|
delete_bookmark_child( &windata->root[i]);
|
|
}
|
|
|
|
gfree( windata->root);
|
|
}
|
|
|
|
if( windata->frame_slider)
|
|
ObjcFree( windata->frame_slider);
|
|
|
|
gfree( windata);
|
|
|
|
DataDelete( win, WD_DATA);
|
|
WindDelete( win);
|
|
|
|
if( wglb.first)
|
|
{
|
|
snd_msg( wglb.first, WM_TOPPED, 0, 0, 0, 0);
|
|
}
|
|
else
|
|
{
|
|
menu_ienable( menu, MENU_BAR_SHOW_FULLSCREEN, 0);
|
|
menu_ienable( menu, MENU_BAR_SAVE, 0);
|
|
menu_ienable( menu, MENU_BAR_INFORMATION, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
WINDOW *WindPdf( char *filename)
|
|
{
|
|
WINDOW *winview = NULL;
|
|
WINDATA *windata;
|
|
IMAGE *img;
|
|
double scale = 1.0;
|
|
int16 w, h;
|
|
char temp[10];
|
|
|
|
if ( ( windata = ( WINDATA*) gmalloc( sizeof( WINDATA))) == NULL)
|
|
{
|
|
graf_mouse( ARROW, NULL);
|
|
errshow( "", ENOMEM);
|
|
return NULL;
|
|
}
|
|
|
|
windata->icon.fd_addr = NULL;
|
|
windata->zoom_picture.fd_addr = NULL;
|
|
windata->zoom_level = 100;
|
|
windata->page_to_show = 0;
|
|
windata->pause = FALSE;
|
|
windata->frame_width = 0;
|
|
windata->border_width = 0;
|
|
windata->root = NULL;
|
|
windata->selected = NULL;
|
|
windata->frame_slider = NULL;
|
|
windata->nbr_bookmark = 0;
|
|
|
|
img = &windata->img;
|
|
|
|
img->_priv_ptr = NULL;
|
|
img->view_mode = full_size;
|
|
img->progress_bar = show_read_progress_bar;
|
|
|
|
strcpy( windata->name, filename);
|
|
|
|
if ( ( winview = WindCreate( WAT_NOINFO, app.x, app.y, app.w, app.h)) == NULL)
|
|
{
|
|
gfree( windata);
|
|
errshow( "", ALERT_WINDOW);
|
|
graf_mouse( ARROW, NULL);
|
|
return NULL;
|
|
}
|
|
|
|
WindSetPtr( winview, WF_TOOLBAR, get_tree( PDFTOOLBAR), WindPdfTool);
|
|
|
|
WindCalc( WC_WORK, winview, 0, 0, app.w, app.h, &dum, &dum, &w, &h);
|
|
|
|
if( !pdf_load( filename, img, w - 225, h - 20))
|
|
{
|
|
WindDelete( winview);
|
|
gfree( windata);
|
|
// errshow( "", IMG_NO_VALID);
|
|
graf_mouse( ARROW, NULL);
|
|
return NULL;
|
|
}
|
|
|
|
strcpy( windata->title, get_pdf_title());
|
|
sprintf( windata->info, "zView - [%s]", fullpathname_to_filename( windata->name));
|
|
|
|
if( img->page > 1)
|
|
{
|
|
pdf_build_bookmark( windata, winview);
|
|
|
|
if( windata->nbr_bookmark)
|
|
{
|
|
OBJECT *frame;
|
|
rsrc_gaddr( 0, SLIDERS, &frame);
|
|
windata->frame_slider = ObjcDup( frame, NULL);
|
|
EvntAttach( winview, WM_XBUTTON, WindPdfMouse);
|
|
EvntAttach( winview, WM_SIZED, WindPdfSize);
|
|
windata -> frame_width = 200;
|
|
windata -> border_width = 5;
|
|
}
|
|
}
|
|
|
|
winview -> h_min = 80;
|
|
winview -> w_min = MAX( 80, windata->frame_width + windata->border_width + 80);
|
|
winview -> h_u = 8;
|
|
winview -> w_u = 8;
|
|
winview -> ypos_max = ( int32)( ( img->image[0].fd_h) >> 3);
|
|
winview -> xpos_max = ( int32)( ( img->image[0].fd_w + windata->frame_width + windata->border_width) >> 3);
|
|
windata -> h_u = 18;
|
|
windata -> ypos = 0;
|
|
windata -> ypos_max = 1;
|
|
|
|
DataAttach( winview, WD_DATA, windata);
|
|
EvntAttach( winview, WM_REDRAW, WindPdfRedraw);
|
|
EvntAttach( winview, WM_DESTROY, WindPdfClose);
|
|
EvntAttach( winview, WM_XKEYBD, WindPdfKeyb);
|
|
EvntAttach( winview, WM_TOPPED, WindPdfTop);
|
|
EvntAttach( winview, WM_ARROWED, Win_Arrow);
|
|
EvntAttach( winview, WM_UPPAGE, Win_UpPage);
|
|
EvntAttach( winview, WM_DNPAGE, Win_DownPage);
|
|
EvntAttach( winview, WM_LFPAGE, Win_LeftPage);
|
|
EvntAttach( winview, WM_RTPAGE, Win_RightPage);
|
|
EvntAttach( winview, WM_UPLINE, Win_UpLine);
|
|
EvntAttach( winview, WM_DNLINE, Win_DownLine);
|
|
EvntAttach( winview, WM_RTLINE, Win_RightLine);
|
|
EvntAttach( winview, WM_LFLINE, Win_LeftLine);
|
|
EvntAttach( winview, WM_VSLID , Win_VSlide);
|
|
EvntAttach( winview, WM_HSLID , Win_HSlide);
|
|
|
|
|
|
WindSetStr( winview, WF_ICONDRAW, WindViewIcon);
|
|
WindSetStr( winview, WF_NAME, windata->info);
|
|
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_BIG, draw_icon_greater, windata);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_SMALL, draw_icon_smaller, windata);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_NEXT, draw_icon_forward, windata);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_PREVIOUS, draw_icon_back, windata);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_OPEN, draw_icon_open, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_INFO, draw_icon_info, NULL);
|
|
// RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_SAVE, draw_icon_save, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_PRINT, draw_icon_printer, NULL);
|
|
RsrcUserDraw ( OC_TOOLBAR, winview, PDFTOOLBAR_FIND, draw_icon_find, NULL);
|
|
|
|
sprintf( temp, "1 of %d", img->page);
|
|
ObjcStrCpy( winview->tool.root, PDFTOOLBAR_PAGE, temp);
|
|
|
|
if( pdf_fit_to_win)
|
|
scale = get_scale_value( img, windata->page_to_show + 1, w - ( windata->frame_width + windata->border_width + 20) , h - 20);
|
|
|
|
sprintf( temp, "%.0f%%", scale * 100);
|
|
|
|
ObjcStrCpy( winview->tool.root, PDFTOOLBAR_PERCENT, temp);
|
|
|
|
|
|
if ( !( WindOpen( winview, app.x, app.y, app.w, app.h)))
|
|
{
|
|
WindPdfClose( winview);
|
|
errshow( "", ALERT_WINDOW);
|
|
graf_mouse( ARROW, NULL);
|
|
return NULL;
|
|
}
|
|
|
|
menu = get_tree( MENU_BAR);
|
|
|
|
menu_ienable( menu, MENU_BAR_INFORMATION, 1);
|
|
menu_ienable( menu, MENU_BAR_SAVE, 0);
|
|
menu_ienable( menu, MENU_BAR_SHOW_FULLSCREEN, 1);
|
|
|
|
graf_mouse( ARROW, NULL);
|
|
|
|
return winview;
|
|
}
|