pstring options::help(pstring description, pstring usage, unsigned width, unsigned indent) { pstring ret; ret = split_paragraphs(description, width, 0, 0) + "\n"; ret += "Usage:\t" + usage + "\n\nOptions:\n\n"; for (auto & optbase : m_opts ) { if (auto opt = dynamic_cast<option *>(optbase)) { pstring line = ""; if (opt->short_opt() != "") line += " -" + opt->short_opt(); if (opt->long_opt() != "") { if (line != "") line += ", "; else line = " "; line += "--" + opt->long_opt(); if (opt->has_argument()) { line += "="; option_str_limit *ol = dynamic_cast<option_str_limit *>(opt); if (ol) { for (auto &v : ol->limit()) { line += v + "|"; } line = line.left(line.begin() + (line.len() - 1)); } else line += "Value"; } } line = line.rpad(" ", indent - 2) + " "; if (line.len() > indent) { //ret += "TestGroup abc\n def gef\nxyz\n\n" ; ret += line + "\n"; ret += split_paragraphs(opt->help(), width, indent, indent); } else ret += split_paragraphs(line + opt->help(), width, indent, 0); } else if (auto grp = dynamic_cast<option_group *>(optbase)) { ret += "\n" + grp->group() + ":\n"; if (grp->help() != "") ret += split_paragraphs(grp->help(), width, 4, 4) + "\n"; } } pstring ex(""); for (auto & optbase : m_opts ) { if (auto example = dynamic_cast<option_example *>(optbase)) { ex += "> " + example->example()+"\n\n"; ex += split_paragraphs(example->help(), width, 4, 4) + "\n"; } } if (ex.len() > 0) { ret += "\n\nExamples:\n\n" + ex; } return ret; }
int main (int argc, char **argv) { char *text; GtkWidget *window; GtkWidget *scrollwin; GtkWidget *vbox, *hbox; GtkWidget *frame; GtkWidget *checkbutton; gtk_init (&argc, &argv); if (argc != 2) { fprintf (stderr, "Usage: %s FILE\n", g_get_prgname ()); exit(1); } /* Create the list of paragraphs from the supplied file */ text = read_file (argv[1]); if (!text) exit(1); context = pango_win32_get_context (); paragraphs = split_paragraphs (text); pango_context_set_language (context, pango_language_from_string ("en_US")); pango_context_set_base_dir (context, PANGO_DIRECTION_LTR); font_description = pango_font_description_new (); pango_font_description_set_family(font_description, "sans"); pango_font_description_set_size(font_description, 16 * PANGO_SCALE); #if 0 /* default init ok? */ font_description.style = PANGO_STYLE_NORMAL; font_description.variant = PANGO_VARIANT_NORMAL; font_description.weight = 500; font_description.stretch = PANGO_STRETCH_NORMAL; #endif pango_context_set_font_description (context, font_description); /* Create the user interface */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 400, 400); gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_main_quit), NULL); vbox = gtk_vbox_new (FALSE, 4); gtk_container_add (GTK_CONTAINER (window), vbox); hbox = make_font_selector (); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); scrollwin = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), scrollwin, TRUE, TRUE, 0); layout = gtk_layout_new (NULL, NULL); gtk_widget_set_events (layout, GDK_BUTTON_PRESS_MASK); gtk_widget_set_app_paintable (layout, TRUE); gtk_signal_connect (GTK_OBJECT (layout), "size_allocate", GTK_SIGNAL_FUNC (size_allocate), paragraphs); gtk_signal_connect (GTK_OBJECT (layout), "expose_event", GTK_SIGNAL_FUNC (expose), paragraphs); gtk_signal_connect (GTK_OBJECT (layout), "draw", GTK_SIGNAL_FUNC (draw), paragraphs); gtk_signal_connect (GTK_OBJECT (layout), "button_press_event", GTK_SIGNAL_FUNC (button_press), paragraphs); #if GTK_CHECK_VERSION (1,3,2) gtk_widget_set_double_buffered (layout, FALSE); #endif gtk_container_add (GTK_CONTAINER (scrollwin), layout); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0); message_label = gtk_label_new ("Current char:"); gtk_misc_set_padding (GTK_MISC (message_label), 1, 1); gtk_misc_set_alignment (GTK_MISC (message_label), 0.0, 0.5); gtk_container_add (GTK_CONTAINER (frame), message_label); checkbutton = gtk_check_button_new_with_label ("Use RTL global direction"); gtk_signal_connect (GTK_OBJECT (checkbutton), "toggled", GTK_SIGNAL_FUNC (checkbutton_toggled), NULL); gtk_box_pack_start (GTK_BOX (vbox), checkbutton, FALSE, FALSE, 0); gtk_widget_show_all (window); gtk_main (); return 0; }