📄 reader.cxx
字号:
if ((('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == ' ') && i < 128) { DBT key, data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); setbkmkkey(g_filename,buff.data(),&key); data.data = (char*)&lcn; data.size = sizeof(lcn); bkmks->put(bkmks, &key, &data, 0); } // else printf("%x:%c\n",ch,ch); } } bkmks->sync(bkmks, 0); input->restore(); } static void clrbkmk_cb(Fl_Widget *widget, void *_data) { DBT key, data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); key.data = ((reader_ui *)_data)->g_filename; key.size = strlen(((reader_ui *)_data)->g_filename); bkmks->seq(bkmks,&key,&data,R_CURSOR); while (strcmp(((reader_ui *)_data)->g_filename,(char*)key.data)==0) { bkmks->del(bkmks,&key,R_CURSOR); if (bkmks->seq(bkmks,&key,&data,R_NEXT) != 0) break; } bkmks->sync(bkmks,0); } static void tidybkmk_cb(Fl_Widget *widget, void *_data) { DBT key, data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); bkmks->seq(bkmks,&key,&data,R_FIRST); do { struct stat buf; char buffer[1024]; memcpy(buffer, key.data, key.size); buffer[key.size] = '\0'; if (strcmp(buffer,LASTFILE) == 0) continue; if (strcmp(buffer,PREFRNCE) == 0) continue; if (stat(buffer,&buf) == -1 && errno == ENOENT) { bkmks->del(bkmks,&key,R_CURSOR); } } while (bkmks->seq(bkmks,&key,&data,R_NEXT) == 0); bkmks->sync(bkmks,0); }#endif#ifdef USEBKMKS static void save_current(Fl_Widget *widget, void *_data) { myoutput* input = (((reader_ui*)_data)->input); if (((reader_ui *)_data)->g_filename[0] != '\0') { DBT key, data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); getdefaultbkmk(((reader_ui *)_data)->g_filename, &key); unsigned int lcn = input->pagelocate(); data.data = (char*)&lcn; data.size = sizeof(lcn); bkmks->put(bkmks, &key, &data, 0); bkmks->sync(bkmks, 0); } }#endif static Fl_Font rotate_font(Fl_Font font) { switch (font) { case FL_HELVETICA: return FL_TIMES; case FL_TIMES: return FL_COURIER; case FL_COURIER: return FL_HELVETICA; case FL_HELVETICA_BOLD: return FL_TIMES_BOLD; case FL_TIMES_BOLD: return FL_COURIER_BOLD; case FL_COURIER_BOLD: return FL_HELVETICA_BOLD; } } static Fl_Font embolden(Fl_Font font) { switch (font) { case FL_HELVETICA: return FL_HELVETICA_BOLD; case FL_TIMES: return FL_TIMES_BOLD; case FL_COURIER: return FL_COURIER_BOLD; } } static Fl_Font enlighten(Fl_Font font) { switch (font) { case FL_HELVETICA_BOLD: return FL_HELVETICA; case FL_TIMES_BOLD: return FL_TIMES; case FL_COURIER_BOLD: return FL_COURIER; } } static void bld_cb(Fl_Widget *widget, void *data) { myoutput* input = (((reader_ui*)data)->input); ((reader_ui*)data)->bold = !((reader_ui*)data)->bold; input->textfont(((reader_ui*)data)->bold ? embolden(input->textfont()) : enlighten(input->textfont())); input->locate(input->pagelocate()); input->redraw(); } static void tight_cb(Fl_Widget *widget, void *data) { myoutput* input = (((reader_ui*)data)->input); ((reader_ui*)data)->btight = !((reader_ui*)data)->btight; input->tight = ((reader_ui*)data)->btight; input->redraw(); } static void fnt_cb(Fl_Widget *widget, void *data) { myoutput* input = (((reader_ui*)data)->input); input->textfont(rotate_font(input->textfont())); input->locate(input->pagelocate()); input->redraw(); } static void mag_cb(Fl_Widget *widget, void *data) { myoutput* input = (((reader_ui*)data)->input); int * sizep; int n = Fl::get_font_sizes(input->textfont(),sizep); if (n == 0) return; if (sizep[0] == 0 && n <= 1) { input->textsize(input->textsize()+1); } else { int i; for (i = 0; i < n-1; i++) { if (sizep[i] > input->textsize()) break; } input->textsize(sizep[i]); } input->locate(input->pagelocate()); input->redraw(); } static void red_cb(Fl_Widget *widget, void *data) { myoutput* input = (((reader_ui*)data)->input); int * sizep; int n = Fl::get_font_sizes(input->textfont(),sizep); if (n == 0) return; if (sizep[0] == 0 && n <= 1) { input->textsize(input->textsize()-1); } else { int i; for (i = n-1; i >= 0; i--) { if (sizep[i] < input->textsize()) break; } if (sizep[i] == 0) i++; input->textsize(sizep[i]); } input->locate(input->pagelocate()); input->redraw(); } static void jump_cb(Fl_Widget *widget, void *_data) { char vlu[40]; static Fl_Window *jumptowin = NULL; if (jumptowin == NULL) { jumptowin = new Fl_Window(100,45);#ifdef AGENDA centre_window(jumptowin);#endif jumptowin->border(0); jumptowin->box(FL_UP_BOX); ((reader_ui *)_data)->locn = new Fl_Int_Input(35,5,50,14,"Place"); ((reader_ui *)_data)->locn->textsize(10); ((reader_ui *)_data)->locn->labelsize(10); Fl_Button *jump_accept = new Fl_Button(10,25,35,15,"Okay"); jump_accept->labelsize(10); jump_accept->callback(jumpAccept_cb,_data); Fl_Button *jump_cancel = new Fl_Button(55,25,35,15,"Cancel"); jump_cancel->labelsize(10); jump_cancel->callback(Cancel_cb,_data); jumptowin->end(); jumptowin->set_modal(); } sprintf(vlu, "%d", ((reader_ui *)_data)->input->pagelocate()); ((reader_ui *)_data)->locn->value(vlu); jumptowin->show(); } static void jumpAccept_cb(Fl_Widget *widget, void *data) { widget->window()->hide(); ((reader_ui *)data)->input->locate(atoi(((reader_ui *)data)->locn->value())); } static void find_cb(Fl_Widget *widget, void *data) { const char *val; myoutput* input = (((reader_ui*)data)->input); //sprintf(search, "%d", input->pagelocate()); val = fl_input("Search String:", search); if (val != NULL) { // User entered a string - go find it! strcpy(search, val); find2_cb(widget, data); } } static void find2_cb(Fl_Widget *widget, void *data) { const char *val, *found; int pos; myoutput* input = (((reader_ui*)data)->input); if (search[0] == '\0') { // Search string is blank; get a new one... find_cb(widget,data); return; } if (found != NULL) { CBuffer test; // input->jumpto(input->locate()); size_t pos; size_t start = input->pagelocate(); input->jumpto(start); input->buffdoc.getline(&test,input->w()); do { pos = input->locate(); if (!input->buffdoc.getline(&test,input->w())) { fl_alert("No occurrences of \'%s\' found!", search); pos = start; break; } // printf("%d:%s\n",pos,test.data()); } while (strstr(test.data(),search) == NULL); input->locate(pos); } } static void open_cb(Fl_Widget *widget, void *data) { char *newfile; reader_ui* reader = (reader_ui*)data; myoutput* input = reader->input;#if defined(RAW) || !defined(AGENDA) newfile = fl_file_chooser("Open File?", "*", filename);#else //newfile = fl_ag_file_chooser("Open File?", "*", filename); newfile = my_fl_file_chooser("Open File?", "*", filename);#endif if (newfile != NULL) reader->load_file(newfile); } static void quit_cb(Fl_Widget *widget, void *_data) { reader_ui* reader = (reader_ui*)_data;#ifdef USEBKMKS save_current(widget, _data);#endif reader->setprefs();#ifdef USEBKMKS DBT key, data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); char buffer[1024]; strcpy(buffer,LASTFILE); key.data = buffer; key.size = strlen(buffer); data.data = ((reader_ui *)_data)->g_filename; data.size = strlen(((reader_ui *)_data)->g_filename); bkmks->put(bkmks,&key,&data,0); bkmks->close(bkmks);#endif reader->window->hide(); } reader_ui(const reader_ui&);public:#ifdef USEBKMKS void setupbkmks() {#ifdef AGENDA bkmkwindow = new Fl_Window(160,240,"Choose Bookmark"); // bkmkwindow->box(FL_NO_BOX); // because it is filled with browser //bkmkwindow->border(0); //bkmkwindow->box(FL_UP_BOX); bkmkbrowser = new Fl_Paged_Select_Browser(0,0,Fl_Group::current()->w(), Fl_Group::current()->h()-25); bkmkbrowser->textfont(FL_HELVETICA); bkmkbrowser->textsize(8);#else int w = (8*Fl::w())/10; int h = (8*Fl::h())/10; if ((14*h)/w < w) w = (10*h)/14; else h = (14*w)/10; bkmkwindow = new Fl_Window(w,h,"Choose Bookmark"); // bkmkwindow->box(FL_NO_BOX); // because it is filled with browser bkmkbrowser = new Fl_Select_Browser(0,0,Fl_Group::current()->w(), Fl_Group::current()->h()-25);#endif bkmkbrowser->callback(bkmk_cb,this); Fl_Button *jump_accept = new Fl_Button((bkmkbrowser->w()-35)/2,bkmkbrowser->h()+5,35,15,"Cancel"); jump_accept->labelsize(10); jump_accept->callback(Cancel_cb,NULL); bkmkwindow->end(); bkmkwindow->set_modal(); } static void bkmk_cb(Fl_Widget* o, void* _data) { o->window()->hide(); int pos = ((Fl_Browser*)o)->value(); // printf("callback, selection = <%d:%s>, event_clicks = %d\n", // pos, ((Fl_Browser*)o)->text(pos), Fl::event_clicks()); if (pos != 0) { (((reader_ui*)_data)->input)->locate((unsigned int)((Fl_Browser*)o)->data(pos)); /* DBT key,data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); setbkmkkey(((reader_ui *)_data)->g_filename,((Fl_Browser*)o)->text(pos),&key); ((Fl_Browser*)o)->clear(); int ret = bkmks->get(bkmks, &key, &data, 0); if (ret == 0) { if (((reader_ui*)_data)->bkmkfind) { unsigned long lcn; memcpy(&lcn,data.data,sizeof(lcn)); (((reader_ui*)_data)->input)->locate(lcn); } else { if (bkmks->del(bkmks, &key, 0) != 0) { fl_alert("Problem deleting bookmark:%d",errno); } } } else { fl_alert("Bookmark not found"); } //delete [] (char*)key.data; */ } } static void populate_bkmk(reader_ui *r) { DBT key,data; memset(&key,0,sizeof(key)); memset(&data,0,sizeof(data)); r->bkmkbrowser->clear(); char buffer1[2048]; strcpy(buffer1,r->g_filename); int offset = strlen(r->g_filename); key.data = buffer1; key.size = offset; bkmks->sync(bkmks, 0); int cnt = 0; CList<Bkmk>* t; if ((t = r->input->getbkmklist()) != NULL) { for (CList<Bkmk>::iterator i = t->begin(); i != t->end(); i++) { r->bkmkbrowser->add(i->name(), (void*)i->value()); cnt++; } delete t; } if (bkmks->seq(bkmks,&key,&data,R_CURSOR) == 0) { while (strcmp(r->g_filename,(char*)key.data)==0) { char buffer[4096]; memcpy(buffer, (char*)key.data+offset+1, key.size-offset-1); buffer[key.size-offset-1] = '\0'; //printf("Found:%s-%s\n",buffer1,buffer); if (strcmp(buffer,"CURRENT") != 0) { unsigned long lcn; memcpy(&lcn,data.data,sizeof(lcn)); r->bkmkbrowser->add(buffer,(void*)lcn); cnt++; } if (bkmks->seq(bkmks,&key,&data,R_NEXT) != 0) break; } } // printf("Showing\n"); // r->bkmkbrowser->position(0); if (cnt > 0) r->bkmkwindow->show(); else fl_alert("No bookmarks for\n%s",filename_name(r->g_filename)); } static void getbkmk_cb(Fl_Widget* o, void* _data) { reader_ui* r = (reader_ui *)_data; r->bkmkfind = true; populate_bkmk(r); } static void delbkmk_cb(Fl_Widget* o, void* _data) { reader_ui* r = (reader_ui *)_data; r->bkmkfind = false; populate_bkmk(r); }#endif static void bstripcr_cb(Fl_Widget* o, void* _data) { ((reader_ui*)_data)->bstripcr = !(((reader_ui*)_data)->bstripcr); ((reader_ui*)_data)->setfilter();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -