summaryrefslogtreecommitdiff
path: root/atari/search.c
diff options
context:
space:
mode:
Diffstat (limited to 'atari/search.c')
-rw-r--r--atari/search.c326
1 files changed, 167 insertions, 159 deletions
diff --git a/atari/search.c b/atari/search.c
index b5e2fdd61..17241d1ae 100644
--- a/atari/search.c
+++ b/atari/search.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2012 Ole Loots <ole@monochrom.net>
+ * Copyright 2013 Ole Loots <ole@monochrom.net>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -14,7 +14,13 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
+ *
+ * Module Description:
+ *
+ *
+ *
+ */
+
#include <limits.h>
#include <stdlib.h>
@@ -23,7 +29,6 @@
#include <string.h>
#include <stdbool.h>
#include <assert.h>
-#include <windom.h>
#include "desktop/gui.h"
#include "desktop/browser.h"
@@ -31,18 +36,17 @@
#include "desktop/search.h"
#include "utils/log.h"
#include "utils/messages.h"
-#include "atari/gui.h"
+#include "atari/gui.h"
+#include "atari/rootwin.h"
#include "atari/misc.h"
-#include "atari/browser.h"
-#include "atari/search.h"
+#include "atari/toolbar.h"
+#include "atari/search.h"
+#include "atari/gemtk/gemtk.h"
#include "atari/res/netsurf.rsh"
extern struct gui_window * input_window;
-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);
@@ -66,7 +70,8 @@ static struct gui_search_callbacks nsatari_search_callbacks = {
void nsatari_search_set_status(bool found, void *p)
{
- LOG(("%p set status: %d\n", p, found));
+ LOG(("%p set status: %d\n", p, found));
+ // TODO: maybe update GUI
}
/**
@@ -78,8 +83,8 @@ void nsatari_search_set_status(bool found, void *p)
void nsatari_search_set_hourglass(bool active, void *p)
{
SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
- LOG((""));
- if( active && current != NULL )
+ LOG(("active: %d, session: %p", active, p));
+ if (active)
gui_window_set_pointer(s->bw->window, GUI_POINTER_PROGRESS);
else
gui_window_set_pointer(s->bw->window, GUI_POINTER_DEFAULT);
@@ -106,10 +111,24 @@ void nsatari_search_add_recent(const char *string, void *p)
*/
void nsatari_search_set_forward_state(bool active, void *p)
-{
+{
+ struct gui_window *gw;
+ OBJECT *toolbar;
+ GRECT area;
SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
/* deactivate back cb */
- LOG(("%p: set forward state: %d\n", p, active));
+ LOG(("%p: set forward state: %d\n", p, active));
+
+ gw = s->bw->window;
+
+ toolbar = toolbar_get_form(gw->root->toolbar);
+ if(active)
+ toolbar[TOOLBAR_BT_SEARCH_FWD].ob_state &= ~OS_DISABLED;
+ else
+ toolbar[TOOLBAR_BT_SEARCH_FWD].ob_state |= OS_DISABLED;
+ window_get_grect(gw->root, BROWSER_AREA_SEARCH, &area);
+ window_schedule_redraw_grect(gw->root, &area);
+
}
/**
@@ -120,184 +139,173 @@ void nsatari_search_set_forward_state(bool active, void *p)
void nsatari_search_set_back_state(bool active, void *p)
{
+ struct gui_window *gw;
+ OBJECT *toolbar;
+ GRECT area;
SEARCH_FORM_SESSION s = (SEARCH_FORM_SESSION)p;
/* deactivate back cb */
- LOG(("%p: set back state: %d\n", p, active));
-}
-
+ LOG(("%p: set back state: %d\n", p, active));
+
+ s->state.back_avail = active;
+ gw = s->bw->window;
+
+ toolbar = toolbar_get_form(gw->root->toolbar);
+ if(active)
+ toolbar[TOOLBAR_BT_SEARCH_BACK].ob_state &= ~OS_DISABLED;
+ else
+ toolbar[TOOLBAR_BT_SEARCH_BACK].ob_state |= OS_DISABLED;
+ window_get_grect(gw->root, BROWSER_AREA_SEARCH, &area);
+ window_schedule_redraw_grect(gw->root, &area);
+}
+
-static SEARCH_FORM_SESSION get_search_session(WINDOW * win)
+static int apply_form(OBJECT *obj, struct s_search_form_state *s)
{
- return (current);
-}
+ char * cstr;
+
+ assert(s != NULL);
-static void destroy_search_session( SEARCH_FORM_SESSION s )
-{
- if( s != NULL ){
- LOG((""));
- free( s );
- }
-}
+ s->flags = 0;
-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 & SELECTED) != 0 )
- s->flags = SEARCH_FLAG_FORWARDS;
- if( (obj[SEARCH_CB_CASESENSE].ob_state & SELECTED) != 0 )
+ if( (obj[TOOLBAR_CB_CASESENSE].ob_state & OS_SELECTED) != 0 )
s->flags |= SEARCH_FLAG_CASE_SENSITIVE;
- if( (obj[SEARCH_CB_SHOWALL].ob_state & SELECTED) != 0 )
+ if( (obj[TOOLBAR_CB_SHOWALL].ob_state & OS_SELECTED) != 0 )
s->flags |= SEARCH_FLAG_SHOWALL;
-
- char * cstr = ObjcString( obj, SEARCH_TB_SRCH, NULL );
- if( cstr != NULL ) {
- strncpy((char*)&s->text[0], cstr, 31 );
- }
+
+ cstr = gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH);
+ snprintf(s->text, 32, "%s", cstr);
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 )
+
+static void set_text(OBJECT *obj, short idx, char * text, int len)
{
- bool check;
- struct s_search_form_state cur;
- SEARCH_FORM_SESSION s = get_search_session(w);
- if( s == NULL )
- return false;
- 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 spare[255];
- char * cstr = ObjcString( obj, SEARCH_TB_SRCH, NULL );
- if( cstr != NULL ){
- if( strcmp(cstr, (char*)&s->state.text) != 0 ) {
- return ( true );
- }
- }
-
- return( false );
-}
+ if( len > 254 )
+ len = 254;
+ if( text != NULL ){
+ strncpy(spare, text, 254);
+ } else {
+ strcpy(spare, "");
+ }
+ set_string(obj, idx, spare);
+}
+
+void nsatari_search_restore_form( struct s_search_form_session *s, OBJECT *obj)
+{
+ if ((s->state.flags & SEARCH_FLAG_SHOWALL) != 0) {
+ obj[TOOLBAR_CB_SHOWALL].ob_state |= OS_SELECTED;
+ }
+ else {
+ obj[TOOLBAR_CB_SHOWALL].ob_state &= ~OS_SELECTED;
+ }
+
+ if ((s->state.flags & SEARCH_FLAG_CASE_SENSITIVE) != 0) {
+ obj[TOOLBAR_CB_CASESENSE].ob_state |= OS_SELECTED;
+ }
+ else {
+ obj[TOOLBAR_CB_CASESENSE].ob_state &= ~OS_SELECTED;
+ }
+
+ if (s->state.back_avail == false) {
+ obj[TOOLBAR_BT_SEARCH_BACK].ob_state |= OS_DISABLED;
+ } else {
+ obj[TOOLBAR_BT_SEARCH_BACK].ob_state &= ~OS_DISABLED;
+ }
+
+ TEDINFO *t = ((TEDINFO *)get_obspec(obj, TOOLBAR_TB_SRCH));
+ set_text(obj, TOOLBAR_TB_SRCH, s->state.text, t->te_txtlen);
+
+}
-static void __CDECL evnt_bt_srch_click( WINDOW *win, int index, int unused, void *unused2)
+void nsatari_search_session_destroy(struct s_search_form_session *s)
{
-
- bool fwd;
- SEARCH_FORM_SESSION s = get_search_session(win);
- OBJECT * obj = ObjcTree(OC_FORM, s->formwind );
- search_flags_t flags = 0;
-
- ObjcChange(OC_FORM, win, index, ~SELECTED , TRUE);
- if( form_changed(win) ){
+ if (s != NULL) {
+ LOG((""));
browser_window_search_destroy_context(s->bw);
- apply_form( win, &s->state );
- } else {
- /* get search direction manually: */
- if( (obj[SEARCH_CB_FWD].ob_state & SELECTED) != 0 )
- s->state.flags |= SEARCH_FLAG_FORWARDS;
- else
- s->state.flags &= (~SEARCH_FLAG_FORWARDS);
- }
- if( browser_window_search_verify_new(s->bw, &nsatari_search_callbacks, s) ){
- browser_window_search_step(s->bw, s->state.flags, ObjcString( obj, SEARCH_TB_SRCH, NULL ) );
+ free(s);
}
-
}
-static void __CDECL evnt_cb_click( WINDOW *win, int index, int unused, void *unused2)
+/** checks for search parameters changes */
+static bool search_session_compare(struct s_search_form_session *s, OBJECT *obj)
{
+ bool check;
+ uint32_t flags_old;
+ uint32_t flags_mask = SEARCH_FLAG_SHOWALL | SEARCH_FLAG_CASE_SENSITIVE;
+ struct s_search_form_state cur;
+
+ assert(s != NULL && obj != NULL);
- short newstate;
- OBJECT * obj = ObjcTree(OC_FORM, get_search_session(win)->formwind );
-}
-
-static void __CDECL evnt_close( WINDOW *win, short buff[8])
-{
- /* Free Search Contexts */
- /* todo: destroy search context, if any? */
- SEARCH_FORM_SESSION s = get_search_session(win);
- if( s != NULL ){
- destroy_search_session( s );
- }
- current = NULL;
- ApplWrite( _AESapid, WM_DESTROY, win->handle, 0,0,0,0 );
-}
+ flags_old = s->state.flags;
-void search_destroy( struct gui_window * gw )
-{
- LOG(("search_destroy %p / %p", gw, current ));
- if( current != NULL && current->formwind != NULL ){
- ApplWrite( _AESapid, WM_CLOSED, current->formwind->handle, 0,0,0,0);
- /* Handle Close event */
- EvntWindom( MU_MESAG );
- /* Handle Destroy Event */
- EvntWindom( MU_MESAG );
+ apply_form(obj, &cur);
+ if ((cur.flags&flags_mask) != (flags_old&flags_mask)) {
+ return( true );
}
- LOG(("done"));
-}
-SEARCH_FORM_SESSION open_browser_search( struct gui_window * gw )
-{
- char * title;
- SEARCH_FORM_SESSION sfs;
- GRECT pos, treesize;
- OBJECT * tree = get_tree(SEARCH);
- if( tree == NULL ){
- return( NULL );
+ char * cstr;
+ cstr = gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH);
+ if (cstr != NULL){
+ if (strcmp(cstr, (char*)&s->state.text) != 0) {
+ return (true);
+ }
}
- sfs = calloc(1, sizeof(struct s_search_form_session));
- if( sfs == NULL )
- return( NULL );
+ return( false );
+}
- title = (char*)messages_get("FindTextNS");
- if( title == NULL )
- title = (char*)"Find text ...";
- search_destroy( gw );
+void nsatari_search_perform(struct s_search_form_session *s, OBJECT *obj,
+ search_flags_t f)
+{
- /* setup dipslay position: right corner */
- treesize.g_x = 0;
- treesize.g_y = 0;
- treesize.g_w = tree->ob_width;
- treesize.g_h = tree->ob_height;
- wind_calc_grect(WC_BORDER, WAT_FORM, &treesize, &pos);
- pos.g_x = app.w - pos.g_w;
- pos.g_y = app.h - pos.g_h;
+ bool fwd;
+ search_flags_t flags = f;
+
+ assert(s!=null);
+ assert(input_window->browser->bw == s->bw);
- current = sfs;
- sfs->bw = gw->browser->bw;
- sfs->formwind = mt_FormCreate( &app, tree, WAT_FORM,
- NULL, title,
- &pos, true, false);
+ if(search_session_compare(s, obj)){
+ browser_window_search_destroy_context(s->bw);
+ apply_form(obj, &s->state);
+ } else {
- 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);
+ }
+
+ /* get search direction manually: */
+ if ( (f&SEARCH_FLAG_FORWARDS) != 0 )
+ s->state.flags |= SEARCH_FLAG_FORWARDS;
+ else
+ s->state.flags &= (~SEARCH_FLAG_FORWARDS);
- return( current );
+ if( browser_window_search_verify_new(s->bw, &nsatari_search_callbacks, s) ){
+ LOG(("searching for: %s\n", gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH)));
+ browser_window_search_step(s->bw, s->state.flags,
+ gemtk_obj_get_text(obj, TOOLBAR_TB_SRCH));
+ }
}
+
+
+struct s_search_form_session * nsatari_search_session_create(OBJECT * obj,
+ struct browser_window *bw)
+{
+ struct s_search_form_session *sfs;
+
+ sfs = calloc(1, sizeof(struct s_search_form_session));
+
+ assert(obj);
+ assert(sfs);
+
+ sfs->bw = bw;
+
+ apply_form(obj, &sfs->state);
+
+ browser_window_search_destroy_context(bw);
+
+ return(sfs);
+}