📄 xmcombo.c
字号:
/*
* ComboBox.c - Das schon lange schmerzlich vermisste Combo-Box-
* Widget -- nun endlich auf fuer Motif!
*
* Version 1.32a -- 04.10.95
*
* Letzte Modifikation:
* 04.10.1995 Layoutfehler behoben, der bei angezeigter horizontaler Liste
* dazu fuehrt, dass das Listenfeld schrumpft. Daneben wird
* jetzt auch der Fall beruecksichtigt, dass das Listenfeld am
* unteren Bildschirmrand abgeschnitten wuerde. In diesem Fall
* erscheint das Listenfeld oberhalb des Eingabefeldes.
* 20.03.1995 XmNscrollbarDisplayPolicy,... koennen nun immer vom Pro-
* grammierer gesetzt werden, statische Liste hin und her.
* 21.10.1994 Fehler in SetValues behoben, der auftritt, wenn man versucht,
* XmNitems und XmNitemCount zu setzen.
* 01.10.1994 Externe Sortierung wird nun unterstuetzt sowie seitenweises
* Rollen in der Liste mittels PgUp und PgDn.
* 25.09.1994 Unterstuetzung fuer XmNautomaticSelection implementiert.
* Damit wird die Sache noch ein bischen runder in der Bedienung.
* Des weiteren sind etliche Callbacks neu hinzugekommen.
* 04.09.1994 Erweiterungen fuer XmSINGLE_SELECT eingebaut. Ausserdem
* kann die Liste jetzt auch statisch unterhalb des Eingabe-
* felds erscheinen. Damit sind wir nun noch kompatibler ge-
* worden -- fragt sich nur, zu was?!
* 29.08.1994 Alle Mirror-Ressourcen tauchen nun auch in der Ressourcen-
* liste der ComboBox-Klasse auf. Allerdings stehen keine
* sinnvollen Werte fuer die Initialisierung 'drin. Weiterhin
* den GeometryManager so veraendert, dass ab sofort das
* Label in der Breite wachsen oder schrumpfen darf.
* 07.06.1994 XmNmnemonic und XmNmnemonicCharSet implementiert.
* 29.05.1994 XmNsensitive angepasst. XmNcursorPositionVisible ist nun
* False, falls die ComboBox nicht editierbar ist.
* 07.05.1994 Drag'n'Drop funktioniert endlich!!! Zudem Anpassung an
* den fvwm ausgefuehrt ('st vom Focus-Verhalten ja ein halber
* twm). Hach', so'ne Linux-Box mit Motif 1.2 macht doch
* einfach Spass... vor allem geht hier so richtig die Post ab.
* Das kann man ja von M$ Windoze (Windoze for Mondays) nicht
* behaupten!
* 14.04.1994 Ein paar Speicherlecks korrigiert.
* 21.02.1994 Die Resourcen XmNitems und XmNitemCount lassen sich nun
* auch von einer Resourcendatei aus initialisieren. ACHTUNG:
* diese beiden Resourcen mussen immer beide beim Aufruf von
* XtSetValues zugleich angegeben werden, ansonsten werden
* diese Angaben ignoriert.
* 03.02.1994 Convenience-Funktionen auf Vordermann gebracht und noch
* einen Callback eingebaut, der immer dann aufgerufen wird,
* wenn die List angezeigt oder wieder versteckt wird.
* 01.02.1994 Motif 1.2-fest!!! Das wird aber heute abend gefeiert!!
* Endlich EIN Alptraum weniger! Naja, Drag'n'Drop bleibt
* noch zu loesen. Spaeter...
* 31.01.1994 VAX-fest (mit Hilfe von Vincenct Li)
* owlm sollte man abschaffen! Aber es scheint so, als ob
* ich jetzt doch noch das FocusOut-Problem geknackt habe.
* Ebenso die OSF...mit viel Arbeit habe ich nun auch noch
* eine anstaendige Initialisierung der Fontliste des Label-
* Kinds erreicht.
* 12.01.1994 Revisionsstand: 1.10a
* nun wirklich voll ANSI-faehiger C-Code
* Pixmaps werden ggf. aufgeraeumt; Druckrichtung
* wird vom Vater erfragt und an das Label weiter-
* gegeben.
* ESC-Behandlung implementiert.
* Spiegel-Ressourcen-Initialisierung aus Ressourcen-Daten-
* bank implementiert.
* Weitergabe von neu gesetzten Farben an die Kinder
* implementiert.
* Combo-Box kann jetzt wahlweise auch links neben dem
* Eingabefeld ein Label anzeigen.
* 09.12.1993 Revisionsstand: 1.00
* erste oeffentlich zugaengliche Version der Combo-Box
*
* (c) 1993, 1994, 1995 Harald Albrecht
* Institut fuer Geometrie und Praktische Mathematik
* RWTH Aachen, Germany
* albrecht@igpm.rwth-aachen.de
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program (see the file COPYING for more details);
* if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
* Cambridge, MA 02139, USA.
*
*/
#ifdef __VMS
/* vms_x_fix.h should be included before any of the X11/Motif headers */
#include <wx/vms_x_fix.h>
#undef XtDisplay
#undef XtScreen
#undef XtWindow
#undef XtIsRealized
#undef XtParent
#undef XtClass
#endif
/* get XmVersion definition */
#include <Xm/Xm.h>
#if (XmVersion < 2000)
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/cursorfont.h>
#include <X11/Shell.h>
#ifdef VMS /* Huch, wo gibt's denn noch sowas ... ?! */
/* Bitte keine Mail bzgl. dieser Bemerkung schicken...
* Ich weiss, das ist ein Vorurteil...aber es gibt
* ja auch wahre Vorurteile....
*/
#include <Xmu/Converters.h>
#else
#include <X11/Xmu/Converters.h>
#endif
#include <Xm/ArrowB.h>
#include <Xm/TextF.h>
#include <Xm/List.h>
#include <Xm/LabelP.h>
#include <string.h>
#include <ctype.h> /* define toupper */
#include "combop.h"
#include <stdio.h>
/* --- Systemspezifische Definitionen */
#if defined(VMS)
#define strcasecmp(s1, s2) strcmp(s1, s2)
#elif defined(__EMX__)
#define strcasecmp stricmp
#endif
/* --- sonstiger Quark */
/* #ifdef DEBUG */
#if 0
#define LOG(p1) fprintf(stderr, p1);
#define LOG2(p1, p2) fprintf(stderr, p1, p2);
#define LOG3(p1, p2, p3) fprintf(stderr, p1, p2, p3);
#else
#define LOG(p1)
#define LOG2(p1, p2)
#define LOG3(p1, p2, p3)
#endif
/* ---------------------------------------------------------------------------
* Resourcen-Liste...
* Hier werden diejenigen Resourcen definiert, die von "aussen" - also fuer
* den Programmierer oder Anwender - benutzbar und veraenderbar sind.
*
* Der Aufbau der einzelnen Eintraege ist immer wieder gleich:
* Resourcen-Name XmN... oder XtN
* Resourcen-Klasse XmC... oder XtC
* Resourcen-Type XmR... oder XtR (Datentyp der Variable in der
* struct der jeweiligen Widgetinstanz)
* Resourcen-Groesse aktuelle Groesse dieses Datentyps
* Resourcen-Offset Lage der Variable innerhalb der struct der
* Widgetinstanz
* Defaultwert-Type Typ des Defaultwertes
* Defaultwert (normalerweise) Zeiger auf den Defaultwert
*/
#define offset(field) XtOffsetOf(XmComboBoxRec, field)
static XtResource resources[] = {
{ /* Eingabefeld kann veraendert werden, oder aber es sind nur
* die Vorgaben aus der Liste auswaehlbar.
*/
XmNeditable, XmCEditable, XmRBoolean, sizeof(Boolean),
offset(combobox.Editable), XmRString, "False"
},
{ /* Liste wird automatisch sortiert -- wie konnten die bei
* der OSF denn SOETWAS nur vergessen ??
*/
XmNsorted, XmCSorted, XmRBoolean, sizeof(Boolean),
offset(combobox.Sorted), XmRString, "False"
},
{ /* externe Sortierreihenfolge */
XmNsortingCallback, XmCSortingCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.SortingCBL), XmRCallback, NULL
},
{ /* Anzahl auf einmal sichtbarer Eintraege in der Liste (ent-
* spricht damit der Listenhoehe.
*/
XmNvisibleItemCount, XmCVisibleItemCount, XmRInt, sizeof(int),
offset(combobox.VisibleItemCount), XmRImmediate, (caddr_t) 8
},
{ /* Fuer das Eingabefeld sowie die Liste verwandte Fonts */
XmNfontList, XmCFontList, XmRFontList, sizeof(XmFontList),
offset(combobox.Font), XmRImmediate, NULL
},
{ /* Rueckruf bei Anwahl */
XmNselectionCallback, XmCSelectionCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.SelectionCBL), XmRCallback, NULL
},
{ /* Gegenteil zum vorherigen Callback! */
XmNunselectionCallback, XmCUnselectionCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.UnselectionCBL), XmRCallback, NULL
},
{ /* Doppelklick in der Liste */
XmNdefaultActionCallback, XmCCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.DefaultActionCBL), XmRCallback, NULL
},
{ /* Rueckruf bei Liste ausklappen/verstecken */
XmNdropDownCallback, XmCDropDownCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.DropDownCBL), XmRCallback, NULL
},
{ /* Eingabe abchecken... */
XmNmodifyVerifyCallback, XmCCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.ModifyVerifyCBL), XmRCallback, NULL
},
{
XmNvalueChangedCallback, XmCCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.ValueChangedCBL), XmRCallback, NULL
},
{
XmNactivateCallback, XmCCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.ActivateCBL), XmRCallback, NULL
},
{
XmNmotionVerifyCallback, XmCCallback, XmRCallback,
sizeof(XtCallbackList),
offset(combobox.MotionVerifyCBL), XmRCallback, NULL
},
{ /* Verhalten der ausgeklappten Liste bei Focus-Out */
XmNpersistentDropDown, XmCPersistentDropDown, XmRBoolean,
sizeof(Boolean),
offset(combobox.Persistent), XmRString, "False"
},
{ /* Wie verhaelt sich der Window-Manager? */
XmNtwmHandlingOn, XmCTwmHandlingOn, XmRBoolean, sizeof(Boolean),
offset(combobox.TwmHandlingOn), XmRString, "False"
},
{ /* Label anzeigen oder nicht? */
XmNshowLabel, XmCShowLabel, XmRBoolean, sizeof(Boolean),
offset(combobox.ShowLabel), XmRString, "False"
},
{ /* Abstand zw. linkem Rand Eingabefeld und linkem Rand Liste */
XmNdropDownOffset, XmCDropDownOffset, XmRPosition,
sizeof(Position), offset(combobox.DropDownOffset),
XmRImmediate, (caddr_t) -1
},
{ /* Neue Voreinstellung bzgl. des Randes */
XmNborderWidth, XmCBorderWidth, XmRDimension, sizeof(Dimension),
offset(core.border_width), XmRImmediate, (caddr_t) 0
},
{ /* welcher Cursor soll in der Dropdown-Liste benutzt werden? */
XmNdropDownCursor, XmCDropDownCursor, XmRCursor, sizeof(Cursor),
offset(combobox.ArrowCursor), XmRString, "center_ptr"
},
{ /* wie lassen sich Eintraege auswaehlen? */
XmNselectionPolicy, XmCSelectionPolicy, XmRSelectionPolicy, sizeof(unsigned char),
offset(combobox.SelectionPolicy), XmRImmediate, (caddr_t) XmBROWSE_SELECT
},
{ /* Wann werden die Callbacks aufgerufen? */
XmNautomaticSelection, XmCAutomaticSelection, XmRBoolean, sizeof(Boolean),
offset(combobox.AutomaticSelection), XmRString, "False"
},
{ /* erscheint die Liste staendig? */
XmNstaticList, XmCStaticList, XmRBoolean, sizeof(Boolean),
offset(combobox.StaticList), XmRString, "False"
},
{
XmNscrollBarDisplayPolicy, XmCScrollBarDisplayPolicy, XmRScrollBarDisplayPolicy, sizeof(unsigned char),
offset(combobox.ScrollBarDisplayPolicy), XmRImmediate, (caddr_t) XmAS_NEEDED
},
{
XmNlistSizePolicy, XmCListSizePolicy, XmRListSizePolicy, sizeof(unsigned char),
offset(combobox.ListSizePolicy), XmRImmediate, (caddr_t) XmVARIABLE
},
{
XmNsquareArrow, XmCSquareArrow, XmRBoolean, sizeof(Boolean),
offset(combobox.SquareArrow), XmRString, "False"
},
{
XmNarrowSpacingOn, XmCArrowSpacingOn, XmRBoolean, sizeof(Boolean),
offset(combobox.ArrowSpacingOn), XmRString, "True"
},
#ifndef DONT_LOOK_IN_THE_MIRROR
/* Mirror-Ressourcen, Adressen sind ungueltig!!!! */
{
XmNalignment, XmCAlignment, XmRAlignment, sizeof(unsigned char),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNblinkRate, XmCBlinkRate, XmRInt, sizeof(int),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNcolumns, XmCColumns, XmRShort, sizeof(short),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNcursorPosition, XmCCursorPosition, XmRTextPosition, sizeof(XmTextPosition),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNitemCount, XmCItemCount, XmRInt, sizeof(int),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
{
XmNitems, XmCItems, XmRXmStringTable, sizeof(XmStringTable),
offset(combobox.Dummy), XmRImmediate, (caddr_t) 0
},
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -