mirror of
https://github.com/gnustep/libs-gui.git
synced 2025-04-22 13:10:59 +00:00
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:
parent
1b97488859
commit
b33bb418f4
42 changed files with 2343 additions and 1170 deletions
78
ANNOUNCE
78
ANNOUNCE
|
@ -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
93
BUGS
Normal 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
297
ChangeLog
|
@ -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>
|
||||
|
||||
|
|
|
@ -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/})
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -189,6 +189,7 @@ typedef enum {
|
|||
// Path modifications.
|
||||
//
|
||||
- (NSBezierPath *)bezierPathByFlatteningPath;
|
||||
|
||||
- (NSBezierPath *)bezierPathByReversingPath;
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -113,7 +113,6 @@
|
|||
SEL mi_action;
|
||||
int mi_tag;
|
||||
id mi_representedObject;
|
||||
BOOL mi_hasSubmenu;
|
||||
NSMenu *mi_submenu;
|
||||
BOOL mi_changesState;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -42,4 +42,7 @@
|
|||
if (pointer) free(pointer)
|
||||
#endif
|
||||
|
||||
/* Define if you have the rintf function. */
|
||||
#undef HAVE_RINTF
|
||||
|
||||
#endif /* _GNUstep_H_config */
|
||||
|
|
2
INSTALL
2
INSTALL
|
@ -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'
|
||||
========================
|
||||
|
|
|
@ -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
70
NEWS
|
@ -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
6
README
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
@ -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];
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
417
Source/NSText.m
417
Source/NSText.m
|
@ -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];
|
||||
|
|
|
@ -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
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
4
Version
4
Version
|
@ -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
114
configure
vendored
|
@ -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
|
||||
|
|
|
@ -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
121
gnustep-gui.spec
Normal 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
|
||||
|
Loading…
Reference in a new issue