shf@well.UUCP (Stuart H. Ferguson) (05/09/89)
+-- hrlaser@sactoh0.UUCP (Harv R. Laser) writes: [ something I consider very telling ... ] | PathMaster is my absolute favorite file requester. I could name | a dozen (or 5 dozen) programs I use frequently whose file | requesters I'd like to rip out by their roots and replace with | PathMaster.... Yeah, and why not? File requesters seem to be a religious issue almost like editors (maybe not that bad :-). They are also very difficult to write well, which leaves developers with few alternatives. The end result is that almost everyone has almost no programs with file requesters they like. There are some PD file requesters -- but what if you don't like them? ARP provides a file requester in its shared library, which is nice for developers who don't want to write there own, and can be replaced. But replacing it requires SetFunction()ing the library, and hoping for no unexpected interactions. How about a "filerequester.library?" It could be spec'ed as having a known interface that anyone could write towards -- from both sides. Developers would have access to a generic file requester from within their programs, users would see a consistent interface, AND users could choose the requester they want from as many possible filerequester.library's as could be written. You could use the Dillon fr.library, or the Schwab fr.library, or the RJ ... There's been some talk on .tech about a requester interface already.... P.S. Personally, I'd still like to see a file requester that opened up like a Workbench drawer with the full functionality. Double-click other drawers to browse the directory and double-click your data file to select it. Or, shift-click to select multiple files. Why, when there's a graphic system interface, are there no graphical file requesters? P.Wishful.Thinking.S. Why, oh, why is there no workbench.library? Put some hooks in that black box, boys. I've got libraries one the brain tonight I gues .... -- Stuart Ferguson (shf@well.UUCP) Action by HAVOC
mp1u+@andrew.cmu.edu (Michael Portuesi) (05/10/89)
shf@well.UUCP (Stuart H. Ferguson) writes: > How about a "filerequester.library?" Stuart, with all due respect, I would like to make one important point: Graphical UI != File Requester in a Library How about instead of a "filerequester.library", we create a shared library named "intuitiontools.library", which contains some high-level user interface tools for intuition. A File Requester, code to manage menus (I seem to remember you write some really fine menu management code that would go nicely into this library), tools to make building requesters easier, compound Intuition gadgets (such as scroll bars) built using Intuition's atomic gadgets, etc. To me, Intuition's biggest problem is that it doesn't provide enough support for a lot of higher-level UI stuff. A shared library containing code to do a lot of this stuff will 1) save programmers a lot of work, 2) result in more efficient use of system resources since only one copy of the code will be shared among multiple applications, 3) Bring more UI standardization to Amiga programs, 4) Allow hackers to customize the "Standard" interface using SetFunction(), and 5) Allow the UI of all application programs on the system to be upgraded merely by upgrading the library. A bigger problem with the Intuition + graphics libraries is that the only text support outside the console device (which is basically terminal emulation) is Text(). A text.library which contained code to manage text buffers + the necessary display handling code which would allow you to attach a text object to a window or gadget would be a wonderful tool for application developers as well. I suspect the reason the Mac has such wonderful word processors and DTP packages is that the Mac OS (as it were) gives developers a lot of system support for text handling. A primary component of the Andrew Toolkit (a user interface toolkit for Unix + X11 that was developed here at the ITC) is its Text object. > Stuart Ferguson (shf@well.UUCP) > Action by HAVOC -- Michael Portuesi * Information Technology Center * Carnegie Mellon University INTERNET: mp1u+@andrew.cmu.edu * BITNET: mp1u+@andrew UUCP: ...harvard!andrew.cmu.edu!mp1u+ MAIL: Carnegie Mellon University, P.O. Box 259, Pittsburgh, PA 15213
golden@cps3xx.UUCP (golden james) (05/10/89)
In article <11583@well.UUCP> shf@well.UUCP (Stuart H. Ferguson) writes: >to write well, which leaves developers with few alternatives. The end >result is that almost everyone has almost no programs with file requesters >they like. > >There are some PD file requesters -- but what if you don't like them? ... >How about a "filerequester.library?" It could be spec'ed as having a >known interface that anyone could write towards -- from both sides. >Developers would have access to a generic file requester from within >their programs, users would see a consistent interface, AND users could >choose the requester they want from as many possible ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >filerequester.library's as could be written. You could use the Dillon >fr.library, or the Schwab fr.library, or the RJ ... Or even a FileReq.device - who knows? Just drop your favorite in the right drawer, and you'll have an instant common user interface to all your favorite (participating) programs. Great Idea!! Mike Golden Physiology Undergraduate Michigan State University
cmcmanis%pepper@Sun.COM (Chuck McManis) (05/11/89)
In article <11583@well.UUCP> shf@well.UUCP (Stuart H. Ferguson) writes: >How about a "filerequester.library?" It could be spec'ed as having a In article <2915@cps3xx.UUCP> golden@cps3xx.UUCP (golden james) writes: >Or even a FileReq.device - who knows? Just drop your favorite in the >right drawer, and you'll have an instant common user interface to all >your favorite (participating) programs. Great Idea!! How about ARP? You may not like the file requester in the ARP library but it is a) a shared library, b) a defined file requester interface. So every thing you need is in place. Just SetFunction() the requester code with your own requester if you want to change it. When I installed ARP 1.3 it didn't sink in, but when I brought up VlT and went to upload a file, the new requester was there and it was really neat. --Chuck McManis uucp: {anywhere}!sun!cmcmanis BIX: cmcmanis ARPAnet: cmcmanis@sun.com These opinions are my own and no one elses, but you knew that didn't you. "A most excellent barbarian ... Genghis Kahn!"
pds@quintus.UUCP (Peter Schachte) (05/11/89)
shf@well.UUCP (Stuart H. Ferguson) writes: > How about a "filerequester.library?" In article <UYNn=hy00VsfE2FI4k@andrew.cmu.edu> mp1u+@andrew.cmu.edu (Michael Portuesi) replies: > Graphical UI != File Requester in a Library True. MUCH MUCH more is needed. Stuart didn't go far enough. >How about instead of a "filerequester.library", we create a shared >library named "intuitiontools.library", which contains some high-level >user interface tools for intuition. But you're not going far enough, either. By putting everything in one library, you either restrict its scope or burden the whole system with lots of code in memory when only a small part is needed. Putting everything in one place (or few places) makes it painful to replace several parts of the system. For example, you may want someone's scroll bars, someone else's file requesters, someone else's popup pie menus, etc. If these thing are kept separate, rather than all stuffed into a single library or a few, then it would be much easier to pick and choose. I think a better way to organize these things would be objects (classes). A program would just create objects and send messages to them. The methods (messages implementations) would be kept in something much like a library, and each actual instance would keep a pointer to its library. Then, just by replacing the library, you would change the implementation of a class. Also, inheritance would be really helpful, since, e.g., by replacing the ScrollingWindow class you would change scrolling behavior for subclasses of ScrollingWindow as well. Another really intriguing aspect of this approach is that many applications would mostly be implemented as classes. The main program would just create a few objects and send them some messages. If the object system itself supplied code for handling the event loop, as does Xtk and Sunview and others, the main program could just exit, leaving the object system to handle things from there. You could spawn as many editors as you want, you'd still only have one process handling them, and all code would be shared. -- -Peter Schachte pds@quintus.uucp ...!sun!quintus!pds
new@udel.EDU (Darren New) (05/12/89)
In article <1051@quintus.UUCP> pds@quintus.UUCP (Peter Schachte) writes: >But you're not going far enough, either. By putting everything in one >library, you either restrict its scope or burden the whole system with >lots of code in memory when only a small part is needed. Putting Alternately, have everything in the library (or most everything) be a stub that LoadSeg's another file and patches the stub. (Do I hear an echo? :-) Then replacing the stub file could change portions of the library and allow low memory overhead. Problems: what if I don't have the memory to do the LoadSeg? How to clean up when expunged? How to specify that more than one routine is in the same file (like open file requester and save file requester)? But these are fairly trivial things overall. - Darren New
peter@sugar.hackercorp.com (Peter da Silva) (05/12/89)
In article <UYNn=hy00VsfE2FI4k@andrew.cmu.edu>, mp1u+@andrew.cmu.edu (Michael Portuesi) writes: > To me, Intuition's biggest problem is that it doesn't provide enough > support for a lot of higher-level UI stuff. I started working on an X-windows-esque widget library, but nobody seemed interested and I dropped it. Maybe it's time to reconsider it? I was originally going to just have a text-pane and some fancy scrollbar with readout widgets... -- Peter "Have you hugged your wolf today" da Silva `-_-' ...texbell!sugar!peter, or peter@sugar.hackercorp.com 'U`
shf@well.UUCP (Stuart H. Ferguson) (05/12/89)
+-- mp1u+@andrew.cmu.edu (Michael Portuesi) writes: | shf@well.UUCP (Stuart H. Ferguson) writes: | > How about a "filerequester.library?" | | Graphical UI != File Requester in a Library | How about instead of a "filerequester.library", we create a shared | library named "intuitiontools.library", which contains some high-level | user interface tools for intuition. A File Requester, code to manage | menus (I seem to remember you write some really fine menu management | code that would go nicely into this library), tools to make building | requesters easier, compound Intuition gadgets (such as scroll bars) | built using Intuition's atomic gadgets, etc. Yes, this stuff is needed. I don't like the idea of just collecting a grab-bag of tools in one big library, however. The reason I suggest a filerequester.library is so that it can be easily replaced. Since file requesters are a very atomic module, and they are required by programs that don't necessarily need other aspects of a graphical toolkit, I think it would be justified to put it in a library by itself. I also think it makes sense if you look at the aspects of the Amiga system design that have worked to make the system extensible. The two that come to mind immediately are input handlers and devices/dos handlers. Both are have well-engineered, highly modular interfaces, which encourages people to write real tools under them. (Ok, dos handlers are a little gooey, but they *are* modular.) The other way to extend the system software, SetFunction, has produced some interesting display hacks, but few real tools. Building on this observation, I think a filereq.library would be an idea that encourages innovation and diversity rather than relying on a single approach. Since it would be easy to replace, the user would have a choice, just like you can choose between NEWCON: or ConMan, VD0: or RAD: (or have both!), DMouse or Mackie ... | To me, Intuition's biggest problem is that it doesn't provide enough | support for a lot of higher-level UI stuff. A shared library | containing code to do a lot of this stuff will [ be a good thing ] I agree. But I would prefer it to be a rational, integrated set of tools rather than a random assortment. | A text.library which contained code to | manage text buffers + the necessary display handling code which would | [ also be a good thing ] I agree again -- also as a well-integrated package. -- Stuart Ferguson (shf@well.UUCP) Action by HAVOC
shf@well.UUCP (Stuart H. Ferguson) (05/12/89)
+-- cmcmanis@sun.UUCP (Chuck McManis) writes: | In article <11583@well.UUCP> shf@well.UUCP (Stuart H. Ferguson) writes: | >How about a "filerequester.library?" It could be spec'ed as having a | In article <2915@cps3xx.UUCP> golden@cps3xx.UUCP (golden james) writes: | >Or even a FileReq.device - who knows? Just drop your favorite in the | | How about ARP? You may not like the file requester in the ARP library | but it is a) a shared library, b) a defined file requester interface. | So every thing you need is in place. Just SetFunction() the requester | code with your own requester if you want to change it. Objection! SetFunction(), I my opinion, is a hack. And a pretty poor one at that. It locks the library in memory, even when it's not in use, and it requires the USER to correctly nest the setfunctioning and un-setfuntioning of nis tools. The first is a bad limitation, but the second is unacceptable from a user's point of view. If they get the nesting wrong - Boom! | When I installed | ARP 1.3 it didn't sink in, but when I brought up VlT and went to | upload a file, the new requester was there and it was really neat. | --Chuck McManis Yeah, there are great advantages to this shared code thing -- we're just so used to the "monolithic" program approach that it's hard to see. -- Stuart Ferguson (shf@well.UUCP) Action by HAVOC
shf@well.UUCP (Stuart H. Ferguson) (05/12/89)
+-- pds@quintus.UUCP (Peter Schachte) writes: | shf@well.UUCP (Stuart H. Ferguson) writes: | > How about a "filerequester.library?" | | In article <> mp1u+@andrew.cmu.edu (Michael Portuesi) replies: | >How about instead of a "filerequester.library", we create a shared | >library named "intuitiontools.library", which contains some high-level | >user interface tools for intuition. | | [...] By putting everything in one | library, you either restrict its scope or burden the whole system with | lots of code in memory when only a small part is needed. Putting | everything in one place (or few places) makes it painful to replace | several parts of the system. My reasoning exactly -- that's the purpose of putting the requester in a library by itself. | I think a better way to organize these things would be objects | (classes). A program would just create objects and send messages to | them. The methods (messages implementations) would be kept in something | much like a library, and each actual instance would keep a pointer to | its library. This is a neat idea which I've been thinking about for a while now. There are several problems, technical and social. The technical problems revolve around selecting a message-passing scheme. My first thought was to use the library structure itself as a dipatch table to enumerated methods. This is very fast since all "messages" are really just library calls at hard-coded offsets. It's limited, however, in that classes are strictly hierarchical and methods have to be nested. Another approach would be to use symbolic message codes and have each "message" to an object involve some sort of string or ID which would be searched for by the object and passed on if unrecognized. This is not nearly as fast and is a lot more complex, but it is fully general with regards to building subclasses and extending your superclasses. This scheme can be made fast, but at a price of complexity. It also has a giant global namespace which I'm not so hot about. Any ideas on that Peter? The social problem is making it catch on. I suppose if it is useful enough people would use it, but for commercial applications ... It's actually the social concerns that have me suggest a filereq. library. a) It can be done reasonably quickly. b) It's small and unobtrusive -- you don't have to buy a whole philosophy to use it. c) It encuurages the gifted "utility" writers to make their own. d) If widely used, it shows off the advantage of having your application broken up into lots of little cooperating bits. (Once that idea is sold, it's easier to sell a full-blown O-O system.) Oh well, I'll leave the social aspects to another group -- this is comp.sys.amiga.TECH! -- Stuart Ferguson (shf@well.UUCP) Action by HAVOC
usenet@cps3xx.UUCP (Usenet file owner) (05/12/89)
In article <15219@louie.udel.EDU> new@udel.EDU (Darren New) writes: >In article <1051@quintus.UUCP> pds@quintus.UUCP (Peter Schachte) writes: >Alternately, have everything in the library (or most everything) be a stub >that LoadSeg's another file and patches the stub. (Do I hear an echo? :-) Instead of LoadSeg directly, how about "IntuitionTools.library" which has a bunch of standard functions. Each function when called, does an additional OpenLibrary("functionname.library",x), and then Calls it and Closes Library. This eliminates SetFunction kludges, and is much simpler. That sounds like a lot of overhead, but for things like file requesters, things are slow anyways. This is an example of a short .signature jap@frith.cl.msu.edu
jimm@amiga.UUCP (Jim Mackraz) (05/13/89)
In article <11636@well.UUCP> shf@well.UUCP (Stuart H. Ferguson) writes:
)| I think a better way to organize these things would be objects
)| (classes). A program would just create objects and send messages to
)| them. The methods (messages implementations) would be kept in something
)| much like a library, and each actual instance would keep a pointer to
)| its library.
)This is a neat idea which I've been thinking about for a while now.
)There are several problems, technical and social. The technical problems
)revolve around selecting a message-passing scheme. My first thought
)was to use the library structure itself as a dipatch table to
)enumerated methods. This is very fast since all "messages" are really
)just library calls at hard-coded offsets. It's limited, however, in
)that classes are strictly hierarchical and methods have to be nested.
I don't know what exactly you mean by nested, but the "array of
function pointers" does single inheritance rather nicely: a subclass
starts out with a copy of the array of its superclass, extends
and replaces some entries. You might want to pass the message
up the inheritance chain, for example when initializing a new object
instance.
)Another approach would be to use symbolic message codes and have each
)"message" to an object involve some sort of string or ID which would
)be searched for by the object and passed on if unrecognized. This is
)not nearly as fast and is a lot more complex, but it is fully general
)with regards to building subclasses and extending your superclasses.
)This scheme can be made fast, but at a price of complexity.
)It also has a giant global namespace which I'm not so hot about.
The namespace is the the blessing and the curse. It's not hard to code
up a system using technique 1, compile and link it as a module.
Use nested include files to define consecutive method IDs and object
data structure, and if you add a method to class A, your makefile makes
sure you recompile all descendants of A. And all clients of A.
On the other hand, if some classes are implemented in the system, some
by aftermarket class vendors, and even a third source for the application
program, you clearly can't recompile when you add a method to a system class.
So, for a solution to fly as system code, you MUST have a global namespace.
So, once you do that, you're looking up methods in id tables, plus any
tricks you want to pull.
To suitably manage a global namespace, it helps to have partitions.
A manageable group of people is responsible for uniqueueness within
the partition, and partitions are handed out by a higher authority.
Objective C does this by partitioning on something they call Packages
or Categories or something (I think the name changed between Cox's book
and the NeXT relealse.)
Brad Cox's book, by the way, describes (evangelizes) Objective-C, his
product. It's sort of the glorified version of lots of "object-oriented
programming in C" articles that you see everywhere.
I can't remember why I thought that might not be so cool. Oh, yeah,
it means that classes are members of categories or packages based
mainly on what vendor they came from, not what type of function they
perform (or, for example, who their parent class is!).
There is a different precedent around in network address naming. You
are granted a group of id's from a higher authority. You may grant
a subset to anyone you choose.
Now, you only need a mess of include files for every language in the
world that will want to implement or make use of the classes. And just
because you have unique id's, it doesn't mean you have unique symbol
to assign them to for programming purposes ...
)The social problem is making it catch on. I suppose if it is
)useful enough people would use it, but for commercial applications ...
)It's actually the social concerns that have me suggest a filereq.
)library. a) It can be done reasonably quickly. b) It's small and
)unobtrusive -- you don't have to buy a whole philosophy to use it.
)c) It encuurages the gifted "utility" writers to make their own.
)d) If widely used, it shows off the advantage of having your application
)broken up into lots of little cooperating bits. (Once that idea is
)sold, it's easier to sell a full-blown O-O system.)
I think you hit the nail on the head, as usual, Stu: it's a big machine
to get people to buy off on. The position I've advocated has been to
make the filerequester interface particularly "thin:" not a lot of customization
and special features, so that when a more comprehensive system implements
a file requester, the callers to the interim system will start getting
the cool one.
There are some other interesting questions in the object/class UI discussion:
The big issue is language independence. I don't read the right journals,
but I am not aware of any system that doesn't bow to a language. I'll
be interested in seeing how they implement classes in other languages on
the NeXT box. But on the Amiga, clearly a system needs to support
the arbitrary reasonable programming language.
Composition of objects into groups is important. How do you arrange
for an up arrow button tell a slider to click up one page? I've done
it a couple of ways, but I think I missed out on the Smalltalk style
Model-View-Controller business. Gotta get the right journals from
now on ... (No, you don't send a REXX message ...)
How do you "reach into" a composite object to establish a parameter for
one of its sub-components?
What kind of user-interface object layout/placement machine do you want?
After you get to a certain high level, your views on inheritance can change.
While I was perfectly happy defining a class ScrollSliderWithButtons as
a subclass of ScrollSlider (no, I don't use names like that really, and it
wasn't quite like that ...), you get a little sick of making a subclass
of windows with ScrollingWindows to have ScrollingWindowsWithExtraButton.
Making little extensions to large classes is what leads people to such
odious things as "multiple inheritance." I figure if I read some more
of those damn journals, there'd be some alternatives to inheritance
which still give you polymorphism (the ability to say: "Delete You"
without knowing to whom).
Also, here do you want to keep all the .library (or .class) files?
jimm
--
Jim Mackraz, I and I Computing "He's hidden now, but you can see
{cbmvax,well,oliveb}!amiga!jimm The bubbles where he breathes."
- Shriekback
Opinions are my own. Comments are not to be taken as Commodore official policy.
cmcmanis%pepper@Sun.COM (Chuck McManis) (05/13/89)
In article <11635@well.UUCP> shf@well.UUCP (Stuart H. Ferguson) writes: >Objection! SetFunction(), I my opinion, is a hack. And a pretty poor >one at that. So, are you agree that something like ARP library is the way to go? I agree that SetFunction() is a hack, and like Bart's system Wedges much better. As for leaving the Library open, that is true, but as long as the routine is setfunctioned, one must assume that the application needing it is still around. Maybe we could use wedges, and put a "wedge identifier" in the handle (xxxBase) so that on a CloseLibrary() call any wedges that this application had in force would be removed. --Chuck McManis uucp: {anywhere}!sun!cmcmanis BIX: cmcmanis ARPAnet: cmcmanis@sun.com These opinions are my own and no one elses, but you knew that didn't you. "A most excellent barbarian ... Genghis Kahn!"
hummel@m.cs.uiuc.edu (05/13/89)
A lot of the discussion on SFRequesters thus far has centered around HOW to provide the service to applications (e.g., SetFunction()'ing arp.library, placing it in a user-interface related library, setting it up as a server process, etc.). On a slightly different tack, I am wondering how best to approach the user-interface aspects of a SFRequester. My general tone is one of asking "how ought it to be"? I think any good design would address these issues, and I am curious about how these have been (or would be) addressed in the design of SFReqeusters. First, a technical question: What is the easiest way to tell if there is a filesystem associated with a device? If the device provides a filesystem, then of course it should be possible to traverse it, else it's a whole different ballgame (see below). Now, when one adopts the practice of offering buttons for devices with filesystems (i.e., df0:, vd0:, etc.), what rules can be applied to determine the "best" devices to assign to buttons, especially when there is likely to be more devices than buttons in an un-cluttered display? Next, how about stream-oriented devices such as SER: or PIPE:? How might these be offered as source or destination "files" without the user resorting to typing into a string requester? I'm talking user-interface, here now - forget for the moment problems like no random access. Should there be a button that gives a scrolling list of mounted devices for this purpose? And then, how about letting the user select logical devices...must that mean yet ANOTHER button, or should those be thrown into some other category? Allow me to finish by tossing around some features and overall goals, some of which have already been mentioned, that might be present in a "perfect" file requester: - Asynchronous directory scans, allowing a selection to be made while still reading in a directory. - Keyboard filename completion. Typing "m" will highlight the first file/directory beginning with "m", and so on. - Responds to Intuition insert/eject messages. - Wildcards and multiple file selection where appropriate. - Scrolling in real-time. - Visually appealing; good use of color/shading and gives an impression of depth. - Function readily apparent from layout; well organized; sensitive to wide variations in system configurations. (i.e., it doesn't offer "df1:" as a choice when there is no "df1:" :-) - It's going to be BIG, so a shared resource (of some form, such as those being discussed in this string) is the way to go. Any thoughts? Any answers? Any tee ell ay en dee? < Lionel ---------- Lionel Hummel 404 W. High St. #6, Urbana, IL 61801 University of Illinois, Urbana-Champaign [H] (217)344-5303 [W] (217)333-7408 hummel@cs.uiuc.edu {pur-ee,uunet}!uiucdcs!hummel BIX: lhummel
dillon@POSTGRES.BERKELEY.EDU (Matt Dillon) (05/14/89)
: - Asynchronous directory scans, allowing a selection to be : made while still reading in a directory. I agree, but displaying the files as the directory is being scanned is quite distracting to me and I usually end up waiting for it to settle down before looking at what is available. Perhaps allow the user to change the directory name string gadget and or file name while scanning asynchronously (i.e. abort the scan and start it over the moment he hits return on the directory, and abort the scan and return from the requester the moment he hits return on the file string gadget) : - Keyboard filename completion. Typing "m" will highlight : the first file/directory beginning with "m", and so on. That would be nice... as the person is typing continuously restrict the list being displayed to what matches the input string*. This would be extremely useful. Have another character, ESC, automatically complete the filename for you (it should not be done automatically when the routine determines only one unique name exists because the user will still be typing!) : - Responds to Intuition insert/eject messages. For the master volume list, you mean? yah. : - Wildcards and multiple file selection where appropriate. As a restricting mechanism. It would be nice to be able to type "*/*" and then page through the list of files before making your final selection(s). :Any thoughts? Any answers? Any tee ell ay en dee? : : < Lionel -Matt
elg@killer.Dallas.TX.US (Eric Green) (05/15/89)
in article <42700012@m.cs.uiuc.edu>, hummel@m.cs.uiuc.edu says: > Allow me to finish by tossing around some features and overall goals, > some of which have already been mentioned, that might be present in a > "perfect" file requester: > - Asynchronous directory scans, allowing a selection to be > made while still reading in a directory. I think some of the existing requesters already do this. In fact, I'm almost certain that the ARP requester does. > - Responds to Intuition insert/eject messages. Justin McCormick's does (at least, in its File Injector incarnation). The main problem is that Justin's code is NOT publically available :-( (but I can sympathize... he spent an entire summer hacking on that file requester, after he'd already finished most of the rest of PixMate). > - Wildcards and multiple file selection where appropriate. Hmm... how about multiple filename buckets? On the right side of the string gadget for the filename, perhaps an up/down arrow gadget pair, to allow you to scroll to other buckets? Sort of like in Preferences for the printers, or the way Justin scrolls his devices when there's more devices than buttons? > - It's going to be BIG, so a shared resource (of some form, > such as those being discussed in this string) is the way to go. Depends on your definition of BIG. Justin's does most of this already, and is maybe 8K long (of course, to get it that small he had to write it about 4/5ths assembler... everything has its price). Hmm, that does seem big enough to deserve its own library, though. Forget the folks saying put it with Intuition stuff.... (Me? I'm using arp.library's file requester. Life's too short...). -- | // Eric Lee Green P.O. Box 92191, Lafayette, LA 70509 | | // ..!{ames,decwrl,mit-eddie,osu-cis}!killer!elg (318)989-9849 | | // Join the Church of HAL, and worship at the altar of all computers | |\X/ with three-letter names (e.g. IBM and DEC). White lab coats optional.|
golden@cps3xx.UUCP (golden james) (05/15/89)
In article <UYNn=hy00VsfE2FI4k@andrew.cmu.edu> mp1u+@andrew.cmu.edu (Michael Portuesi) writes: >shf@well.UUCP (Stuart H. Ferguson) writes: >> How about a "filerequester.library?" > >Stuart, with all due respect, I would like to make one important point: > > Graphical UI != File Requester in a Library > I don't believe that he ever said it was... [...] >3) Bring more UI standardization to Amiga programs, 4) Allow hackers ^^^^^^^ >to customize the "Standard" interface using SetFunction(), and 5) [...] That's exactly the point. You shouldn't have to be a hacker to get a filerequestor that works well for you. I guess your saying that only people with technical expertise deserve to have file requestors that they like. Mike Golden Physiology Undergraduate Michigan State University
ranjit@grad2.cis.upenn.edu (Ranjit Bhatnagar) (05/15/89)
In article <2977@cps3xx.UUCP> golden@cps3xx.UUCP (golden james) writes: > >That's exactly the point. You shouldn't have to be a hacker to get a >filerequestor that works well for you. I guess your saying that only >people with technical expertise deserve to have file requestors that >they like. > >Mike Golden OK, then - who's gonna be the first to write a file-requester in structured, well-documented AREXX code? Make it pleasant enough that the average BASIC novice can understand it, and even a newcomer can modify things like the size, position, color of the windows, whether to ignore case in alphabetization, and such. (Put all these in variable assignments at the top of the file.) This would make it embarassingly easy to add your favorite goodies. Sort by file-extender? Highlight .info files in blue? Automatically format any disks whose names start with 'v'? No problem. (Note that this approach makes it easy for people to trade their favorite file-requester code, and it also makes it relatively easy for novices to detect nasties like the v-disk formatter.) By the way, whaddya think about a REQ: device? An OPEN call on REQ:foo:bar brings up a requester with caption 'foo' in dir bar, and returns a lock on the file the user selects. This would add requesters to even all-text programs, and, in fact, could be used in scripts to add a bit of friendliness to all-text programs. script file fastfont: ff "req:Please choose a font to become the system font:fonts:" AnyProject.info: default tool = req:Pick your favorite application. script file easyzoo: zoo e// "req:Which file do you want to unzoo?:*.zoo" (note the new feature I just thought of.) -ranjit (well, SOMEBODY has to have the wild ideas) "Trespassers w" ranjit@eniac.seas.upenn.edu mailrus!eecae!netnews!eniac!... Near the sides of tall buildings, how dare they kiss goodbye? Those buildings that saw the airplanes that kiss the air in their fantasy.
ecphssrw@roger.csun.edu (Stephen Walton) (05/16/89)
In article <11126@netnews.upenn.edu>, ranjit@grad2 (Ranjit Bhatnagar) writes: > >OK, then - who's gonna be the first to write a file-requester in >structured, well-documented AREXX code? Here's one: Call Addlib('rexxarplib.library',0,-30,0) filename = GetFile(x, y, 'dir', 'file', 'title') where x and y are the coordinates of the upper right corner of the requester, 'dir' is the name of the starting directory, 'file' is the default file in the flie gadget, and 'title' is the title to appear in the title bar of the requester. Steve Walton P.S. 1/2 :-) Seriously, rexxarplib is the only sensible way to get at Intuition functions, including gadgets, requesters, etc., from ARexx.
mp1u+@andrew.cmu.edu (Michael Portuesi) (05/16/89)
golden@cps3xx.UUCP (golden james) writes: > ^^^^^^^ > >to customize the "Standard" interface using SetFunction(), and 5) > [...] > > That's exactly the point. You shouldn't have to be a hacker to get a > filerequestor that works well for you. I guess your saying that only > people with technical expertise deserve to have file requestors that > they like. > First of all, once a "hacker" creates a new style of user interface component, anyone can take advantage of it, not its creator. And the cold reality is that you're going to have to have some programming experience to build new graphical UI components, at least with the software technology we have today. Second, various proposal have been made in other messages that would allow the "look and feel" of various UI pmponents to be changed merely by replacing files in LIBS:. I don't have much time to think about the issue right now, since I have my final exam as an undergraduate student tomorrow and I really should go and prepare for it. Hopefully I'll have more to say later. -- Michael Portuesi * Information Technology Center * Carnegie Mellon University INTERNET: mp1u+@andrew.cmu.edu * BITNET: mp1u+@andrew UUCP: ...harvard!andrew.cmu.edu!mp1u+ MAIL: Carnegie Mellon University, P.O. Box 259, Pittsburgh, PA 15213
lphillips@lpami.wimsey.bc.ca (Larry Phillips) (05/16/89)
In <2977@cps3xx.UUCP>, golden@cps3xx.UUCP (golden james) writes: > That's exactly the point. You shouldn't have to be a hacker to get a > filerequestor that works well for you. I guess your saying that only > people with technical expertise deserve to have file requestors that > they like. As it stands now, I can only get a file requester that works for me when I run one or two programs. A 'standard' FR call, with well defined parameters and return values, easily replacable, will give us the best of all possible worlds. What programmer wouldn't welcome a simple FR call? If the programmer doesn't like the supplied one, he supplies on of his own. If the user disagrees, he replaces it with one he has written, one his friend has written, or one he has purchased either standalone or as part of another package. Saying that you shouldn't have to be a hacker to get a FR that works for you is rather like saying that you shouldn't have to be a mechanic to have a souped up engine or racing suspension. The main problem, as I see it, is to define the program interface to the FR. There must be enough there to do the minimum required functions of a FR, certainly, and there should probably be enough there to allow the programmer to supply a default directory, a title for the FR, perhaps filename filters, perhaps whether a filename pointer or lock should be returned, and so on. Once that is defined and implemented, we would be virtually deluged with FRs, ranging in quality form good to worse than bad (witness the current crop of FRs, replacement commands, pallette tools, and so on). The main point, however, would be that you, as a user, could define the good for yourself, and that need not be the same as the FR I define as good. In either case, with my good FR, and your not so good FR :-), we would each have consistency within our own environment for all the programs that made use of the system call. -larry -- - Don't tell me what kind of a day to have! - +----------------------------------------------------------------------+ | // Larry Phillips | | \X/ lphillips@lpami.wimsey.bc.ca or uunet!van-bc!lpami!lphillips | | COMPUSERVE: 76703,4322 | +----------------------------------------------------------------------+
ddave@pnet02.cts.com (David Donley) (05/16/89)
dillon@POSTGRES.BERKELEY.EDU (Matt Dillon) writes: >: - Asynchronous directory scans, allowing a selection to be >: made while still reading in a directory. > > I agree, but displaying the files as the directory is being scanned > is quite distracting to me and I usually end up waiting for it to > settle down before looking at what is available. > > Perhaps allow the user to change the directory name string gadget > and or file name while scanning asynchronously (i.e. abort the scan > and start it over the moment he hits return on the directory, and > abort the scan and return from the requester the moment he hits > return on the file string gadget) > >: - Keyboard filename completion. Typing "m" will highlight >: the first file/directory beginning with "m", and so on. > > That would be nice... as the person is typing continuously restrict >the list being displayed to what matches the input string*. This would be >extremely useful. Have another character, ESC, automatically complete the >filename for you (it should not be done automatically when the routine >determines only one unique name exists because the user will still be >typing!) > >: - Responds to Intuition insert/eject messages. > > For the master volume list, you mean? yah. > >: - Wildcards and multiple file selection where appropriate. > > As a restricting mechanism. It would be nice to be able to type >"*/*" and then page through the list of files before making your final >selection(s). > >:Any thoughts? Any answers? Any tee ell ay en dee? >: >: < Lionel > > -Matt People who are still using floppy drives will be very upset at having to wait for the directory to finish... People who have hard disks can wait for the directory if they want it to settle down... :-) Call the Bug Eyes BBS at (213) 372-4494 ddave@pnet02.CTS.COM killer!gryphon!pnet02!ddave
wade@pnet01.cts.com (Wade Bickel) (05/17/89)
I assume this topic will be discussed at the developers confrence next month. Who will be in charge of the topic? Thanks, Wade. UUCP: {nosc ucsd hplabs!hp-sdd}!crash!pnet01!wade ARPA: crash!pnet01!wade@nosc.mil INET: wade@pnet01.cts.com
mwm@eris.berkeley.edu (Mike (I'll think of something yet) Meyer) (05/24/89)
I give up - I've been trying to catch up before commenting, and not
getting anywhere. So let's answer a question of Jimm's, and then give
my (right, of course :-) answer to the question of UI libraries
In article <3828@amiga.UUCP> jimm@cloyd.UUCP (Jim Mackraz) writes:
< Making little extensions to large classes is what leads people to such
< odious things as "multiple inheritance." I figure if I read some more
< of those damn journals, there'd be some alternatives to inheritance
< which still give you polymorphism (the ability to say: "Delete You"
< without knowing to whom).
I think you're talking about "mixins" (name from the flavors system,
of course). You create a class (say window), and it gets to use mixins
(borders, scroll bars, etc). Think of them as "not-quite-classes" that
you can multiple-inherit from. I haven't explored all the variations
(running from "each class has it's own mixins" through multiple
inheritance), but somewhere in there there ougtha be an answer.
Now, for my suggestion in the UI area. What we really need is _two_
levels. A components level, and an objects level. The components
would be a library that provides simple gadgets/requesters/etc, all
with the same look (and feel?). Up-arrow, down-arrow, string (either
text or numeric) requesters, one & two-d sliders, even the
ever-popular "scrolling text box" gadget (calling itself, of course).
Call this "components.library" or some such.
On top of this, we build _real_ objects. Requesters and other things,
or libraries of them. You have "requesters.library" which includes the
common requesters: files, color requesters, devices, anything else you
can think of. These are built of components from the components
library.
Both should have well-defined interfaces. You can change the looks
(and some of the feel) of your requester at will by changing the
components library - but it will still have the same basic layout and
behavior. You can change the layout and behavior by changing the
requesters library - but all the components will still look (and act)
the same.
In addition, if a program rolls it's own requesters from the
components library, they still come up looking (and acting, to some
degree) like the standard requester types.
I've got load libraries that do part of this, for menus & requesters.
They work, and I use them. But I don't do enough intuitionified stuff
to warrant completing them and turning them into real libraries. Also,
I just tossed the file requester in with the rest of the requesters
library; not much point in seperating it out of load libraries.
The problem, of course, is deciding just where to put the line between
the "components" and the "requesters" (or "windows" or whatever)
libraries. Like the "mixins" problem, finding the right point is
critical for making it a success.
As for making it a social success, I can only see two ways: 1) give it
away so everybody can use it, and charge developers bucks for support
and documentation, or 2) get CBM to put it in 1.4 (or whatever). And
#2 has a lot better chance of working than #1.
<mike
--
I know the world is flat. Mike Meyer
Don't try tell me that it's round. mwm@berkeley.edu
I know the world stands still. ucbvax!mwm
Don't try to make it turn around. mwm@ucbjade.BITNET
jimm@amiga.UUCP (Jim Mackraz) (05/26/89)
In article <24769@agate.BERKELEY.EDU> mwm@eris.berkeley.edu (Mike (I'll think of something yet) Meyer) writes: )In article <3828@amiga.UUCP> jimm@cloyd.UUCP (Jim Mackraz) writes: )< Making little extensions to large classes is what leads people to such )< odious things as "multiple inheritance." I figure if I read some more )< of those damn journals, there'd be some alternatives to inheritance )< which still give you polymorphism (the ability to say: "Delete You" )< without knowing to whom). ) )I think you're talking about "mixins" (name from the flavors system, )of course). Hmmm, maybe. I think there are some other ones out there. One easy answer is to use components (such as a "group object") instead of multiple inheritance ("the button panel class is a subclass of both button and group."). Now, onto some rabid agreement. )Now, for my suggestion in the UI area. What we really need is _two_ )levels. A components level, and an objects level. The components )would be a library that provides simple gadgets/requesters/etc, ... )On top of this, we build _real_ objects. Very much the plan for V1.4. I've got "Custom Gadgets" in there now. You can do dials, ... Perhaps more importantly, there is a uniform interface to a set of components. It still needs work. At this level, the components, you need some mechanism for connecting components together: not just grouping but hooking up up-arrow to scroll bar slider. I've done this in oop deals at home, but it's kind of another problem with gadgets. Gadgets don't issue forth when triggered, giving a notice that might be directed at a sensor of a separate component. All they do is turn on mouse messages and say "I'm done." Anyway, suppose we figure it out, and there's a nice class of gadgets, including scrolling lists, etc. Of course, we need to make a set of them "standard" but save that problem. Now, the "objects" level. What I HOPE is that you could use these Intuition constructs to implement a fancy-schmansy UI object system above them. I'm trying to determine what the components must bring to the party. I know that inheritance is at the object level. I think connections are at the component level. Polymorphism, for defined operations on components" should be at the component level (at least for "delete", "remove," "refresh," ...). So, pieces: 1) Intuition support for "custom gadgets" and provisions for their connection. 2) Standard set of useful components (besides converting over the bool/prop/string, the only one I've written is a useless "dial gadget.") 3) Higher level system which includes font and resolution sensitive layout, perhaps file/font functions for requesters, interface-builder stuff, rexx ports, blah blah ... )As for making it a social success, I can only see two ways: 1) give it )away so everybody can use it, and charge developers bucks for support )and documentation, or 2) get CBM to put it in 1.4 (or whatever). And )#2 has a lot better chance of working than #1. I think #1 rarely works. I'm working bottom-up. Action will happen starting next developer release of V1.4 software. jimm -- Jim Mackraz, I and I Computing "He's hidden now, but you can see {cbmvax,well,oliveb}!amiga!jimm The bubbles where he breathes." - Shriekback Opinions are my own. Comments are not to be taken as Commodore official policy.
scot@amigash.UUCP (Scot L. Harris) (05/30/89)
>From: hummel@m.cs.uiuc.edu >Subject: Re: Standard File Requesters >Date: 13 May 89 03:16:00 GMT > >A lot of the discussion on SFRequesters thus far has centered around >HOW to provide the service to applications (e.g., SetFunction()'ing >arp.library, placing it in a user-interface related library, setting >it up as a server process, etc.). On a slightly different tack, I am This has been a very interesting discussion so far with a lot of GREAT ideas. >the practice of offering buttons for devices with filesystems (i.e., >df0:, vd0:, etc.), what rules can be applied to determine the "best" >devices to assign to buttons, especially when there is likely to be >more devices than buttons in an un-cluttered display? I still think the best solution to the button problem is the one used in Deluxe Photo Lab. Group items by files, directories, and volumes and allow the user to jump to these by pressing an F, D, or V. This way you never have to worry about running out of buttons for volumes and directories are not mixed in with the files. Also allowing a double click to perform the load or what ever action the requester was called up for is a very nice feature. >Allow me to finish by tossing around some features and overall goals, >some of which have already been mentioned, that might be present in a >"perfect" file requester: > - Asynchronous directory scans, allowing a selection to be > made while still reading in a directory. > - Keyboard filename completion. Typing "m" will highlight > the first file/directory beginning with "m", and so on. > - Responds to Intuition insert/eject messages. > - Wildcards and multiple file selection where appropriate. > - Scrolling in real-time. > - Visually appealing; good use of color/shading and gives an > impression of depth. > - Function readily apparent from layout; well organized; > sensitive to wide variations in system configurations. (i.e., > it doesn't offer "df1:" as a choice when there is no "df1:" :-) > - It's going to be BIG, so a shared resource (of some form, > such as those being discussed in this string) is the way to go. > >Any thoughts? Any answers? Any tee ell ay en dee? > > < Lionel >---------- >Lionel Hummel 404 W. High St. #6, Urbana, IL 61801 >University of Illinois, Urbana-Champaign [H] (217)344-5303 [W] (217)333-7408 >hummel@cs.uiuc.edu {pur-ee,uunet}!uiucdcs!hummel BIX: lhummel I for one like a lot of your ideas and hope they are translated to something useful RSN. -- _ /// /_\ Scot L. Harris !hoptoad!peora!rtmvax!amigash!scot \XX/ / \ M I G A [If you can keep your head when all about you are losing theirs, perhaps you have misunderstood the situation.]
MJB@cup.portal.com (Martin J Brown-Jr) (06/02/89)
There has been one very obvious design flaw that has, regrettably, shown up in all/most windowing system file requesters. The flaw is separating the scroll arrow gadgets, putting them at opposite ends of the slider gadget. IMHO, this is just plain bad design. First, it seems to me a user is going to use either the arrows or the slider, in any one instance of useage. When the user grabs either one of the arrows, then overshoots the mark he/she is going to want to correct the situation by using the other arrow. And as we all know, the other arrow is just about as far away as possible, at the opposite end of the requester. And if the requester has been sized to max_height to show a lot of files, the user ends up moving the mouse just about the max_distance to get from one arrow to the other. DUMB DUMB DUMB DUMB! (don't give me that "just use a mouse accelerator" crap either, I use one) IMHO, the two arrows would be in the best position if they were toegether, one just above the other. That way shifting from one to other couldn't be easier or quicker, with little chance for the horizontal positional error to occur over such a short distance (h error much easier to get when moving over longer distances). This short distance reduces the attention for aiming that is needed. The remaining question is whether to put the two arrows at the top or bottom of the slider. Since 99% of the boolean gadgets that will be needed to be used after selecting the file are at the bottom, it seems obvious to me that the two arrows should be below the slider. If the requester designer puts the arrows together below the slider, and puts the next most likely bool gadget ("OK", "LOAD", etc.) below the arrows, and the user scrolls his/her selection to the bottom of the scroll area, next to the arrows, about 99% of the most common action ever to occur with this requester will occur within about a radius of inch or two (ok 2.5",:->) no matter how tall the requester gets. This sure seems logical, ergonomical, and .`. the most proper way to incorpora these arrow gadgets. - MJB -