summaryrefslogtreecommitdiff
path: root/atari/search.c
diff options
context:
space:
mode:
Diffstat (limited to 'atari/search.c')
-rw-r--r--atari/search.c257
1 files changed, 257 insertions, 0 deletions
diff --git a/atari/search.c b/atari/search.c
new file mode 100644
index 000000000..6af6caf12
--- /dev/null
+++ b/atari/search.c
@@ -0,0 +1,257 @@
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
+#include <assert.h>
+#include <windom.h>
+
+#include "desktop/gui.h"
+#include "desktop/browser.h"
+#include "desktop/search.h"
+#include "utils/log.h"
+#include "utils/messages.h"
+#include "atari/gui.h"
+#include "atari/misc.h"
+#include "atari/search.h"
+#include "atari/res/netsurf.rsh"
+
+extern void * h_gem_rsrc;
+
+
+static SEARCH_FORM_SESSION current;
+
+static void nsatari_search_set_status(bool found, void *p);
+static void nsatari_search_set_hourglass(bool active, void *p);
+static void nsatari_search_add_recent(const char *string, void *p);
+void nsatari_search_set_forward_state(bool active, void *p);
+void nsatari_search_set_back_state(bool active, void *p);
+
+static struct search_callbacks nsatari_search_callbacks = {
+ nsatari_search_set_forward_state,
+ nsatari_search_set_back_state,
+ nsatari_search_set_status,
+ nsatari_search_set_hourglass,
+ nsatari_search_add_recent
+};
+
+
+/**
+* Change the displayed search status.
+* \param found search pattern matched in text
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_status(bool found, void *p)
+{
+ LOG(("%p set status: %d\n", p, found));
+}
+
+/**
+* display hourglass while searching
+* \param active start/stop indicator
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_hourglass(bool active, void *p)
+{
+ SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
+ if( active )
+ gui_window_set_pointer(s->bw->window, GUI_POINTER_PROGRESS);
+ else
+ gui_window_set_pointer(s->bw->window, GUI_POINTER_DEFAULT);
+}
+
+/**
+* add search string to recent searches list
+* front is at liberty how to implement the bare notification
+* should normally store a strdup() of the string;
+* core gives no guarantee of the integrity of the const char *
+* \param string search pattern
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_add_recent(const char *string, void *p)
+{
+ LOG(("%p add recent: %s\n", p, string));
+}
+
+/**
+* activate search forwards button in gui
+* \param active activate/inactivate
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_forward_state(bool active, void *p)
+{
+ SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
+ /* deactivate back cb */
+ LOG(("%p: set forward state: %d\n", p, active));
+}
+
+/**
+* activate search back button in gui
+* \param active activate/inactivate
+* \param p the pointer sent to search_verify_new() / search_create_context()
+*/
+
+void nsatari_search_set_back_state(bool active, void *p)
+{
+ SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
+ /* deactivate back cb */
+ LOG(("%p: set back state: %d\n", p, active));
+}
+
+
+static SEARCH_FORM_SESSION get_search_session(WINDOW * win)
+{
+ return (current);
+}
+
+static void destroy_search_session( SEARCH_FORM_SESSION s )
+{
+ free( s );
+}
+
+static int apply_form( WINDOW * win, struct s_search_form_state * s )
+{
+ OBJECT * obj = ObjcTree(OC_FORM, win );
+ if( obj == NULL ){
+ goto error;
+ }
+ s->flags = 0;
+ if( (obj[SEARCH_CB_FWD].ob_state & CROSSED) != 0 )
+ s->flags = SEARCH_FLAG_FORWARDS;
+ if( (obj[SEARCH_CB_CASESENSE].ob_state & CROSSED) != 0 )
+ s->flags |= SEARCH_FLAG_CASE_SENSITIVE;
+ if( (obj[SEARCH_CB_SHOWALL].ob_state & CROSSED) != 0 )
+ s->flags |= SEARCH_FLAG_SHOWALL;
+
+ char * cstr = ObjcString( obj, SEARCH_TB_SRCH, NULL );
+ if( cstr != NULL ) {
+ strncpy((char*)&s->text[0], cstr, 31 );
+ }
+ return ( 0 );
+
+error:
+ s->flags = SEARCH_FLAG_FORWARDS;
+ /* s->forward = true; */
+ strncpy((char*)&s->text[0], "", 31 );
+ return( 1 );
+}
+
+/* checks if search parameters changes */
+static bool form_changed( WINDOW * w )
+{
+ bool check;
+ struct s_search_form_state cur;
+ SEARCH_FORM_SESSION s = get_search_session(w);
+ OBJECT * obj = ObjcTree(OC_FORM, w);
+ assert( s != NULL && obj != NULL );
+ uint32_t flags_old = s->state.flags;
+ apply_form(w, &cur);
+
+ /* adjust the forward flag, it should not init an new search */
+ flags_old |= SEARCH_FLAG_FORWARDS;
+ cur.flags |= SEARCH_FLAG_FORWARDS;
+ if( cur.flags != flags_old ){
+ return( true );
+ }
+
+ char * cstr = ObjcString( obj, SEARCH_TB_SRCH, NULL );
+ if( cstr != NULL ){
+ if( strcmp(cstr, (char*)&s->state.text) != 0 ) {
+ return ( true );
+ }
+ }
+
+ return( false );
+}
+
+
+static void __CDECL evnt_bt_srch_click( WINDOW *win, int index, int unused, void *unused2) {
+
+ ObjcChange( OC_FORM, win, index, ~SELECTED, TRUE);
+ bool fwd;
+ SEARCH_FORM_SESSION s = get_search_session(win);
+ OBJECT * obj = ObjcTree(OC_FORM, s->formwind );
+ search_flags_t flags = 0;
+
+ if( s->bw->search_context == NULL || form_changed(win) ){
+ if( s->bw->search_context != NULL ) {
+ search_destroy_context(s->bw->search_context);
+ s->bw->search_context = NULL;
+ }
+ apply_form( win, &s->state );
+ } else {
+ /* get search direction manually: */
+ if( (obj[SEARCH_CB_FWD].ob_state & CROSSED) != 0 )
+ s->state.flags |= SEARCH_FLAG_FORWARDS;
+ else
+ s->state.flags &= (~SEARCH_FLAG_FORWARDS);
+ }
+ if( search_verify_new(s->bw, &nsatari_search_callbacks, s) ){
+ search_step(s->bw->search_context, s->state.flags, ObjcString( obj, SEARCH_TB_SRCH, NULL ) );
+ }
+
+}
+
+static void __CDECL evnt_cb_click( WINDOW *win, int index, int unused, void *unused2) {
+
+ short newstate;
+ OBJECT * obj = ObjcTree(OC_FORM, get_search_session(win)->formwind );
+ ObjcChange( OC_FORM, win, index, ~SELECTED, TRUE);
+ newstate = (obj[index].ob_state & CROSSED) ? ~CROSSED : CROSSED;
+ ObjcChange( OC_FORM, win, index, newstate , TRUE);
+}
+
+static void __CDECL evnt_close( WINDOW *win, short buff[8]) {
+ /* Free Search Contexts */
+ /* todo: destroy search context, if any */
+ destroy_search_session( get_search_session(win) );
+ current = NULL;
+ ApplWrite( _AESapid, WM_DESTROY, win->handle, 0,0,0,0);
+}
+
+SEARCH_FORM_SESSION open_browser_search( struct gui_window * gw )
+{
+ char * title;
+ SEARCH_FORM_SESSION sfs;
+ OBJECT * tree = get_tree(SEARCH);
+ if( tree == NULL ){
+ return( NULL );
+ }
+ sfs = malloc(sizeof(struct s_search_form_session));
+ if( sfs == NULL )
+ return( NULL );
+ memset(sfs, 0, sizeof(struct s_search_form_session));
+ title = (char*)messages_get("FindTextNS");
+ if( title == NULL )
+ title = (char*)"Find text ...";
+
+ if( current != NULL ){
+ ApplWrite( _AESapid, WM_CLOSED, current->formwind->handle, 0,0,0,0);
+ /* Handle Close event */
+ EvntWindom( MU_MESAG );
+ /* Handle Destroy Event */
+ EvntWindom( MU_MESAG );
+ }
+ current = sfs;
+ sfs->bw = gw->browser->bw;
+ /* todo: check if we already have an form for this gw! */
+ sfs->formwind = mt_FormCreate( &app, tree, WAT_FORM,
+ NULL, title,
+ NULL, true, false);
+
+ ObjcAttachFormFunc( sfs->formwind, SEARCH_BT_SEARCH, evnt_bt_srch_click, NULL);
+ ObjcAttachFormFunc( sfs->formwind, SEARCH_CB_CASESENSE, evnt_cb_click, NULL);
+ ObjcAttachFormFunc( sfs->formwind, SEARCH_CB_SHOWALL, evnt_cb_click, NULL);
+ ObjcAttachFormFunc( sfs->formwind, SEARCH_CB_FWD, evnt_cb_click, NULL);
+ EvntAdd( sfs->formwind, WM_CLOSED, evnt_close, EV_TOP);
+ apply_form(sfs->formwind, &sfs->state );
+ strncpy( ObjcString( tree, SEARCH_TB_SRCH, NULL ), "", SEARCH_MAX_SLEN);
+
+ return( current );
+
+} \ No newline at end of file