aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/e-text/e-text.c
diff options
context:
space:
mode:
Diffstat (limited to 'widgets/e-text/e-text.c')
-rw-r--r--widgets/e-text/e-text.c135
1 files changed, 115 insertions, 20 deletions
diff --git a/widgets/e-text/e-text.c b/widgets/e-text/e-text.c
index e87cec59c8..6d7e08dad2 100644
--- a/widgets/e-text/e-text.c
+++ b/widgets/e-text/e-text.c
@@ -30,6 +30,8 @@
#include "e-text-event-processor-emacs-like.h"
+#define BORDER_INDENT 4
+
enum {
E_TEXT_CHANGED,
E_TEXT_ACTIVATE,
@@ -80,7 +82,8 @@ enum {
ARG_BREAK_CHARACTERS,
ARG_MAX_LINES,
ARG_WIDTH,
- ARG_HEIGHT
+ ARG_HEIGHT,
+ ARG_DRAW_BORDERS,
};
@@ -269,6 +272,8 @@ e_text_class_init (ETextClass *klass)
GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH);
gtk_object_add_arg_type ("EText::height",
GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_HEIGHT);
+ gtk_object_add_arg_type ("EText::draw_borders",
+ GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BORDERS);
if (!clipboard_atom)
clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE);
@@ -674,6 +679,7 @@ calc_line_widths (EText *text)
struct line *lines;
int i;
int j;
+ gdouble clip_width;
/* Make sure line has been split */
if (text->text && text->num_lines == 0)
@@ -682,6 +688,14 @@ calc_line_widths (EText *text)
lines = text->lines;
text->max_width = 0;
+ clip_width = text->clip_width;
+ if (clip_width >= 0 && text->draw_borders) {
+ clip_width -= 6;
+ if (clip_width < 0)
+ clip_width = 0;
+ }
+
+
if (!lines)
return;
@@ -698,12 +712,12 @@ calc_line_widths (EText *text)
if (text->clip &&
text->use_ellipsis &&
! text->editing &&
- lines->width > text->clip_width &&
- text->clip_width >= 0) {
+ lines->width > clip_width &&
+ clip_width >= 0) {
if (text->font) {
lines->ellipsis_length = 0;
for (j = 0; j < lines->length; j++ ) {
- if (gdk_text_width (text->font, lines->text, j) + text->ellipsis_width <= text->clip_width)
+ if (gdk_text_width (text->font, lines->text, j) + text->ellipsis_width <= clip_width)
lines->ellipsis_length = j;
else
break;
@@ -747,6 +761,7 @@ split_into_lines (EText *text)
char *laststart;
char *lastend;
char *linestart;
+ double clip_width;
/* Free old array of lines */
e_text_free_lines(text);
@@ -760,13 +775,20 @@ split_into_lines (EText *text)
laststart = text->text;
linestart = text->text;
+ clip_width = text->clip_width;
+ if (clip_width >= 0 && text->draw_borders) {
+ clip_width -= 6;
+ if (clip_width < 0)
+ clip_width = 0;
+ }
+
for (p = text->text; *p; p++) {
if (text->line_wrap && (*p == ' ' || *p == '\n')) {
if ( laststart != lastend
&& gdk_text_width(text->font,
linestart,
p - linestart)
- > text->clip_width ) {
+ > clip_width ) {
text->num_lines ++;
linestart = laststart;
laststart = p + 1;
@@ -781,7 +803,7 @@ split_into_lines (EText *text)
&& gdk_text_width(text->font,
linestart,
p + 1 - linestart)
- > text->clip_width ) {
+ > clip_width ) {
text->num_lines ++;
linestart = laststart;
laststart = p + 1;
@@ -804,7 +826,7 @@ split_into_lines (EText *text)
&& gdk_text_width(text->font,
linestart,
p - linestart)
- > text->clip_width ) {
+ > clip_width ) {
text->num_lines ++;
}
}
@@ -831,7 +853,7 @@ split_into_lines (EText *text)
if ( gdk_text_width(text->font,
lines->text,
p - lines->text)
- > text->clip_width
+ > clip_width
&& laststart != lastend ) {
lines->length = lastend - lines->text;
lines++;
@@ -852,7 +874,7 @@ split_into_lines (EText *text)
&& gdk_text_width(text->font,
lines->text,
p + 1 - lines->text)
- > text->clip_width ) {
+ > clip_width ) {
lines->length = lastend - lines->text;
lines++;
line_num++;
@@ -885,7 +907,7 @@ split_into_lines (EText *text)
if ( gdk_text_width(text->font,
lines->text,
p - lines->text)
- > text->clip_width
+ > clip_width
&& laststart != lastend ) {
lines->length = lastend - lines->text;
lines++;
@@ -1212,6 +1234,16 @@ e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
text->needs_calc_line_widths = 1;
needs_reflow = 1;
break;
+
+ case ARG_DRAW_BORDERS:
+ if (text->draw_borders != GTK_VALUE_BOOL (*arg)) {
+ text->draw_borders = GTK_VALUE_BOOL (*arg);
+ text->needs_calc_height = 1;
+ text->needs_redraw = 1;
+ needs_reflow = 1;
+ needs_update = 1;
+ }
+ break;
default:
return;
@@ -1348,6 +1380,10 @@ e_text_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
GTK_VALUE_DOUBLE (*arg) = text->clip && text->clip_height != -1 ? text->clip_height : text->height / text->item.canvas->pixels_per_unit;
break;
+ case ARG_DRAW_BORDERS:
+ GTK_VALUE_BOOL (*arg) = text->draw_borders;
+ break;
+
default:
arg->type = GTK_TYPE_INVALID;
break;
@@ -1371,6 +1407,7 @@ e_text_reflow (GnomeCanvasItem *item, int flags)
int x;
int i;
struct line *lines;
+ gdouble clip_width;
calc_line_widths(text);
text->needs_calc_line_widths = 0;
text->needs_calc_height = 1;
@@ -1396,8 +1433,15 @@ e_text_reflow (GnomeCanvasItem *item, int flags)
text->xofs_edit = x;
}
- if (2 + x - text->clip_width > text->xofs_edit) {
- text->xofs_edit = 2 + x - text->clip_width;
+ clip_width = text->clip_width;
+ if (clip_width >= 0 && text->draw_borders) {
+ clip_width -= 6;
+ if (clip_width < 0)
+ clip_width = 0;
+ }
+
+ if (2 + x - clip_width > text->xofs_edit) {
+ text->xofs_edit = 2 + x - clip_width;
}
if ((text->font->ascent + text->font->descent) * i < text->yofs_edit)
@@ -1593,12 +1637,15 @@ get_line_xpos (EText *text, struct line *line)
break;
default:
+ if (text->draw_borders)
+ x += BORDER_INDENT;
/* For GTK_JUSTIFY_LEFT, we don't have to do anything. We do not support
* GTK_JUSTIFY_FILL, yet.
*/
break;
}
+
return x;
}
@@ -1637,6 +1684,37 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
canvas = GNOME_CANVAS_ITEM(text)->canvas;
fg_gc = GTK_WIDGET(canvas)->style->fg_gc[text->has_selection ? GTK_STATE_SELECTED : GTK_STATE_ACTIVE];
+
+ if (text->draw_borders) {
+ gdouble thisx = 0, thisy = 0;
+ gdouble thiswidth, thisheight;
+ GtkWidget *widget = GTK_WIDGET(item->canvas);
+ gtk_paint_flat_box (widget->style, drawable,
+ GTK_WIDGET_STATE(widget), GTK_SHADOW_NONE,
+ NULL, widget, "entry_bg",
+ 0, 0, -1, -1);
+
+ gtk_object_get(GTK_OBJECT(text),
+ "width", &thiswidth,
+ "height", &thisheight,
+ NULL);
+ if (text->editing) {
+ thisx += 1;
+ thisy += 1;
+ thiswidth -= 2;
+ thisheight -= 2;
+ }
+ gtk_paint_shadow (widget->style, drawable,
+ GTK_STATE_NORMAL, GTK_SHADOW_IN,
+ NULL, widget, "entry",
+ thisx - x, thisy - y, thiswidth, thisheight);
+
+ if (text->editing) {
+ gtk_paint_focus (widget->style, drawable,
+ NULL, widget, "entry",
+ - x, - y, thiswidth + 1, thisheight + 1);
+ }
+ }
if (!text->text || !text->font)
return;
@@ -1659,6 +1737,9 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
clip_rect = &rect;
}
ypos = text->cy + text->font->ascent;
+ if (text->draw_borders)
+ ypos += BORDER_INDENT;
+
if (text->editing)
ypos -= text->yofs_edit;
@@ -2345,7 +2426,12 @@ _do_tooltip (gpointer data)
NULL);
- e_canvas_item_move_absolute(tooltip_text, 1, 1);
+
+ if (text->draw_borders)
+ e_canvas_item_move_absolute(tooltip_text, 1 + BORDER_INDENT, 1 + BORDER_INDENT);
+ else
+ e_canvas_item_move_absolute(tooltip_text, 1, 1);
+
calc_height(E_TEXT(tooltip_text));
calc_line_widths(E_TEXT(tooltip_text));
@@ -2422,15 +2508,16 @@ _do_tooltip (gpointer data)
#endif
gnome_canvas_item_set(rect,
- "x2", (double) tooltip_width + 4,
- "y2", (double) tooltip_height + 4,
+ "x2", (double) tooltip_width + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
+ "y2", (double) tooltip_height + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
NULL);
gtk_widget_set_usize (text->tooltip_window,
- tooltip_width + 4,
- tooltip_height + 4);
+ tooltip_width + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0),
+ tooltip_height + 4 + (text->draw_borders ? BORDER_INDENT * 2 : 0));
gnome_canvas_set_scroll_region (GNOME_CANVAS(canvas), 0.0, 0.0,
- tooltip_width, (double)tooltip_height);
+ tooltip_width + (text->draw_borders ? BORDER_INDENT * 2 : 0),
+ (double)tooltip_height + (text->draw_borders ? BORDER_INDENT * 2 : 0));
gtk_widget_show (canvas);
gtk_widget_realize (text->tooltip_window);
gtk_signal_connect (GTK_OBJECT(text->tooltip_window), "event",
@@ -2889,6 +2976,7 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp
int x;
int i;
struct line *lines = text->lines;
+ gdouble clip_width;
if ( !lines )
return;
@@ -2908,8 +2996,15 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp
text->xofs_edit = x;
}
- if (2 + x - text->clip_width > text->xofs_edit) {
- text->xofs_edit = 2 + x - text->clip_width;
+ clip_width = text->clip_width;
+ if (clip_width >= 0 && text->draw_borders) {
+ clip_width -= 6;
+ if (clip_width < 0)
+ clip_width = 0;
+ }
+
+ if (2 + x - clip_width > text->xofs_edit) {
+ text->xofs_edit = 2 + x - clip_width;
}
if ((text->font->ascent + text->font->descent) * i < text->yofs_edit)