📄 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 }, { XmNlabelFontList, XmCLabelFontList, XmRFontList, sizeof(XmFontList), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelInsensitivePixmap, XmCLabelInsensitivePixmap, XmRPixmap, sizeof(Pixmap), offset(combobox.Dummy), XmRImmediate, (caddr_t) 0 }, { XmNlabelMarginBottom, XmCLabelMarginBottom, XmRDimension, sizeof(Dimension),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -