summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Fl_Input.cxx40
-rw-r--r--src/Fl_Input_.cxx29
-rw-r--r--src/Fl_Tabs.cxx74
3 files changed, 81 insertions, 62 deletions
diff --git a/src/Fl_Input.cxx b/src/Fl_Input.cxx
index 70648bf6f..b84457985 100644
--- a/src/Fl_Input.cxx
+++ b/src/Fl_Input.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Input.cxx,v 1.10.2.2 1999/10/14 04:56:08 bill Exp $"
+// "$Id: Fl_Input.cxx,v 1.10.2.3 1999/10/15 09:01:43 bill Exp $"
//
// Input widget for the Fast Light Tool Kit (FLTK).
//
@@ -279,6 +279,8 @@ int Fl_Input::handle_key() {
}
int Fl_Input::handle(int event) {
+ static char first_click;
+
switch (event) {
case FL_FOCUS:
@@ -311,27 +313,31 @@ int Fl_Input::handle(int event) {
case FL_PUSH:
compose = 0;
- if (Fl::event_button() == 2) {
- Fl::paste(*this);
-#ifndef MOTIF // use -DMOTIF for Motif rather than Win32+Motif hybrid
- if (Fl::focus()==this) return 1;
-#endif
- }
+ first_click = 0;
if (Fl::focus() != this) {
Fl::focus(this);
- handle(FL_FOCUS); // cause minimal update
-#ifndef MOTIF
- position(size(),0); // select everything
- Fl::event_is_click(0); // prevents next click from doing word-select
- return 1;
-#endif
+ handle(FL_FOCUS);
+ // Windoze-style: select everything on first click:
+ if (type() != FL_MULTILINE_INPUT) {
+ first_click = 1;
+ position(size(), 0); // select everything
+ Fl::event_is_click(0); // prevents next click from being a double click
+ return 1;
+ }
}
+ // don't remove selection when pasting in a replacement:
+ if (Fl::event_button() == 2 && mark() != position()) return 1;
break;
- case FL_DRAG:
case FL_RELEASE:
- if (Fl::event_button() == 2) return 0;
- break;
+ if (Fl::event_button() == 2) {
+ Fl::event_is_click(0); // stop double click from picking a word
+ Fl::paste(*this);
+ } else if (!first_click) {
+ copy();
+ }
+ return 1;
+
}
Fl_Boxtype b = box();
return Fl_Input_::handletext(event,
@@ -344,5 +350,5 @@ Fl_Input::Fl_Input(int x, int y, int w, int h, const char *l)
}
//
-// End of "$Id: Fl_Input.cxx,v 1.10.2.2 1999/10/14 04:56:08 bill Exp $".
+// End of "$Id: Fl_Input.cxx,v 1.10.2.3 1999/10/15 09:01:43 bill Exp $".
//
diff --git a/src/Fl_Input_.cxx b/src/Fl_Input_.cxx
index 0dd258fbe..28c551039 100644
--- a/src/Fl_Input_.cxx
+++ b/src/Fl_Input_.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Input_.cxx,v 1.21 1999/03/04 18:09:18 mike Exp $"
+// "$Id: Fl_Input_.cxx,v 1.21.2.1 1999/10/15 09:01:44 bill Exp $"
//
// Common input widget routines for the Fast Light Tool Kit (FLTK).
//
@@ -170,7 +170,7 @@ void Fl_Input_::drawtext(int X, int Y, int W, int H) {
}
int selstart, selend;
- if (Fl::focus()!=this && Fl::selection_owner()!=this && Fl::pushed()!=this)
+ if (Fl::focus()!=this && /*Fl::selection_owner()!=this &&*/ Fl::pushed()!=this)
selstart = selend = 0;
else if (position() <= mark()) {
selstart = position(); selend = mark();
@@ -352,14 +352,18 @@ void Fl_Input_::handle_mouse(int X, int Y,
p = e;
if (e >= value_+size_) break;
}
- const char *l, *r, *t;
+ const char *l, *r, *t; double f0 = 0;
for (l = p, r = e; l<r; ) {
double f;
t = l+(r-l+1)/2;
f = X-xscroll_+expandpos(p, t, buf, 0);
- if (f <= Fl::event_x()) l = t;
+ if (f <= Fl::event_x()) {l = t; f0 = Fl::event_x()-f;}
else r = t-1;
}
+ if (l < e) { // see if closer to character on right:
+ double f1 = X-xscroll_+expandpos(p, l+1, buf, 0)-Fl::event_x();
+ if (f1 < f0) l = l+1;
+ }
newpos = l-value();
int newmark = drag ? mark() : newpos;
@@ -394,7 +398,7 @@ int Fl_Input_::position(int p, int m) {
if (m<0) m = 0;
if (m>size()) m = size();
if (p == position_ && m == mark_) return 0;
- if (Fl::selection_owner() == this) Fl::selection_owner(0);
+ //if (Fl::selection_owner() == this) Fl::selection_owner(0);
if (p != m) {
if (p != position_) minimal_update(position_, p);
if (m != mark_) minimal_update(mark_, m);
@@ -590,16 +594,15 @@ int Fl_Input_::handletext(int event, int X, int Y, int W, int H) {
case FL_FOCUS:
if (mark_ == position_) {
minimal_update(size()+1);
- } else if (Fl::selection_owner() != this)
+ } else //if (Fl::selection_owner() != this)
minimal_update(mark_, position_);
return 1;
case FL_UNFOCUS:
if (mark_ == position_) {
if (!(damage()&FL_DAMAGE_EXPOSE)) {minimal_update(position_); erase_cursor_only = 1;}
- } else if (Fl::selection_owner() != this) {
+ } else //if (Fl::selection_owner() != this)
minimal_update(mark_, position_);
- }
if (when() & FL_WHEN_RELEASE) maybe_do_callback();
return 1;
@@ -616,10 +619,10 @@ int Fl_Input_::handletext(int event, int X, int Y, int W, int H) {
copy();
return 1;
- case FL_SELECTIONCLEAR:
- minimal_update(mark_, position_);
- mark_ = position_;
- return 1;
+// case FL_SELECTIONCLEAR:
+// minimal_update(mark_, position_);
+// mark_ = position_;
+// return 1;
case FL_PASTE: {
// strip trailing control characters and spaces before pasting:
@@ -734,5 +737,5 @@ Fl_Input_::~Fl_Input_() {
}
//
-// End of "$Id: Fl_Input_.cxx,v 1.21 1999/03/04 18:09:18 mike Exp $".
+// End of "$Id: Fl_Input_.cxx,v 1.21.2.1 1999/10/15 09:01:44 bill Exp $".
//
diff --git a/src/Fl_Tabs.cxx b/src/Fl_Tabs.cxx
index 465f9dbd6..43355c84b 100644
--- a/src/Fl_Tabs.cxx
+++ b/src/Fl_Tabs.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Tabs.cxx,v 1.6.2.2 1999/07/22 07:27:11 bill Exp $"
+// "$Id: Fl_Tabs.cxx,v 1.6.2.3 1999/10/15 09:01:45 bill Exp $"
//
// Tab widget for the Fast Light Tool Kit (FLTK).
//
@@ -43,13 +43,13 @@
// Return value is the index of the selected item.
int Fl_Tabs::tab_positions(int* p, int* w) {
- int selected = 0;
+ int selected = -1;
Fl_Widget*const* a = array();
int i;
p[0] = 0;
for (i=0; i<children(); i++) {
Fl_Widget* o = *a++;
- if (o == value_) selected = i;
+ if (o->visible()) selected = i;
if (o->label()) {
int wt = 0; int ht = 0; o->measure_label(wt,ht);
w[i] = wt+TABSLOPE;
@@ -144,7 +144,6 @@ int Fl_Tabs::handle(int event) {
default:
DEFAULT:
- value(); // initialize value & visibility if value_ == 0
return Fl_Group::handle(event);
}
@@ -152,35 +151,41 @@ int Fl_Tabs::handle(int event) {
int Fl_Tabs::push(Fl_Widget *o) {
if (push_ == o) return 0;
- if (push_ && push_ != value_ || o && o != value_) damage(FL_DAMAGE_EXPOSE);
+ if (push_ && !push_->visible() || o && !o->visible())
+ damage(FL_DAMAGE_EXPOSE);
push_ = o;
return 1;
}
+// The value() is the first visible child (or the last child if none
+// are visible) and this also hides any other children.
+// This allows the tabs to be deleted, moved to other groups, and
+// show()/hide() called without it screwing up.
Fl_Widget* Fl_Tabs::value() {
- Fl_Widget *v = value_;
- if (!v) {
- // If value() has not been called, find first visible() child:
- Fl_Widget*const* a = array();
- for (int i=children(); i--;) {
- Fl_Widget* o = *a++;
- if (v) o->hide();
- else if (o->visible()) v = o;
- }
- if (!v) return 0; // no children...
- value_ = v;
+ Fl_Widget* v = 0;
+ Fl_Widget*const* a = array();
+ for (int i=children(); i--;) {
+ Fl_Widget* o = *a++;
+ if (v) o->hide();
+ else if (o->visible()) v = o;
+ else if (!i) {o->show(); v = o;}
}
return v;
}
-int Fl_Tabs::value(Fl_Widget *o) {
- if (value_ == o) return 0;
- Fl_Widget* oldvalue = value_;
- value_ = o;
- if (o) o->show();
- if (oldvalue) oldvalue->hide();
- redraw();
- do_callback();
+// Setting the value hides all other children, and makes this one
+// visible, iff it is really a child:
+int Fl_Tabs::value(Fl_Widget *newvalue) {
+ Fl_Widget*const* a = array();
+ for (int i=children(); i--;) {
+ Fl_Widget* o = *a++;
+ if (o == newvalue) {
+ if (o->visible()) return 0; // no change
+ o->show();
+ } else {
+ o->hide();
+ }
+ }
return 1;
}
@@ -197,8 +202,6 @@ void Fl_Tabs::draw() {
} else { // redraw the child
if (v) update_child(*v);
}
- if (!v) return;
-
if (damage() & (FL_DAMAGE_EXPOSE|FL_DAMAGE_ALL)) {
int p[128]; int w[128];
int selected = tab_positions(p,w);
@@ -208,8 +211,14 @@ void Fl_Tabs::draw() {
draw_tab(x()+p[i], x()+p[i+1], w[i], H, a[i], LEFT);
for (i=children()-1; i > selected; i--)
draw_tab(x()+p[i], x()+p[i+1], w[i], H, a[i], RIGHT);
- i = selected;
- draw_tab(x()+p[i], x()+p[i+1], w[i], H, a[i], SELECTED);
+ if (v) {
+ i = selected;
+ draw_tab(x()+p[i], x()+p[i+1], w[i], H, a[i], SELECTED);
+ } else {
+ // draw the edge when no selection:
+ fl_color(H >= 0 ? FL_LIGHT3 : FL_DARK3);
+ fl_xyline(x(), H >= 0 ? y()+H : y()+h()+H, x()+this->w());
+ }
}
}
@@ -255,11 +264,12 @@ void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) {
}
Fl_Tabs::Fl_Tabs(int X,int Y,int W, int H, const char *l) :
- Fl_Group(X,Y,W,H,l) {
- box(FL_THIN_UP_BOX);
- value_ = push_ = 0;
+ Fl_Group(X,Y,W,H,l)
+{
+ box(FL_THIN_UP_BOX);
+ push_ = 0;
}
//
-// End of "$Id: Fl_Tabs.cxx,v 1.6.2.2 1999/07/22 07:27:11 bill Exp $".
+// End of "$Id: Fl_Tabs.cxx,v 1.6.2.3 1999/10/15 09:01:45 bill Exp $".
//