Doc sync.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7517 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Greg Ercolano
2010-04-16 17:55:45 +00:00
parent 4d22e65e53
commit cba451be45
5 changed files with 231 additions and 42 deletions
+2
View File
@@ -157,6 +157,8 @@ CHANGES IN FLTK 1.3.0
- hide() and show() methods are now virtual from Fl_Widget,
was only virtual since Fl_Window derived classes before.
So now widget->hide() will work if widget is a window.
- New widgets: Fl_Tree, Fl_Table, Fl_Native_File_Chooser
- added Fl_Menu_ methods: insert(), find_index(), clear_submenu()
CHANGES IN FLTK 1.1.9
+12 -2
View File
@@ -66,6 +66,9 @@ public:
const Fl_Menu_Item* picked(const Fl_Menu_Item*);
const Fl_Menu_Item* find_item(const char *name);
const Fl_Menu_Item* find_item(Fl_Callback*);
int find_index(const char *name) const;
int find_index(const Fl_Menu_Item *item) const;
int find_index(Fl_Callback *cb) const;
const Fl_Menu_Item* test_shortcut() {return picked(menu()->test_shortcut());}
void global();
@@ -77,14 +80,21 @@ public:
const Fl_Menu_Item *menu() const {return menu_;}
void menu(const Fl_Menu_Item *m);
void copy(const Fl_Menu_Item *m, void* user_data = 0);
int insert(int index, const char*, int shortcut, Fl_Callback*, void* = 0, int = 0);
int add(const char*, int shortcut, Fl_Callback*, void* = 0, int = 0);
/** See int Fl_Menu_::add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0)*/
/** See int Fl_Menu_::add(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0) */
int add(const char* a, const char* b, Fl_Callback* c, void* d = 0, int e = 0) {
return add(a,fl_old_shortcut(b),c,d,e);}
return add(a,fl_old_shortcut(b),c,d,e);
}
/** See int Fl_Menu_::insert(const char* label, int shortcut, Fl_Callback*, void *user_data=0, int flags=0) */
int insert(int index, const char* a, const char* b, Fl_Callback* c, void* d = 0, int e = 0) {
return insert(index,a,fl_old_shortcut(b),c,d,e);
}
int add(const char *);
int size() const ;
void size(int W, int H) { Fl_Widget::size(W, H); }
void clear();
int clear_submenu(int index);
void replace(int,const char *);
void remove(int);
/** Changes the shortcut of item i to n. */
+1
View File
@@ -386,6 +386,7 @@ struct FL_EXPORT Fl_Menu_Item {
/** back compatibility only \deprecated. */
void uncheck() {flags &= ~FL_MENU_VALUE;}
int insert(int,const char*,int,Fl_Callback*,void* =0, int =0);
int add(const char*, int shortcut, Fl_Callback*, void* =0, int = 0);
/** See int add(const char*, int shortcut, Fl_Callback*, void*, int) */
+119 -19
View File
@@ -100,11 +100,13 @@ int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *findite
}
/**
Find menu item index, given a menu pathname such as "Edit/Copy".
Find the menu item for a given menu \p pathname, such as "Edit/Copy".
This method finds a menu item in a menu array, also traversing submenus, but
This method finds a menu item in the menu array, also traversing submenus, but
not submenu pointers.
To get the menu item's index, use find_index(const char*)
\b Example:
\code
Fl_Menu_Bar *menubar = new Fl_Menu_Bar(..);
@@ -120,25 +122,84 @@ int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *findite
item->labelcolor(FL_GREEN);
}
\endcode
\returns The item found, or NULL if not found.
\see
\param name path and name of the menu item
\return NULL if not found
\see Fl_Menu_::find_item(Fl_Callback*), item_pathname()
\param pathname The path and name of the menu item
\returns The item found, or NULL if not found
\see find_index(const char*), find_item(Fl_Callback*), item_pathname()
*/
const Fl_Menu_Item * Fl_Menu_::find_item(const char *name) {
char menupath[1024] = ""; // File/Export
const Fl_Menu_Item * Fl_Menu_::find_item(const char *pathname) {
int i = find_index(pathname);
return( (i==-1) ? 0 : (const Fl_Menu_Item*)(menu_+i));
}
/**
Find the index the menu array for given \p item.
A way to convert a menu item pointer into an index.
Current implementation is fast and not expensive.
\code
// Convert an index-to-item
int index = 12;
const Fl_Menu_Item *item = mymenu->menu() + index;
// Convert an item-to-index
int index = mymenu->find_index(item);
if ( index == -1 ) { ..error.. }
\endcode
\param item The *item to be found
\returns The index of the item, or -1 if not found.
\see menu()
*/
int Fl_Menu_::find_index(const Fl_Menu_Item *item) const {
Fl_Menu_Item *max = menu_+size();
if (item<menu_ || item>=max) return(-1);
return(item-menu_);
}
/**
Find the index into the menu array for a given callback \p cb.
This method finds a menu item's index position, also traversing submenus, but
not submenu pointers. This is useful if an application uses internationalisation
and a menu item can not be found using its label. This search is also much faster.
\param cb Find the first item with this callback
\returns The index of the item with the specific callback, or -1 if not found
\see find_index(const char*)
*/
int Fl_Menu_::find_index(Fl_Callback *cb) const {
for ( int t=0; t < size(); t++ )
if (menu_[t].callback_==cb)
return(t);
return(-1);
}
/**
Find the menu item index for a given menu \p pathname, such as "Edit/Copy".
This method finds a menu item's index position for the given menu pathname,
also traversing submenus, but not submenu pointers.
To get the menu item pointer for a pathname, use find_item()
\param pathname The path and name of the menu item index to find
\returns The index of the matching item, or -1 if not found.
\see item_pathname()
*/
int Fl_Menu_::find_index(const char *pathname) const {
char menupath[1024] = ""; // File/Export
for ( int t=0; t < size(); t++ ) {
Fl_Menu_Item *m = menu_ + t;
if (m->flags&FL_SUBMENU) {
// IT'S A SUBMENU
// we do not support searches through FL_SUBMENU_POINTER links
if (menupath[0]) strlcat(menupath, "/", sizeof(menupath));
strlcat(menupath, m->label(), sizeof(menupath));
if (!strcmp(menupath, name)) return m;
if (!strcmp(menupath, pathname)) return(t);
} else {
if (!m->label()) {
// END OF SUBMENU? Pop back one level.
@@ -147,21 +208,19 @@ const Fl_Menu_Item * Fl_Menu_::find_item(const char *name) {
else menupath[0] = '\0';
continue;
}
// IT'S A MENU ITEM
char itempath[1024]; // eg. Edit/Copy
strcpy(itempath, menupath);
if (itempath[0]) strlcat(itempath, "/", sizeof(itempath));
strlcat(itempath, m->label(), sizeof(itempath));
if (!strcmp(itempath, name)) return m;
if (!strcmp(itempath, pathname)) return(t);
}
}
return (const Fl_Menu_Item *)0;
return(-1);
}
/**
Find menu item index given a callback.
Find the menu item for the given callback \p cb.
This method finds a menu item in a menu array, also traversing submenus, but
not submenu pointers. This is useful if an application uses
@@ -169,8 +228,8 @@ const Fl_Menu_Item * Fl_Menu_::find_item(const char *name) {
search is also much faster.
\param cb find the first item with this callback
\return NULL if not found
\see Fl_Menu_::find_item(const char*)
\returns The item found, or NULL if not found
\see find_item(const char*)
*/
const Fl_Menu_Item * Fl_Menu_::find_item(Fl_Callback *cb) {
for ( int t=0; t < size(); t++ ) {
@@ -286,7 +345,7 @@ void Fl_Menu_::menu(const Fl_Menu_Item* m) {
/**
Sets the menu array pointer with a copy of m that will be automatically deleted.
If ud is not NULL, then all user data pointers are changed in the menus as well.
If userdata \p ud is not NULL, then all user data pointers are changed in the menus as well.
See void Fl_Menu_::menu(const Fl_Menu_Item* m).
*/
void Fl_Menu_::copy(const Fl_Menu_Item* m, void* ud) {
@@ -330,6 +389,47 @@ void Fl_Menu_::clear() {
}
}
/**
Clears the specified submenu pointed to by \p index of all menu items.
This method is useful for clearing a submenu so that it can be
re-populated with new items. Example: a "File/Recent Files/..." submenu
that shows the last few files that have been opened.
The specified \p index must point to a submenu.
The submenu is cleared with remove().
If the menu array was directly set with menu(x), then copy()
is done to make a private array.
\warning Since this method can change the internal menu array, any menu
item pointers or indecies the application may have cached can become
stale, and should be recalculated/refreshed.
\b Example:
\code
int index = menubar->find_index("File/Recent"); // get index of "File/Recent" submenu
if ( index != -1 ) menubar->clear_submenu(index); // clear the submenu
menubar->add("File/Recent/Aaa");
menubar->add("File/Recent/Bbb");
[..]
\endcode
\param index The index of the submenu to be cleared
\returns 0 on success, -1 if the index is out of range or not a submenu
\see remove(int)
*/
int Fl_Menu_::clear_submenu(int index) {
if ( index < 0 || index >= size() ) return(-1);
if ( ! (menu_[index].flags & FL_SUBMENU) ) return(-1);
++index; // advance to first item in submenu
while ( index < size() ) { // keep remove()ing top item until end is reached
if ( menu_[index].text == 0 ) break; // end of this submenu? done
remove(index); // remove items/submenus
}
return(0);
}
//
// End of "$Id$".
//
+97 -21
View File
@@ -53,11 +53,12 @@ extern Fl_Menu_* fl_menu_array_owner; // in Fl_Menu_.cxx
// Insert a single Fl_Menu_Item into an array of size at offset n,
// if this is local_array it will be reallocated if needed.
static Fl_Menu_Item* insert(
Fl_Menu_Item* array, int size,
int n,
const char *text,
int flags
static Fl_Menu_Item* array_insert(
Fl_Menu_Item* array, // array to modify
int size, // size of array
int n, // index of new insert position
const char *text, // text of new item (copy is made)
int flags // flags for new item
) {
if (array == local_array && size >= local_array_alloc) {
local_array_alloc = 2*size;
@@ -106,6 +107,27 @@ int Fl_Menu_Item::add(
Fl_Callback *cb,
void *data,
int myflags
) {
return(insert(-1,mytext,sc,cb,data,myflags)); // -1: append
}
/** Inserts an item at position \p index.
If \p index is -1, the item is added the same way as Fl_Menu_Item::add().
If 'mytext' contains any un-escaped front slashes (/), it's assumed
a menu pathname is being specified, and the value of \p index
will be ignored.
In all other aspects, the behavior of insert() is the same as add().
*/
int Fl_Menu_Item::insert(
int index,
const char *mytext,
int sc,
Fl_Callback *cb,
void *data,
int myflags
) {
Fl_Menu_Item *array = this;
Fl_Menu_Item *m = this;
@@ -133,17 +155,18 @@ int Fl_Menu_Item::add(
item = buf;
if (*p != '/') break; /* not a menu title */
mytext = p+1; /* point at item title */
index = -1; /* any submenu specified overrides insert position */
mytext = p+1; /* point at item title */
/* find a matching menu title: */
for (; m->text; m = m->next())
if (m->flags&FL_SUBMENU && !compare(item, m->text)) break;
if (!m->text) { /* create a new menu */
int n = m-array;
array = insert(array, msize, n, item, FL_SUBMENU|flags1);
int n = (index==-1) ? m-array : index;
array = array_insert(array, msize, n, item, FL_SUBMENU|flags1);
msize++;
array = insert(array, msize, n+1, 0, 0);
array = array_insert(array, msize, n+1, 0, 0);
msize++;
m = array+n;
}
@@ -156,11 +179,11 @@ int Fl_Menu_Item::add(
if (!(m->flags&FL_SUBMENU) && !compare(m->text,item)) break;
if (!m->text) { /* add a new menu item */
int n = m-array;
array = insert(array, msize, n, item, myflags|flags1);
int n = (index==-1) ? m-array : index;
array = array_insert(array, msize, n, item, myflags|flags1);
msize++;
if (myflags & FL_SUBMENU) { // add submenu delimiter
array = insert(array, msize, n+1, 0, 0);
array = array_insert(array, msize, n+1, 0, 0);
msize++;
}
m = array+n;
@@ -179,17 +202,21 @@ int Fl_Menu_Item::add(
/**
Adds a new menu item.
\param[in] label The text label for the menu item.
\param[in] label The text label for the menu item.
\param[in] shortcut Optional keyboard shortcut that can be an int or string; (FL_CTRL+'a') or "^a". Default 0 if none.
\param[in] callback Optional callback invoked when user clicks the item. Default 0 if none.
\param[in] userdata Optional user data passed as an argument to the callback. Default 0 if none.
\param[in] flags Optional flags that control the type of menu item; see below. Default is 0 for none.
\returns The index into the menu() array, where the entry was added.
\param[in] flags Optional flags that control the type of menu item; see below. Default is 0 for none.
\returns The index into the menu() array, where the entry was added.
\par Description
If the menu array was directly set with menu(x), then copy() is done
to make a private array.
\par
Since this method can change the internal menu array, any menu item
pointers or indecies the application may have cached can become stale,
and should be recalculated/refreshed.
\par
A menu item's callback must not add() items to its parent menu during the callback.
<B>Detailed Description of Parameters</B>
@@ -219,23 +246,32 @@ int Fl_Menu_Item::add(
\par
This parameter is optional, and defaults to 0 to indicate no shortcut.
\par
Shortcut can be 0L, or either a modifier/key combination (for example
FL_CTRL+'A') or a string describing the shortcut in one of two ways:
The shortcut can either be a raw integer value (eg. FL_CTRL+'A')
or a string (eg. "^c" or "^97").
\par
Raw integer shortcuts can be a combination of keyboard chars (eg. 'A')
and optional keyboard modifiers (see Fl::event_state(), e.g. FL_SHIFT, etc).
\par
String shortcuts can be specified in one of two ways:
\par
\verbatim
[#+^]<ascii_value> e.g. "97", "^97", "+97", "#97"
[#+^]<ascii_char> e.g. "a", "^a", "+a", "#a"
\endverbatim
\par
..where \<ascii_value\> is a decimal value representing an
ascii character (eg. 97 is the ascii for 'a'), and the optional
ascii character (eg. 97 is the ascii code for 'a'), and the optional
prefixes enhance the value that follows. Multiple prefixes must
appear in the above order.
\par
\verbatim
# - Alt
+ - Shift
^ - Control
\endverbatim
Text shortcuts are converted to integer shortcut by calling
unsigned int fl_old_shortcut(const char*).
\par
Internally, the text shortcuts are converted to integer values using
fl_old_shortcut(const char*).
\par callback
The callback to invoke when this menu item is selected.
@@ -264,8 +300,48 @@ int Fl_Menu_Item::add(
FL_MENU_DIVIDER // Creates divider line below this item. Also ends a group of radio buttons.
\endcode
\todo Raw integer shortcut needs examples.
Dependent on responses to http://fltk.org/newsgroups.php?gfltk.development+v:10086 and results of STR#2344
*/
int Fl_Menu_::add(const char *label,int shortcut,Fl_Callback *callback,void *userdata,int flags) {
return(insert(-1,label,shortcut,callback,userdata,flags)); // -1: append
}
/**
Inserts a new menu item at the specified \p index position.
If \p index is -1, the menu item is appended; same behavior as add().
The value of \p index will be ignored if \p label contains un-escaped
front-slashes (/) indicating a menu pathname as the point of insertion.
A menu pathname will override the value of \p index.
For more details, see add(). Except for the \p index parameter, add()
has more detailed information on parameters and behavior, and is
functionally equivalent,
\param[in] index The menu array's index position where the new item
is inserted. If -1, behavior is the same as add().
\param[in] label The text label for the menu item.
\param[in] shortcut Optional keyboard shortcut. Can be an int (FL_CTRL+'a')
or a string ("^a"). Default is 0.
\param[in] callback Optional callback invoked when user clicks the item.
Default 0 if none.
\param[in] userdata Optional user data passed as an argument to the callback.
Default 0 if none.
\param[in] flags Optional flags that control the type of menu item;
see add() for more info. Default is 0 for none.
\returns The index into the menu() array, where the entry was added.
*/
int Fl_Menu_::insert(
int index,
const char *label,
int shortcut,
Fl_Callback *callback,
void *userdata,
int flags
) {
// make this widget own the local array:
if (this != fl_menu_array_owner) {
if (fl_menu_array_owner) {
@@ -299,7 +375,7 @@ int Fl_Menu_::add(const char *label,int shortcut,Fl_Callback *callback,void *use
}
fl_menu_array_owner = this;
}
int r = menu_->add(label,shortcut,callback,userdata,flags);
int r = menu_->insert(index,label,shortcut,callback,userdata,flags);
// if it rellocated array we must fix the pointer:
int value_offset = value_-menu_;
menu_ = local_array; // in case it reallocated it