Merge from 0.6.5

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@6040 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Adam Fedor 2000-02-19 00:40:47 +00:00
parent 1b97488859
commit b33bb418f4
42 changed files with 2343 additions and 1170 deletions

View file

@ -1,7 +1,7 @@
ANNOUNCE
********
This is version 0.6.0 of the GNUstep GUI library (`gnustep-gui').
This is version 0.6.5 of the GNUstep GUI library (`gnustep-gui').
What is the GNUstep GUI Library?
================================
@ -31,11 +31,74 @@ component like the GNUstep X/DPS GUI Backend.
What's new in this release?
===========================
The currently released version of the library is `0.6.0'.
The currently released version of the library is `0.6.5'.
Noteworthy changes in version `0.6.5'
=====================================
Many of the basic GUI classes have been vastly improved or
rewritten, thanks to Nicola Pero <n.pero@mi.flashnet.it> and many
others.
* New Info Panel support
* New NSBezierPath
* Rewrite of several classes including Cell and Button classes.
* Rewrite of NSBrowser, NSSavePanel, menus, text classes,
NSTableHeader.
* RTF Parser
* Implemented image caching.
* Implemented editing in Forms, Matricies.
* New autolayout classes GSHBox, GSTable, and GSVBox.
* Almost all back-end classes have been removed and code incorporated
in a DPS-like graphics context structure.
* Better keyboard handling.
* NSHelpManager, NSComboBox, ProgressIndicator written.
In addition a preliminary version of an Interface Builder (Gorm) has
been written, thanks to Richard Frith-Macdonald
<richard@brainstorm.co.uk>
Noteworthy changes in version `0.6.0'
=====================================
A Huge amount of progress, although a lot still needs to be done.
It's usable for a large base of moderately simple apps. Several
NeXT/OpenStep apps and libraries have been ported with little changes.
* Drag and Drop support fleshed out but not completed.
* NSText and related classes rewritten. Basic functionality but much
needs to be done to finish them off.
* nib2gmodel app works with MacOS-X
* Work done in minimizing the backend which allowed a lot of
functionality to move to the GNU library.
* Menu code rewritten.
* PopupButtons now work.
* Many new images
* Basic functionality for NSTabView
* Much better lockFocus support in NSView. Flipped views handled.
* Rewrite of NSSavePanel and NSOpenPanel
* Several fixes that at least double the speed of the gui.
Noteworthy changes in version `0.5.5'
=====================================
@ -44,6 +107,7 @@ Noteworthy changes in version `0.5.5'
* A lot of rewritting has been done to the classes, with general
cleanup of coordinate conversion code, etc.
Noteworthy changes in version `0.5.0'
=====================================
@ -93,6 +157,7 @@ Noteworthy changes in version `0.5.0'
* Several cleanups and as usual, many bug fixes.
How can I get support for this software?
========================================
@ -105,7 +170,7 @@ the GNUstep Web Pages for more information regarding GNUstep resources
Where can you get it? How can you compile it?
==============================================
The gstep-gui-0.6.0.tar.gz distribution file has been placed on
The gstep-gui-0.6.5.tar.gz distribution file has been placed on
`ftp.gnustep.org' in `pub/gnustep/core'.
The program requires gcc 2.8.0 or higher.
@ -115,7 +180,7 @@ library version 3.4 may be required depending on the backend you choose.
It also requires a FoundationKit library as specified by the OpenStep
specification. The FoundationKit libraries known to work are the
GNUstep Base Library version `0.6.0'.
GNUstep Base Library version `0.6.5'.
The `.tar' file is compressed with GNU gzip. Gzip can be obtained by
anonymous ftp at any of the GNU archive sites.
@ -132,13 +197,10 @@ Where do I send bug reports?
Bug reports can be sent to <bug-gnustep@gnu.org>.
Creators rejoice!
Scott Christley
<scottc@net-community.com>
Obtaining GNU Software
======================
Check out the GNU web site. (`http://www.gnu.org/')
Check out the GNU web site. (`http://www.gnu.org/')
Check out the GNUstep web site. (`http://www.gnustep.org/')

93
BUGS Normal file
View file

@ -0,0 +1,93 @@
TODO
****
Bugs in the GUI library
=======================
Windows
-------
* Code to manage window decorations is not finished. The reported
frame origin of a window might be wrong.
* Windows never get released. Setting isReleasedWhenClosed does not
work.
Fixing these bugs requires touching delicate parts of the library.
This is why fixing them has been postponed after 0.6.5, to keep
0.6.5 reasonably stable.
Texts
-----
* The NSText code is particularly complex to work on and it has not
improved much since 0.6.0. Many bugs are know in the code - it is
somewhat usable though. We hope on a big improvement of this area
for next release.
Matrices
--------
* Encoding/Decoding of matrices is unimplemented. There are some
minor known bugs with handling of mouse down in matrices.
Cells
-----
* Since NSText does only left alignment, when you select or edit text
in a cell it becomes automatically left aligned regardless of the
original alignment.
* Multi line texts are unsupported; isScrollable, wordWraps etc do
nothing. This restriction will hopefully be removed in next
releases.
Images anf Graphics
-------------------
* There are problems with alpha composing. To avoid these problems,
you may set manually the background color of your image when
displaying it.
* Only TIFF images are supported in 0.6.5. Support at least for PNG
and JPEG images is planned for next release.
* alpha drawing and compositing of graphics doesn't work.
Alert, Info Panels
------------------
* Multi line messages are generally unsupported due to the similar
restriction in the cells code.
Unimplemented Classes
---------------------
The following classes are currently unimplemented or unfinished to
such a degree to be unusable.
* NSColorPanel
* NSDataLink
* NSFontManager
* NSFontPanel
* NSHelpPanel
* NSLayoutManager
* NSPageLayout
* NSPrintPanel
* NSSecureTextField
* NSSpellChecker
* NSTableView
* NSTextView

297
ChangeLog
View file

@ -1,8 +1,3 @@
Wed Feb 09 18:50:12 2000 Enrico Sersale <enrico@imago.ro>
* Source/NSBezierPath.m Headers/gnustep/gui/NSBezierPath.h :
Rewritten conforming to MacOS-X implementation details.
Tue Jan 25 14:52:27 2000 Nicola Pero <n.pero@mi.flashnet.it>
Contributed by Fred Kiefer:
@ -11,6 +6,284 @@ Tue Jan 25 14:52:27 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Headers/AppKit/NSFontManager.h: Corresponding rewrite.
* Headers/AppKit/NSFontPanel.h: Idem.
2000-02-17 Adam Fedor <fedor@gnu.org>
* Version: 0.6.5 released.
2000-02-16 Adam Fedor <fedor@gnu.org>
* gnustep-gui.spec: Newfile
2000-02-15 Adam Fedor <fedor@gnu.org>
* configure.in: Fix test for rintf
2000-02-14 Adam Fedor <fedor@gnu.org>
* Version: Update version number
* Documentation/announce.tmpl.texi: Update
* Documentation/readme.tmpl.texi: Likewise.
* Documentation/news.tmpl.texi: Likewise.
* Documentation/todo.tmpl.texi: Likewise.
* ANNOUNCE, BUGS, NEWS, README: Regenerate
Mon Feb 14 13:23:00 2000 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSLayoutManager.m: Tidied and simplified by removing
inefficient scanner class and using NSScanner instead.
* Source/NSText.m: ditto.
* Source/NSTextView.m: fix a couple of bugs that were causing crash in
text network demo - lets the demo run a while longer before crashing.
2000-02-13 Adam Fedor <fedor@gnu.org>
* Source/NSAffineTransform (-transformBezierPath:): Implement.
(from Enrico Sersale <enrico@imago.ro>).
Mon Feb 14 00:59:33 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSApplication.m ([-orderFrontStandardAboutPanel:]): Fixed
typo/bug. Reported by Fred Kiefer <FredKiefer@gmx.de>
Sun Feb 13 22:24:54 2000 Nicola Pero <n.pero@mi.flashnet.it>
This fixes a bug; the same bug that produced those little white
vertical lines at the bottom of windows with editable textfields
when windows were ordered out then in after editing.
* Source/NSView.m ([-removeFromSuperviewWithoutNeedingDisplay]),
([-removeFromSuperview]): Ask the window to take first responder
status in our place if we are. Important: this is done *before*
any other action is undertaken, because changing first responder
invokes -resignFirstResponder:, which should be allowed to assume
that the view is normally placed in the view hierarchy.
Sun Feb 13 19:20:00 2000 Enrico Sersale <enrico@imago.ro>
* Source/NSBezierPath.m: ([-copyWithZone:]) implemented.
Sat Feb 12 21:16:00 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSBrowser.m ([-loadColumnZero]), ([-reloadColumn:]):
Adjust frame of column after loading it.
Sat Feb 12 20:27:00 2000 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSView.m: ([setNeedsDisplayInRect:]) change to ensure that
superviews are always marked as needing display when we are.
* Source/NSPopUpButton.m: ([-encodeWithCoder:]) ([-initWithCoder:])
implemented for Gorm.
Sat Feb 12 19:47:14 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSPopUpButton.m ([-selectItem:]): Bug fix: Update menu
knowledge of the selected item. ([-selectItemWithTitle:]),
([-selectItemAtIndex:]), ([-selectItem:]): Bug fix: Invoke
synchronizeTitleAndSelectedItem to update what is displayed.
Sat Feb 12 18:11:32 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSWindow.m ([-setContentView:]): When expanding the new
content view to cover the whole window, do it using the nice way,
resizeWithOldSuperviewSize:, which allows the view to reorganize
its subviews for the new size.
Sat Feb 12 17:53:00 2000 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSMenu.m: Replace non-working archiving code with
drastically simplified code that does work in the normal case, but
doesn't deal with non-standard menu representations. This lets
Gorm work with menus.
* Source/NSMenuItem.m: Don't archive parent menu.
Fri Feb 11 20:18:10 2000 Enrico Sersale <enrico@imago.ro>
* Source/NSBezierPath.m: ([-transformUsingAffineTransform:]) implement.
2000-02-09 Adam Fedor <fedor@gnu.org>
* Documentation/announce.tmpl.texi: Update.
* Documentation/news.tmpl.texi: Likewise.
* Documentation/readme.tmpl.texi: Likewise.
Thu Feb 10 00:56:08 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSText.m ([-keyDown:]): Implemented NSDeleteFunctionKey,
which was unimplemented - problem reported by Jory van Zessen.
Simple superficial improvements to make NSText just a little
faster:
* Source/NSText.m: Changed everywhere [self selectedRange] simply
to selected_range. ([-moveCursorUp:]), ([-moveCursorLeft:]):
Return at once if cursor is already at the beginning of text.
([-moveCursorDown:]), ([-moveCursorRight:]): Return at once if
cursor is already at the end of text.
Wed Feb 09 18:59:02 2000 Enrico Sersale <enrico@imago.ro>
* Source/NSBezierPath.m Headers/gnustep/gui/NSBezierPath.h :
Rewritten conforming to MacOS-X implementation details.
Tue Feb 8 17:22:05 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Model/GMAppKit.m ([NSMenuItem -initWithModelUnarchiver:]): Fix
for having GNUstep load gmodels created from OPENSTEP NIBs.
NSMenu internals are slightly different in GNUstep and OPENSTEP;
OPENSTEP stores an item submenu as the item target, while GNUstep
stores it in a special mi_submenu ivar. This patch, for GNUstep
only, sets the submenu ivar from the target for items which have a
submenu.
2000-02-07 Adam Fedor <fedor@gnu.org>
* configure.in: Add check for rintf.
* Source/NSBrowser.m: Use rint i no rintf.
* Source/NSApplication.m: Convert NSDebugLog to NSDebugLLog for
various NSEvent debugs.
* Source/NSMenuItemCell.m ([NSMenuItemCell -calcSize]): Make
sure anImage exists before getting size (methods with nil receivers
returning structs segfaults on Solaris).
Mon Feb 7 18:55:29 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSMatrix.m ([-mouseDown:]): Pass mouse down to super if
we have no cells.
Mon Feb 7 03:06:36 2000 Nicola Pero <n.pero@mi.flashnet.it>
This bug was crashing GNUstep while I was doing experiments with
the Save Panel's code. It wasn't easy to find.
* Source/NSMatrix.m ([-putCell:atRow:column:]): Fixed bug. If we
are putting a new cell precisely in _selectedRow, _selectedColumn,
we have to update _selectedCell, otherwise it remains pointing to
the released cell! ([-insertRow:withCells:]): Update _selectedRow
if needed. ([-insertColumn:withCells:]): Update _selectedColumn if
needed.
Sun Feb 6 8:52:00 2000 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/GSInfoPanel.m: Make newly created panel appear in center
of screen.
Sun Feb 6 05:50:20 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Documentation/gnustep-gui.tmpl.texi (Window Manager): Added a
tiny section recommending to set "Click Window To Focus" in the
window manager configuration. Also, improved the section on the
Standard Info Panel.
Sat Feb 5 03:02:04 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSWindow.m ([-orderWindow:relativeTo:]): Fixed a quite
serious bug appearing twice, in two for loops. It was messing
window ordering, causing the app to freeze under certain
circumstances.
Fri Feb 4 18:35:59 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/GSInfoPanel.m ([-initWithDictionary:]): Use
Helvetica-Bold instead of Helvetica-BoldOblique [for now].
Thu Feb 3 17:24:00 2000 Richard Frith-Macdonald <richard@brainstorm.co.uk>
* Source/NSMenu.m: ([NSMenuWindowTitleView -mouseDown:]) fix memory
allocation error when setting new menu location frame info.
Thu Feb 3 02:56:10 2000 Enrico Sersale <enrico@imago.ro>
* Source/NSBezierPath.m Partially rewritten, fixed,
added a concrete class
([-setCachesBezierPath:]): Implemented using NSImage.
Thu Feb 3 03:45:08 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSButtonCell.m ([-drawInteriorWithFrame:inView:]):
NSImageAbove, NSImageBelow: Rewritten. In these cases now we
determine the space taken by the text; then all the remaining
space is given to the image, which is centered in it.
Thu Feb 3 02:20:29 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSButtonCell.m ([-cellSize]): Bug fix: typo would prevent
button with both image and text, image above/below text, to size
correctly.
Wed Feb 2 06:56:33 2000 Nicola Pero <n.pero@mi.flashnet.it>
With a hack the library is now able to pop up popupbuttons in the
right position, correcting at run time bugs in the window frame
code. This was hard.
* Source/NSPopUpButtonCell.m (_convertBaseToScreen_with_fix):
Added private function to do the conversion right, automatically
fixing window frame origin bugs.
* Source/NSPopUpButtonCell.m ([-attachPopUpWithFrame:inView:]):
Use the above mentioned function to perform the coordinate
conversion right.
* Source/NSPopUpButton.m ([-mouseDown:]): Idem.
Tue Feb 1 00:46:42 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Headers/AppKit/NSMenuItem.h: Removed unused ivar mi_hasSubmenu.
* Source/NSMenuItem.m ([-init]): Removed reference to the unused
ivar.
Mon Jan 31 00:24:17 2000 Nicola Pero <n.pero@mi.flashnet.it>
Rewritten, fixed, NSPopUpButton appearance. NB: When the button
popups in the wrong position, that is a bug elsewhere.
* Headers/AppKit/NSMenuItemCell.h: Added ivar
_mcell_belongs_to_popupbutton.
* Source/NSMenuItemCell.m ([-imageRectForBounds:]): In the special
case _mcell_belongs_to_popupbutton == YES and there is an image,
draw it at the extreme right.
* Source/NSPopUpButtonCell.m: Added private method [NSMenuItemCell
-setBelongsToPopUpButton:]. ([+initialize]): Added method. We
are now caching the two standard images. ([-addItemWithTitle:]):
Simplified. ([-insertItemWithTitle:atIndex:]): Set image position
to right, and set cell to belong to popup button.
([-selectItem:]): Invoke setChangesState: NO and set proper image
after setting state of any item. ([-selectItemAtIndex:]): Made
code readable. ([-drawWithFrame:inView:]): Set background of
image.
* Source/NSMenuItemCell.m ([-calcSize]): Bug fix: don't move the
image to the left if a valid image position has been already set.
* Source/NSMenuView.m ([-setMenuItemCell:forItemAtIndex:]): Bug
fix: Connect new cell to menuItem and menu so that it works.
* Source/NSApplication.m
([-orderFrontStandardAboutPanelWithOptions:]): Display 'Info' in
the title.
2000-01-28 Adam Fedor <fedor@gnu.org>
* Source/NSBrowser.m ([NSBrowser -_performLoadOfColumn:]): Don't
release columns's columnMatrix, the column will do it.
2000-01-26 Adam Fedor <fedor@gnu.org>
* Source/NSGraphicsContext.m ([NSGraphicsContext
+setCurrentContext:]): Retain (assign) the new context (fix
suggested by Jonathan Gapen <jagapen@whitewater.chem.wisc.edu>)
* gui/Model/GMAppkit.m ([NSMenuItem -encodeWithModelArchiver:]):
Check to see if object responds to various selectors before
invoking them.
Wed Jan 26 06:50:14 2000 Nicola Pero <n.pero@mi.flashnet.it>
Fixed mixed state stuff so that it is exactly as in macosx
[untested]:
* Headers/AppKit/NSCell.h: Turned _cell.state into a normal int;
changed NSMixedState to -1.
* Source/NSCell.m ([-setState:]): Rewritten, mixed state support.
Wed Jan 26 02:03:25 2000 Nicola Pero <n.pero@mi.flashnet.it>
* Documentation/gnustep-gui.tmpl.texi (Standard Info Panel): Added
documentation for [NSApplication -orderFrontInfoPanel:] and
[NSApplication -orderFrontInfoPanelWithOptions:].
Mon Jan 24 23:45:30 2000 Nicola Pero <n.pero@mi.flashnet.it>
Implemented a standard Info Panel for GNUstep. To make everyone
@ -18,17 +291,19 @@ Mon Jan 24 23:45:30 2000 Nicola Pero <n.pero@mi.flashnet.it>
-orderFrontStandardInfoPanel: are available; one displays 'About'
in the title, and the other displays 'Info'; they are otherwise
identical. GNUstep recommends using the 'Info' version.
* Source/GNUmakefile (libgnustep-gui_OBJC_FILES): Added GSInfoPanel.
(libgnustep-gui_HEADER_FILES): Idem.
* Source/GNUmakefile (libgnustep-gui_OBJC_FILES): Added
GSInfoPanel. (libgnustep-gui_HEADER_FILES): Idem.
* Source/GSInfoPanel.m: New class.
* Headers/AppKit/GSInfoPanel.h: New class.
* Headers/AppKit/NSApplication.h: Added ivar _infoPanel, declaration
of new methods.
* Source/NSApplication.m
([-orderFrontStandardInfoPanelWithOptions:]): New method, implemented.
([-orderFrontStandardInfoPanel:]): Idem. ([-orderFrontStandardAboutPanel:]):
Idem. ([-orderFrontStandardAboutPanelWithOptions:]): Idem. ([-dealloc]):
Added release of _infoPanel.
([-orderFrontStandardInfoPanelWithOptions:]): New method,
implemented.
([-orderFrontStandardInfoPanel:]): Idem.
([-orderFrontStandardAboutPanel:]): Idem.
([-orderFrontStandardAboutPanelWithOptions:]): Idem.
([-dealloc]): Added release of _infoPanel.
Mon Jan 24 04:01:55 2000 Nicola Pero <n.pero@mi.flashnet.it>

View file

@ -81,11 +81,6 @@ be placed in
Bug reports can be sent to
@email{bug-gnustep@@gnu.org}.
@noindent
Creators rejoice!@*
Scott Christley@*
@email{scottc@@net-community.com}@*
@section Obtaining GNU Software
Check out the GNU web site. (@url{http://www.gnu.org/})

View file

@ -1,124 +0,0 @@
@c -*-texinfo-*-
@chapter Frequently Asked Questions With Answers
@ifset TEXT-ONLY
@include version.texi
@end ifset
Maintained by Scott Christley @email{scottc@@net-community.com}.
Last updated March 28 1997. The most up-to-date version of this FAQ
is available at:
@example
@url{ftp://www.gnustep.org/Documentation/gnustep-gui/gnustep-gui_toc.html}
@end example
Please send corrections to @email{scottc@@net-community.com}.
@enumerate
@item @b{What is the GNUstep GUI Library?}
The GNUstep GUI Library is a library of objects useful for writing
graphical applications. For example, it includes classes for drawing
and manipulating graphics objects on the screen: windows, menus,
buttons, sliders, text fields, and events. There are also many
peripheral classes that offer operating-system-independent interfaces to
images, cursors, colors, fonts, pasteboards, printing. There are also
workspace support classes such as data links, open/save panels,
context-dependent help, spell checking.
It provides functionality that aims to implement the @samp{AppKit}
portion of the OpenStep standard. However the implementation has
been written to take advantage of GNUstep enhancements wherever possible.
@item @b{Explain the organization of the front and back-ends.}
The GNUstep GUI Library is divided into a front and back-end. The
front-end contains the majority of implementation, but leaves out the
low-level drawing and event code. A back-end can override whatever
methods necessary in order to implement low-level drawing event
receiving. Different back-ends will make GNUstep available on various
platforms. The default GNU back-end will run on top of the X Window
System and the Display Ghostscript Server. Other back-ends could allow
GNUstep to run on Mac, OS/2, and WIN32 graphics/event platforms.
Much work will be saved by this clean separation between front and
back-end, because it allows different platforms to share the large
amount of front-end code.
The front-end does not specify what mechanism to use in order to "plug
in" the back-end; that is the back-end implementor's choice. At least
two backends will use @samp{+poseAs:} method, for example, running
@samp{[XDPSWindow poseAs: [NSWindow class]]}. Using @samp{+poseAs:} is
more flexible than using Categories because it allows the the back-end
implementor to choose what to override in the front-end, instead of
having the interface between front and back-end fixed by the front-end.
@item @b{What is the current state of development of the front-end?}
A number of classes in the front-end are complete or almost complete;
these include: NSActionCell, NSButtonCell, NSButton, NSCell, NSColor,
NSColorWell, NSControl, NSCursor, NSEvent, NSFont, NSImage, NSImageRep,
NSBitmapImageRep, NSResponder, NSSlider, NSScroller, NSTextField, and
NSTextFieldCell.
Other classes are complete enough to use, but still require some major
additions before being considered almost complete: NSApplication, NSBox,
NSFontManager, NSMatrix, NSMenu, NSMenuCell, NSPopUpButton,
NSSliderCell, NSText, NSView, and NSWindow.
You can review the most up-to-date status report at:
@example
@url{http://www.gnustep.org/Documentation/gnustep-gui/gnustep-gui_toc.html}.
@end example
@item @b{What back-ends are available?}
The official back-end is the GNUstep X/DPS GUI Backend which runs
under the X Window System and interfaces to the Display Ghostscript
System. You can learn more at:
@example
@url{http://www.gnustep.org/Documentation/gnustep-xdps/gnustep-xdps_toc.html}
@end example
@item @b{Where can I get a copy?}
@ifset GNUSTEP-GUI-FTP-MACHINE
The gstep-gui-@value{GNUSTEP-GUI-VERSION}.tar.gz distribution
file has been placed on @samp{@value{GNUSTEP-GUI-FTP-MACHINE}} in
@samp{@value{GNUSTEP-GUI-FTP-DIRECTORY}}.
@end ifset
@ifclear GNUSTEP-GUI-FTP-MACHINE
The gstep-gui-@value{GNUSTEP-GUI-VERSION}.tar.gz distribution
file has not been made available by anonymous ftp.
@end ifclear
The program requires gcc @value{GNUSTEP-GUI-GCC} or higher.
It requires the Display Ghostscript System version
@value{GNUSTEP-GUI-DGS} and the TIFF Graphics library version
@value{GNUSTEP-GUI-LIBTIFF}.
It also requires a FoundationKit library as specified by the OpenStep
specification. The FoundationKit libraries known to work are the GNUstep
Base Library version @samp{@value{GNUSTEP-GUI-BASE}} and libFoundation version
@samp{@value{LIB-FOUNDATION}}.
The @samp{.tar} file is compressed with GNU gzip. Gzip can be obtained by
anonymous ftp at any of the GNU archive sites.
For info about FTP via email, send email to
@email{ftpmail@@decwrl.dec.com} with no subject line, and two-line body
with line one @samp{help} and line two @samp{quit}.
The most recent (not necessarily tested) snapshots of the library will
be placed in
@url{ftp://@value{GNUSTEP-GUI-SNAP-FTP-MACHINE}/@value{GNUSTEP-GUI-SNAP-FTP-DIRECTORY}}.
@end enumerate

View file

@ -147,6 +147,7 @@ installed the GNUstep Makefile Pacakge and the GNUstep Base Library.
@chapter Special Features of GUI Classes.
@menu
* NSApplication::
* NSBrowserCell::
* NSSavePanel::
* GSHbox::
@ -154,7 +155,111 @@ installed the GNUstep Makefile Pacakge and the GNUstep Base Library.
* GSVbox::
@end menu
@node NSBrowserCell, NSSavePanel, Classes, Classes
@node NSApplication, NSBrowserCell, Classes, Classes
@section NSApplication
@menu
* Standard Info Panel::
@end menu
@node Standard Info Panel, , NSApplication, NSApplication
@subsection Standard Info Panel
GNUstep NSApplication provides the following two methods to easily
create a standard Info Panel for your application:
@noindent
- (void) @b{orderFrontStandardInfoPanel:} (id)@t{sender}
Invokes @code{orderFrontStandardInfoPanelWithOptions:} with a @code{nil}
dictionary. You may use this method as action of a menu item, even
if it is generally preferred to use the full method so that you can
fill in all the information to show in the Info Panel.
@noindent
- (void) @b{orderFrontStandardInfoPanelWithOptions:} (NSDictionary *)@t{dictionary}
Orders front the standard info panel for the application, taking the
needed information from the @t{dictionary} argument. There is a single
standard info panel per application; it is created the first time that
this method is invoked, and then reused in all subsequent calls. The
application standard info panel is immutable and can not be changed
after creation. Useful keys for the @t{dictionary} are:
@code{ApplicationName}: A string with the name of the application (eg,
@code{@@"Gorm"}). If not available, the @file{Info-gnustep.plist} file is
searched for the value of @code{ApplicationName}; if this fails, the
@file{Info-gnustep.plist} file is searched for the value of
@code{NSHumanReadableShortName}; if this also fails, the string returned
by @code{[[NSProcessInfo processInfo] processName]} is used.
@code{ApplicationDescription}: A string with a very short description
of the application (eg, @code{@@"GNUstep Graphics Objects Relationship
Modeller"}). If not available, @file{Info-gnustep.plist} is searched
for that key; if this fails, no application description is shown.
@code{ApplicationIcon}: An image to be shown near the title. If not
available, @file{Info-gnustep.plist} is looked for
@code{ApplicationIcon}; if this fails, @code{[NSApp
applicationIconImage]} is used instead. Since this is what you usually
want, you usually do not need to set the @code{ApplicationIcon}
key/value in the @code{dictionary}.
@code{ApplicationRelease}: A string with the name of the application,
release included (eg, @code{@@"Gorm 0.1"}). If not available, the value
for @code{ApplicationVersion} is used instead. If this fails,
@file{Info-gnustep.plist} is looked for @code{ApplicationRelease} or
(failing this) for @code{NSAppVersion}. If all fails, @code{"Unknown"}
is used.
@code{FullVersionID}: A string with the full version of the application
(eg, @code{@@"0.1.2b"} or @code{@@"snap011100"}). If not available,
@code{Version} is used instead. If this fails,
@file{Info-gnustep.plist} is looked for @code{NSBuildVersion}. If all
fails, no full version is shown.
@code{Authors}: An array of strings, each one with the name of an author
(eg,
@code{[NSArray arrayWithObject: @@"Nicola Pero <n.pero@@mi.flashnet.it>"]}).
If not found, @file{Info-gnustep.plist} is
looked for @code{Authors}, if this fails, @code{@@"Unknown"} is
displayed.
@code{URL}: [This field is still under work, so it might be changed] A
string with an URL (eg, @code{@@"See http://www.gnustep.org"}).
@code{Copyright}: A string with copyright owners (eg, @code{@@"Copyright
(C) 2000 The Free Software Foundation, Inc."}). Support for multiple
line strings is planned but not yet available. If not found,
@file{Info-gnustep.plist} is searched for @code{Copyright} and then
(failing this) for @code{NSHumanReadableCopyright}. If all fails,
@code{@@"Copyright Information Not Available"} is used.
@code{CopyrightDescription}: A string describing the kind of copyright
(eg, @code{@@"Released under the GNU General Public License 2.0"}). If
not available, @file{Info-gnustep.plist} is looked for
@code{CopyrightDescription}. If this fails, no copyright description
is shown.
For compatibility reasons only, the following MacOSX API is also
available:
@noindent
- (void) @b{orderFrontStandardAboutPanel:} (id)@t{sender}
@noindent
- (void) @b{orderFrontStandardAboutPanelWithOptions:} (NSDictionary *)@t{dictionary}
These methods do the same as the ones above, but are deprecated.
Please note that you are free to implement your own info panel for your
app without breaking the GNUstep User Interface; the standard one is
available only as a facility -- it's not at all compulsory to use the
standard one -- you are encouraged to create your own if you like. What
is important instead is that you make your info panel available from the
@t{Info...} item in the @t{Info} menu.
@node NSBrowserCell, NSSavePanel, NSApplication, Classes
@section NSBrowserCell
@menu
@ -1139,10 +1244,11 @@ argument was given. The Info-gnustep.plist file could look like this:
@chapter Special Setup Instructions.
@menu
* Keyboard Modifiers::
* Keyboard Modifiers::
* Window Manager::
@end menu
@node Keyboard Modifiers, , Setup, Setup
@node Keyboard Modifiers, Window Manager, Setup, Setup
@section Keyboard Modifiers
This section applies only to the xgps and the xdps backend.
@ -1280,6 +1386,16 @@ Good window managers let you change the keyboard shortcuts,
so you may move the wm shortcuts that you do not use to keys
which do not conflict (at least not too much) with GNUstep.
@node Window Manager, , Keyboard Modifiers, Setup
@section Window Manager Recommended Configuration
If you are using GNUstep GUI library with the Window Maker window
manager it is recommended that you set the Window Maker option "Input
Focus Mouse" (under "Window Focus Preferences") to "Click Window To
Focus".
If you are using another window manager, look for a similar option.
@node Contributing, Concept Index, Setup, Top
@chapter Contributing

View file

@ -9,8 +9,51 @@
The currently released version of the library is @samp{@value{GNUSTEP-GUI-VERSION}}.
@section Noteworthy changes in version @samp{0.6.5}
Many of the basic GUI classes have been vastly improved or rewritten, thanks
to Nicola Pero @email{n.pero@@mi.flashnet.it} and many others.
@itemize @bullet
@item New Info Panel support
@item New NSBezierPath
@item Rewrite of several classes including Cell and Button classes.
@item Rewrite of NSBrowser, NSSavePanel, menus, text classes, NSTableHeader.
@item RTF Parser
@item Implemented image caching.
@item Implemented editing in Forms, Matricies.
@item New autolayout classes GSHBox, GSTable, and GSVBox.
@item Almost all back-end classes have been removed and code incorporated
in a DPS-like graphics context structure.
@item Better keyboard handling.
@item NSHelpManager, NSComboBox, ProgressIndicator written.
@end itemize
In addition a preliminary version of an Interface Builder (Gorm) has
been written, thanks to Richard Frith-Macdonald @email{richard@@brainstorm.co.uk}
@section Noteworthy changes in version @samp{0.6.0}
A Huge amount of progress, although a lot still needs to be done. It's
usable for a large base of moderately simple apps. Several NeXT/OpenStep
apps and libraries have been ported with little changes.
@itemize @bullet
@item Drag and Drop support fleshed out but not completed.
@item NSText and related classes rewritten. Basic functionality but
much needs to be done to finish them off.
@item nib2gmodel app works with MacOS-X
@item Work done in minimizing the backend which allowed a lot
of functionality to move to the GNU library.
@item Menu code rewritten.
@item PopupButtons now work.
@item Many new images
@item Basic functionality for NSTabView
@item Much better lockFocus support in NSView. Flipped views handled.
@item Rewrite of NSSavePanel and NSOpenPanel
@item Several fixes that at least double the speed of the gui.
@end itemize
@section Noteworthy changes in version @samp{0.5.5}
Too extensive to list.

View file

@ -32,7 +32,3 @@ Give us feedback! Tell us what you like; tell us what you think
could be better. Send bug reports to @email{bug-gnustep@@gnu.org}.
@end itemize
@noindent
Creators rejoice!@*
Scott Christley@*
@email{scottc@@net-community.com}

View file

@ -6,17 +6,86 @@
@include version.texi
@end ifset
@section Projects Looking for Volunteers
If you think you can do one of these projects, please let me know. Your
help is greatly appreciated. Send email to @email{scottc@@net-community.com}.
@section Bugs in the GUI library
@end ifclear
@subsection Windows
@itemize @bullet
@item Code to manage window decorations is not finished.
The reported frame origin of a window might be wrong.
@item Consolodate examples and tests [3, OpenStep] (980913).
Also fix or document whatever bugs are there.
@item Windows never get released. Setting isReleasedWhenClosed
does not work.
@item Need an rtf parser [6 - Objective-C, RTF] (980820).
Fixing these bugs requires touching delicate parts of the library.
This is why fixing them has been postponed after 0.6.5, to keep 0.6.5
reasonably stable.
@end itemize
@subsection Texts
@itemize @bullet
@item The NSText code is particularly complex to work on and it has not
improved much since 0.6.0. Many bugs are know in the code -- it is
somewhat usable though. We hope on a big improvement of this area
for next release.
@end itemize
@subsection Matrices
@itemize @bullet
@item Encoding/Decoding of matrices is unimplemented. There are some minor
known bugs with handling of mouse down in matrices.
@end itemize
@subsection Cells
@itemize @bullet
@item Since NSText does only left alignment, when you select or edit text
in a cell it becomes automatically left aligned regardless of the original
alignment.
@item Multi line texts are unsupported; isScrollable, wordWraps etc do nothing.
This restriction will hopefully be removed in next releases.
@end itemize
@subsection Images anf Graphics
@itemize @bullet
@item There are problems with alpha composing. To avoid these problems,
you may set manually the background color of your image when displaying it.
@item Only TIFF images are supported in 0.6.5. Support at least for PNG and
JPEG images is planned for next release.
@item alpha drawing and compositing of graphics doesn't work.
@end itemize
@subsection Alert, Info Panels
@itemize @bullet
@item Multi line messages are generally unsupported due to the similar
restriction in the cells code.
@end itemize
@subsection Unimplemented Classes
The following classes are currently unimplemented or unfinished
to such a degree to be unusable.
@itemize @bullet
@item NSColorPanel
@item NSDataLink
@item NSFontManager
@item NSFontPanel
@item NSHelpPanel
@item NSLayoutManager
@item NSPageLayout
@item NSPrintPanel
@item NSSecureTextField
@item NSSpellChecker
@item NSTableView
@item NSTextView
@end itemize

View file

@ -189,6 +189,7 @@ typedef enum {
// Path modifications.
//
- (NSBezierPath *)bezierPathByFlatteningPath;
- (NSBezierPath *)bezierPathByReversingPath;
//

View file

@ -99,10 +99,13 @@ enum {
yDist = 2 // vertical distance between the text and image rects.
};
/*
* We try to do as in macosx.
*/
enum {
NSOffState = 0,
NSOnState = 1,
NSMixedState = 2
NSMixedState = -1
};
@interface NSCell : NSObject <NSCopying, NSCoding>
@ -112,7 +115,7 @@ enum {
NSImage *_cell_image;
NSFont *_cell_font;
struct GSCellFlagsType {
// total 30 bits. 2 bits left.
// total 28 bits. 4 bits left.
unsigned is_highlighted:1;
unsigned is_disabled:1;
unsigned is_editable:1;
@ -124,7 +127,6 @@ enum {
unsigned float_autorange:1;
unsigned wraps:1;
unsigned allows_mixed_state:1;
unsigned state:2; // 3 values;
unsigned text_align:3; // 5 values
unsigned image_position:4; // 7 values
unsigned type:4; // 8 values (see NSButtonCell)
@ -132,6 +134,9 @@ enum {
// 2 bits reserved for subclass use
unsigned subclass_bool_one:1;
unsigned subclass_bool_two:1;
/* This is not in the bitfield now (for simpler macosx compatibility)
but who knows in the future */
int state; // 3 values but one negative
} _cell;
unsigned int _cell_float_left;
unsigned int _cell_float_right;

View file

@ -113,7 +113,6 @@
SEL mi_action;
int mi_tag;
id mi_representedObject;
BOOL mi_hasSubmenu;
NSMenu *mi_submenu;
BOOL mi_changesState;

View file

@ -54,6 +54,10 @@ typedef void (*DrawingIMP)(id, SEL, NSRect, NSView*);
NSString *mcell_titleToDisplay;
NSSize mcell_imageSize;
/* If we belong to a popupbutton, we display image on the extreme
right */
BOOL _mcell_belongs_to_popupbutton;
@private
NSColor *_backgroundColor;
}

View file

@ -42,4 +42,7 @@
if (pointer) free(pointer)
#endif
/* Define if you have the rintf function. */
#undef HAVE_RINTF
#endif /* _GNUstep_H_config */

View file

@ -6,7 +6,7 @@ This file documents the installation of the GNUstep GUI Library,
may copy, distribute, and modify it freely as long as you preserve this
copyright notice and permission notice.
This is version 0.6.0 of the GNUstep GUI library.
This is version 0.6.5 of the GNUstep GUI library.
Installing `gnustep-gui'
========================

View file

@ -723,18 +723,25 @@ void __dummy_GMAppKit_functionForLinking() {}
- (void)encodeWithModelArchiver:(GMArchiver*)archiver
{
[archiver encodeString:[self title] withName:@"title"];
[archiver encodeObject:[self image] withName:@"image"];
[archiver encodeObject:[self onStateImage] withName:@"onStateImage"];
[archiver encodeObject:[self offStateImage] withName:@"offStateImage"];
[archiver encodeObject:[self mixedStateImage] withName:@"mixedStateImage"];
if ([self respondsToSelector: @selector(image)])
[archiver encodeObject:[self image] withName:@"image"];
if ([self respondsToSelector: @selector(onStateImage)])
[archiver encodeObject:[self onStateImage] withName:@"onStateImage"];
if ([self respondsToSelector: @selector(offStateImage)])
[archiver encodeObject:[self offStateImage] withName:@"offStateImage"];
if ([self respondsToSelector: @selector(mixedStateImage)])
[archiver encodeObject:[self mixedStateImage] withName:@"mixedStateImage"];
[archiver encodeString:[self keyEquivalent] withName:@"keyEquivalent"];
[archiver encodeInt:[self state] withName:@"state"];
if ([self respondsToSelector: @selector(state)])
[archiver encodeInt:[self state] withName:@"state"];
[archiver encodeObject:[self target] withName:@"target"];
[archiver encodeSelector:[self action] withName:@"action"];
[archiver encodeInt:[self tag] withName:@"tag"];
[archiver encodeBOOL:[self isEnabled] withName:@"isEnabled"];
[archiver encodeBOOL:[self changesState] withName:@"changesState"];
[archiver encodeObject:[self submenu] withName:@"submenu"];
if ([self respondsToSelector: @selector(changesState)])
[archiver encodeBOOL:[self changesState] withName:@"changesState"];
if ([self respondsToSelector: @selector(submenu)])
[archiver encodeObject:[self submenu] withName:@"submenu"];
[archiver encodeConditionalObject:[self representedObject]
withName:@"representedObject"];
}
@ -759,6 +766,18 @@ void __dummy_GMAppKit_functionForLinking() {}
[self setRepresentedObject:[unarchiver
decodeObjectWithName:@"representedObject"]];
#ifdef GNU_GUI_LIBRARY
/*
* Set submenu from target if not set
*/
if ([NSStringFromSelector ([self action])
isEqualToString: @"submenuAction:"])
{
if ([self submenu] == nil)
[self setSubmenu: [self target]];
}
#endif
#if 0
NSLog (@"menu item %@: target = %@, isEnabled = %d",
[self title], [self target], [self isEnabled]);

70
NEWS
View file

@ -1,11 +1,74 @@
NEWS
****
The currently released version of the library is `0.6.0'.
The currently released version of the library is `0.6.5'.
Noteworthy changes in version `0.6.5'
=====================================
Many of the basic GUI classes have been vastly improved or
rewritten, thanks to Nicola Pero <n.pero@mi.flashnet.it> and many
others.
* New Info Panel support
* New NSBezierPath
* Rewrite of several classes including Cell and Button classes.
* Rewrite of NSBrowser, NSSavePanel, menus, text classes,
NSTableHeader.
* RTF Parser
* Implemented image caching.
* Implemented editing in Forms, Matricies.
* New autolayout classes GSHBox, GSTable, and GSVBox.
* Almost all back-end classes have been removed and code incorporated
in a DPS-like graphics context structure.
* Better keyboard handling.
* NSHelpManager, NSComboBox, ProgressIndicator written.
In addition a preliminary version of an Interface Builder (Gorm) has
been written, thanks to Richard Frith-Macdonald
<richard@brainstorm.co.uk>
Noteworthy changes in version `0.6.0'
=====================================
A Huge amount of progress, although a lot still needs to be done.
It's usable for a large base of moderately simple apps. Several
NeXT/OpenStep apps and libraries have been ported with little changes.
* Drag and Drop support fleshed out but not completed.
* NSText and related classes rewritten. Basic functionality but much
needs to be done to finish them off.
* nib2gmodel app works with MacOS-X
* Work done in minimizing the backend which allowed a lot of
functionality to move to the GNU library.
* Menu code rewritten.
* PopupButtons now work.
* Many new images
* Basic functionality for NSTabView
* Much better lockFocus support in NSView. Flipped views handled.
* Rewrite of NSSavePanel and NSOpenPanel
* Several fixes that at least double the speed of the gui.
Noteworthy changes in version `0.5.5'
=====================================
@ -14,6 +77,7 @@ Noteworthy changes in version `0.5.5'
* A lot of rewritting has been done to the classes, with general
cleanup of coordinate conversion code, etc.
Noteworthy changes in version `0.5.0'
=====================================
@ -63,6 +127,7 @@ Noteworthy changes in version `0.5.0'
* Several cleanups and as usual, many bug fixes.
Noteworthy changes in version `0.3.0'
=====================================
@ -94,6 +159,7 @@ Noteworthy changes in version `0.3.0'
retain/release policy has been fixed, the cell classes correctly
implement the NSCopying protocol and many others.
Noteworthy changes in version `0.2.0'
=====================================
@ -128,6 +194,7 @@ Noteworthy changes in version `0.2.0'
* Many bug fixes and minor enhancements.
Noteworthy changes in version `0.1.1'
=====================================
@ -151,6 +218,7 @@ Noteworthy changes in version `0.1.1'
* Now requires the TIFF library for reading, writing, and
manipulating tiff files and images.
Noteworthy changes in version `0.1.0'
=====================================

6
README
View file

@ -1,7 +1,7 @@
README
******
This is version 0.6.0 of the GNUstep GUI library (`gnustep-gui').
This is version 0.6.5 of the GNUstep GUI library (`gnustep-gui').
Here is some introductory info to get you started:
@ -21,7 +21,3 @@ How can you help?
* Give us feedback! Tell us what you like; tell us what you think
could be better. Send bug reports to <bug-gnustep@gnu.org>.
Creators rejoice!
Scott Christley
<scottc@net-community.com>

View file

@ -272,8 +272,9 @@ static NSAffineTransformStruct identityTransform = {
- (NSBezierPath*) transformBezierPath: (NSBezierPath*)aPath
{
[self notImplemented: _cmd];
return nil;
NSBezierPath *path = [aPath copyWithZone: [aPath zone]];
[path transformUsingAffineTransform: self];
return path;
}
- (NSPoint) transformPoint: (NSPoint)point

View file

@ -1146,7 +1146,7 @@ static NSCell* tileCell = nil;
{
if (theEvent == null_event)
{
NSDebugLog(@"Not sending the Null Event\n");
NSDebugLLog(@"NSEvent", @"Not sending the Null Event\n");
return;
}
@ -1157,7 +1157,7 @@ static NSCell* tileCell = nil;
case NSKeyDown:
{
NSDebugLog(@"send key down event\n");
NSDebugLLog(@"NSEvent", @"send key down event\n");
if ([theEvent modifierFlags] & NSCommandKeyMask)
{
NSArray *window_list = [self windows];
@ -1179,7 +1179,7 @@ static NSCell* tileCell = nil;
case NSKeyUp:
{
NSDebugLog(@"send key up event\n");
NSDebugLLog(@"NSEvent", @"send key up event\n");
[[theEvent window] sendEvent: theEvent];
break;
}
@ -1189,16 +1189,16 @@ static NSCell* tileCell = nil;
NSWindow *window = [theEvent window];
if (!theEvent)
NSDebugLog(@"NSEvent is nil!\n");
NSDebugLog(@"NSEvent type: %d", [theEvent type]);
NSDebugLog(@"send event to window");
NSDebugLog([window description]);
NSDebugLLog(@"NSEvent", @"NSEvent is nil!\n");
NSDebugLLog(@"NSEvent", @"NSEvent type: %d", [theEvent type]);
NSDebugLLog(@"NSEvent", @"send event to window");
NSDebugLLog(@"NSEvent", [window description]);
if (window)
[window sendEvent: theEvent];
else if ([theEvent type] == NSRightMouseDown)
[self rightMouseDown: theEvent];
else
NSDebugLog(@"no window");
NSDebugLLog(@"NSEvent", @"no window");
}
}
}
@ -1637,22 +1637,18 @@ NSAssert([event retainCount] > 0, NSInternalInconsistencyException);
@"OK", NULL, NULL);
}
/* infoPanel, macosx API -- 'About' in the title */
/* infoPanel, macosx API -- Deprecated */
- (void) orderFrontStandardAboutPanel: sender
{
[self orderFrontStandardAboutPanel: sender];
[self orderFrontStandardInfoPanel: sender];
}
- (void) orderFrontStandardAboutPanelWithOptions: (NSDictionary *)options
{
if (_infoPanel == nil)
_infoPanel = [[GSInfoPanel alloc] initWithDictionary: options];
[_infoPanel setTitle: @"About"];
[_infoPanel orderFront: self];
[self orderFrontStandardInfoPanelWithOptions: options];
}
/* infoPanel, GNUstep API -- 'Info' in the title */
/* infoPanel, GNUstep API */
- (void) orderFrontStandardInfoPanel: sender
{
[self orderFrontStandardInfoPanelWithOptions: nil];

View file

@ -58,7 +58,7 @@ void subdiv(int degree, float coeff[], float t, float bleft[], float bright[]);
NSPoint rotatePoint(NSPoint p, NSPoint centre, float angle);
@interface PathElement : NSObject
@interface PathElement : NSObject <NSCopying, NSCoding>
{
NSPoint p[3];
NSBezierPathElement type;
@ -140,6 +140,39 @@ NSPoint rotatePoint(NSPoint p, NSPoint centre, float angle);
return AUTORELEASE(element);
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder: aCoder];
[aCoder encodeValueOfObjCType: @encode(NSBezierPathElement) at: &type];
[aCoder encodeValueOfObjCType: @encode(NSPoint *) at: &p];
}
- (id)initWithCoder:(NSCoder *)aCoder
{
self = [super initWithCoder: aCoder];
[aCoder decodeValueOfObjCType: @encode(NSBezierPathElement) at: &type];
[aCoder decodeValueOfObjCType: @encode(NSPoint *) at: &p];
return self;
}
- (id)copyWithZone:(NSZone *)zone
{
PathElement *element = [[PathElement allocWithZone: zone] init];
element->type = type;
if(type == NSMoveToBezierPathElement || type == NSLineToBezierPathElement) {
element->p[0].x = p[0].x;
element->p[0].y = p[0].y;
} else if(type == NSCurveToBezierPathElement) {
element->p[0].x = p[0].x;
element->p[0].y = p[0].y;
element->p[1].x = p[1].x;
element->p[1].y = p[1].y;
element->p[2].x = p[2].x;
element->p[2].y = p[2].y;
}
return AUTORELEASE(element);
}
- (void)setType:(NSBezierPathElement)t
{
type = t;
@ -491,7 +524,7 @@ static Class NSBezierPath_concrete_class = nil;
//
- (void)transformUsingAffineTransform:(NSAffineTransform *)transform
{
[self subclassResponsibility:_cmd];
}
//
@ -636,23 +669,24 @@ static Class NSBezierPath_concrete_class = nil;
//
// NSCoding protocol
//
- (void)encodeWithCoder:(NSCoder*)aCoder
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder: aCoder];
[self subclassResponsibility:_cmd];
}
- (id)initWithCoder:(NSCoder*)aCoder
- (id)initWithCoder:(NSCoder *)aCoder
{
[super initWithCoder: aCoder];
[self subclassResponsibility:_cmd];
return self;
}
//
// NSCopying Protocol
//
- (id)copyWithZone:(NSZone*)zone
- (id)copyWithZone:(NSZone *)zone
{
return self;
[self subclassResponsibility:_cmd];
return self;
}
@end
@ -686,6 +720,9 @@ static Class NSBezierPath_concrete_class = nil;
if(self) {
pathElements = [[NSMutableArray alloc] initWithCapacity: 1];
subPaths = [[NSMutableArray alloc] initWithCapacity: 1];
[self setLineWidth: 1];
[self setLineCapStyle: NSButtLineCapStyle];
[self setLineJoinStyle: NSMiterLineJoinStyle];
[self setWindingRule: NSNonZeroWindingRule];
[self setBounds: NSZeroRect];
[self setControlPointBounds: NSZeroRect];
@ -831,7 +868,6 @@ static Class NSBezierPath_concrete_class = nil;
PathElement *elm;
NSBezierPathElement t;
NSPoint *pts, origin;
float r, g, b, w;
int i;
if(cachesBezierPath) {
@ -842,12 +878,10 @@ static Class NSBezierPath_concrete_class = nil;
cacheimg = [[NSImage alloc] initWithSize: [self bounds].size];
[self movePathToPoint: NSMakePoint(0, 0)];
PScurrentrgbcolor(&r, &g, &b);
PScurrentlinewidth(&w);
[cacheimg lockFocus];
PSsetrgbcolor(r, g, b);
PSsetlinewidth(w);
PSsetlinewidth([self lineWidth]);
PSsetlinejoin([self lineJoinStyle]);
PSsetlinecap([self lineCapStyle]);
for(i = 0; i < [pathElements count]; i++) {
elm = [pathElements objectAtIndex: i];
pts = [elm points];
@ -874,6 +908,9 @@ static Class NSBezierPath_concrete_class = nil;
}
[cacheimg compositeToPoint: origin operation: NSCompositeCopy];
} else {
PSsetlinewidth([self lineWidth]);
PSsetlinejoin([self lineJoinStyle]);
PSsetlinecap([self lineCapStyle]);
for(i = 0; i < [pathElements count]; i++) {
elm = [pathElements objectAtIndex: i];
pts = [elm points];
@ -904,7 +941,6 @@ static Class NSBezierPath_concrete_class = nil;
PathElement *elm;
NSBezierPathElement t;
NSPoint *pts, origin;
float r, g, b;
int i;
if(cachesBezierPath) {
@ -914,10 +950,8 @@ static Class NSBezierPath_concrete_class = nil;
[cacheimg release];
cacheimg = [[NSImage alloc] initWithSize: [self bounds].size];
[self movePathToPoint: NSMakePoint(0, 0)];
PScurrentrgbcolor(&r, &g, &b);
[cacheimg lockFocus];
PSsetrgbcolor(r, g, b);
for(i = 0; i < [pathElements count]; i++) {
elm = [pathElements objectAtIndex: i];
pts = [elm points];
@ -985,6 +1019,36 @@ static Class NSBezierPath_concrete_class = nil;
}
//
// Applying transformations.
//
- (void)transformUsingAffineTransform:(NSAffineTransform *)transform
{
PathElement *elm;
NSBezierPathElement t;
NSPoint p, *pts;
int i;
for(i = 0; i < [pathElements count]; i++) {
elm = [pathElements objectAtIndex: i];
pts = [elm points];
t = [elm type];
if(t == NSCurveToBezierPathElement) {
p = [transform transformPoint: pts[0]];
[elm setPointAtIndex: 0 toPoint: p];
p = [transform transformPoint: pts[1]];
[elm setPointAtIndex: 1 toPoint: p];
p = [transform transformPoint: pts[2]];
[elm setPointAtIndex: 2 toPoint: p];
} else {
p = [transform transformPoint: pts[0]];
[elm setPointAtIndex: 0 toPoint: p];
}
}
[self calculateDraftPolygon];
}
//
// Path info
//
@ -1229,6 +1293,83 @@ static Class NSBezierPath_concrete_class = nil;
[self calculateDraftPolygon];
}
//
// NSCoding protocol
//
- (void)encodeWithCoder:(NSCoder *)aCoder
{
float f;
int i;
NSRect r;
[aCoder encodeValueOfObjCType: @encode(NSMutableArray) at: &pathElements];
[aCoder encodeValueOfObjCType: @encode(NSMutableArray) at: &subPaths];
r = [self bounds];
[aCoder encodeValueOfObjCType: @encode(NSRect) at: &r];
r = [self controlPointBounds];
[aCoder encodeValueOfObjCType: @encode(NSRect) at: &r];
f = [self lineWidth];
[aCoder encodeValueOfObjCType: @encode(float) at: &f];
i = [self lineCapStyle];
[aCoder encodeValueOfObjCType: @encode(int) at: &i];
i = [self lineJoinStyle];
[aCoder encodeValueOfObjCType: @encode(int) at: &i];
i = [self windingRule];
[aCoder encodeValueOfObjCType: @encode(int) at: &i];
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &cachesBezierPath];
[aCoder encodeValueOfObjCType: @encode(NSImage) at: &cacheimg];
}
- (id)initWithCoder:(NSCoder *)aCoder
{
float f;
int i;
NSRect r;
self = [super init];
if(self) {
[aCoder decodeValueOfObjCType: @encode(NSMutableArray) at: &pathElements];
[aCoder decodeValueOfObjCType: @encode(NSMutableArray) at: &subPaths];
[aCoder decodeValueOfObjCType: @encode(NSRect) at: &r];
[self setBounds: r];
[aCoder decodeValueOfObjCType: @encode(NSRect) at: &r];
[self setControlPointBounds: r];
[aCoder decodeValueOfObjCType: @encode(float) at: &f];
[self setLineWidth: f];
[aCoder decodeValueOfObjCType: @encode(int) at: &i];
[self setLineCapStyle: i];
[aCoder decodeValueOfObjCType: @encode(int) at: &i];
[self setLineJoinStyle: i];
[aCoder decodeValueOfObjCType: @encode(int) at: &i];
[self setWindingRule: i];
[aCoder decodeValueOfObjCType: @encode(BOOL) at: &cachesBezierPath];
[aCoder decodeValueOfObjCType: @encode(NSImage) at: &cacheimg];
isValid = NO;
}
return self;
}
//
// NSCopying Protocol
//
- (id)copyWithZone:(NSZone *)zone
{
GSBezierPath *path = [[GSBezierPath allocWithZone: zone] init];
path->pathElements = [[pathElements copy] retain];
path->subPaths = [[subPaths copy] retain];
path->cachesBezierPath = cachesBezierPath;
if(cachesBezierPath && cacheimg)
path->cacheimg = [[cacheimg copy] retain];
[path setLineWidth: [self lineWidth]];
[path setLineCapStyle: [self lineCapStyle]];
[path setLineJoinStyle: [self lineJoinStyle]];
[path setWindingRule: [self windingRule]];
[path setBounds: [self bounds]];
[path setControlPointBounds: [self controlPointBounds]];
return path;
}
//
// Private Methods
@ -1238,7 +1379,7 @@ static Class NSBezierPath_concrete_class = nil;
PathElement *elm;
NSBezierPathElement bpt;
NSPoint p, *pts;
double x, y, t, k = 0.025;
double x, y, t, k = 0.25;
float maxx, minx, maxy, miny;
float cpmaxx, cpminx, cpmaxy, cpminy;
int i;

View file

@ -47,6 +47,10 @@
#include <AppKit/NSTextFieldCell.h>
#include <AppKit/PSOperators.h>
#ifndef HAVE_RINTF
#define rintf rint
#endif
#define NSBR_COLUMN_SEP 6
#define NSBR_VOFFSET 3
@ -951,6 +955,7 @@
// load column 0
[self _performLoadOfColumn: 0];
[self _adjustMatrixOfColumn: 0];
_isLoaded = YES;
@ -984,6 +989,7 @@
// Perform the data load
[self _performLoadOfColumn: column];
[self _adjustMatrixOfColumn: column];
// set last column loaded
[self setLastColumn: column];
@ -2592,7 +2598,6 @@
[matrix setDoubleAction: @selector(doDoubleClick:)];
// set new col matrix and release old
[[bc columnMatrix] release];
[bc setColumnMatrix: matrix];
[sc setDocumentView: matrix];

View file

@ -408,8 +408,10 @@
NSString *titleToDisplay;
NSRect titleRect;
NSSize imageSize = {0, 0};
NSSize titleSize = {0, 0};
NSColor *backgroundColor = nil;
BOOL flippedView = [controlView isFlipped];
NSCellImagePosition ipos = _cell.image_position;
// transparent buttons never draw
if (_buttoncell_is_transparent)
@ -484,11 +486,29 @@
if (imageToDisplay)
{
imageSize = [imageToDisplay size];
[imageToDisplay setBackgroundColor: backgroundColor];
imageSize = [imageToDisplay size];
}
switch (_cell.image_position)
if (titleToDisplay && (ipos == NSImageAbove || ipos == NSImageBelow))
{
titleSize = NSMakeSize([_cell_font widthOfString: titleToDisplay],
[_cell_font boundingRectForFont].size.height);
}
if (flippedView == YES)
{
if (ipos == NSImageAbove)
{
ipos = NSImageBelow;
}
else if (ipos == NSImageBelow)
{
ipos = NSImageAbove;
}
}
switch (ipos)
{
case NSNoImage:
imageToDisplay = nil;
@ -541,44 +561,56 @@
break;
case NSImageAbove:
imageRect.origin.x = cellFrame.origin.x;
imageRect.size.width = cellFrame.size.width;
imageRect.size.height = imageSize.height;
/* In this case, imageRect is all the space we can allocate above the text.
The drawing code below will then center the image in imageRect. */
titleRect.origin.x = cellFrame.origin.x;
titleRect.origin.y = cellFrame.origin.y;
titleRect.size.width = cellFrame.size.width;
titleRect.size.height = cellFrame.size.height - imageSize.height
- yDist;
// TODO: Add distance from border if needed
if (flippedView)
titleRect.size.height = titleSize.height;
imageRect.origin.x = cellFrame.origin.x;
imageRect.origin.y = cellFrame.origin.y;
imageRect.origin.y += titleRect.size.height + yDist;
imageRect.size.width = cellFrame.size.width;
imageRect.size.height = cellFrame.size.height;
imageRect.size.height -= titleSize.height + yDist;
if (_cell.is_bordered || _cell.is_bezeled)
{
imageRect.origin.y = NSMinY(cellFrame);
titleRect.origin.y = NSMaxY(cellFrame) - titleRect.size.height;
}
else
{
imageRect.origin.y = NSMaxY(cellFrame) - imageRect.size.height;
titleRect.origin.y = NSMinY(cellFrame);
imageRect.size.width -= 6;
imageRect.origin.x += 3;
titleRect.size.width -= 6;
titleRect.origin.x += 3;
imageRect.size.height -= 1;
titleRect.size.height -= 1;
titleRect.origin.y += 1;
}
break;
case NSImageBelow:
imageRect.origin.x = cellFrame.origin.x;
imageRect.size.width = cellFrame.size.width;
imageRect.size.height = imageSize.height;
/* In this case, imageRect is all the space we can allocate below the text.
The drawing code below will then center the image in imageRect. */
titleRect.origin.x = cellFrame.origin.x;
titleRect.origin.y = cellFrame.origin.y + cellFrame.size.height;
titleRect.origin.y -= titleSize.height;
titleRect.size.width = cellFrame.size.width;
titleRect.size.height = cellFrame.size.height - imageSize.height
- yDist;
// TODO: Add distance from border if needed
if (flippedView)
titleRect.size.height = titleSize.height;
imageRect.origin.x = cellFrame.origin.x;
imageRect.origin.y = cellFrame.origin.y;
imageRect.size.width = cellFrame.size.width;
imageRect.size.height = cellFrame.size.height;
imageRect.size.height -= titleSize.height + yDist;
if (_cell.is_bordered || _cell.is_bezeled)
{
imageRect.origin.y = NSMaxY(cellFrame) - imageRect.size.height;
titleRect.origin.y = NSMinY(cellFrame);
}
else
{
imageRect.origin.y = NSMinY(cellFrame);
titleRect.origin.y = NSMaxY(cellFrame) - titleRect.size.height;
imageRect.size.width -= 6;
imageRect.origin.x += 3;
titleRect.size.width -= 6;
titleRect.origin.x += 3;
imageRect.size.height -= 1;
imageRect.origin.y += 1;
titleRect.size.height -= 1;
}
break;
@ -683,7 +715,7 @@
case NSImageBelow:
case NSImageAbove:
if (imageSize.width > titleSize.width)
s.height = imageSize.width;
s.width = imageSize.width;
else
s.width = titleSize.width;
s.height = imageSize.height + titleSize.height; // + yDist ??
@ -720,7 +752,7 @@
// Add border size
s.width += 2 * borderSize.width;
s.height += 2 * borderSize.height;
return s;
}

View file

@ -346,8 +346,18 @@ static NSColor *shadowCol;
*/
- (void) setState: (int)value
{
// FIXME
_cell.state = value;
/* We do exactly as in macosx when value is not NSOnState,
* NSOffState, NSMixedState, even if their behaviour (value < 0 ==>
* NSMixedState) is a bit strange. We could decide to do
* differently in the future, so please use always symbolic
* constants when calling this method, this way your code won't be
* broken by changes. */
if (value > 0)
_cell.state = NSOnState;
else if (value == 0 || (_cell.allows_mixed_state == NO))
_cell.state = NSOffState;
else
_cell.state = NSMixedState;
}
- (int) state

View file

@ -129,7 +129,7 @@ NSGraphicsContext *GSCurrentContext()
*/
NSThread *th = GSCurrentThread();
th->_gcontext = context;
ASSIGN(th->_gcontext, context);
#else
NSMutableDictionary *dict = [[NSThread currentThread] threadDictionary];

File diff suppressed because it is too large Load diff

View file

@ -348,6 +348,8 @@ static SEL getSel = @selector(objectAtIndex:);
cells[i][column] = old;
selectedCells[i][column] = NO;
}
if (_selectedCell && (_selectedColumn >= column))
_selectedColumn++;
}
/*
@ -425,6 +427,8 @@ static SEL getSel = @selector(objectAtIndex:);
}
cells[row] = oldr;
selectedCells[row] = olds;
if (_selectedCell && (_selectedRow >= row))
_selectedRow++;
}
/*
@ -501,7 +505,13 @@ static SEL getSel = @selector(objectAtIndex:);
[NSException raise: NSRangeException
format: @"attempt to put cell outside matrix bounds"];
}
if ((row == _selectedRow) && (column == _selectedColumn)
&& (_selectedCell != nil))
_selectedCell = newCell;
ASSIGN(cells[row][column], newCell);
[self setNeedsDisplayInRect: [self cellFrameAtRow: row column: column]];
}
@ -1780,6 +1790,15 @@ static SEL getSel = @selector(objectAtIndex:);
static MPoint anchor = {0, 0};
int clickCount;
/*
* Pathological case -- ignore mouse down
*/
if ((numRows == 0) || (numCols == 0))
{
[super mouseDown: theEvent];
return;
}
// Manage multi-click events
clickCount = [theEvent clickCount];

View file

@ -496,16 +496,16 @@ static NSString *NSMenuLocationsKey = @"NSMenuLocations";
// Managing Submenus.
//
- (void) setSubmenu: (NSMenu *)aMenu
forItem: (id <NSMenuItem>) anItem
forItem: (id <NSMenuItem>)anItem
{
[(NSMenuItem *)anItem setSubmenu: aMenu];
[anItem setTarget: self];
[anItem setAction: @selector(submenuAction:)];
if (aMenu)
aMenu->menu_supermenu = self;
ASSIGN(aMenu->menu_title, [anItem title]);
if (aMenu != nil)
{
aMenu->menu_supermenu = self;
ASSIGN(aMenu->menu_title, [anItem title]);
}
[self itemChanged: anItem];
}
@ -856,66 +856,37 @@ static NSString *NSMenuLocationsKey = @"NSMenuLocations";
{
[encoder encodeObject: menu_title];
[encoder encodeObject: menu_items];
[encoder encodeObject: menu_view];
[encoder encodeConditionalObject: menu_supermenu];
[encoder encodeConditionalObject: menu_popb];
[encoder encodeValueOfObjCType: @encode(BOOL) at: &menu_autoenable];
[encoder encodeValueOfObjCType: @encode(BOOL) at: &menu_is_tornoff];
[encoder encodeValueOfObjCType: @encode(BOOL)
at: &menu_is_beholdenToPopUpButton];
}
- (id) initWithCoder: (NSCoder*)decoder
{
NSNotificationCenter *theCenter = [NSNotificationCenter defaultCenter];
NSRect winRect = {{0,0},{20,23}};
NSString *dTitle;
NSArray *dItems;
BOOL dAuto;
unsigned i;
[decoder decodeValueOfObjCType: @encode(id) at: &menu_title];
[decoder decodeValueOfObjCType: @encode(id) at: &menu_items];
[decoder decodeValueOfObjCType: @encode(id) at: &menu_view];
[menu_view setMenu: self]; // Sets notifications up
menu_supermenu = [decoder decodeObject];
menu_popb = [decoder decodeObject];
[decoder decodeValueOfObjCType: @encode(BOOL) at: &menu_autoenable];
[decoder decodeValueOfObjCType: @encode(BOOL) at: &menu_is_tornoff];
[decoder decodeValueOfObjCType: @encode(BOOL)
at: &menu_is_beholdenToPopUpButton];
dTitle = [decoder decodeObject];
dItems = [decoder decodeObject];
[decoder decodeValueOfObjCType: @encode(BOOL) at: &dAuto];
menu_attachedMenu = nil;
menu_changedMessagesEnabled = YES;
menu_notifications = [NSMutableArray new];
menu_follow_transient = NO;
menu_is_visible = NO;
self = [self initWithTitle: dTitle];
[self setAutoenablesItems: dAuto];
// Mark the menu as changed in order to get it resized.
menu_changed = YES;
/*
* Make sure that items and submenus are set correctly.
*/
for (i = 0; i < [dItems count]; i++)
{
NSMenuItem *item = [dItems objectAtIndex: i];
NSMenu *sub = [item submenu];
// Transient windows private stuff.
_oldAttachedMenu = nil;
// Create the windows that will display the menu.
aWindow = [[NSMenuWindow alloc] initWithContentRect: winRect
styleMask: NSBorderlessWindowMask
backing: NSBackingStoreRetained
defer: NO];
bWindow = [[NSMenuWindow alloc] initWithContentRect: winRect
styleMask: NSBorderlessWindowMask
backing: NSBackingStoreRetained
defer: NO];
titleView = [NSMenuWindowTitleView new];
[titleView setFrameOrigin: NSMakePoint(0, winRect.size.height - 23)];
[titleView setFrameSize: NSMakeSize (winRect.size.width, 23)];
[[aWindow contentView] addSubview: menu_view];
[[aWindow contentView] addSubview: titleView];
[titleView setMenu: self];
// Set up the notification to start the process of redisplaying
// the menus where the user left them the last time.
[theCenter addObserver: self
selector: @selector(_showTornOffMenuIfAny:)
name: NSApplicationWillFinishLaunchingNotification
object: NSApp];
[self addItem: item];
if (sub != nil)
{
[self setSubmenu: sub forItem: item];
}
}
return self;
}
@ -1010,7 +981,10 @@ static NSString *NSMenuLocationsKey = @"NSMenuLocations";
defaults = [NSUserDefaults standardUserDefaults];
menuLocations = [[defaults objectForKey: NSMenuLocationsKey] mutableCopy];
[menuLocations removeObjectForKey: key];
[defaults setObject: menuLocations forKey: NSMenuLocationsKey];
if ([menuLocations count] > 0)
[defaults setObject: menuLocations forKey: NSMenuLocationsKey];
else
[defaults removeObjectForKey: NSMenuLocationsKey];
RELEASE(menuLocations);
[defaults synchronize];
}
@ -1448,7 +1422,9 @@ static NSString *NSMenuLocationsKey = @"NSMenuLocations";
defaults = [NSUserDefaults standardUserDefaults];
menuLocations = [[defaults objectForKey: NSMenuLocationsKey] mutableCopy];
if (menuLocations == nil)
menuLocations = [NSMutableDictionary dictionaryWithCapacity: 2];
{
menuLocations = [[NSMutableDictionary alloc] initWithCapacity: 2];
}
locString = [[menu window] stringWithSavedFrame];
[menuLocations setObject: locString forKey: key];
[defaults setObject: menuLocations forKey: NSMenuLocationsKey];

View file

@ -70,7 +70,6 @@ static Class imageClass;
- (id) init
{
self = [super init];
mi_hasSubmenu = NO;
mi_target = nil;
mi_menu = nil;
mi_mnemonicLocation = 255; // No mnemonic
@ -395,7 +394,6 @@ static Class imageClass;
- (void) encodeWithCoder: (NSCoder*)aCoder
{
[super encodeWithCoder: aCoder];
[aCoder encodeConditionalObject: mi_menu];
[aCoder encodeObject: mi_title];
[aCoder encodeObject: mi_keyEquivalent];
[aCoder encodeValueOfObjCType: "I" at: &mi_keyEquivalentModifierMask];
@ -417,7 +415,6 @@ static Class imageClass;
- (id) initWithCoder: (NSCoder*)aDecoder
{
self = [super initWithCoder: aDecoder];
mi_menu = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(id) at: &mi_title];
[aDecoder decodeValueOfObjCType: @encode(id) at: &mi_keyEquivalent];
[aDecoder decodeValueOfObjCType: "I" at: &mi_keyEquivalentModifierMask];

View file

@ -159,9 +159,11 @@ static NSImage *arrowImageH = nil;
}
// Image
if ((anImage = [mcell_item image]))
if ((anImage = [mcell_item image]) && _cell.image_position == NSNoImage)
[self setImagePosition: NSImageLeft];
componentSize = [anImage size];
componentSize = NSMakeSize(0,0);
if (anImage)
componentSize = [anImage size];
mcell_imageWidth = componentSize.width;
if (componentSize.height > neededMenuItemHeight)
neededMenuItemHeight = componentSize.height;
@ -245,6 +247,13 @@ static NSImage *arrowImageH = nil;
//
- (NSRect) imageRectForBounds:(NSRect)cellFrame
{
if (_mcell_belongs_to_popupbutton && _cell.image_position)
{
/* Special case: draw image on the extreme right [FIXME check the distance]*/
cellFrame.origin.x += cellFrame.size.width - mcell_imageWidth - 2;
cellFrame.size.width = mcell_imageWidth;
return cellFrame;
}
// Calculate the image part of cell frame from NSMenuView
cellFrame.origin.x += [mcell_menuView imageAndTitleOffset];
cellFrame.size.width = [mcell_menuView imageAndTitleWidth];

View file

@ -228,8 +228,18 @@ static float GSMenuBarHeight = 25.0; // A wild guess.
- (void) setMenuItemCell: (NSMenuItemCell *)cell
forItemAtIndex: (int)index
{
NSMenuItem *anItem = [menuv_items_link objectAtIndex: index];
[menuv_itemCells replaceObjectAtIndex: index withObject: cell];
[cell setMenuItem: anItem];
[cell setMenuView: self];
if ([self highlightedItemIndex] == index)
[cell setHighlighted: YES];
else
[cell setHighlighted: NO];
// Mark the new cell and the menu view as needing resizing.
[cell setNeedsSizing: YES];
[self setNeedsSizing: YES];

View file

@ -195,16 +195,19 @@ Class _nspopupbuttonCellClass = 0;
- (void) selectItem: (id <NSMenuItem>)anObject
{
[_cell selectItem: anObject];
[self synchronizeTitleAndSelectedItem];
}
- (void) selectItemAtIndex: (int)index
{
[_cell selectItemAtIndex: index];
[self synchronizeTitleAndSelectedItem];
}
- (void) selectItemWithTitle: (NSString*)title
{
[_cell selectItemWithTitle: title];
[self synchronizeTitleAndSelectedItem];
}
- (int) numberOfItems
@ -302,7 +305,8 @@ Class _nspopupbuttonCellClass = 0;
NSMenuView *mr = [[_cell menu] menuRepresentation];
NSEvent *e;
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
NSPoint p;
if ([self isEnabled] == NO)
return;
@ -313,12 +317,23 @@ Class _nspopupbuttonCellClass = 0;
[_cell attachPopUpWithFrame: _bounds
inView: self];
{
// Hack, function in NSPopUpButtonCell
extern NSPoint
_convertBaseToScreen_with_fix (NSRect frame, NSWindow *window,
NSPoint point);
p = [[mr window]
convertScreenToBase:
_convertBaseToScreen_with_fix ([self convertRect:_bounds
toView: nil], _window,
[theEvent locationInWindow])];
}
// Process events; we start menu events processing by converting
// this event to the menu window, and sending it there.
e = [NSEvent mouseEventWithType: [theEvent type]
location: [[mr window] convertScreenToBase:
[_window convertBaseToScreen:
[theEvent locationInWindow]]]
location: p
modifierFlags: [theEvent modifierFlags]
timestamp: [theEvent timestamp]
windowNumber: [[mr window] windowNumber]
@ -336,8 +351,7 @@ Class _nspopupbuttonCellClass = 0;
// Send action to target
[super sendAction: [self action]
to: [self target]];
to: [self target]];
}
/*
@ -345,30 +359,58 @@ Class _nspopupbuttonCellClass = 0;
*/
- (void) encodeWithCoder: (NSCoder*)aCoder
{
int i;
BOOL f;
id c;
/*
* Don't encode all the cell information!
*/
c = RETAIN([self cell]);
[super encodeWithCoder: aCoder];
/*
[aCoder encodeObject: list_items];
[aCoder encodeRect: list_rect];
[aCoder encodeValueOfObjCType: @encode(int) at: &selected_item];
[aCoder encodeConditionalObject: pub_target];
[aCoder encodeValueOfObjCType: @encode(SEL) at: &pub_action];
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &is_up];
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &pulls_down];
*/
[self setCell: c];
RELEASE(c);
f = [self pullsDown];
[aCoder encodeValueOfObjCType: @encode(BOOL) at: &f];
[aCoder encodeObject: [self itemArray]];
i = [self indexOfSelectedItem];
[aCoder encodeValueOfObjCType: @encode(int) at: &i];
}
- (id) initWithCoder: (NSCoder*)aDecoder
{
NSArray *dItems;
int dSelected;
BOOL dPull;
unsigned i;
id aCell;
[super initWithCoder: aDecoder];
/*
[aDecoder decodeValueOfObjCType: @encode(id) at: &list_items];
list_rect = [aDecoder decodeRect];
[aDecoder decodeValueOfObjCType: @encode(int) at: &selected_item];
pub_target = [aDecoder decodeObject];
[aDecoder decodeValueOfObjCType: @encode(SEL) at: &pub_action];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &is_up];
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &pulls_down];
*/
/*
* Set a newly created cell.
*/
aCell = [[[self class] cellClass] new];
[self setCell: aCell];
RELEASE(aCell);
[aDecoder decodeValueOfObjCType: @encode(BOOL) at: &dPull];
[self setPullsDown: dPull];
dItems = [aDecoder decodeObject];
for (i = 0; i < [dItems count]; i++)
{
NSMenuItem *dItem = [dItems objectAtIndex: i];
NSMenuItem *item;
[self addItemWithTitle: [dItem title]];
item = [self itemAtIndex: i];
[item setTarget: [dItem target]];
[item setAction: [dItem action]];
[item setEnabled: [dItem isEnabled]];
[item setTag: [dItem tag]];
[item setKeyEquivalent: [dItem keyEquivalent]];
}
[aDecoder decodeValueOfObjCType: @encode(int) at: &dSelected];
[self selectItemAtIndex: dSelected];
[self synchronizeTitleAndSelectedItem];
return self;
}

View file

@ -36,7 +36,75 @@
#include <AppKit/NSPopUpButtonCell.h>
#include <AppKit/PSOperators.h>
@interface NSMenuItemCell (GNUStepPrivate)
- (void) setBelongsToPopUpButton: (BOOL)flag;
@end
@implementation NSMenuItemCell (GNUStepPrivate)
- (void) setBelongsToPopUpButton: (BOOL)flag
{
_mcell_belongs_to_popupbutton = flag;
}
@end
/* Same as [NSWindow -convertBaseToScreen:] with the difference
that detects and fixes at run time bugs in the window frame management */
/* frame is a frame where the mouse is supposed to be.
If the mouse is out of that frame, it means the window code has got the
window origin wrong -- presumably by a decoration height.
Looking if mouse is upper or lower than the given frame we determine
if decoration window size need to be added or subtracted. */
NSPoint
_convertBaseToScreen_with_fix(NSRect frame, NSWindow *window, NSPoint point)
{
/* We get mouse position */
NSPoint mouse = [window mouseLocationOutsideOfEventStream];
float l, r, b;
float t = 0;
NSPoint ret;
/* If the reported mouse position is not in frame
this means that the window frame origin is broken. */
if (mouse.y > frame.origin.y + frame.size.height)
{
NSLog (@"Window Frame Origin Bug Detected: point reported higher");
NSLog (@"Workaround enabled.");
DPSstyleoffsets (GSCurrentContext (), &l, &r, &t, &b,
[window styleMask]);
}
else if (mouse.y < frame.origin. y)
{
NSLog (@"Window Frame Origin Bug Detected: point reported lower");
NSLog (@"Workaround enabled.");
DPSstyleoffsets (GSCurrentContext (), &l, &r, &t, &b,
[window styleMask]);
t = -t;
}
/* Convert the origin */
ret = [window convertBaseToScreen: point];
/* Add the bug correction */
ret.y += t;
return ret;
}
/* The image to use in a specific popupbutton is
* _pbc_image[_pbcFlags.pullsDown]; that is, _pbc_image[0] if it is a
* popup menu, _pbc_image[1] if it is a pulls down list. */
static NSImage *_pbc_image[2];
@implementation NSPopUpButtonCell
+ (void) initialize
{
if (self == [NSPopUpButtonCell class])
{
[self setVersion: 1];
ASSIGN(_pbc_image[0], [NSImage imageNamed: @"common_Nibble"]);
ASSIGN(_pbc_image[1], [NSImage imageNamed: @"common_3DArrowDown"]);
}
}
- (void) dealloc
{
RELEASE(_menu);
@ -146,15 +214,8 @@
// Adding and removing items
- (void) addItemWithTitle: (NSString *)title
{
NSMenuItem *anItem = [NSMenuItem new];
[anItem setTitle: title];
// Not bad as defaults:
[anItem setTarget: nil];
[anItem setAction: NULL];
[_menu insertItem: anItem atIndex: [_menu numberOfItems]];
RELEASE(anItem);
[self insertItemWithTitle: title
atIndex: [_menu numberOfItems]];
}
- (void) addItemsWithTitles: (NSArray *)itemTitles
@ -171,19 +232,25 @@
- (void) insertItemWithTitle: (NSString *)title atIndex: (int)index
{
NSMenuItem *anItem = [NSMenuItem new];
NSMenuItemCell *aCell;
int count = [_menu numberOfItems];
if (index < 0)
index = 0;
if (index > [_menu numberOfItems])
index = [_menu numberOfItems];
if (index > count)
index = count;
[anItem setTitle: title];
// Not bad as defaults:
[anItem setTarget: nil];
[anItem setAction: NULL];
[_menu insertItem: anItem atIndex: index];
RELEASE(anItem);
aCell = [[_menu menuRepresentation] menuItemCellForItemAtIndex: index];
[aCell setBelongsToPopUpButton: YES];
[aCell setImagePosition: NSImageRight];
}
- (void) removeItemWithTitle: (NSString *)title
@ -265,8 +332,11 @@
if (!item)
{
if (_pbcFlags.altersStateOfSelectedItem)
[_selectedItem setState: NSOffState];
{
[_selectedItem setState: NSOffState];
[_selectedItem setChangesState: NO];
}
[_selectedItem setImage: nil];
_selectedItem = nil;
}
else
@ -274,18 +344,32 @@
if (_pbcFlags.altersStateOfSelectedItem)
{
[_selectedItem setState: NSOffState];
}
[_selectedItem setChangesState: NO];
}
[_selectedItem setImage: nil];
_selectedItem = item;
if (_pbcFlags.altersStateOfSelectedItem)
{
[_selectedItem setState: NSOnState];
[_selectedItem setState: NSOnState];
[_selectedItem setChangesState: NO];
}
[_selectedItem setImage: _pbc_image[_pbcFlags.pullsDown]];
}
/* Set the item in the menu */
[(NSMenuView *)[_menu menuRepresentation] setHighlightedItemIndex:
[_menu indexOfItem: _selectedItem]];
}
- (void) selectItemAtIndex: (int)index
{
NSMenuItem *anItem = (index == -1) ? nil : [self itemAtIndex: index];
NSMenuItem *anItem;
if (index < 0)
anItem = nil;
else
anItem = [self itemAtIndex: index];
[self selectItem: anItem];
}
@ -349,8 +433,8 @@
}
else
{
int index = [[_menu menuRepresentation] highlightedItemIndex];
int index = [[_menu menuRepresentation] highlightedItemIndex];
if (index < 0)
index = 0;
[self selectItemAtIndex: index];
@ -393,6 +477,8 @@
NSWindow *cvWin = [controlView window];
NSMenuView *mr = [_menu menuRepresentation];
int items;
NSRect origCellFrame = [controlView convertRect: cellFrame
toView: nil];
[nc postNotificationName: NSPopUpButtonCellWillPopUpNotification
object: self];
@ -417,10 +503,14 @@
}
// Convert to Screen Coordinates
/* Convert to content view */
cellFrame = [controlView convertRect: cellFrame
toView: nil];
cellFrame.origin = [cvWin convertBaseToScreen: cellFrame.origin];
cellFrame.origin = _convertBaseToScreen_with_fix (origCellFrame, cvWin,
cellFrame.origin);
// Ask the MenuView to attach the menu to this rect
if (_pbcFlags.pullsDown)
{
@ -464,17 +554,6 @@
// This method is not executed upon mouse down; rather, it should
// simulate what would happen upon mouse down. It should not start
// any real mouse tracking.
/*
int indexToClick;
[self attachPopUpWithFrame: frame
inView: controlView];
indexToClick = [[_menu menuRepresentation] indexOfItemAtPoint:
[[_menu window] mouseLocationOutsideOfEventStream]];
[[_menu menuRepresentation] mouseDown: [NSApp currentEvent]];
[[[_menu menuRepresentation] menuItemCellForItemAtIndex: indexToClick]
performClick: nil];*/
}
// Arrow position for bezel style and borderless popups.
@ -483,18 +562,26 @@
return _pbcFlags.arrowPosition;
}
/*
* Does nothing for now.
*/
- (void) setArrowPosition: (NSPopUpArrowPosition)position
{
_pbcFlags.arrowPosition = position;
}
/*
* What would be nice and natural is to make this drawing using the same code
* that is used to draw cells in the menu.
* This looks like a mess to do in this framework.
*/
- (void) drawWithFrame: (NSRect)cellFrame
inView: (NSView*)view
{
NSSize size;
NSPoint position;
NSImage *aImage;
NSImage *anImage;
// Save last view drawn to
if (_control_view != view)
_control_view = view;
@ -508,17 +595,13 @@
cellFrame.size.width -= 5;
[self _drawText: [self titleOfSelectedItem] inFrame: cellFrame];
anImage = _pbc_image[_pbcFlags.pullsDown];
if (_pbcFlags.pullsDown)
{
aImage = [NSImage imageNamed: @"common_3DArrowDown"];
}
else
{
aImage = [NSImage imageNamed: @"common_Nibble"];
}
/* NB: If we are drawing here, then the control can't be selected */
[anImage setBackgroundColor: [NSColor controlBackgroundColor]];
size = [aImage size];
size = [anImage size];
position.x = cellFrame.origin.x + cellFrame.size.width - size.width - 4;
position.y = MAX(NSMidY(cellFrame) - (size.height/2.), 0.);
/*
@ -527,9 +610,8 @@
*/
if ([view isFlipped])
position.y += size.height;
[aImage compositeToPoint: position operation: NSCompositeCopy];
[anImage compositeToPoint: position operation: NSCompositeCopy];
[view unlockFocus];
}
@end

View file

@ -37,10 +37,6 @@
// - optimization: 3.paragraph made one less line due to delition
// of single char [opti hook 1; diff from 1.]
#if !defined(ABS)
#define ABS(A) ({ typeof(A) __a = (A); __a < 0 ? - __a : __a; })
#endif // the definition in gstep-base produces warnings FIX ME FAR
#include <gnustep/gui/config.h>
#include <Foundation/NSNotification.h>
#include <Foundation/NSString.h>
@ -68,6 +64,23 @@
#define HUGE 1e99
/*
* A little utility function to determine the range of characters in a scanner
* that are present in a specified character set.
*/
static inline NSRange
scanRange(NSScanner *scanner, NSCharacterSet* aSet)
{
unsigned start = [scanner scanLocation];
unsigned end = start;
if ([scanner scanCharactersFromSet: aSet intoString: 0] == YES)
{
end = [scanner scanLocation];
}
return NSMakeRange(start, end - start);
}
enum {
NSBackspaceKey = 8,
NSCarriageReturnKey = 13,
@ -82,7 +95,6 @@ enum {
float drawingOffset;
BOOL dontDisplay;
unsigned type;
NSString *fingerprintString; // obsolete, unused
}
typedef enum
@ -106,8 +118,6 @@ typedef enum
- (void) setDrawingOffset: (float) anOffset;
- (void) setDontDisplay: (BOOL) flag;
- (void) setType: (unsigned) aType;
- (NSString*) fingerprintString;
- (void) setFingerprintString: (NSString*) aString;
- (BOOL) isLineTerminatingParagraph;
- (NSString*) description;
@ -151,11 +161,6 @@ typedef enum
return drawingOffset;
}
- (NSString*) fingerprintString
{
return fingerprintString;
}
- (void) setLineRange: (NSRange) aRange
{
lineRange = aRange;
@ -184,17 +189,11 @@ typedef enum
type = aType;
}
- (void) setFingerprintString: (NSString*) aString
{
ASSIGN (fingerprintString, aString);
}
- (NSString*) description
{
return [[NSDictionary dictionaryWithObjectsAndKeys:
NSStringFromRange(lineRange), @"LineRange",
NSStringFromRect(lineRect), @"LineRect",
fingerprintString, @"fingerprint",
nil]
description];
}
@ -204,13 +203,6 @@ typedef enum
// sort of hackish
return type == LineLayoutInfoType_Paragraph && lineRect.origin.x> 0;
}
- (void) dealloc
{
if (fingerprintString)
[fingerprintString release];
[super dealloc];
}
@end
static NSRange MakeRangeFromAbs (int a1,int a2) // not the same as NSMakeRange!
@ -233,118 +225,6 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
*/
// end: _GNULineLayoutInfo------------------------------------------------------------------------------------------
// NeXT's NSScanner's scanCharactersFromSet and friends seem to be
// a bit sluggish on whitespaces and newlines
// (have not tried GNUstep - base implementation though).
// so here is a more pedantic (and faster) implementation:
// this class should be considered private since it is not polished at all!
@interface _GNUTextScanner: NSObject
{
NSString *string;
NSCharacterSet *set,*iSet;
unsigned stringLength;
NSRange activeRange;
}
+ (_GNUTextScanner*) scannerWithString: (NSString*) aStr
set: (NSCharacterSet*) aSet
invertedSet: (NSCharacterSet*) anInvSet;
- (void) setString: (NSString*) aString set: (NSCharacterSet*)
aSet invertedSet: (NSCharacterSet*) anInvSet;
- (NSRange) _scanCharactersInverted: (BOOL) inverted;
- (NSRange) scanSetCharacters;
- (NSRange) scanNonSetCharacters;
- (BOOL) isAtEnd;
- (unsigned) scanLocation;
- (void) setScanLocation: (unsigned) aLoc;
@end
@implementation _GNUTextScanner
+ (_GNUTextScanner*) scannerWithString: (NSString*) aStr
set: (NSCharacterSet*) aSet
invertedSet: (NSCharacterSet*) anInvSet
{
_GNUTextScanner *ret = [[self alloc] init];
[ret setString: aStr set: aSet invertedSet: anInvSet];
return [ret autorelease];
}
- (void) setString: (NSString*) aString set: (NSCharacterSet*) aSet
invertedSet: (NSCharacterSet*) anInvSet
{
ASSIGN (string, aString);
stringLength = [string length];
activeRange = NSMakeRange (0, stringLength);
ASSIGN (set, aSet);
ASSIGN (iSet, anInvSet);
}
- (NSRange) _scanCharactersInverted: (BOOL) inverted
{
NSRange range = NSMakeRange (activeRange.location, 0);
NSCharacterSet *currentSet = inverted? iSet: set;
NSCharacterSet *currentISet = inverted? set: iSet;
if (activeRange.location >= stringLength)
return range;
if ([currentSet characterIsMember: [string characterAtIndex:
activeRange.location]])
{
range = [string rangeOfCharacterFromSet: currentSet options: 0
range: activeRange];
}
if (range.length)
{
NSRange iRange = range;
iRange = [string rangeOfCharacterFromSet: currentISet options: 0
range: MakeRangeFromAbs (NSMaxRange (range),
stringLength)];
if (iRange.length)
range = MakeRangeFromAbs (range.location, iRange.location);
else
range = MakeRangeFromAbs (range.location, stringLength);
activeRange = MakeRangeFromAbs (NSMaxRange(range), stringLength);
}
return range;
}
- (NSRange) scanSetCharacters
{
return [self _scanCharactersInverted: NO];
}
- (NSRange) scanNonSetCharacters
{
return [self _scanCharactersInverted: YES];
}
- (BOOL) isAtEnd
{
return activeRange.location >= stringLength;
}
- (unsigned) scanLocation
{
return activeRange.location;
}
- (void) setScanLocation: (unsigned) aLoc
{
activeRange = MakeRangeFromAbs (aLoc, stringLength);
}
- (void) dealloc
{
[string release];
[set release];
[iSet release];
[super dealloc];
}
@end
// end: _GNUTextScanner implementation--------------------------------------
/*
@interface NSAttributedString(DrawingAddition)
- (NSSize) sizeRange: (NSRange) aRange;
@ -602,7 +482,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
if ((!sendType || [sendType isEqual: NSStringPboardType])
&& (!returnType || [returnType isEqual: NSStringPboardType]))
{
if (([self selectedRange].length || !sendType)
if ((selected_range.length || !sendType)
&& ([self isEditable] || !returnType))
{
return self;
@ -617,7 +497,6 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
types: (NSArray*)sendTypes
{
NSArray *types;
NSRange range;
NSString *string;
if ([sendTypes containsObject: NSStringPboardType] == NO)
@ -626,9 +505,8 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
}
types = [NSArray arrayWithObjects: NSStringPboardType, nil];
[pb declareTypes: types owner: nil];
range = [self selectedRange];
string = [self string];
string = [string substringWithRange: range];
string = [string substringWithRange: selected_range];
return [pb setString: string forType: NSStringPboardType];
}
@ -645,7 +523,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
if ([self isRichText])
{
[self setTextColor: color range: [self selectedRange]];
[self setTextColor: color range: selected_range];
}
else
[self setTextColor: color];
@ -788,7 +666,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
return NSMakeRange(0,0);
}
switch(granularity)
switch (granularity)
{
case NSSelectByCharacter:
return NSIntersectionRange (proposedCharRange,
@ -1033,12 +911,11 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
{
if ([self isRichText])
{
NSRange selectedRange = [self selectedRange];
NSRange searchRange = selectedRange;
NSRange searchRange = selected_range;
NSRange foundRange;
int maxSelRange;
for (maxSelRange = NSMaxRange(selectedRange);
for (maxSelRange = NSMaxRange(selected_range);
searchRange.location < maxSelRange;
searchRange = NSMakeRange (NSMaxRange (foundRange),
maxSelRange - NSMaxRange(foundRange)))
@ -1158,7 +1035,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
- (BOOL) shouldDrawInsertionPoint
{
return ([self selectedRange].length == 0) && [self isEditable];
return (selected_range.length == 0) && [self isEditable];
}
- (void) drawInsertionPointInRect: (NSRect)rect
@ -1540,16 +1417,16 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
{
BOOL doUnderline = YES;
if ([[rtfContent attribute: NSUnderlineStyleAttributeName
atIndex: [self selectedRange].location
atIndex: selected_range.location
effectiveRange: NULL] intValue])
doUnderline = NO;
if ([self selectedRange].length)
if (selected_range.length)
{
[rtfContent addAttribute: NSUnderlineStyleAttributeName
value: [NSNumber numberWithInt: doUnderline]
range: [self selectedRange]];
[self rebuildFromCharacterIndex: [self selectedRange].location];
range: selected_range];
[self rebuildFromCharacterIndex: selected_range.location];
}
else // no redraw necess.
[[self typingAttributes]
@ -1562,11 +1439,11 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
{
if ([self isRichText])
{
if ([self selectedRange].length)
if (selected_range.length)
{
[rtfContent removeAttribute: NSUnderlineStyleAttributeName
range: [self selectedRange]];
[self rebuildFromCharacterIndex: [self selectedRange].location];
range: selected_range];
[self rebuildFromCharacterIndex: selected_range.location];
}
else // no redraw necess.
[[self typingAttributes]
@ -1595,9 +1472,9 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
{
[self scrollRectToVisible:
NSUnionRect ([self rectForCharacterIndex:
[self selectedRange].location],
selected_range.location],
[self rectForCharacterIndex:
NSMaxRange ([self selectedRange])])];
NSMaxRange (selected_range)])];
}
//
@ -1679,14 +1556,18 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
unsigned cursorIndex;
NSPoint cursorPoint;
if ([self selectedRange].length)
/* Do nothing if we are at beginning of text */
if (selected_range.location == 0)
return;
if (selected_range.length)
{
currentCursorX = [self rectForCharacterIndex:
[self selectedRange].location].origin.x;
selected_range.location].origin.x;
currentCursorY = [self rectForCharacterIndex:
[self selectedRange].location].origin.y;
selected_range.location].origin.y;
}
cursorIndex = [self selectedRange].location;
cursorIndex = selected_range.location;
cursorPoint = [self rectForCharacterIndex: cursorIndex].origin;
cursorIndex = [self characterIndexForPoint:
NSMakePoint (currentCursorX + 0.001,
@ -1703,14 +1584,18 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
unsigned cursorIndex;
NSRect cursorRect;
if ([self selectedRange].length)
/* Do nothing if we are at end of text */
if (selected_range.location == [self textLength])
return;
if (selected_range.length)
{
currentCursorX = [self rectForCharacterIndex:
NSMaxRange ([self selectedRange])].origin.x;
NSMaxRange (selected_range)].origin.x;
currentCursorY = [self rectForCharacterIndex:
NSMaxRange ([self selectedRange])].origin.y;
NSMaxRange (selected_range)].origin.y;
}
cursorIndex = [self selectedRange].location;
cursorIndex = selected_range.location;
cursorRect = [self rectForCharacterIndex: cursorIndex];
cursorIndex = [self characterIndexForPoint:
NSMakePoint (currentCursorX + 0.001,
@ -1723,22 +1608,30 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
}
- (void) moveCursorLeft: sender
{
/* Do nothing if we are at beginning of text */
if (selected_range.location == 0)
return;
[self setSelectedRange:
[self selectionRangeForProposedRange:
NSMakeRange ([self selectedRange].location - 1, 0)
NSMakeRange (selected_range.location - 1, 0)
granularity: NSSelectByCharacter]];
currentCursorX = [self rectForCharacterIndex:
[self selectedRange].location].origin.x;
selected_range.location].origin.x;
}
- (void) moveCursorRight: sender
{
/* Do nothing if we are at end of text */
if (selected_range.location == [self textLength])
return;
[self setSelectedRange:
[self selectionRangeForProposedRange:
NSMakeRange (MIN (NSMaxRange ([self selectedRange]) + 1,
NSMakeRange (MIN (NSMaxRange (selected_range) + 1,
[self textLength]), 0)
granularity: NSSelectByCharacter]];
currentCursorX = [self rectForCharacterIndex:
[self selectedRange].location].origin.x;
selected_range.location].origin.x;
}
//
@ -1759,7 +1652,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
[_window makeFirstResponder: self];
switch([theEvent clickCount])
switch ([theEvent clickCount])
{
case 1: granularity = NSSelectByCharacter;
break;
@ -1780,13 +1673,13 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
[self lockFocus];
// clean up before doing the dragging
if ([self selectedRange].length == 0) // remove old cursor
if (selected_range.length == 0) // remove old cursor
{
[self drawInsertionPointAtIndex: [self selectedRange].location
[self drawInsertionPointAtIndex: selected_range.location
color: nil turnedOn: NO];
}
else
[self drawSelectionAsRangeNoCaret: [self selectedRange]];
[self drawSelectionAsRangeNoCaret: selected_range];
//<!> make this non - blocking (or make use of timed entries)
for (currentEvent = [_window
@ -1906,7 +1799,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
{
[self drawPlainLinesInLineRange: redrawLineRange];
}
[self drawSelectionAsRange: [self selectedRange]];
[self drawSelectionAsRange: selected_range];
}
if ([self drawsBackground]) // clean up the remaining area under text of us
@ -1927,7 +1820,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
if (![lineLayoutInformation count]
|| [[lineLayoutInformation lastObject]
type] == LineLayoutInfoType_Paragraph)
[self drawSelectionAsRange: [self selectedRange]];
[self drawSelectionAsRange: selected_range];
}
}
@ -1958,7 +1851,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
- (void) insertText: insertObjc
{
NSRange selectedRange = [self selectedRange];
NSRange selectedRange = selected_range;
int lineIndex = [self lineLayoutIndexForCharacterIndex:
selectedRange.location];
int origLineIndex = lineIndex;
@ -1986,7 +1879,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
if ([self isRichText])
{
[self replaceRange: [self selectedRange]
[self replaceRange: selected_range
withAttributedString: [insertObjc isKindOfClass:
[NSAttributedString class]]?
insertObjc:
@ -1997,7 +1890,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
}
else
{
[self replaceRange: [self selectedRange] withString: insertString];
[self replaceRange: selected_range withString: insertString];
}
redrawLineRange.length = [self rebuildLineLayoutInformationStartingAtLine:
redrawLineRange.location
@ -2011,14 +1904,15 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
// move cursor <!> [self selectionRangeForProposedRange: ]
[self
setSelectedRange:
NSMakeRange ([self selectedRange].location + [insertString length], 0)];
NSMakeRange (selected_range.location + [insertString length], 0)];
// remember x for row - stable cursor movements
currentCursorX = [self rectForCharacterIndex:
[self selectedRange].location].origin.x;
selected_range.location].origin.x;
// remember x for row - stable cursor movements
currentCursorY = [self rectForCharacterIndex:
[self selectedRange].location].origin.y;
selected_range.location].origin.y;
redrawLineRange = NSIntersectionRange (redrawLineRange,
[self lineRangeForRect:
@ -2103,10 +1997,11 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
// remember x for row - stable cursor movements
currentCursorX = [self rectForCharacterIndex:
[self selectedRange].location].origin.x;
selected_range.location].origin.x;
// remember x for row - stable cursor movements
currentCursorY = [self rectForCharacterIndex:
[self selectedRange].location].origin.y;
selected_range.location].origin.y;
redrawLineRange
= NSIntersectionRange (redrawLineRange,
@ -2192,7 +2087,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
}
// Special Characters for generic NSText
switch(keyCode)
switch (keyCode)
{
case NSUpArrowFunctionKey:
[self moveCursorUp: self];
@ -2206,8 +2101,20 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
case NSRightArrowFunctionKey:
[self moveCursorRight: self];
return;
case NSDeleteFunctionKey:
if (selected_range.location != [self textLength])
{
/* Not at the end of text -- delete following character */
[self deleteRange:
[self selectionRangeForProposedRange:
NSMakeRange (selected_range.location, 1)
granularity: NSSelectByCharacter]
backspace: NO];
return;
}
/* end of text: behave the same way as NSBackspaceKey */
case NSBackspaceKey:
[self deleteRange: [self selectedRange] backspace: YES];
[self deleteRange: selected_range backspace: YES];
return;
#if 1
case 0x6d: // end - key: debugging: enforce complete re - layout
@ -2252,7 +2159,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
if ([self shouldDrawInsertionPoint])
{
[self drawInsertionPointAtIndex: [self selectedRange].location
[self drawInsertionPointAtIndex: selected_range.location
color: nil turnedOn: NO];
//<!> stop timed entry
@ -2278,7 +2185,7 @@ static NSRange MakeRangeFromAbs(int a1,int a2)
//if ([self shouldDrawInsertionPoint])
// {
// [self lockFocus];
// [self drawInsertionPointAtIndex: [self selectedRange].location
// [self drawInsertionPointAtIndex: selected_range.location
// color: [NSColor blackColor] turnedOn: YES];
// [self unlockFocus];
// //<!> restart timed entry
@ -2619,13 +2526,13 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
delta: (int) insertionDelta
actualLine: (int) insertionLineIndex
{
NSDictionary *attributes = [self defaultTypingAttributes];
NSPoint drawingPoint = NSZeroPoint;
_GNUTextScanner *parscanner;
float width = _frame.size.width;
unsigned startingIndex = 0,currentLineIndex;
_GNULineLayoutInfo *lastValidLineInfo = nil;
NSArray *ghostArray = nil; // for optimization detection
NSDictionary *attributes = [self defaultTypingAttributes];
NSPoint drawingPoint = NSZeroPoint;
NSScanner *pScanner;
float width = _frame.size.width;
unsigned startingIndex = 0,currentLineIndex;
_GNULineLayoutInfo *lastValidLineInfo = nil;
NSArray *ghostArray = nil; // for optimization detection
_GNUSeekableArrayEnumerator *prevArrayEnum = nil;
NSCharacterSet *invSelectionWordGranularitySet
= [selectionWordGranularitySet invertedSet];
@ -2684,37 +2591,39 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
currentLineIndex = aLine;
// each paragraph
for (parscanner
= [_GNUTextScanner
scannerWithString: parsedString = [[self string]
substringFromIndex:
startingIndex]
set: selectionParagraphGranularitySet
invertedSet: invSelectionParagraphGranularitySet];
![parscanner isAtEnd];)
parsedString = [[self string] substringFromIndex: startingIndex];
pScanner = [NSScanner scannerWithString: parsedString];
[pScanner setCharactersToBeSkipped: nil];
while ([pScanner isAtEnd] == NO)
{
_GNUTextScanner *linescanner;
NSScanner *lScanner;
NSString *paragraph;
NSRange paragraphRange, leadingNlRange, trailingNlRange;
unsigned startingParagraphIndex
= [parscanner scanLocation] + startingIndex;
unsigned startingLineCharIndex = startingParagraphIndex;
BOOL isBuckled = NO, inBuckling = NO;
leadingNlRange = [parscanner scanSetCharacters];
// add the leading newlines of current paragraph
// if any (only the first time)
if (leadingNlRange.length)
{
[self addNewlines: leadingNlRange
intoLayoutArray: lineLayoutInformation
attributes: attributes
atPoint: &drawingPoint
width: width
characterIndex: startingLineCharIndex
ghostEnumerator: prevArrayEnum
didShift: &nlDidShift
verticalDisplacement: &yDisplacement];
NSRange paragraphRange, leadingNlRange, trailingNlRange;
unsigned currentLoc = [pScanner scanLocation];
unsigned startingParagraphIndex = currentLoc + startingIndex;
unsigned startingLineCharIndex = startingParagraphIndex;
BOOL isBuckled = NO, inBuckling = NO;
leadingNlRange
= scanRange(pScanner, selectionParagraphGranularitySet);
paragraphRange
= scanRange(pScanner, invSelectionParagraphGranularitySet);
trailingNlRange
= scanRange(pScanner, selectionParagraphGranularitySet);
if (leadingNlRange.length > 0)
{
[self addNewlines: leadingNlRange
intoLayoutArray: lineLayoutInformation
attributes: attributes
atPoint: &drawingPoint
width: width
characterIndex: startingLineCharIndex
ghostEnumerator: prevArrayEnum
didShift: &nlDidShift
verticalDisplacement: &yDisplacement];
if (nlDidShift)
{
if (insertionDelta == 1)
@ -2733,43 +2642,41 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
startingLineCharIndex += leadingNlRange.length;
currentLineIndex += leadingNlRange.length;
}
paragraphRange = [parscanner scanNonSetCharacters];
trailingNlRange = [parscanner scanSetCharacters];
// each line
for (linescanner
= [_GNUTextScanner
scannerWithString: paragraph = [parsedString
substringWithRange:
paragraphRange]
set: selectionWordGranularitySet
invertedSet: invSelectionWordGranularitySet];
![linescanner isAtEnd];)
paragraph = [parsedString substringWithRange: paragraphRange];
lScanner = [NSScanner scannerWithString: paragraph];
[lScanner setCharactersToBeSkipped: nil];
while ([lScanner isAtEnd] == NO)
{
NSRect currentLineRect = NSMakeRect (0, drawingPoint.y, 0, 0);
NSRect currentLineRect = NSMakeRect (0, drawingPoint.y, 0, 0);
// starts with zero, do not confuse with startingLineCharIndex
unsigned localLineStartIndex = [linescanner scanLocation];
NSSize advanceSize = NSZeroSize;
unsigned localLineStartIndex = [lScanner scanLocation];
NSSize advanceSize = NSZeroSize;
// scan the individual words to the end of the line
for (; ![linescanner isAtEnd]; drawingPoint.x += advanceSize.width)
for (; ![lScanner isAtEnd]; drawingPoint.x += advanceSize.width)
{
NSRange currentStringRange, trailingSpacesRange;
NSRange leadingSpacesRange;
unsigned scannerPosition = [linescanner scanLocation];
NSRange currentStringRange, trailingSpacesRange;
NSRange leadingSpacesRange;
unsigned scannerPosition = [lScanner scanLocation];
// snack next word
// leading spaces: only first time
leadingSpacesRange = [linescanner scanSetCharacters];
currentStringRange = [linescanner scanNonSetCharacters];
trailingSpacesRange = [linescanner scanSetCharacters];
leadingSpacesRange
= scanRange(lScanner, selectionWordGranularitySet);
currentStringRange
= scanRange(lScanner, invSelectionWordGranularitySet);
trailingSpacesRange
= scanRange(lScanner, selectionWordGranularitySet);
if (leadingSpacesRange.length)
currentStringRange = NSUnionRange (leadingSpacesRange,
currentStringRange = NSUnionRange(leadingSpacesRange,
currentStringRange);
if (trailingSpacesRange.length)
currentStringRange = NSUnionRange (trailingSpacesRange,
currentStringRange = NSUnionRange(trailingSpacesRange,
currentStringRange);
// evaluate size of current word and line so far
@ -2849,7 +2756,7 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
_GNULineLayoutInfo *ghostInfo = nil, *thisInfo;
// undo layout of last word
[linescanner setScanLocation: scannerPosition];
[lScanner setScanLocation: scannerPosition];
currentLineRect.origin.x = 0;
currentLineRect.origin.y = drawingPoint.y;
@ -2952,10 +2859,10 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
// newline - induced premature lineending: flush
}
else if ([linescanner isAtEnd])
else if ([lScanner isAtEnd])
{
_GNULineLayoutInfo *thisInfo;
scannerPosition = [linescanner scanLocation];
scannerPosition = [lScanner scanLocation];
[lineLayoutInformation
addObject: (thisInfo
= [_GNULineLayoutInfo
@ -3188,7 +3095,7 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
return;
[self drawRectNoSelection: rect];
[self drawSelectionAsRange: [self selectedRange]];
[self drawSelectionAsRange: selected_range];
}
// text lays out from top to bottom
@ -3224,15 +3131,15 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
[pboard declareTypes: types owner: self];
[pboard setString: [[self string] substringWithRange: [self selectedRange]]
[pboard setString: [[self string] substringWithRange: selected_range]
forType: NSStringPboardType];
if ([self isRichText])
[pboard setData: [self RTFFromRange: [self selectedRange]]
[pboard setData: [self RTFFromRange: selected_range]
forType: NSRTFPboardType];
if ([self importsGraphics])
[pboard setData: [self RTFDFromRange: [self selectedRange]]
[pboard setData: [self RTFDFromRange: selected_range]
forType: NSRTFDPboardType];
}
@ -3248,11 +3155,11 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
- (void) delete: sender
{
[self deleteRange: [self selectedRange] backspace: NO];
[self deleteRange: selected_range backspace: NO];
}
- (void) cut: sender
{
if ([self selectedRange].length)
if (selected_range.length)
{
[self copy: self];
[self delete: self];
@ -3344,7 +3251,7 @@ _relocLayoutArray (NSMutableArray *lineLayoutInformation,
NSRange errorRange
= [[NSSpellChecker sharedSpellChecker]
checkSpellingOfString: [self string]
startingAt: NSMaxRange ([self selectedRange])];
startingAt: NSMaxRange (selected_range)];
if (errorRange.length)
[self setSelectedRange: errorRange];

View file

@ -32,26 +32,26 @@
#import <Foundation/NSNotification.h>
@interface NSTextContainer (TextViewObserver)
- (void) _textViewFrameChanged: (NSNotification *)aNotification;
- (void) _textViewFrameChanged: (NSNotification*)aNotification;
@end
@implementation NSTextContainer (TextViewObserver)
- (void) _textViewFrameChanged: (NSNotification *)aNotification
- (void) _textViewFrameChanged: (NSNotification*)aNotification
{
id textView;
NSSize newSize;
NSSize inset;
if ( _observingFrameChanges )
if (_observingFrameChanges)
{
textView = [aNotification object];
newSize = [textView frame].size;
inset = [textView textContainerInset];
if ( _widthTracksTextView )
if (_widthTracksTextView)
newSize.width = MAX(newSize.width - (inset.width * 2.0), 0.0);
if ( _heightTracksTextView )
if (_heightTracksTextView)
newSize.height = MAX(newSize.height - (inset.height * 2.0), 0.0);
[self setContainerSize: newSize];
@ -64,8 +64,10 @@
+ (void) initialize
{
if ( self == [NSTextContainer class] )
[self setVersion: 1];
if (self == [NSTextContainer class])
{
[self setVersion: 1];
}
}
- (id) initWithContainerSize: (NSSize)aSize
@ -82,36 +84,43 @@
return self;
}
- (void) setLayoutManager: (NSLayoutManager *)aLayoutManager
- (void) setLayoutManager: (NSLayoutManager*)aLayoutManager
{
ASSIGN(_layoutManager, aLayoutManager);
}
- (NSLayoutManager *) layoutManager
- (NSLayoutManager*) layoutManager
{
return _layoutManager;
}
- (void) replaceLayoutManager: (NSLayoutManager *)newLayoutManager
- (void) replaceLayoutManager: (NSLayoutManager*)newLayoutManager
{
id textStorage = [_layoutManager textStorage];
NSArray *textContainers = [_layoutManager textContainers];
unsigned i, count = [textContainers count];
[textStorage removeLayoutManager: _layoutManager];
[textStorage addLayoutManager: newLayoutManager];
[_layoutManager setTextStorage: nil];
for ( i = 0; i < count; i++ )
if (newLayoutManager != _layoutManager)
{
[newLayoutManager addTextContainer: [textContainers objectAtIndex: i]];
[_layoutManager removeTextContainerAtIndex: i];
id textStorage = [_layoutManager textStorage];
NSArray *textContainers = [_layoutManager textContainers];
unsigned i, count = [textContainers count];
[textStorage removeLayoutManager: _layoutManager];
[textStorage addLayoutManager: newLayoutManager];
[_layoutManager setTextStorage: nil];
for (i = 0; i < count; i++)
{
NSTextContainer *container;
container = RETAIN([textContainers objectAtIndex: i]);
[_layoutManager removeTextContainerAtIndex: i];
[newLayoutManager addTextContainer: container];
RELEASE(container);
}
}
}
- (void) setTextView: (NSTextView *)aTextView
- (void) setTextView: (NSTextView*)aTextView
{
if ( _textView )
if (_textView)
{
[_textView setTextContainer: nil];
[[NSNotificationCenter defaultCenter] removeObserver: self];
@ -119,17 +128,17 @@
ASSIGN(_textView, aTextView);
if ( aTextView )
if (aTextView)
{
[_textView setTextContainer: self];
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(_textViewFrameChanged: )
selector: @selector(_textViewFrameChanged:)
name: NSViewFrameDidChangeNotification
object: _textView];
}
}
- (NSTextView *) textView
- (NSTextView*) textView
{
return _textView;
}
@ -138,7 +147,7 @@
{
_containerRect = NSMakeRect(0, 0, aSize.width, aSize.height);
if ( _layoutManager )
if (_layoutManager)
[_layoutManager textContainerChangedGeometry: self];
}
@ -173,7 +182,7 @@
{
_lineFragmentPadding = aFloat;
if ( _layoutManager )
if (_layoutManager)
[_layoutManager textContainerChangedGeometry: self];
}
@ -185,7 +194,7 @@
- (NSRect) lineFragmentRectForProposedRect: (NSRect)proposedRect
sweepDirection: (NSLineSweepDirection)sweepDir
movementDirection: (NSLineMovementDirection)moveDir
remainingRect: (NSRect *)remainingRect;
remainingRect: (NSRect*)remainingRect;
{
// line fragment rectangle simply must fit within the container rectangle
*remainingRect = NSZeroRect;

File diff suppressed because it is too large Load diff

View file

@ -372,6 +372,10 @@ GSSetDragTypes(NSView* obj, NSArray *types)
- (void) removeFromSuperviewWithoutNeedingDisplay
{
/* This must be first because it invokes -resignFirstResponder:,
which assumes the view is still in the view hierarchy */
if ([_window firstResponder] == self)
[_window makeFirstResponder: _window];
/*
* We MUST make sure that coordinates are invalidated even if we have
* no superview - cos they may have been rebuilt since we lost the
@ -400,6 +404,10 @@ GSSetDragTypes(NSView* obj, NSArray *types)
- (void) removeFromSuperview
{
/* This must be first because it invokes -resignFirstResponder:,
which assumes the view is still in the view hierarchy */
if ([_window firstResponder] == self)
[_window makeFirstResponder: _window];
/*
* We MUST make sure that coordinates are invalidated even if we have
* no superview - cos they may have been rebuilt since we lost the
@ -1703,6 +1711,8 @@ GSSetDragTypes(NSView* obj, NSArray *types)
- (void) setNeedsDisplayInRect: (NSRect)rect
{
NSView *currentView = _super_view;
/*
* Limit to bounds, combine with old _invalidRect, and then check to see
* if the result is the same as the old _invalidRect - if it isn't then
@ -1713,7 +1723,6 @@ GSSetDragTypes(NSView* obj, NSArray *types)
if (NSEqualRects(rect, _invalidRect) == NO)
{
NSView *firstOpaque = [self opaqueAncestor];
NSView *currentView = _super_view;
_rFlags.needs_display = YES;
_invalidRect = rect;
@ -1726,12 +1735,16 @@ GSSetDragTypes(NSView* obj, NSArray *types)
rect = [firstOpaque convertRect: _invalidRect fromView: self];
[firstOpaque setNeedsDisplayInRect: rect];
}
while (currentView)
{
currentView->_rFlags.needs_display = YES;
currentView = currentView->_super_view;
}
}
/*
* Must make sure that superviews know that we need display.
* NB. we may have been marked as needing display and then moved to another
* parent, so we can't assume that our parent is marked simply because we are.
*/
while (currentView)
{
currentView->_rFlags.needs_display = YES;
currentView = currentView->_super_view;
}
}

View file

@ -344,9 +344,12 @@ static NSMapTable* windowmaps = NULL;
[content_view removeFromSuperview];
}
content_view = aView;
[content_view setFrame: [_wv frame]]; // Resize to fill window.
[content_view setAutoresizingMask: NSViewWidthSizable | NSViewHeightSizable];
[_wv addSubview: content_view]; // Add to our window view
[content_view setAutoresizingMask: (NSViewWidthSizable
| NSViewHeightSizable)];
[_wv addSubview: content_view];
[content_view resizeWithOldSuperviewSize: [content_view frame].size];
[content_view setFrameOrigin: [_wv bounds].origin];
NSAssert1 ([[_wv subviews] count] == 1,
@"window's view has %d subviews!", [[_wv subviews] count]);
@ -679,18 +682,25 @@ static NSMapTable* windowmaps = NULL;
if ([self isKeyWindow])
{
[self resignKeyWindow];
for (i = pos + 1; i != pos; i++)
i = pos + 1;
if (i == c)
{
i = 0;
}
while (i != pos)
{
if (i == c)
{
i = 0;
}
w = [windowList objectAtIndex: i];
if ([w isVisible] && [w canBecomeKeyWindow])
{
[w makeKeyWindow];
break;
}
i++;
if (i == c)
{
i = 0;
}
}
/*
* if we didn't find a possible key window - use the app icon or,
@ -720,18 +730,25 @@ static NSMapTable* windowmaps = NULL;
}
else
{
for (i = pos + 1; i != pos; i++)
i = pos + 1;
if (i == c)
{
i = 0;
}
while (i != pos)
{
if (i == c)
{
i = 0;
}
w = [windowList objectAtIndex: i];
if ([w isVisible] && [w canBecomeMainWindow])
{
[w makeMainWindow];
break;
}
i++;
if (i == c)
{
i = 0;
}
}
}
}

View file

@ -5,7 +5,7 @@
GNUSTEP_GUI_GCC=2.8.0
# Versions for libraries that gnustep-gui is dependent upon
GNUSTEP_GUI_BASE=0.6.0
GNUSTEP_GUI_BASE=0.6.5
LIB_FOUNDATION=0.8.1
GNUSTEP_GUI_LIBTIFF=3.4
GNUSTEP_GUI_DGS=0.5.7
@ -14,7 +14,7 @@ GNUSTEP_GUI_DPSCLIENT=6.1
# The version number of this release.
GNUSTEP_GUI_MAJOR_VERSION=0
GNUSTEP_GUI_MINOR_VERSION=6
GNUSTEP_GUI_SUBMINOR_VERSION=0
GNUSTEP_GUI_SUBMINOR_VERSION=5
GNUSTEP_GUI_VERSION=${GNUSTEP_GUI_MAJOR_VERSION}.${GNUSTEP_GUI_MINOR_VERSION}.${GNUSTEP_GUI_SUBMINOR_VERSION}
VERSION=${GNUSTEP_GUI_VERSION}

114
configure vendored
View file

@ -1,7 +1,7 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.12
# Generated automatically using autoconf version 2.13
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
@ -49,6 +49,7 @@ mandir='${prefix}/man'
# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12
@ -332,7 +333,7 @@ EOF
verbose=yes ;;
-version | --version | --versio | --versi | --vers)
echo "configure generated by autoconf version 2.12"
echo "configure generated by autoconf version 2.13"
exit 0 ;;
-with-* | --with-*)
@ -502,9 +503,11 @@ ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross
ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
@ -521,6 +524,105 @@ fi
echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
echo "configure:529: checking for main in -lm" >&5
ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lm $LIBS"
cat > conftest.$ac_ext <<EOF
#line 537 "configure"
#include "confdefs.h"
int main() {
main()
; return 0; }
EOF
if { (eval echo configure:544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"
fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
echo "$ac_t""yes" 1>&6
ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
cat >> confdefs.h <<EOF
#define $ac_tr_lib 1
EOF
LIBS="-lm $LIBS"
else
echo "$ac_t""no" 1>&6
fi
for ac_func in rintf
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:574: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 579 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
#include <assert.h>
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char $ac_func();
int main() {
/* The GNU C library defines this for functions which it implements
to always fail with ENOSYS. Some functions are actually named
something starting with __ and the normal name is an alias. */
#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif
; return 0; }
EOF
if { (eval echo configure:602: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_func_$ac_func=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
echo "$ac_t""yes" 1>&6
ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
else
echo "$ac_t""no" 1>&6
fi
done
trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
@ -544,7 +646,7 @@ EOF
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(set) 2>&1 |
case `(ac_space=' '; set) 2>&1` in
case `(ac_space=' '; set | grep ac_space) 2>&1` in
*ac_space=\ *)
# `set' does not quote correctly, so add quotes (double-quote substitution
# turns \\\\ into \\, and sed turns \\ into \).
@ -611,7 +713,7 @@ do
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
echo "$CONFIG_STATUS generated by autoconf version 2.12"
echo "$CONFIG_STATUS generated by autoconf version 2.13"
exit 0 ;;
-help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;;
@ -630,9 +732,11 @@ sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
$ac_vpsub
$extrasub
s%@SHELL@%$SHELL%g
s%@CFLAGS@%$CFLAGS%g
s%@CPPFLAGS@%$CPPFLAGS%g
s%@CXXFLAGS@%$CXXFLAGS%g
s%@FFLAGS@%$FFLAGS%g
s%@DEFS@%$DEFS%g
s%@LDFLAGS@%$LDFLAGS%g
s%@LIBS@%$LIBS%g

View file

@ -27,6 +27,9 @@ AC_INIT(Source/NSApplication.m)
AC_CONFIG_HEADER(Headers/gnustep/gui/config.h)
AC_CHECK_LIB(m, main)
AC_CHECK_FUNCS(rintf)
AC_OUTPUT()

121
gnustep-gui.spec Normal file
View file

@ -0,0 +1,121 @@
# This package is not relocatable
%define ver 0.6.5
%define date 20000217
%define prefix /usr
%define gsr %{prefix}/GNUstep
%define libcombo gnu-gnu-gnu-xgps
Name: gnustep-gui
Version: %{ver}
Release: 1
Source: ftp://ftp.gnustep.org/pub/gnustep/core/gstep-gui-%{ver}.tar.gz
#Source: /cvs/gnustep-gui-%{ver}-%{date}.tar.gz
Copyright: GPL
Group: Development/Tools
Summary: GNUstep GUI library package
Packager: Christopher Seawood <cls@seawood.org>
Distribution: Seawood's Random RPMS (%{_buildsym})
Vendor: The Seawood Project
URL: http://www.gnustep.org/
BuildRoot: /var/tmp/build-%{name}
Conflicts: gnustep-core
Requires: gnustep-base
%description
It is a library of graphical user interface classes written
completely in the Objective-C language; the classes are based upon the
OpenStep specification as release by NeXT Software, Inc. The library
does not completely conform to the specification and has been enhanced
in a number of ways to take advantage of the GNU system. These classes
include graphical objects such as buttons, text fields, popup lists,
browser lists, and windows; there are also many associated classes for
handling events, colors, fonts, pasteboards and images.
Library combo is %{libcombo}.
%{_buildblurb}
%package devel
Summary: GNUstep GUI headers and libs.
Group: Development/Libraries
Requires: %{name} = %{ver}, gnustep-base-devel
Conflicts: gnustep-core
%description devel
Header files required to build applications against the GNUstep GUI library.
Library combo is %{libcombo}.
%{_buildblurb}
%prep
%setup -q -n gstep-%{ver}/gui
%patch -p2 -b .headers
%build
if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then
. %{gsr}/Makefiles/GNUstep.sh
fi
CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{gsr} --with-library-combo=%{libcombo}
make
%install
rm -rf $RPM_BUILD_ROOT
if [ -z "$GNUSTEP_SYSTEM_ROOT" ]; then
. %{gsr}/Makefiles/GNUstep.sh
fi
mkdir -p ${RPM_BUILD_ROOT}%{gsr}/Library/Services
make install GNUSTEP_INSTALLATION_DIR=${RPM_BUILD_ROOT}%{gsr}
cat > filelist.rpm.in << EOF
%defattr (-, bin, bin)
%doc ANNOUNCE COPYING* ChangeLog INSTALL NEWS NOTES README SUPPORT Version
%dir %{gsr}/Library
%{gsr}/Libraries/GSARCH/GSOS/%{libcombo}/lib*.so.*
%{gsr}/Libraries/Resources
%{gsr}/Library/Model
%{gsr}/Library/Services/*
%{gsr}/Tools/make_services
%{gsr}/Tools/set_show_service
# gpbs is now provided by xgps
#%{gsr}/Tools/GSARCH/GSOS/%{libcombo}/gpbs
%{gsr}/Tools/GSARCH/GSOS/%{libcombo}/make_services
%{gsr}/Tools/GSARCH/GSOS/%{libcombo}/set_show_service
EOF
cat > filelist-devel.rpm.in << EOF
%defattr(-, bin, bin)
%{gsr}/Headers/gnustep/gui
%{gsr}/Libraries/GSARCH/GSOS/%{libcombo}/lib*.so
EOF
sed -e "s|GSARCH|${GNUSTEP_HOST_CPU}|" -e "s|GSOS|${GNUSTEP_HOST_OS}|" < filelist.rpm.in > filelist.rpm
sed -e "s|GSARCH|${GNUSTEP_HOST_CPU}|" -e "s|GSOS|${GNUSTEP_HOST_OS}|" < filelist-devel.rpm.in > filelist-devel.rpm
# Don't worry about ld.so.conf on linux as gnustep-base should take care of it.
%ifos Linux
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
%endif
%clean
rm -rf $RPM_BUILD_ROOT
%files -f filelist.rpm
%files -f filelist-devel.rpm devel
%changelog
* Sat Sep 18 1999 Christopher Seawood <cls@seawood.org>
- Version 0.6.0
- Added headers patch
* Sat Aug 07 1999 Christopher Seawood <cls@seawood.org>
- Updated to cvs dawn_6 branch
* Sat Jun 26 1999 Christopher Seawood <cls@seawood.org>
- Split into separate rpm from gnustep-core
- Build from cvs snapshot
- Split into -devel, -libs & -zoneinfo packages