Initial import of Scalos. To decrease size I have
[AROS-Contrib.git] / scalos / Plugins / Prefs / Palette / PalettePrefs.c
blob5ce47aa0305617a36d245a235b3de8122abffb16
1 // PalettePrefs.c
2 // $Date$
3 // $Revision$
5 #ifdef __AROS__
6 #define MUIMASTER_YES_INLINE_STDARG
7 #endif
9 #include <stdlib.h>
10 #include <string.h>
11 #include <stdio.h>
12 #include <stddef.h>
13 #include <dos/dos.h>
14 #include <exec/types.h>
15 #include <exec/memory.h>
16 #include <exec/ports.h>
17 #include <exec/io.h>
18 #include <exec/resident.h>
19 #include <utility/utility.h>
20 #include <libraries/dos.h>
21 #include <libraries/dosextens.h>
22 #include <libraries/gadtools.h>
23 #include <libraries/asl.h>
24 #include <libraries/mui.h>
25 #include <libraries/iffparse.h>
26 #include <devices/clipboard.h>
27 #include <workbench/workbench.h>
28 #include <workbench/icon.h>
29 #include <intuition/intuition.h>
30 #include <intuition/classusr.h>
31 #include <graphics/gfxmacros.h>
32 #include <prefs/prefhdr.h>
34 #include <clib/alib_protos.h>
36 #define __USE_SYSBASE
38 #include <proto/exec.h>
39 #include <proto/dos.h>
40 #include <proto/icon.h>
41 #include <proto/graphics.h>
42 #include <proto/intuition.h>
43 #include <proto/gadtools.h>
44 #include <proto/utility.h>
45 #include <proto/asl.h>
46 #include <proto/locale.h>
47 #include <proto/iffparse.h>
49 #ifndef __AROS__
50 #define NO_INLINE_STDARG
51 #endif
52 #include <proto/muimaster.h>
54 #include <mui/NListview_mcc.h>
55 #include <mui/Lamp_mcc.h>
56 #include <scalos/palette.h>
57 #include <defs.h>
58 #include <Year.h>
60 #include <scalos/scalosprefsplugin.h>
62 #include <defs.h>
63 #include <Year.h>
65 #include "PalettePrefs.h"
66 #include "DataTypesMCC.h"
68 #define ScalosPalette_NUMBERS
69 #define ScalosPalette_ARRAY
70 #define ScalosPalette_CODE
71 #include STR(SCALOSLOCALE)
73 #include "plugin.h"
75 //----------------------------------------------------------------------------
77 #ifdef __AROS__
78 #define NewColorAdjustObject BOOPSIOBJMACRO_START(NewColorAdjustClass->mcc_Class)
79 #define NewPalettePenListObject BOOPSIOBJMACRO_START(NewPalettePenListClass->mcc_Class)
80 #define NewScalosPenListObject BOOPSIOBJMACRO_START(NewScalosPenListClass->mcc_Class)
81 #define myNListObject BOOPSIOBJMACRO_START(myNListClass->mcc_Class)
82 #define DataTypesImageObject BOOPSIOBJMACRO_START(DataTypesImageClass->mcc_Class)
83 #else
84 #define NewColorAdjustObject NewObject(NewColorAdjustClass->mcc_Class, 0
85 #define NewPalettePenListObject NewObject(NewPalettePenListClass->mcc_Class, 0
86 #define NewScalosPenListObject NewObject(NewScalosPenListClass->mcc_Class, 0
87 #define myNListObject NewObject(myNListClass->mcc_Class, 0
88 #define DataTypesImageObject NewObject(DataTypesImageClass->mcc_Class, 0
89 #endif
91 //----------------------------------------------------------------------------
93 #define IMG(prefix1,PREFIX2) \
94 BodychunkObject,\
95 MUIA_FixWidth , PREFIX2##_WIDTH ,\
96 MUIA_FixHeight , PREFIX2##_HEIGHT,\
97 MUIA_Bitmap_Width , PREFIX2##_WIDTH ,\
98 MUIA_Bitmap_Height , PREFIX2##_HEIGHT,\
99 MUIA_Bodychunk_Depth , PREFIX2##_DEPTH ,\
100 MUIA_Bodychunk_Body , (UBYTE *) prefix1##_body,\
101 MUIA_Bodychunk_Compression, PREFIX2##_COMPRESSION,\
102 MUIA_Bodychunk_Masking , PREFIX2##_MASKING,\
103 MUIA_Bitmap_SourceColors , (ULONG *) prefix1##_colors,\
104 MUIA_Bitmap_Transparent , 0,\
107 //----------------------------------------------------------------------------
109 // from DoLoadDT.c
110 extern Object *DoLoadDT(STRPTR source, struct RastPort *rast,
111 struct ColorMap *cmap,
112 int x, int y, int w, int h,
113 ULONG FirstTag, ...);
115 //----------------------------------------------------------------------------
117 // local data structures
119 #define KeyButtonHelp(name,key,HelpText)\
120 TextObject,\
121 ButtonFrame,\
122 MUIA_CycleChain, TRUE, \
123 MUIA_Font, MUIV_Font_Button,\
124 MUIA_Text_Contents, name,\
125 MUIA_Text_PreParse, "\33c",\
126 MUIA_Text_HiChar , key,\
127 MUIA_ControlChar , key,\
128 MUIA_InputMode , MUIV_InputMode_RelVerify,\
129 MUIA_Background , MUII_ButtonBack,\
130 MUIA_ShortHelp, HelpText,\
133 #define CheckMarkHelp(selected, HelpTextID)\
134 ImageObject,\
135 ImageButtonFrame,\
136 MUIA_CycleChain , TRUE, \
137 MUIA_InputMode , MUIV_InputMode_Toggle,\
138 MUIA_Image_Spec , MUII_CheckMark,\
139 MUIA_Image_FreeVert , TRUE,\
140 MUIA_Selected , selected,\
141 MUIA_Background , MUII_ButtonBack,\
142 MUIA_ShowSelState , FALSE,\
143 MUIA_ShortHelp , GetLocString(HelpTextID),\
146 #define Application_Return_EDIT 0
147 #define Application_Return_USE 1001
148 #define Application_Return_SAVE 1002
150 #define ID_SPAL MAKE_ID('S','P','A','L')
151 #define ID_PENS MAKE_ID('P','E','N','S')
154 #define PEN_UNDEFINED (-1)
157 struct NewScalosPenListInst
159 ULONG nspl_fDragging;
162 struct PensListConstruct
164 ULONG splc_Red;
165 ULONG splc_Green;
166 ULONG splc_Blue;
169 struct PensListEntry
171 // Red,Green,Blue MUST be the very first entries!
172 // (used for MUIA_Coloradjust_RGB)
173 ULONG sple_Red;
174 ULONG sple_Green;
175 ULONG sple_Blue;
177 ULONG sple_Index;
180 struct ScalosPenListEntry
182 WORD snle_PenIndex;
183 WORD snle_PenNr;
184 CONST_STRPTR snle_PenName;
187 struct PenListInit
189 WORD pli_PenIndex;
190 WORD pli_PenNr;
191 ULONG pli_PenNameID;
194 struct RGB
196 ULONG rgb_Red;
197 ULONG rgb_Green;
198 ULONG rgb_Blue;
201 static const LONG StopChunkList[] =
203 ID_PREF, ID_SPAL,
204 ID_PREF, ID_PENS,
207 //----------------------------------------------------------------------------
209 // aus mempools.lib
210 #if !defined(__amigaos4__) && !defined(__AROS__)
211 extern int _STI_240_InitMemFunctions(void);
212 extern void _STD_240_TerminateMemFunctions(void);
213 #endif
215 //----------------------------------------------------------------------------
217 // local functions
219 DISPATCHER_PROTO(PalettePrefs);
220 static BOOL CreatePalettePrefsObject(struct PalettePrefsInst *inst, struct opSet *ops);
221 static void DisposePalettePrefsObject(struct PalettePrefsInst *inst);
222 static Object *CreatePrefsGroup(struct PalettePrefsInst *inst);
223 static Object *CreatePrefsImage(void);
224 static void InitHooks(struct PalettePrefsInst *inst);
226 static BOOL OpenLibraries(void);
227 static void CloseLibraries(void);
228 static STRPTR GetLocString(ULONG MsgId);
229 static void TranslateNewMenu(struct NewMenu *nm);
230 //static void TranslateStringArray(STRPTR *stringArray);
231 DISPATCHER_PROTO(NewColorAdjust);
232 DISPATCHER_PROTO(NewPalettePenList);
233 DISPATCHER_PROTO(NewScalosPenList);
234 static APTR AllocatedPensListConstructFunc(struct Hook *hook, APTR memPool, struct PensListEntry *spleNew);
235 static void AllocatedPensListDestructFunc(struct Hook *hook, APTR memPool, APTR Entry);
236 static ULONG AllocatedPensListDisplayFunc(struct Hook *hook, Object *obj, struct NList_DisplayMessage *ndm);
237 static LONG AllocatedPensListCompareFunc(struct Hook *hook, Object *obj, struct NList_CompareMessage *ncm);
238 static APTR WBPensListConstructFunc(struct Hook *hook, APTR memPool, struct PensListEntry *spleNew);
239 static void WBPensListDestructFunc(struct Hook *hook, APTR memPool, APTR Entry);
240 static ULONG WBPensListDisplayFunc(struct Hook *hook, Object *obj, struct NList_DisplayMessage *ndm);
241 static LONG WBPensListCompareFunc(struct Hook *hook, Object *obj, struct NList_CompareMessage *ncm);
242 static APTR ScalosPenListConstructFunc(struct Hook *hook, APTR memPool, struct ScalosPenListEntry *msg);
243 static void ScalosPenListDestructFunc(struct Hook *hook, APTR memPool, APTR Entry);
244 static ULONG ScalosPenListDisplayFunc(struct Hook *hook, Object *obj, struct NList_DisplayMessage *ndm);
245 static LONG ScalosPenListCompareFunc(struct Hook *hook, Object *obj, struct NList_CompareMessage *ncm);
246 static STRPTR GetLocString(ULONG MsgId);
247 static void GetWBColorsFunc(struct Hook *hook, Object *pop, Object *win);
248 static APTR AddPenFunc(struct Hook *hook, Object *o, Msg msg);
249 static APTR SelectPalettePenFunc(struct Hook *hook, Object *o, Msg msg);
250 static APTR SelectScalosPenFunc(struct Hook *hook, Object *o, Msg msg);
251 static APTR ChangePenColorFunc(struct Hook *hook, Object *o, ULONG **msg);
252 static APTR ResetToDefaultsFunc(struct Hook *hook, Object *o, Msg msg);
253 static APTR AboutFunc(struct Hook *hook, Object *o, Msg msg);
254 static APTR OpenFunc(struct Hook *hook, Object *o, Msg msg);
255 static APTR LastSavedFunc(struct Hook *hook, Object *o, Msg msg);
256 static APTR RestoreFunc(struct Hook *hook, Object *o, Msg msg);
257 static APTR SaveAsFunc(struct Hook *hook, Object *o, Msg msg);
258 static APTR DeletePenFunc(struct Hook *hook, Object *o, Msg msg);
259 static APTR ContextMenuTriggerHookFunc(struct Hook *hook, Object *o, Msg msg);
260 static void AslIntuiMsgHookFunc(struct Hook *hook, Object *o, Msg msg);
261 static void InitPenList(struct PalettePrefsInst *inst);
262 static LONG ReadPrefsFile(struct PalettePrefsInst *inst, CONST_STRPTR Filename, BOOL Quiet);
263 static void SearchAndSetPen(struct PalettePrefsInst *inst, const struct ScalosPen *sPen);
264 static LONG WritePrefsFile(struct PalettePrefsInst *inst, CONST_STRPTR Filename);
265 static LONG SaveIcon(struct PalettePrefsInst *inst, CONST_STRPTR IconName);
266 static void UpdatePalettePenCount(struct PalettePrefsInst *inst);
267 static ULONG GetPenReferenceCount(struct PalettePrefsInst *inst, ULONG PenNr);
268 static void SetChangedFlag(struct PalettePrefsInst *inst, BOOL changed);
269 DISPATCHER_PROTO(myNList);
270 static LONG ColorComp(ULONG Color1, ULONG Color2);
271 static LONG RGBComp(const struct PensListEntry *sple1, const struct PensListEntry *sple2);
273 //----------------------------------------------------------------------------
275 // local data items
277 struct Library *MUIMasterBase;
278 T_LOCALEBASE LocaleBase;
279 struct GfxBase *GfxBase;
280 struct Library *IconBase;
281 struct Library *IFFParseBase;
282 T_UTILITYBASE UtilityBase;
283 struct IntuitionBase *IntuitionBase;
284 struct Library *DataTypesBase;
286 #if defined(__GNUC__) && !defined(__amigaos4__)
287 extern T_UTILITYBASE __UtilityBase;
288 #endif /* __GNUC__ */
290 #ifdef __amigaos4__
291 struct Library *DOSBase;
292 struct DOSIFace *IDOS;
293 struct MUIMasterIFace *IMUIMaster;
294 struct LocaleIFace *ILocale;
295 struct GraphicsIFace *IGraphics;
296 struct IconIFace *IIcon;
297 struct IFFParseIFace *IIFFParse;
298 struct UtilityIFace *IUtility;
299 struct IntuitionIFace *IIntuition;
300 struct DataTypesIFace *IDataTypes;
301 struct Library *NewlibBase;
302 struct Interface *INewlib;
303 #endif
305 #ifdef __AROS__
306 struct DosLibrary *DOSBase;
307 #endif
309 struct MUI_CustomClass *NewColorAdjustClass;
310 struct MUI_CustomClass *NewPalettePenListClass;
311 struct MUI_CustomClass *NewScalosPenListClass;
312 struct MUI_CustomClass *myNListClass;
313 struct MUI_CustomClass *DataTypesImageClass;
315 struct MUI_CustomClass *PalettePrefsClass;
317 static struct Catalog *PalettePrefsCatalog;
318 static struct Locale *PalettePrefsLocale;
320 static ULONG MajorVersion, MinorVersion;
322 static ULONG Signature = 0x4711;
324 static const struct MUIP_ScalosPrefs_MCCList RequiredMccList[] =
326 { MUIC_Lamp, 11, 1 },
327 { MUIC_NListview, 18, 0 },
328 { NULL, 0, 0 }
331 static const struct Hook PalettePrefsHooks[] =
333 { { NULL, NULL }, HOOKFUNC_DEF(WBPensListConstructFunc), NULL },
334 { { NULL, NULL }, HOOKFUNC_DEF(WBPensListDestructFunc), NULL },
335 { { NULL, NULL }, HOOKFUNC_DEF(WBPensListDisplayFunc), NULL },
336 { { NULL, NULL }, HOOKFUNC_DEF(WBPensListCompareFunc), NULL },
338 { { NULL, NULL }, HOOKFUNC_DEF(AllocatedPensListConstructFunc), NULL },
339 { { NULL, NULL }, HOOKFUNC_DEF(AllocatedPensListDestructFunc), NULL },
340 { { NULL, NULL }, HOOKFUNC_DEF(AllocatedPensListDisplayFunc), NULL },
341 { { NULL, NULL }, HOOKFUNC_DEF(AllocatedPensListCompareFunc), NULL },
343 { { NULL, NULL }, HOOKFUNC_DEF(ScalosPenListConstructFunc), NULL },
344 { { NULL, NULL }, HOOKFUNC_DEF(ScalosPenListDestructFunc), NULL },
345 { { NULL, NULL }, HOOKFUNC_DEF(ScalosPenListDisplayFunc), NULL },
346 { { NULL, NULL }, HOOKFUNC_DEF(ScalosPenListCompareFunc), NULL },
348 { { NULL, NULL }, HOOKFUNC_DEF(GetWBColorsFunc), NULL },
350 { { NULL, NULL }, HOOKFUNC_DEF(AddPenFunc), NULL },
351 { { NULL, NULL }, HOOKFUNC_DEF(SelectPalettePenFunc), NULL },
352 { { NULL, NULL }, HOOKFUNC_DEF(SelectScalosPenFunc), NULL },
353 { { NULL, NULL }, HOOKFUNC_DEF(ChangePenColorFunc), NULL },
354 { { NULL, NULL }, HOOKFUNC_DEF(ResetToDefaultsFunc), NULL },
355 { { NULL, NULL }, HOOKFUNC_DEF(AboutFunc), NULL },
356 { { NULL, NULL }, HOOKFUNC_DEF(OpenFunc), NULL },
357 { { NULL, NULL }, HOOKFUNC_DEF(LastSavedFunc), NULL },
358 { { NULL, NULL }, HOOKFUNC_DEF(RestoreFunc), NULL },
359 { { NULL, NULL }, HOOKFUNC_DEF(SaveAsFunc), NULL },
360 { { NULL, NULL }, HOOKFUNC_DEF(DeletePenFunc), NULL },
361 { { NULL, NULL }, HOOKFUNC_DEF(ContextMenuTriggerHookFunc), NULL },
362 { { NULL, NULL }, HOOKFUNC_DEF(AslIntuiMsgHookFunc), NULL },
366 static struct NewMenu ContextMenus[] =
368 { NM_TITLE, (STRPTR) MSGID_TITLENAME, NULL, 0, 0, NULL },
369 { NM_ITEM, (STRPTR) MSGID_MENU_PROJECT_OPEN, (STRPTR) MSGID_MENU_PROJECT_OPEN_SHORT, 0, 0, (APTR) HOOKNDX_Open },
370 { NM_ITEM, (STRPTR) MSGID_MENU_PROJECT_SAVEAS, (STRPTR) MSGID_MENU_PROJECT_SAVEAS_SHORT, 0, 0, (APTR) HOOKNDX_SaveAs },
371 { NM_ITEM, NM_BARLABEL, NULL, 0, 0, NULL },
372 { NM_ITEM, (STRPTR) MSGID_MENU_PROJECT_ABOUT, NULL, 0, 0, (APTR) HOOKNDX_About },
374 { NM_END, NULL, NULL, 0, 0, 0,},
377 static const struct PenListInit PenListContents[] =
379 { TEXTPEN, 1, MSGID_TEXTPEN },
380 { SHINEPEN, 2, MSGID_SHINEPEN },
381 { SHADOWPEN, 1, MSGID_SHADOWPEN },
382 { FILLPEN, 3, MSGID_HIFILLPEN },
383 { FILLTEXTPEN, 1, MSGID_FILLTEXTPEN },
384 { BACKGROUNDPEN, 0, MSGID_BGPEN },
385 { HIGHLIGHTTEXTPEN, 2, MSGID_HITEXTPEN },
386 { BARDETAILPEN, 1, MSGID_BARDETAILPEN },
387 { BARBLOCKPEN, 2, MSGID_BARBLOCKPEN },
388 { BARTRIMPEN, 1, MSGID_BARTRIMPEN },
390 { -1, 5, MSGID_HSHINEPEN },
391 { -2, 4, MSGID_HSHADOWPEN },
392 { -18, 1, MSGID_ICONTEXTPEN },
393 { -19, 1, MSGID_ICONTEXTPENSEL },
394 { -3, 1, MSGID_ICONTEXTOUTLINEPEN },
395 { -20, 1, MSGID_ICONTEXTSHADOWPEN },
396 { -23, 3, MSGID_ICONTEXTFILESELBG },
397 { -4, 3, MSGID_DRAWERTEXT },
398 { -5, 2, MSGID_DRAWERTEXTSEL },
399 { -6, 3, MSGID_DRAWERBG },
400 { -7, 1, MSGID_FILETEXT },
401 { -8, 2, MSGID_FILETEXTSEL },
402 { -9, 1, MSGID_FILEBG },
403 { -10, 0, MSGID_BACKDROPDETAIL },
404 { -11, 0, MSGID_BACKDROPBLOCK },
405 { -12, 1, MSGID_TOOLTIP_TEXT },
406 { -13, 2, MSGID_TOOLTIP_BG },
407 { -14, 1, MSGID_DRAGINFO_TEXT },
408 { -15, 2, MSGID_DRAGINFO_BG },
409 { -16, 4, MSGID_STATUSBAR_BG },
410 { -17, 1, MSGID_STATUSBAR_TEXT },
411 { -21, 4, MSGID_THUMBNAIL_BG },
412 { -22, 4, MSGID_THUMBNAIL_BG_SEL },
413 { 0, 0, 0 }
416 static const struct PensListEntry DefaultPaletteEntries[] =
418 { 0x95959595, 0x95959595, 0x95959595, 0 },
419 { 0x00000000, 0x00000000, 0x00000000, 1 },
420 { 0xffffffff, 0xffffffff, 0xffffffff, 2 },
421 { 0x56565656, 0x7e7e7e7e, 0xa2a2a2a2, 3 },
422 { 0x7b7b7b7b, 0x7b7b7b7b, 0x7b7b7b7b, 4 },
423 { 0xafafafaf, 0xafafafaf, 0xafafafaf, 5 },
424 { 0xaaaaaaaa, 0x90909090, 0x7c7c7c7c, 6 },
425 { 0xffffffff, 0xa9a9a9a9, 0x97979797, 7 },
428 //---------------------------------------------------------------
430 VOID closePlugin(struct PluginBase *PluginBase)
432 d1(kprintf(__FUNC__ "/%ld:\n", __LINE__));
434 if (DataTypesImageClass)
436 CleanupDtpicClass(DataTypesImageClass);
437 DataTypesImageClass = NULL;
439 if (myNListClass)
441 MUI_DeleteCustomClass(myNListClass);
442 myNListClass = NULL;
445 if (NewColorAdjustClass)
447 MUI_DeleteCustomClass(NewColorAdjustClass);
448 NewColorAdjustClass = NULL;
450 if (NewScalosPenListClass)
452 MUI_DeleteCustomClass(NewScalosPenListClass);
453 NewScalosPenListClass = NULL;
455 if (NewPalettePenListClass)
457 MUI_DeleteCustomClass(NewPalettePenListClass);
458 NewPalettePenListClass = NULL;
461 if (PalettePrefsCatalog)
463 CloseCatalog(PalettePrefsCatalog);
464 PalettePrefsCatalog = NULL;
466 if (PalettePrefsLocale)
468 CloseLocale(PalettePrefsLocale);
469 PalettePrefsLocale = NULL;
472 if (PalettePrefsClass)
474 MUI_DeleteCustomClass(PalettePrefsClass);
475 PalettePrefsClass = NULL;
478 CloseLibraries();
480 #if !defined(__amigaos4__) && !defined(__AROS__)
481 _STD_240_TerminateMemFunctions();
482 #endif
486 LIBFUNC_P2(ULONG, LIBSCAGetPrefsInfo,
487 D0, ULONG, which,
488 A6, struct PluginBase *, PluginBase);
490 ULONG result;
492 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: which=%ld\n", __LINE__, which));
494 (void) PluginBase;
496 switch(which)
498 case SCAPREFSINFO_GetClass:
499 result = (ULONG) PalettePrefsClass;
500 break;
502 case SCAPREFSINFO_GetTitle:
503 result = (ULONG) GetLocString(MSGID_PLUGIN_LIST_TITLE);
504 break;
506 case SCAPREFSINFO_GetTitleImage:
507 result = (ULONG) CreatePrefsImage();
508 break;
510 default:
511 result = 0;
512 break;
515 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Result=%08lx\n", __LINE__, result));
517 return result;
519 LIBFUNC_END
521 //----------------------------------------------------------------------------
523 DISPATCHER(PalettePrefs)
525 struct PalettePrefsInst *inst;
526 ULONG result = 0;
528 d1(kprintf("%s/%s/%ld: START\n", __FILE__, __FUNC__, __LINE__));
530 switch(msg->MethodID)
532 case OM_NEW:
533 obj = (Object *) DoSuperMethodA(cl, obj, msg);
534 d1(kprintf("%s/%s/%ld: obj=%08lx\n", __FILE__, __FUNC__, __LINE__, obj));
535 if (obj)
537 Object *prefsobject = NULL;
539 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
541 memset(inst, 0, sizeof(struct PalettePrefsInst));
543 if (CreatePalettePrefsObject(inst, (struct opSet *) msg))
545 prefsobject = CreatePrefsGroup(inst);
546 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: prefsobject=%08lx\n", __LINE__, prefsobject));
548 if (prefsobject)
550 DoMethod(obj, OM_ADDMEMBER, prefsobject);
552 result = (ULONG) obj;
554 else
556 CoerceMethod(cl, obj, OM_DISPOSE);
559 break;
561 case OM_DISPOSE:
562 DisposePalettePrefsObject((struct PalettePrefsInst *) INST_DATA(cl, obj));
563 d1(kprintf("%s/%d/%ld: PalettePrefsCatalog=%08lx\n", __FILE__, __FUNC__, __LINE__, PalettePrefsCatalog));
564 return DoSuperMethodA(cl, obj, msg);
565 break;
567 case OM_SET:
569 struct opSet *ops = (struct opSet *) msg;
571 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
572 inst->ppb_fCreateIcons = GetTagData(MUIA_ScalosPrefs_CreateIcons, inst->ppb_fCreateIcons, ops->ops_AttrList);
573 inst->ppb_ProgramName = (CONST_STRPTR) GetTagData(MUIA_ScalosPrefs_ProgramName, (ULONG) inst->ppb_ProgramName, ops->ops_AttrList);
574 inst->ppb_Objects[OBJNDX_WIN_Main] = (APTR) GetTagData(MUIA_ScalosPrefs_MainWindow,
575 (ULONG) inst->ppb_Objects[OBJNDX_WIN_Main], ops->ops_AttrList);
576 inst->ppb_Objects[OBJNDX_APP_Main] = (APTR) GetTagData(MUIA_ScalosPrefs_Application,
577 (ULONG) inst->ppb_Objects[OBJNDX_APP_Main], ops->ops_AttrList);
579 return DoSuperMethodA(cl, obj, msg);
581 break;
583 case OM_GET:
585 struct opGet *opg = (struct opGet *) msg;
587 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
588 switch (opg->opg_AttrID)
590 case MUIA_ScalosPrefs_CreateIcons:
591 *opg->opg_Storage = inst->ppb_fCreateIcons;
592 result = 0;
593 break;
594 default:
595 result = DoSuperMethodA(cl, obj, msg);
598 break;
600 case MUIM_ScalosPrefs_LoadConfig:
601 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
602 if (RETURN_OK != ReadPrefsFile(inst, "ENV:Scalos/Palette13.prefs", TRUE))
603 ReadPrefsFile(inst, "ENV:Scalos/Palette13.prefs", FALSE);
604 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
605 SetChangedFlag(inst, FALSE);
606 break;
608 case MUIM_ScalosPrefs_UseConfig:
609 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
610 WritePrefsFile(inst, "ENV:Scalos/Palette13.prefs");
611 break;
613 case MUIM_ScalosPrefs_UseConfigIfChanged:
614 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
615 if (inst->ppb_Changed)
617 WritePrefsFile(inst, "ENV:Scalos/Palette13.prefs");
618 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
619 SetChangedFlag(inst, FALSE);
621 break;
623 case MUIM_ScalosPrefs_SaveConfig:
624 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
625 WritePrefsFile(inst, "ENVARC:Scalos/Palette13.prefs");
626 WritePrefsFile(inst, "ENV:Scalos/Palette13.prefs");
627 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
628 SetChangedFlag(inst, FALSE);
629 break;
631 case MUIM_ScalosPrefs_SaveConfigIfChanged:
632 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
633 if (inst->ppb_Changed)
635 WritePrefsFile(inst, "ENVARC:Scalos/Palette13.prefs");
636 WritePrefsFile(inst, "ENV:Scalos/Palette13.prefs");
637 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
638 SetChangedFlag(inst, FALSE);
640 break;
642 case MUIM_ScalosPrefs_RestoreConfig:
643 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
644 DoMethod(obj, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_Restore], 0);
645 break;
647 case MUIM_ScalosPrefs_ResetToDefaults:
648 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
649 DoMethod(obj, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_ResetToDefaults], 0);
650 break;
652 case MUIM_ScalosPrefs_LastSavedConfig:
653 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
654 DoMethod(obj, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_LastSaved], 0);
655 break;
657 case MUIM_ScalosPrefs_OpenConfig:
658 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
659 DoMethod(obj, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_Open], 0);
660 break;
662 case MUIM_ScalosPrefs_SaveConfigAs:
663 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
664 DoMethod(obj, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_SaveAs], 0);
665 break;
667 case MUIM_ScalosPrefs_About:
668 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
669 DoMethod(obj, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_About], 0);
670 break;
672 case MUIM_ScalosPrefs_LoadNamedConfig:
674 struct MUIP_ScalosPrefs_LoadNamedConfig *lnc = (struct MUIP_ScalosPrefs_LoadNamedConfig *) msg;
676 inst = (struct PalettePrefsInst *) INST_DATA(cl, obj);
677 ReadPrefsFile(inst, lnc->ConfigFileName, FALSE);
679 break;
681 case MUIM_ScalosPrefs_CreateSubWindows:
682 result = 0;
683 break;
685 case MUIM_ScalosPrefs_GetListOfMCCs:
686 result = (ULONG) RequiredMccList;
687 break;
689 default:
690 d1(kprintf("%s/%s/%ld: MethodID=%08lx\n", __FILE__, __FUNC__, __LINE__, msg->MethodID));
691 result = DoSuperMethodA(cl, obj, msg);
692 break;
695 d1(kprintf("%s/%d/%ld/%ld: END result=%ld\n", __FILE__, __FUNC__, __LINE__, result));
697 return result;
699 DISPATCHER_END
701 //----------------------------------------------------------------------------
703 static BOOL CreatePalettePrefsObject(struct PalettePrefsInst *inst, struct opSet *ops)
705 BOOL Success = FALSE;
707 do {
708 memset(inst, 0, sizeof(struct PalettePrefsInst));
710 inst->ppb_Changed = FALSE;
711 inst->ppb_fPreview = TRUE;
712 inst->ppb_fAutoPreview = FALSE;
713 inst->ppb_fDontChange = FALSE;
714 inst->ppb_PalettePrecision = PRECISION_IMAGE;
715 inst->ppb_PreviewWeight = 20;
716 inst->ppb_AllocatedPensListImageIndex = 1;
718 InitHooks(inst);
720 inst->ppb_fCreateIcons = GetTagData(MUIA_ScalosPrefs_CreateIcons, TRUE, ops->ops_AttrList);
721 inst->ppb_ProgramName = (CONST_STRPTR) GetTagData(MUIA_ScalosPrefs_ProgramName, (ULONG) "", ops->ops_AttrList);
722 inst->ppb_Objects[OBJNDX_WIN_Main] = (APTR) GetTagData(MUIA_ScalosPrefs_MainWindow, (ULONG) NULL, ops->ops_AttrList);
723 inst->ppb_Objects[OBJNDX_APP_Main] = (APTR) GetTagData(MUIA_ScalosPrefs_Application, (ULONG) NULL, ops->ops_AttrList);
725 inst->ppb_WBScreen = LockPubScreen("Workbench");
726 if (NULL == inst->ppb_WBScreen)
727 break;
729 Success = TRUE;
730 } while (0);
732 return Success;
736 static void DisposePalettePrefsObject(struct PalettePrefsInst *inst)
738 if (inst->ppb_WBScreen)
740 UnlockPubScreen(NULL, inst->ppb_WBScreen);
741 inst->ppb_WBScreen = NULL;
743 if (inst->ppb_LoadReq)
745 MUI_FreeAslRequest(inst->ppb_LoadReq);
746 inst->ppb_LoadReq = NULL;
748 if (inst->ppb_SaveReq)
750 MUI_FreeAslRequest(inst->ppb_SaveReq);
751 inst->ppb_SaveReq = NULL;
753 if (inst->ppb_Objects[OBJNDX_ContextMenu])
755 MUI_DisposeObject(inst->ppb_Objects[OBJNDX_ContextMenu]);
756 inst->ppb_Objects[OBJNDX_ContextMenu] = NULL;
761 static Object *CreatePrefsGroup(struct PalettePrefsInst *inst)
763 d1(kprintf(__FUNC__ "/%ld: inst=%08lx\n", __LINE__, inst));
765 inst->ppb_Objects[OBJNDX_ContextMenu] = MUI_MakeObject(MUIO_MenustripNM, ContextMenus, 0);
767 if (NULL == inst->ppb_Objects[OBJNDX_ContextMenu])
768 return NULL;
770 inst->ppb_Objects[OBJNDX_Group_Main] = VGroup,
771 MUIA_Background, MUII_PageBack,
773 Child, HGroup,
774 Child, VGroup,
775 Child, TextObject,
776 MUIA_Font, MUIV_Font_Title,
777 TextFrame,
778 MUIA_Background, MUII_GroupBack,
779 MUIA_Text_PreParse, "\33c",
780 MUIA_Text_Contents, GetLocString(MSGID_TITLE_SCALOSPENLIST),
781 End, //NListviewObject
783 Child, NListviewObject,
784 MUIA_CycleChain, TRUE,
785 MUIA_Listview_Input, TRUE,
786 MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
787 MUIA_NListview_NList, inst->ppb_Objects[OBJNDX_ScalosPenList] = NewScalosPenListObject,
788 MUIA_NList_PrivateData, inst,
789 InputListFrame,
790 MUIA_Background, MUII_ListBack,
791 MUIA_NList_Format, "BAR D=8 P=\x1br,BAR D=8 P=\x1br,,",
792 MUIA_NList_DisplayHook2, &inst->ppb_Hooks[HOOKNDX_ScalosPenListDisplay],
793 MUIA_NList_ConstructHook, &inst->ppb_Hooks[HOOKNDX_ScalosPenListConstruct],
794 MUIA_NList_DestructHook, &inst->ppb_Hooks[HOOKNDX_ScalosPenListDestruct],
795 MUIA_NList_CompareHook2, &inst->ppb_Hooks[HOOKNDX_ScalosPenListCompare],
796 MUIA_NList_DragSortable, TRUE,
797 MUIA_NList_ShowDropMarks, TRUE,
798 MUIA_NList_AutoVisible, TRUE,
799 MUIA_NList_EntryValueDependent, TRUE,
800 MUIA_NList_Title, TRUE,
801 MUIA_NList_TitleSeparator, TRUE,
802 MUIA_NList_SortType, 2,
803 MUIA_NList_TitleMark, MUIV_NList_TitleMark_Down | 2,
804 MUIA_ContextMenu, inst->ppb_Objects[OBJNDX_ContextMenu],
805 End,
806 MUIA_ShortHelp, GetLocString(MSGID_SHORTHELP_SCALOSPENLIST),
807 End, //NListviewObject
808 End, //VGroup
810 Child, BalanceObject,
811 End, //BalanceObject
813 Child, VGroup,
814 Child, inst->ppb_Objects[OBJNDX_AllocatedPensListTitleObj] = TextObject,
815 MUIA_Font, MUIV_Font_Title,
816 TextFrame,
817 MUIA_Background, MUII_GroupBack,
818 MUIA_Text_PreParse, "\33c",
819 MUIA_Text_Contents, inst->ppb_PalettePenListTitle,
820 End, //TextObject
822 Child, NListviewObject,
823 MUIA_Listview_Input, TRUE,
824 MUIA_CycleChain, TRUE,
825 MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
826 MUIA_NListview_NList, inst->ppb_Objects[OBJNDX_AllocatedPensList] = NewPalettePenListObject,
827 MUIA_NList_PrivateData, inst,
828 MUIA_UserData, inst,
829 InputListFrame,
830 MUIA_Background, MUII_ListBack,
831 MUIA_NList_Format, "BAR D=8 P=\x1br,BAR D=8 P=\x1br,BAR P=\x1br,NOBAR D=8 P=\x1br,NOBAR D=8 P=\x1br,NOBAR D=8 P=\x1br",
832 MUIA_NList_DisplayHook2, &inst->ppb_Hooks[HOOKNDX_AllocatedPensListDisplay],
833 MUIA_NList_ConstructHook, &inst->ppb_Hooks[HOOKNDX_AllocatedPensListConstruct],
834 MUIA_NList_DestructHook, &inst->ppb_Hooks[HOOKNDX_AllocatedPensListDestruct],
835 MUIA_NList_CompareHook2, &inst->ppb_Hooks[HOOKNDX_AllocatedPensListCompare],
836 MUIA_NList_DragSortable, TRUE,
837 MUIA_NList_ShowDropMarks, TRUE,
838 MUIA_NList_AutoVisible, TRUE,
839 MUIA_NList_EntryValueDependent, TRUE,
840 MUIA_NList_Title, TRUE,
841 MUIA_NList_TitleSeparator, TRUE,
842 MUIA_NList_SortType, 0,
843 MUIA_NList_TitleMark, MUIV_NList_TitleMark_Down | 0,
844 MUIA_ContextMenu, inst->ppb_Objects[OBJNDX_ContextMenu],
845 End, //NewPalettePenListClass
846 MUIA_ShortHelp, GetLocString(MSGID_SHORTHELP_PALETTEPENLIST),
847 End, //NListviewObject
849 Child, HGroup,
850 Child, inst->ppb_Objects[OBJNDX_Lamp_Changed] = LampObject,
851 MUIA_Lamp_Type, MUIV_Lamp_Type_Huge,
852 MUIA_Lamp_Color, MUIV_Lamp_Color_Off,
853 MUIA_ShortHelp, GetLocString(MSGID_SHORTHELP_LAMP_CHANGED),
854 End, //LampObject
856 Child, HGroup,
857 MUIA_Group_SameSize, TRUE,
858 Child, inst->ppb_Objects[OBJNDX_NewButton] = KeyButtonHelp(GetLocString(MSGID_NEW), 'n', GetLocString(MSGID_SHORTHELP_NEWBUTTON)),
859 Child, inst->ppb_Objects[OBJNDX_DeleteButton] = KeyButtonHelp(GetLocString(MSGID_DELETE), 'd', GetLocString(MSGID_SHORTHELP_DELETEBUTTON)),
860 End, //HGroup
861 End, //HGroup
863 Child, BalanceObject,
864 End, //BalanceObject
866 Child, inst->ppb_Objects[OBJNDX_ColorAdjust] = NewColorAdjustObject,
867 MUIA_UserData, inst,
868 End, //NewColorAdjustClass
870 Child, PopobjectObject,
871 MUIA_Popstring_String, TextObject,
872 MUIA_CycleChain, TRUE,
873 MUIA_Background, MUII_GroupBack,
874 TextFrame,
875 MUIA_Text_Contents, GetLocString(MSGID_IMPORTNAME),
876 MUIA_Text_PreParse, "\33c",
877 End,
878 MUIA_Popstring_Button, PopButton(MUII_PopUp),
879 MUIA_ShortHelp, GetLocString(MSGID_SHORTHELP_WBPENSBUTTON),
880 MUIA_Popobject_WindowHook, &inst->ppb_Hooks[HOOKNDX_GetWBColors],
881 MUIA_Popobject_Object, NListviewObject,
882 MUIA_Listview_Input, TRUE,
883 MUIA_Listview_DragType, MUIV_Listview_DragType_Immediate,
884 MUIA_Listview_MultiSelect, TRUE,
885 MUIA_CycleChain, TRUE,
886 MUIA_ShortHelp, GetLocString(MSGID_SHORTHELP_WBPENLIST),
887 MUIA_NListview_NList, inst->ppb_Objects[OBJNDX_WBColorsList] = myNListObject,
888 MUIA_NList_PrivateData, inst,
889 InputListFrame,
890 MUIA_Background, MUII_ListBack,
891 MUIA_NList_Format, "BAR D=8 P=\x1br,BAR D=8 P=\x1br,NOBAR D=8 P=\x1br,NOBAR D=8 P=\x1br,NOBAR D=8 P=\x1br",
892 MUIA_NList_DisplayHook2, &inst->ppb_Hooks[HOOKNDX_WBPensListDisplay],
893 MUIA_NList_ConstructHook, &inst->ppb_Hooks[HOOKNDX_WBPensListConstruct],
894 MUIA_NList_DestructHook, &inst->ppb_Hooks[HOOKNDX_WBPensListDestruct],
895 MUIA_NList_CompareHook2, &inst->ppb_Hooks[HOOKNDX_WBPensListCompare],
896 MUIA_NList_ShowDropMarks, TRUE,
897 MUIA_NList_AutoVisible, TRUE,
898 MUIA_NList_Title, TRUE,
899 MUIA_NList_TitleSeparator, TRUE,
900 MUIA_NList_SortType, 0,
901 MUIA_NList_TitleMark, MUIV_NList_TitleMark_Down | 0,
902 MUIA_NList_EntryValueDependent, TRUE,
903 MUIA_ContextMenu, inst->ppb_Objects[OBJNDX_ContextMenu],
904 End, //inst->ppb_myNListClass
905 End, //NListviewObject
906 End, //PopobjectObject
907 End,
908 End, //HGroup
910 MUIA_ContextMenu, inst->ppb_Objects[OBJNDX_ContextMenu],
911 End; //VGroup
913 if (NULL == inst->ppb_Objects[OBJNDX_Group_Main])
914 return NULL;
916 InitPenList(inst);
917 UpdatePalettePenCount(inst);
919 set(inst->ppb_Objects[OBJNDX_DeleteButton], MUIA_Disabled, TRUE);
921 // setup sorting hooks for OBJNDX_ScalosPenList list
922 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_Notify, MUIA_NList_TitleClick, MUIV_EveryTime,
923 inst->ppb_Objects[OBJNDX_ScalosPenList], 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_Both);
924 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_Notify, MUIA_NList_TitleClick2, MUIV_EveryTime,
925 inst->ppb_Objects[OBJNDX_ScalosPenList], 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_2);
926 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_Notify, MUIA_NList_SortType, MUIV_EveryTime,
927 inst->ppb_Objects[OBJNDX_ScalosPenList], 3, MUIM_Set, MUIA_NList_TitleMark, MUIV_TriggerValue);
928 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_Notify, MUIA_NList_SortType2, MUIV_EveryTime,
929 inst->ppb_Objects[OBJNDX_ScalosPenList], 3, MUIM_Set, MUIA_NList_TitleMark2, MUIV_TriggerValue);
931 // setup sorting hooks for OBJNDX_AllocatedPensList list
932 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_Notify, MUIA_NList_TitleClick, MUIV_EveryTime,
933 inst->ppb_Objects[OBJNDX_AllocatedPensList], 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_Both);
934 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_Notify, MUIA_NList_TitleClick2, MUIV_EveryTime,
935 inst->ppb_Objects[OBJNDX_AllocatedPensList], 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_2);
936 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_Notify, MUIA_NList_SortType, MUIV_EveryTime,
937 inst->ppb_Objects[OBJNDX_AllocatedPensList], 3, MUIM_Set, MUIA_NList_TitleMark, MUIV_TriggerValue);
938 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_Notify, MUIA_NList_SortType2, MUIV_EveryTime,
939 inst->ppb_Objects[OBJNDX_AllocatedPensList], 3, MUIM_Set, MUIA_NList_TitleMark2, MUIV_TriggerValue);
941 // setup sorting hooks for OBJNDX_WBColorsList list
942 DoMethod(inst->ppb_Objects[OBJNDX_WBColorsList], MUIM_Notify, MUIA_NList_TitleClick, MUIV_EveryTime,
943 inst->ppb_Objects[OBJNDX_WBColorsList], 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_Both);
944 DoMethod(inst->ppb_Objects[OBJNDX_WBColorsList], MUIM_Notify, MUIA_NList_TitleClick2, MUIV_EveryTime,
945 inst->ppb_Objects[OBJNDX_WBColorsList], 4, MUIM_NList_Sort3, MUIV_TriggerValue, MUIV_NList_SortTypeAdd_2Values, MUIV_NList_Sort3_SortType_2);
946 DoMethod(inst->ppb_Objects[OBJNDX_WBColorsList], MUIM_Notify, MUIA_NList_SortType, MUIV_EveryTime,
947 inst->ppb_Objects[OBJNDX_WBColorsList], 3, MUIM_Set, MUIA_NList_TitleMark, MUIV_TriggerValue);
948 DoMethod(inst->ppb_Objects[OBJNDX_WBColorsList], MUIM_Notify, MUIA_NList_SortType2, MUIV_EveryTime,
949 inst->ppb_Objects[OBJNDX_WBColorsList], 3, MUIM_Set, MUIA_NList_TitleMark2, MUIV_TriggerValue);
951 // notification on Contextmenu for all places except listviews
952 DoMethod(inst->ppb_Objects[OBJNDX_Group_Main], MUIM_Notify, MUIA_ContextMenuTrigger, MUIV_EveryTime,
953 inst->ppb_Objects[OBJNDX_Group_Main], 3, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_ContextMenuTrigger], MUIV_TriggerValue );
955 // Notification for "Add pen" button
956 DoMethod(inst->ppb_Objects[OBJNDX_NewButton], MUIM_Notify, MUIA_Pressed, FALSE,
957 inst->ppb_Objects[OBJNDX_AllocatedPensList], 2, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_AddPen]);
959 // Notification for "Delete pen" button
960 DoMethod(inst->ppb_Objects[OBJNDX_DeleteButton], MUIM_Notify, MUIA_Pressed, FALSE,
961 inst->ppb_Objects[OBJNDX_AllocatedPensList], 2, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_DeletePen]);
963 // Update ColorAdjust every time a new pen is selected
964 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_Notify, MUIA_NList_Active, MUIV_EveryTime,
965 inst->ppb_Objects[OBJNDX_ColorAdjust], 2, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_SelectPalettePen]);
967 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_Notify, MUIA_NList_Active, MUIV_EveryTime,
968 MUIV_Notify_Window, 2, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_SelectScalosPen]);
970 DoMethod(inst->ppb_Objects[OBJNDX_ColorAdjust], MUIM_Notify, MUIA_Coloradjust_RGB, MUIV_EveryTime,
971 inst->ppb_Objects[OBJNDX_AllocatedPensList], 3, MUIM_CallHook, &inst->ppb_Hooks[HOOKNDX_ChangePenColor], MUIV_TriggerValue);
973 return inst->ppb_Objects[OBJNDX_Group_Main];
977 static Object *CreatePrefsImage(void)
979 #include "PalettePrefsImage.h"
980 Object *img;
982 // First try to load datatypes image from THEME: tree
983 img = DataTypesImageObject,
984 MUIA_ScaDtpic_Name, (ULONG) "THEME:prefs/plugins/palette",
985 MUIA_ScaDtpic_FailIfUnavailable, TRUE,
986 End; //DataTypesMCCObject
988 if (NULL == img)
989 img = IMG(Palette, PALETTE); // use built-in fallback image
991 return img;
995 static void InitHooks(struct PalettePrefsInst *inst)
997 ULONG n;
999 for (n=0; n<HOOKNDX_MAX; n++)
1001 inst->ppb_Hooks[n] = PalettePrefsHooks[n];
1002 inst->ppb_Hooks[n].h_Data = inst;
1007 static BOOL OpenLibraries(void)
1009 DOSBase = (APTR) OpenLibrary( "dos.library", 39 );
1010 if (!DOSBase)
1011 return FALSE;
1012 #ifdef __amigaos4__
1013 IDOS = (struct DOSIFace *)GetInterface((struct Library *)DOSBase, "main", 1, NULL);
1014 if (NULL == IDOS)
1015 return FALSE;
1016 #endif
1018 d1(kprintf(__FUNC__ "/%ld:\n", __LINE__));
1020 IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library", 39);
1021 if (NULL == IntuitionBase)
1022 return FALSE;
1023 #ifdef __amigaos4__
1024 IIntuition = (struct IntuitionIFace *)GetInterface((struct Library *)IntuitionBase, "main", 1, NULL);
1025 if (NULL == IIntuition)
1026 return FALSE;
1027 #endif
1029 MUIMasterBase = OpenLibrary("zune.library", 0);
1030 if (NULL == MUIMasterBase)
1031 MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN-1);
1032 if (NULL == MUIMasterBase)
1033 return FALSE;
1034 #ifdef __amigaos4__
1035 IMUIMaster = (struct MUIMasterIFace *)GetInterface((struct Library *)MUIMasterBase, "main", 1, NULL);
1036 if (NULL == IMUIMaster)
1037 return FALSE;
1038 #endif
1040 IFFParseBase = OpenLibrary("iffparse.library", 36);
1041 if (NULL == IFFParseBase)
1042 return FALSE;
1043 #ifdef __amigaos4__
1044 IIFFParse = (struct IFFParseIFace *)GetInterface((struct Library *)IFFParseBase, "main", 1, NULL);
1045 if (NULL == IIFFParse)
1046 return FALSE;
1047 #endif
1049 IconBase = OpenLibrary("icon.library", 0);
1050 if (NULL == IconBase)
1051 return FALSE;
1052 #ifdef __amigaos4__
1053 IIcon = (struct IconIFace *)GetInterface((struct Library *)IconBase, "main", 1, NULL);
1054 if (NULL == IIcon)
1055 return FALSE;
1056 #endif
1058 GfxBase = (struct GfxBase *) OpenLibrary("graphics.library", 39);
1059 if (NULL == GfxBase)
1060 return FALSE;
1061 #ifdef __amigaos4__
1062 IGraphics = (struct GraphicsIFace *)GetInterface((struct Library *)GfxBase, "main", 1, NULL);
1063 if (NULL == IGraphics)
1064 return FALSE;
1065 #endif
1067 UtilityBase = (T_UTILITYBASE) OpenLibrary(UTILITYNAME, 39);
1068 if (NULL == UtilityBase)
1069 return FALSE;
1070 #ifdef __amigaos4__
1071 IUtility = (struct UtilityIFace *)GetInterface((struct Library *)UtilityBase, "main", 1, NULL);
1072 if (NULL == IUtility)
1073 return FALSE;
1074 #endif
1076 #if defined(__GNUC__) && !defined(__MORPHOS__) && !defined(__amigaos4__) && !defined(__AROS__)
1077 __UtilityBase = UtilityBase;
1078 #endif /* __GNUC__ && !__MORPHOS__ && ! __amigaos4__ */
1080 DataTypesBase = OpenLibrary("datatypes.library", 39);
1081 if (NULL == DataTypesBase)
1082 return FALSE;
1083 #ifdef __amigaos4__
1084 IDataTypes = (struct DataTypesIFace *)GetInterface((struct Library *)DataTypesBase, "main", 1, NULL);
1085 if (NULL == IDataTypes)
1086 return FALSE;
1087 #endif
1089 #ifdef __amigaos4__
1090 NewlibBase = OpenLibrary("newlib.library", 0);
1091 if (NULL == NewlibBase)
1092 return FALSE;
1093 INewlib = GetInterface(NewlibBase, "main", 1, NULL);
1094 if (NULL == INewlib)
1095 return FALSE;
1096 #endif
1098 LocaleBase = (T_LOCALEBASE) OpenLibrary("locale.library", 39);
1099 #ifdef __amigaos4__
1100 if (LocaleBase)
1101 ILocale = (struct LocaleIFace *)GetInterface((struct Library *)LocaleBase, "main", 1, NULL);
1102 #endif
1104 return TRUE;
1108 static void CloseLibraries(void)
1110 #ifdef __amigaos4__
1111 if (INewlib)
1113 DropInterface(INewlib);
1114 INewlib = NULL;
1116 if (NewlibBase)
1118 CloseLibrary(NewlibBase);
1119 NewlibBase = NULL;
1121 if (IDataTypes)
1123 DropInterface((struct Interface *)IDataTypes);
1124 IDataTypes = NULL;
1126 #endif
1127 if (DataTypesBase)
1129 CloseLibrary(DataTypesBase);
1130 DataTypesBase = NULL;
1132 #ifdef __amigaos4__
1133 if (ILocale)
1135 DropInterface((struct Interface *)ILocale);
1136 ILocale = NULL;
1138 #endif
1139 if (LocaleBase)
1141 CloseLibrary((struct Library *) LocaleBase);
1142 LocaleBase = NULL;
1144 #ifdef __amigaos4__
1145 if (IUtility)
1147 DropInterface((struct Interface *)IUtility);
1148 IUtility = NULL;
1150 #endif
1151 if (UtilityBase)
1153 CloseLibrary((struct Library *) UtilityBase);
1154 UtilityBase = NULL;
1156 #ifdef __amigaos4__
1157 if (IGraphics)
1159 DropInterface((struct Interface *)IGraphics);
1160 IGraphics = NULL;
1162 #endif
1163 if (GfxBase)
1165 CloseLibrary((struct Library *) GfxBase);
1166 GfxBase = NULL;
1168 #ifdef __amigaos4__
1169 if (IIcon)
1171 DropInterface((struct Interface *)IIcon);
1172 IIcon = NULL;
1174 #endif
1175 if (IconBase)
1177 CloseLibrary(IconBase);
1178 IconBase = NULL;
1180 #ifdef __amigaos4__
1181 if (IIFFParse)
1183 DropInterface((struct Interface *)IIFFParse);
1184 IIFFParse = NULL;
1186 #endif
1187 if (IFFParseBase)
1189 CloseLibrary(IFFParseBase);
1190 IFFParseBase = NULL;
1192 #ifdef __amigaos4__
1193 if (IMUIMaster)
1195 DropInterface((struct Interface *)IMUIMaster);
1196 IMUIMaster = NULL;
1198 #endif
1199 if (MUIMasterBase)
1201 CloseLibrary(MUIMasterBase);
1202 MUIMasterBase = NULL;
1204 #ifdef __amigaos4__
1205 if (IIntuition)
1207 DropInterface((struct Interface *)IIntuition);
1208 IIntuition = NULL;
1210 #endif
1211 if (IntuitionBase)
1213 CloseLibrary((struct Library *) IntuitionBase);
1214 IntuitionBase = NULL;
1216 #ifdef __amigaos4__
1217 if (IDOS)
1219 DropInterface((struct Interface *)IDOS);
1220 IDOS = NULL;
1222 #endif
1223 if (DOSBase)
1225 CloseLibrary((struct Library *) DOSBase);
1226 DOSBase = NULL;
1231 //----------------------------------------------------------------------------
1233 static STRPTR GetLocString(ULONG MsgId)
1235 struct ScalosPalette_LocaleInfo li;
1237 li.li_Catalog = PalettePrefsCatalog;
1238 #ifndef __amigaos4__
1239 li.li_LocaleBase = LocaleBase;
1240 #else
1241 li.li_ILocale = ILocale;
1242 #endif
1244 return (STRPTR)GetScalosPaletteString(&li, MsgId);
1248 static void TranslateNewMenu(struct NewMenu *nm)
1250 while (nm && NM_END != nm->nm_Type)
1252 if (NM_BARLABEL != nm->nm_Label)
1253 nm->nm_Label = GetLocString((ULONG) nm->nm_Label);
1255 if (nm->nm_CommKey)
1256 nm->nm_CommKey = GetLocString((ULONG) nm->nm_CommKey);
1258 nm++;
1262 #if 0
1263 static void TranslateStringArray(STRPTR *stringArray)
1265 while (*stringArray)
1267 *stringArray = GetLocString((ULONG) *stringArray);
1268 stringArray++;
1271 #endif
1273 //----------------------------------------------------------------------------
1275 void _XCEXIT(long x)
1279 //----------------------------------------------------------------------------
1281 DISPATCHER(myNList)
1283 struct PalettePrefsInst *inst = NULL;
1284 ULONG result;
1286 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: MethodID=%08lx\n", __LINE__, msg->MethodID));
1288 switch(msg->MethodID)
1290 case MUIM_ContextMenuChoice:
1292 struct MUIP_ContextMenuChoice *cmc = (struct MUIP_ContextMenuChoice *) msg;
1293 Object *MenuObj;
1294 ULONG MenuHookIndex = 0;
1295 struct Hook *MenuHook = NULL;
1297 get(obj, MUIA_NList_PrivateData, &inst);
1299 d1(kprintf(__FUNC__ "/%ld: MUIM_ContextMenuChoice item=%08lx\n", __LINE__, cmc->item));
1301 MenuObj = cmc->item;
1303 d1(kprintf(__FUNC__ "/%ld: MenuObj=%08lx\n", __LINE__, MenuObj));
1304 d1(kprintf(__FUNC__ "/%ld: msg=%08lx *msg=%08lx\n", __LINE__, msg, *((ULONG *) msg)));
1306 get(MenuObj, MUIA_UserData, &MenuHookIndex);
1308 if (MenuHookIndex > 0 && MenuHookIndex < HOOKNDX_MAX)
1309 MenuHook = &inst->ppb_Hooks[MenuHookIndex];
1311 d1(kprintf(__FUNC__ "/%ld: MenuHook=%08lx\n", __LINE__, MenuHook));
1312 if (MenuHook)
1313 DoMethod(inst->ppb_Objects[OBJNDX_Group_Main], MUIM_CallHook, MenuHook, MenuObj);
1315 result = 0;
1317 break;
1319 default:
1320 result = DoSuperMethodA(cl, obj, msg);
1323 return result;
1325 DISPATCHER_END
1327 //----------------------------------------------------------------------------
1329 DISPATCHER(NewColorAdjust)
1331 struct PalettePrefsInst *inst = NULL;
1332 ULONG Result;
1334 d1(kprintf( "%s/%s/%ld: START MethodID=%08lx\n", __FILE__, __FUNC__, __LINE__, msg->MethodID));
1336 switch (msg->MethodID)
1338 case MUIM_DragQuery:
1340 struct MUIP_DragQuery *dq = (struct MUIP_DragQuery *) msg;
1342 get(obj, MUIA_UserData, &inst);
1344 if (inst->ppb_Objects[OBJNDX_WBColorsList] == dq->obj)
1345 Result = MUIV_DragQuery_Accept;
1346 else
1347 Result = MUIV_DragQuery_Refuse;
1349 break;
1351 case MUIM_DragDrop:
1353 struct MUIP_DragDrop *dd = (struct MUIP_DragDrop *) msg;
1354 APTR activeEntry = NULL;
1356 get(obj, MUIA_UserData, &inst);
1358 DoMethod(dd->obj, MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &activeEntry);
1360 if (activeEntry)
1361 set(inst->ppb_Objects[OBJNDX_ColorAdjust], MUIA_Coloradjust_RGB, (ULONG) activeEntry);
1363 Result = 0;
1365 break;
1367 default:
1368 Result = DoSuperMethodA(cl, obj, msg);
1369 break;
1372 d1(kprintf( "%s/%s/%ld: END Result=%ld\n", __FILE__, __FUNC__, __LINE__, Result));
1374 return Result;
1376 DISPATCHER_END
1379 DISPATCHER(NewPalettePenList)
1381 struct PalettePrefsInst *inst = NULL;
1382 ULONG Result;
1384 switch (msg->MethodID)
1386 case MUIM_DragQuery:
1388 struct MUIP_DragQuery *dq = (struct MUIP_DragQuery *) msg;
1390 get(obj, MUIA_NList_PrivateData, &inst);
1392 if (inst->ppb_Objects[OBJNDX_WBColorsList] == dq->obj || inst->ppb_Objects[OBJNDX_AllocatedPensList] == dq->obj)
1393 Result = MUIV_DragQuery_Accept;
1394 else
1395 Result = MUIV_DragQuery_Refuse;
1397 break;
1399 case MUIM_DragDrop:
1401 struct MUIP_DragDrop *dd = (struct MUIP_DragDrop *) msg;
1403 get(obj, MUIA_NList_PrivateData, &inst);
1405 if (inst->ppb_Objects[OBJNDX_AllocatedPensList] == dd->obj)
1407 // Drag-sorting pen list
1408 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
1409 SetChangedFlag(inst, TRUE);
1410 Result = DoSuperMethodA(cl, obj, msg);
1412 else
1414 LONG DropMark = 0;
1415 LONG Entry;
1417 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_DropMark, &DropMark);
1418 set(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Quiet, TRUE);
1420 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: DropMark=%ld\n", __LINE__, DropMark));
1422 Entry = MUIV_NList_NextSelected_Start;
1424 do {
1425 DoMethod(dd->obj, MUIM_NList_NextSelected, &Entry);
1427 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: DropMark=%ld\n", __LINE__, Entry));
1429 if (Entry != MUIV_NList_NextSelected_End)
1431 struct ScalosPenListEntry *snle;
1433 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
1434 SetChangedFlag(inst, TRUE);
1436 DoMethod(dd->obj, MUIM_NList_GetEntry, Entry, &snle);
1437 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList],
1438 MUIM_NList_InsertSingle, snle, DropMark);
1440 if (MUIV_NList_Insert_Bottom != DropMark)
1441 DropMark++;
1443 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: DropMark=%ld\n", __LINE__, DropMark));
1445 } while (Entry != MUIV_NList_NextSelected_End);
1447 set(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Quiet, FALSE);
1449 Result = 0;
1452 break;
1454 case MUIM_ContextMenuChoice:
1456 struct MUIP_ContextMenuChoice *cmc = (struct MUIP_ContextMenuChoice *) msg;
1457 Object *MenuObj;
1458 ULONG MenuHookIndex = 0;
1459 struct Hook *MenuHook = NULL;
1461 get(obj, MUIA_NList_PrivateData, &inst);
1463 d1(kprintf(__FUNC__ "/%ld: MUIM_ContextMenuChoice item=%08lx\n", __LINE__, cmc->item));
1465 MenuObj = cmc->item;
1467 d1(kprintf(__FUNC__ "/%ld: MenuObj=%08lx\n", __LINE__, MenuObj));
1468 d1(kprintf(__FUNC__ "/%ld: msg=%08lx *msg=%08lx\n", __LINE__, msg, *((ULONG *) msg)));
1470 get(MenuObj, MUIA_UserData, &MenuHookIndex);
1472 if (MenuHookIndex > 0 && MenuHookIndex < HOOKNDX_MAX)
1473 MenuHook = &inst->ppb_Hooks[MenuHookIndex];
1475 d1(kprintf(__FUNC__ "/%ld: MenuHook=%08lx\n", __LINE__, MenuHook));
1476 if (MenuHook)
1477 DoMethod(inst->ppb_Objects[OBJNDX_Group_Main], MUIM_CallHook, MenuHook, MenuObj);
1479 Result = 0;
1481 break;
1483 default:
1484 Result = DoSuperMethodA(cl, obj, msg);
1485 break;
1488 return Result;
1490 DISPATCHER_END
1493 DISPATCHER(NewScalosPenList)
1495 struct PalettePrefsInst *inst = NULL;
1496 ULONG Result;
1498 switch (msg->MethodID)
1500 case MUIM_DragQuery:
1502 struct MUIP_DragQuery *dq = (struct MUIP_DragQuery *) msg;
1504 get(obj, MUIA_NList_PrivateData, &inst);
1506 if (inst->ppb_Objects[OBJNDX_ScalosPenList] == dq->obj || inst->ppb_Objects[OBJNDX_AllocatedPensList] == dq->obj)
1507 Result = MUIV_DragQuery_Accept;
1508 else
1509 Result = MUIV_DragQuery_Refuse;
1511 break;
1513 case MUIM_DragDrop:
1515 LONG DropMark = 0;
1516 struct MUIP_DragDrop *dd = (struct MUIP_DragDrop *) msg;
1518 get(obj, MUIA_NList_PrivateData, &inst);
1519 get(obj, MUIA_NList_DropMark, &DropMark);
1520 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: DropMark=%ld\n", __LINE__, DropMark));
1522 if (DropMark >= 0)
1524 if (inst->ppb_Objects[OBJNDX_AllocatedPensList] == dd->obj)
1526 struct ScalosPenListEntry *snle;
1527 LONG Entry = 0;
1528 ULONG OldPenNr;
1530 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
1531 SetChangedFlag(inst, TRUE);
1533 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Active, &Entry);
1534 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Entry=%ld DropMark=%ld\n", __LINE__, Entry, DropMark));
1536 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, DropMark, &snle);
1538 OldPenNr = snle->snle_PenNr;
1539 snle->snle_PenNr = Entry;
1541 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_Redraw, DropMark);
1543 // Redraw "allocated pens" entry of old and new pen, since reference counts have changed
1544 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Redraw, OldPenNr);
1545 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Redraw, snle->snle_PenNr);
1547 else
1549 struct ScalosPenListEntry *snleActive = NULL;
1551 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &snleActive);
1552 if (snleActive)
1554 struct ScalosPenListEntry *snleDest;
1555 ULONG OldPenNr;
1557 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: DropMark=%ld\n", __LINE__, DropMark));
1559 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
1560 SetChangedFlag(inst, TRUE);
1562 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, DropMark, &snleDest);
1564 OldPenNr = snleDest->snle_PenNr;
1565 snleDest->snle_PenNr = snleActive->snle_PenNr;
1567 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_Redraw, DropMark);
1569 // Redraw "allocated pens" entry of old and new pen, since reference counts have changed
1570 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Redraw, OldPenNr);
1571 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Redraw, snleDest->snle_PenNr);
1576 Result = 0;
1578 break;
1580 case MUIM_NList_DropType:
1582 struct MUIP_NList_DropType *mdt = (struct MUIP_NList_DropType *) msg;
1584 Result = DoSuperMethodA(cl, obj, msg);
1586 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: DropType=%ld\n", __LINE__, *mdt->type));
1588 if (MUIV_NList_DropType_None != *mdt->type)
1589 *mdt->type = MUIV_NList_DropType_Onto;
1591 break;
1593 case MUIM_ContextMenuChoice:
1595 struct MUIP_ContextMenuChoice *cmc = (struct MUIP_ContextMenuChoice *) msg;
1596 Object *MenuObj;
1597 ULONG MenuHookIndex = 0;
1598 struct Hook *MenuHook = NULL;
1600 get(obj, MUIA_NList_PrivateData, &inst);
1602 d1(kprintf(__FUNC__ "/%ld: MUIM_ContextMenuChoice item=%08lx\n", __LINE__, cmc->item));
1604 MenuObj = cmc->item;
1606 d1(kprintf(__FUNC__ "/%ld: MenuObj=%08lx\n", __LINE__, MenuObj));
1607 d1(kprintf(__FUNC__ "/%ld: msg=%08lx *msg=%08lx\n", __LINE__, msg, *((ULONG *) msg)));
1609 get(MenuObj, MUIA_UserData, &MenuHookIndex);
1611 if (MenuHookIndex > 0 && MenuHookIndex < HOOKNDX_MAX)
1612 MenuHook = &inst->ppb_Hooks[MenuHookIndex];
1614 d1(kprintf(__FUNC__ "/%ld: MenuHook=%08lx\n", __LINE__, MenuHook));
1615 if (MenuHook)
1616 DoMethod(inst->ppb_Objects[OBJNDX_Group_Main], MUIM_CallHook, MenuHook, MenuObj);
1618 Result = 0;
1620 break;
1622 default:
1623 Result = DoSuperMethodA(cl, obj, msg);
1624 break;
1627 return Result;
1629 DISPATCHER_END
1631 //----------------------------------------------------------------------------
1633 static APTR AllocatedPensListConstructFunc(struct Hook *hook, APTR memPool,
1634 struct PensListEntry *spleNew)
1636 struct PensListEntry *sple = AllocPooled(memPool, sizeof(struct PensListEntry));
1638 if (sple)
1640 // struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
1642 *sple = *spleNew;
1645 return sple;
1648 static void AllocatedPensListDestructFunc(struct Hook *hook, APTR memPool, APTR Entry)
1650 if (Entry)
1652 FreePooled(memPool, Entry, sizeof(struct PensListEntry));
1656 static ULONG AllocatedPensListDisplayFunc(struct Hook *hook, Object *obj, struct NList_DisplayMessage *ndm)
1658 if (ndm->entry)
1660 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
1661 struct PensListEntry *sple = (struct PensListEntry *) ndm->entry;
1662 static char Buffer[80];
1663 STRPTR lp = Buffer;
1665 sprintf(lp, "%ld", (long)sple->sple_Index);
1666 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: lp=<%s>\n", __LINE__, lp));
1667 ndm->strings[0] = lp;
1668 lp += 1 + strlen(lp);
1670 sprintf(lp, "\033I[2:%08lx %08lx %08lx]",
1671 (long)sple->sple_Red, (long)sple->sple_Green, (long)sple->sple_Blue);
1672 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: lp=<%s>\n", __LINE__, lp));
1673 ndm->strings[1] = lp;
1674 lp += 1 + strlen(lp);
1676 // Ref. Count
1677 sprintf(lp, "%ld", (long)GetPenReferenceCount(inst, sple->sple_Index));
1678 ndm->strings[2] = lp;
1679 lp += 1 + strlen(lp);
1681 sprintf(lp, "%ld", (long)(sple->sple_Red >> 24));
1682 ndm->strings[3] = lp;
1683 lp += 1 + strlen(lp);
1685 sprintf(lp, "%ld", (long)(sple->sple_Green >> 24));
1686 ndm->strings[4] = lp;
1687 lp += 1 + strlen(lp);
1689 sprintf(lp, "%ld", (long)(sple->sple_Blue >> 24));
1690 ndm->strings[5] = lp;
1692 else
1694 // display titles
1695 ndm->strings[0] = GetLocString(MSGID_PEN);
1696 ndm->strings[1] = "";
1697 ndm->strings[2] = GetLocString(MSGID_PEN_REFERENCE_COUNT);
1698 ndm->strings[3] = GetLocString(MSGID_RED);
1699 ndm->strings[4] = GetLocString(MSGID_GREEN);
1700 ndm->strings[5] = GetLocString(MSGID_BLUE);
1703 return 0;
1706 static LONG AllocatedPensListCompareFunc(struct Hook *hook, Object *obj, struct NList_CompareMessage *ncm)
1708 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
1709 const struct PensListEntry *sple1 = (const struct PensListEntry *) ncm->entry1;
1710 const struct PensListEntry *sple2 = (const struct PensListEntry *) ncm->entry2;
1711 LONG col1 = ncm->sort_type & MUIV_NList_TitleMark_ColMask;
1712 LONG col2 = ncm->sort_type2 & MUIV_NList_TitleMark2_ColMask;
1713 LONG Result = 0;
1715 if (ncm->sort_type != MUIV_NList_SortType_None)
1717 // primary sorting
1718 switch (col1)
1720 case 0: // sort by index
1721 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1722 Result = sple2->sple_Index - sple1->sple_Index;
1723 else
1724 Result = sple1->sple_Index - sple2->sple_Index;
1725 break;
1726 case 1: // sort by RGB
1727 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1728 Result = RGBComp(sple2, sple1);
1729 else
1730 Result = RGBComp(sple1, sple2);
1731 break;
1732 case 2: // sort by reference count
1733 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1734 Result = GetPenReferenceCount(inst, sple2->sple_Index) - GetPenReferenceCount(inst, sple1->sple_Index);
1735 else
1736 Result = GetPenReferenceCount(inst, sple1->sple_Index) - GetPenReferenceCount(inst, sple2->sple_Index);
1737 break;
1738 case 3: // sort by Red
1739 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1740 Result = ColorComp(sple2->sple_Red, sple1->sple_Red);
1741 else
1742 Result = ColorComp(sple1->sple_Red, sple2->sple_Red);
1743 break;
1744 case 4: // sort by Green
1745 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1746 Result = ColorComp(sple2->sple_Green, sple1->sple_Green);
1747 else
1748 Result = ColorComp(sple1->sple_Green, sple2->sple_Green);
1749 break;
1750 case 5: // sort by Blue
1751 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1752 Result = ColorComp(sple2->sple_Blue, sple1->sple_Blue);
1753 else
1754 Result = ColorComp(sple1->sple_Blue, sple2->sple_Blue);
1755 break;
1756 default:
1757 break;
1760 if (0 == Result && col1 != col2)
1762 // Secondary sorting
1763 switch (col2)
1765 case 0: // sort by index
1766 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
1767 Result = sple2->sple_Index - sple1->sple_Index;
1768 else
1769 Result = sple1->sple_Index - sple2->sple_Index;
1770 break;
1771 case 1: // sort by RGB
1772 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
1773 Result = RGBComp(sple2, sple1);
1774 else
1775 Result = RGBComp(sple1, sple2);
1776 break;
1777 case 2: // sort by reference count
1778 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1779 Result = GetPenReferenceCount(inst, sple2->sple_Index) - GetPenReferenceCount(inst, sple1->sple_Index);
1780 else
1781 Result = GetPenReferenceCount(inst, sple1->sple_Index) - GetPenReferenceCount(inst, sple2->sple_Index);
1782 break;
1783 case 3: // sort by Red
1784 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1785 Result = ColorComp(sple2->sple_Red, sple1->sple_Red);
1786 else
1787 Result = ColorComp(sple1->sple_Red, sple2->sple_Red);
1788 break;
1789 case 4: // sort by Green
1790 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1791 Result = ColorComp(sple2->sple_Green, sple1->sple_Green);
1792 else
1793 Result = ColorComp(sple1->sple_Green, sple2->sple_Green);
1794 break;
1795 case 5: // sort by Blue
1796 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1797 Result = ColorComp(sple2->sple_Blue, sple1->sple_Blue);
1798 else
1799 Result = ColorComp(sple1->sple_Blue, sple2->sple_Blue);
1800 break;
1801 default:
1802 break;
1807 return Result;
1810 //----------------------------------------------------------------------------
1812 static APTR WBPensListConstructFunc(struct Hook *hook, APTR memPool,
1813 struct PensListEntry *spleNew)
1815 struct PensListEntry *sple = AllocPooled(memPool, sizeof(struct PensListEntry));
1817 if (sple)
1819 *sple = *spleNew;
1822 return sple;
1825 static void WBPensListDestructFunc(struct Hook *hook, APTR memPool, APTR Entry)
1827 FreePooled(memPool, Entry, sizeof(struct PensListEntry));
1830 static ULONG WBPensListDisplayFunc(struct Hook *hook, Object *obj, struct NList_DisplayMessage *ndm)
1832 if (ndm->entry)
1834 struct PensListEntry *sple = (struct PensListEntry *) ndm->entry;
1835 static char Buffer[80];
1836 STRPTR lp = Buffer;
1838 sprintf(lp, "%ld", (long)sple->sple_Index);
1839 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: lp=<%s>\n", __LINE__, lp));
1840 ndm->strings[0] = lp;
1841 lp += 1 + strlen(lp);
1843 sprintf(lp, "\x1bI[2:%08lx %08lx %08lx]",
1844 (long)sple->sple_Red, (long)sple->sple_Green, (long)sple->sple_Blue);
1845 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: lp=<%s>\n", __LINE__, lp));
1846 ndm->strings[1] = lp;
1847 lp += 1 + strlen(lp);
1849 sprintf(lp, "%ld", (long)(sple->sple_Red >> 24));
1850 ndm->strings[2] = lp;
1851 lp += 1 + strlen(lp);
1853 sprintf(lp, "%ld", (long)(sple->sple_Green >> 24));
1854 ndm->strings[3] = lp;
1855 lp += 1 + strlen(lp);
1857 sprintf(lp, "%ld", (long)(sple->sple_Blue >> 24));
1858 ndm->strings[4] = lp;
1860 else
1862 // display titles
1863 ndm->strings[0] = GetLocString(MSGID_PEN);
1864 ndm->strings[1] = "";
1865 ndm->strings[2] = GetLocString(MSGID_RED);
1866 ndm->strings[3] = GetLocString(MSGID_GREEN);
1867 ndm->strings[4] = GetLocString(MSGID_BLUE);
1870 return 0;
1873 static LONG WBPensListCompareFunc(struct Hook *hook, Object *obj, struct NList_CompareMessage *ncm)
1875 // struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
1876 const struct PensListEntry *sple1 = (const struct PensListEntry *) ncm->entry1;
1877 const struct PensListEntry *sple2 = (const struct PensListEntry *) ncm->entry2;
1878 LONG col1 = ncm->sort_type & MUIV_NList_TitleMark_ColMask;
1879 LONG col2 = ncm->sort_type2 & MUIV_NList_TitleMark2_ColMask;
1880 LONG Result = 0;
1882 if (ncm->sort_type != MUIV_NList_SortType_None)
1884 // primary sorting
1885 switch (col1)
1887 case 0: // sort by index
1888 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1889 Result = sple2->sple_Index - sple1->sple_Index;
1890 else
1891 Result = sple1->sple_Index - sple2->sple_Index;
1892 break;
1893 case 1: // sort by RGB
1894 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1895 Result = RGBComp(sple2, sple1);
1896 else
1897 Result = RGBComp(sple1, sple2);
1898 break;
1899 case 2: // sort by Red
1900 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1901 Result = ColorComp(sple2->sple_Red, sple1->sple_Red);
1902 else
1903 Result = ColorComp(sple1->sple_Red, sple2->sple_Red);
1904 break;
1905 case 3: // sort by Green
1906 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1907 Result = ColorComp(sple2->sple_Green, sple1->sple_Green);
1908 else
1909 Result = ColorComp(sple1->sple_Green, sple2->sple_Green);
1910 break;
1911 case 4: // sort by Blue
1912 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
1913 Result = ColorComp(sple2->sple_Blue, sple1->sple_Blue);
1914 else
1915 Result = ColorComp(sple1->sple_Blue, sple2->sple_Blue);
1916 break;
1917 default:
1918 break;
1921 if (0 == Result && col1 != col2)
1923 // Secondary sorting
1924 switch (col2)
1926 case 0: // sort by index
1927 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
1928 Result = sple2->sple_Index - sple1->sple_Index;
1929 else
1930 Result = sple1->sple_Index - sple2->sple_Index;
1931 break;
1932 case 1: // sort by RGB
1933 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
1934 Result = RGBComp(sple2, sple1);
1935 else
1936 Result = RGBComp(sple1, sple2);
1937 break;
1938 case 2: // sort by Red
1939 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1940 Result = ColorComp(sple2->sple_Red, sple1->sple_Red);
1941 else
1942 Result = ColorComp(sple1->sple_Red, sple2->sple_Red);
1943 break;
1944 case 3: // sort by Green
1945 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1946 Result = ColorComp(sple2->sple_Green, sple1->sple_Green);
1947 else
1948 Result = ColorComp(sple1->sple_Green, sple2->sple_Green);
1949 break;
1950 case 4: // sort by Blue
1951 if (ncm->sort_type2 & MUIV_NList_TitleMark_TypeMask)
1952 Result = ColorComp(sple2->sple_Blue, sple1->sple_Blue);
1953 else
1954 Result = ColorComp(sple1->sple_Blue, sple2->sple_Blue);
1955 break;
1956 default:
1957 break;
1962 return Result;
1965 //----------------------------------------------------------------------------
1967 static APTR ScalosPenListConstructFunc(struct Hook *hook, APTR memPool, struct ScalosPenListEntry *msg)
1969 struct ScalosPenListEntry *snle = AllocPooled(memPool, sizeof(struct ScalosPenListEntry));
1971 if (snle)
1973 *snle = *msg;
1976 return snle;
1979 static void ScalosPenListDestructFunc(struct Hook *hook, APTR memPool, APTR Entry)
1981 FreePooled(memPool, Entry, sizeof(struct ScalosPenListEntry));
1984 static ULONG ScalosPenListDisplayFunc(struct Hook *hook, Object *obj, struct NList_DisplayMessage *ndm)
1986 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
1988 if (ndm->entry)
1990 struct PensListEntry *sple = NULL;
1991 struct ScalosPenListEntry *snle = (struct ScalosPenListEntry *) ndm->entry;
1992 static char Buffer[80];
1993 STRPTR lp = Buffer;
1996 if (PEN_UNDEFINED != snle->snle_PenNr)
1997 sprintf(lp, "%d", snle->snle_PenNr);
1998 else
1999 strcpy(lp, "??");
2000 ndm->strings[0] = lp;
2001 lp += 1 + strlen(lp);
2003 if (PEN_UNDEFINED != snle->snle_PenNr)
2004 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_GetEntry, snle->snle_PenNr, &sple);
2006 if (sple)
2008 sprintf(lp, "\x1bI[2:%08lx %08lx %08lx]",
2009 (long)sple->sple_Red, (long)sple->sple_Green, (long)sple->sple_Blue);
2011 else
2013 strcpy(lp, "");
2015 ndm->strings[1] = lp;
2017 ndm->strings[2] = (STRPTR) snle->snle_PenName;
2019 else
2021 // display titles
2022 ndm->strings[0] = GetLocString(MSGID_PEN);
2023 ndm->strings[1] = "";
2024 ndm->strings[2] = GetLocString(MSGID_PENNAMENAME);
2027 return 0;
2030 static LONG ScalosPenListCompareFunc(struct Hook *hook, Object *obj, struct NList_CompareMessage *ncm)
2032 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2033 const struct ScalosPenListEntry *snle1 = (const struct ScalosPenListEntry *) ncm->entry1;
2034 const struct ScalosPenListEntry *snle2 = (const struct ScalosPenListEntry *) ncm->entry2;
2035 LONG col1 = ncm->sort_type & MUIV_NList_TitleMark_ColMask;
2036 LONG col2 = ncm->sort_type2 & MUIV_NList_TitleMark2_ColMask;
2037 LONG Result = 0;
2039 if (ncm->sort_type != MUIV_NList_SortType_None)
2041 struct PensListEntry *sple1 = NULL;
2042 struct PensListEntry *sple2 = NULL;
2044 if (PEN_UNDEFINED != snle1->snle_PenNr)
2045 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_GetEntry, snle1->snle_PenNr, &sple1);
2046 if (PEN_UNDEFINED != snle2->snle_PenNr)
2047 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_GetEntry, snle2->snle_PenNr, &sple2);
2049 // primary sorting
2050 switch (col1)
2052 case 0: // sort by pen number
2053 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
2054 Result = snle2->snle_PenNr - snle1->snle_PenNr;
2055 else
2056 Result = snle1->snle_PenNr - snle2->snle_PenNr;
2057 break;
2058 case 1: // sort by RGB
2059 if (sple2 && sple1)
2061 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
2062 Result = RGBComp(sple2, sple1);
2063 else
2064 Result = RGBComp(sple1, sple2);
2066 break;
2067 case 2: // sort by name
2068 if (ncm->sort_type & MUIV_NList_TitleMark_TypeMask)
2069 Result = Stricmp(snle2->snle_PenName, snle1->snle_PenName);
2070 else
2071 Result = Stricmp(snle1->snle_PenName, snle2->snle_PenName);
2072 break;
2073 default:
2074 break;
2077 if (0 == Result && col1 != col2)
2079 // Secondary sorting
2080 switch (col2)
2082 case 0: // sort by pen number
2083 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
2084 Result = snle1->snle_PenNr - snle2->snle_PenNr;
2085 else
2086 Result = snle2->snle_PenNr - snle1->snle_PenNr;
2087 break;
2088 case 1: // sort by RGB
2089 if (sple1 && sple2)
2091 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
2092 Result = RGBComp(sple2, sple1);
2093 else
2094 Result = RGBComp(sple1, sple2);
2096 break;
2097 case 2: // sort by name
2098 if (ncm->sort_type2 & MUIV_NList_TitleMark2_TypeMask)
2099 Result = Stricmp(snle2->snle_PenName, snle1->snle_PenName);
2100 else
2101 Result = Stricmp(snle1->snle_PenName, snle2->snle_PenName);
2102 break;
2103 default:
2104 break;
2109 return Result;
2112 //----------------------------------------------------------------------------
2114 static void GetWBColorsFunc(struct Hook *hook, Object *pop, Object *win)
2116 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2118 if (inst->ppb_WBScreen)
2120 ULONG nColors = inst->ppb_WBScreen->BitMap.Depth;
2121 struct ColorMap *cm = inst->ppb_WBScreen->ViewPort.ColorMap;
2122 struct RGB *RGBTable;
2124 if (nColors > 8)
2125 nColors = cm->Count;
2126 else
2127 nColors = 1L << nColors;
2129 DoMethod(inst->ppb_Objects[OBJNDX_WBColorsList], MUIM_NList_Clear);
2131 RGBTable = AllocVec(nColors * sizeof(struct RGB), MEMF_PUBLIC);
2132 if (RGBTable)
2134 ULONG n;
2136 GetRGB32(cm, 0, nColors, (ULONG *) RGBTable);
2138 for (n=0; n<nColors; n++)
2140 struct PensListEntry sple;
2142 sple.sple_Index = n;
2143 sple.sple_Red = RGBTable[n].rgb_Red;
2144 sple.sple_Green = RGBTable[n].rgb_Green;
2145 sple.sple_Blue = RGBTable[n].rgb_Blue;
2147 DoMethod(inst->ppb_Objects[OBJNDX_WBColorsList],
2148 MUIM_NList_InsertSingle, &sple, MUIV_NList_Insert_Sorted);
2151 FreeVec(RGBTable);
2156 //----------------------------------------------------------------------------
2158 static APTR AddPenFunc(struct Hook *hook, Object *o, Msg msg)
2160 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2161 ULONG *rgb = NULL;
2162 struct PensListEntry sple;
2164 sple.sple_Index = 0;
2166 get(inst->ppb_Objects[OBJNDX_ColorAdjust], MUIA_Coloradjust_RGB, &rgb);
2167 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Entries, &sple.sple_Index );
2169 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: rgb=%08lx %08lx %08lx\n", __LINE__, rgb[0], rgb[1], rgb[2]));
2171 sple.sple_Red = rgb[0];
2172 sple.sple_Green = rgb[1];
2173 sple.sple_Blue = rgb[2];
2175 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
2176 SetChangedFlag(inst, TRUE);
2178 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList],
2179 MUIM_NList_InsertSingle, &sple, MUIV_NList_Insert_Bottom);
2180 set(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Active, MUIV_NList_Active_Bottom);
2182 UpdatePalettePenCount(inst);
2184 return 0;
2187 static APTR SelectPalettePenFunc(struct Hook *hook, Object *o, Msg msg)
2189 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2190 struct PensListEntry *sple;
2192 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &sple);
2194 if (sple)
2195 set(inst->ppb_Objects[OBJNDX_ColorAdjust], MUIA_Coloradjust_RGB, (ULONG) sple);
2197 set(inst->ppb_Objects[OBJNDX_DeleteButton], MUIA_Disabled, NULL == sple);
2198 set(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIA_NList_Active, MUIV_NList_Active_Off);
2200 return 0;
2203 static APTR SelectScalosPenFunc(struct Hook *hook, Object *o, Msg msg)
2205 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2206 struct ScalosPenListEntry *snle = NULL;
2208 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &snle);
2210 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: snle=%08lx\n", __LINE__, snle));
2212 if (snle)
2214 set(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Active, snle->snle_PenNr);
2217 return 0;
2220 static APTR ChangePenColorFunc(struct Hook *hook, Object *o, ULONG **msg)
2222 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2223 struct PensListEntry *sple = NULL;
2224 ULONG *rgb = *msg;
2225 LONG ActiveEntryNr = 0;
2227 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_GetEntry, MUIV_NList_GetEntry_Active, &sple);
2228 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Active, &ActiveEntryNr);
2230 if (sple)
2232 if (sple->sple_Red != rgb[0] || sple->sple_Green != rgb[1] || sple->sple_Blue != rgb[2])
2234 ULONG n, nEntries = 0;
2236 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
2237 SetChangedFlag(inst, TRUE);
2239 sple->sple_Red = rgb[0];
2240 sple->sple_Green = rgb[1];
2241 sple->sple_Blue = rgb[2];
2243 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Redraw, MUIV_NList_Redraw_Active);
2245 get(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIA_NList_Entries, &nEntries);
2247 for (n=0; n<nEntries; n++)
2249 struct ScalosPenListEntry *snle;
2251 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, n, &snle);
2253 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: snle_PenNr=%ld ActiveEntryNr=%ld\n", __LINE__, snle->snle_PenNr, ActiveEntryNr));
2255 if (snle && snle->snle_PenNr == ActiveEntryNr)
2256 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_Redraw, n);
2261 return 0;
2264 static APTR ResetToDefaultsFunc(struct Hook *hook, Object *o, Msg msg)
2266 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2267 ULONG n;
2268 LONG EntryNr;
2269 struct ScalosPenListEntry *snle;
2270 const struct PenListInit *pli;
2272 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Clear);
2274 for (n=0; n<sizeof(DefaultPaletteEntries)/sizeof(DefaultPaletteEntries[0]); n++)
2276 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList],
2277 MUIM_NList_InsertSingle, &DefaultPaletteEntries[n], MUIV_NList_Insert_Sorted);
2280 for (pli=PenListContents, EntryNr=0; pli->pli_PenIndex; pli++, EntryNr++)
2282 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, EntryNr, &snle);
2284 if (NULL == snle)
2285 break;
2287 snle->snle_PenIndex = pli->pli_PenIndex;
2288 snle->snle_PenNr = pli->pli_PenNr;
2289 snle->snle_PenName = GetLocString(pli->pli_PenNameID);
2292 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_Redraw, MUIV_NList_Redraw_All);
2294 SetChangedFlag(inst, TRUE);
2296 return NULL;
2299 static APTR AboutFunc(struct Hook *hook, Object *o, Msg msg)
2301 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2303 MUI_Request(inst->ppb_Objects[OBJNDX_APP_Main], inst->ppb_Objects[OBJNDX_WIN_Main], 0, NULL,
2304 GetLocString(MSGID_ABOUTREQOK),
2305 GetLocString(MSGID_ABOUTREQFORMAT),
2306 MajorVersion, MinorVersion, COMPILER_STRING, CURRENTYEAR);
2308 return 0;
2311 static APTR OpenFunc(struct Hook *hook, Object *o, Msg msg)
2313 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2315 if (NULL == inst->ppb_LoadReq)
2317 inst->ppb_LoadReq = MUI_AllocAslRequestTags(ASL_FileRequest,
2318 ASLFR_InitialFile, "Palette.pre",
2319 ASLFR_Flags1, FRF_DOPATTERNS,
2320 ASLFR_InitialDrawer, "SYS:Prefs/presets",
2321 ASLFR_InitialPattern, "#?.(pre|prefs)",
2322 ASLFR_UserData, inst,
2323 ASLFR_IntuiMsgFunc, &inst->ppb_Hooks[HOOKNDX_AslIntuiMsg],
2324 TAG_END);
2326 if (inst->ppb_LoadReq)
2328 BOOL Result;
2329 struct Window *win = NULL;
2331 get(inst->ppb_Objects[OBJNDX_WIN_Main], MUIA_Window_Window, &win);
2333 //AslRequest(
2334 Result = MUI_AslRequestTags(inst->ppb_LoadReq,
2335 ASLFR_Window, win,
2336 ASLFR_SleepWindow, TRUE,
2337 ASLFR_TitleText, GetLocString(MSGID_MENU_PROJECT_OPEN),
2338 TAG_END);
2340 if (Result)
2342 BPTR dirLock = Lock(inst->ppb_LoadReq->fr_Drawer, ACCESS_READ);
2344 if (dirLock)
2346 BPTR oldDir = CurrentDir(dirLock);
2348 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Clear);
2350 ReadPrefsFile(inst, inst->ppb_LoadReq->fr_File, FALSE);
2352 CurrentDir(oldDir);
2353 UnLock(dirLock);
2358 return 0;
2361 static APTR LastSavedFunc(struct Hook *hook, Object *o, Msg msg)
2363 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2365 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Clear);
2367 ReadPrefsFile(inst, "ENVARC:Scalos/Palette13.prefs", FALSE);
2369 SetChangedFlag(inst, TRUE);
2371 return 0;
2374 static APTR RestoreFunc(struct Hook *hook, Object *o, Msg msg)
2376 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2378 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Clear);
2380 ReadPrefsFile(inst, "ENV:Scalos/Palette13.prefs", FALSE);
2382 SetChangedFlag(inst, TRUE);
2384 return 0;
2387 static APTR SaveAsFunc(struct Hook *hook, Object *o, Msg msg)
2389 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2391 if (NULL == inst->ppb_SaveReq)
2393 inst->ppb_SaveReq = MUI_AllocAslRequestTags(ASL_FileRequest,
2394 ASLFR_InitialFile, "Palette.pre",
2395 ASLFR_DoSaveMode, TRUE,
2396 ASLFR_InitialDrawer, "SYS:Prefs/presets",
2397 ASLFR_UserData, inst,
2398 ASLFR_IntuiMsgFunc, &inst->ppb_Hooks[HOOKNDX_AslIntuiMsg],
2399 TAG_END);
2401 if (inst->ppb_SaveReq)
2403 BOOL Result;
2404 struct Window *win = NULL;
2406 get(inst->ppb_Objects[OBJNDX_WIN_Main], MUIA_Window_Window, &win);
2408 //AslRequest(
2409 Result = MUI_AslRequestTags(inst->ppb_SaveReq,
2410 ASLFR_TitleText, GetLocString(MSGID_MENU_PROJECT_SAVEAS),
2411 ASLFR_Window, win,
2412 ASLFR_SleepWindow, TRUE,
2413 TAG_END);
2415 if (Result)
2417 BPTR dirLock = Lock(inst->ppb_SaveReq->fr_Drawer, ACCESS_READ);
2419 if (dirLock)
2421 LONG Result;
2422 BPTR oldDir = CurrentDir(dirLock);
2424 Result = WritePrefsFile(inst, inst->ppb_SaveReq->fr_File);
2426 if (RETURN_OK == Result)
2428 if (inst->ppb_fCreateIcons)
2429 SaveIcon(inst, inst->ppb_SaveReq->fr_File);
2432 CurrentDir(oldDir);
2433 UnLock(dirLock);
2438 return 0;
2441 static APTR DeletePenFunc(struct Hook *hook, Object *o, Msg msg)
2443 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2444 LONG ActiveEntryNr = MUIV_NList_Active_Off;
2445 LONG PenCount = 0;
2447 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Active, &ActiveEntryNr);
2448 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_NList_Entries, &PenCount);
2450 if (MUIV_NList_Active_Off != ActiveEntryNr)
2452 LONG n;
2453 LONG Entries = 0;
2455 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: \n", __LINE__));
2456 SetChangedFlag(inst, TRUE);
2458 get(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIA_NList_Entries, &Entries);
2460 // adjust all pen numbers in inst->ppb_Objects[OBJNDX_ScalosPenList]
2462 for (n=0; n<Entries; n++)
2464 struct ScalosPenListEntry *snle;
2466 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, n, &snle);
2468 if (snle->snle_PenNr == ActiveEntryNr)
2469 snle->snle_PenNr = PEN_UNDEFINED;
2470 if (snle->snle_PenNr > ActiveEntryNr)
2471 snle->snle_PenNr--;
2474 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Remove, MUIV_NList_Remove_Active);
2475 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_Redraw, MUIV_NList_Redraw_All);
2478 UpdatePalettePenCount(inst);
2480 return 0;
2484 static APTR ContextMenuTriggerHookFunc(struct Hook *hook, Object *o, Msg msg)
2486 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2487 Object *MenuObj = *((Object **) msg);
2488 ULONG MenuHookIndex = 0;
2489 struct Hook *MenuHook = NULL;
2491 d1(kprintf(__FUNC__ "/%ld: MenuObj=%08lx\n", __LINE__, MenuObj));
2492 d1(kprintf(__FUNC__ "/%ld: msg=%08lx *msg=%08lx\n", __LINE__, msg, *((ULONG *) msg)));
2494 get(MenuObj, MUIA_UserData, &MenuHookIndex);
2496 if (MenuHookIndex > 0 && MenuHookIndex < HOOKNDX_MAX)
2497 MenuHook = &inst->ppb_Hooks[MenuHookIndex];
2499 d1(kprintf(__FUNC__ "/%ld: MenuHook=%08lx\n", __LINE__, MenuHook));
2500 if (MenuHook)
2501 DoMethod(inst->ppb_Objects[OBJNDX_Group_Main], MUIM_CallHook, MenuHook, MenuObj);
2503 return NULL;
2506 //----------------------------------------------------------------------------
2508 static void AslIntuiMsgHookFunc(struct Hook *hook, Object *o, Msg msg)
2510 struct PalettePrefsInst *inst = (struct PalettePrefsInst *) hook->h_Data;
2511 struct IntuiMessage *iMsg = (struct IntuiMessage *) msg;
2513 if (IDCMP_REFRESHWINDOW == iMsg->Class)
2515 DoMethod(inst->ppb_Objects[OBJNDX_APP_Main], MUIM_Application_CheckRefresh);
2519 //----------------------------------------------------------------------------
2521 static void InitPenList(struct PalettePrefsInst *inst)
2523 const struct PenListInit *pli;
2525 for (pli=PenListContents; pli->pli_PenIndex; pli++)
2527 struct ScalosPenListEntry snle;
2529 snle.snle_PenIndex = pli->pli_PenIndex;
2530 snle.snle_PenNr = pli->pli_PenNr;
2531 snle.snle_PenName = GetLocString(pli->pli_PenNameID);
2533 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList],
2534 MUIM_NList_InsertSingle, &snle, MUIV_NList_Insert_Sorted);
2539 static LONG ReadPrefsFile(struct PalettePrefsInst *inst, CONST_STRPTR Filename, BOOL Quiet)
2541 LONG Result;
2542 struct IFFHandle *iff;
2543 BOOL iffOpened = FALSE;
2545 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_NList_Clear);
2547 do {
2548 iff = AllocIFF();
2549 if (NULL == iff)
2551 Result = IoErr();
2552 break;
2555 InitIFFasDOS(iff);
2557 iff->iff_Stream = (IPTR)Open(Filename, MODE_OLDFILE);
2558 if (0 == iff->iff_Stream)
2560 Result = IoErr();
2561 break;
2564 Result = OpenIFF(iff, IFFF_READ);
2565 if (RETURN_OK != Result)
2566 break;
2568 iffOpened = TRUE;
2570 Result = StopChunks(iff, StopChunkList, 2);
2571 if (RETURN_OK != Result)
2572 break;
2574 while (RETURN_OK == Result)
2576 struct ContextNode *cn;
2578 Result = ParseIFF(iff, IFFPARSE_SCAN);
2579 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Result=%ld\n", __LINE__, Result));
2580 if (RETURN_OK != Result)
2581 break;
2583 cn = CurrentChunk(iff);
2584 if (NULL == cn)
2585 break;
2587 if (ID_PENS == cn->cn_ID)
2589 LONG Actual;
2590 WORD Pen, PenCount;
2592 Actual = ReadChunkBytes(iff, &PenCount, sizeof(PenCount));
2593 if (Actual < 0)
2594 break;
2596 PenCount = SCA_BE2WORD(PenCount);
2598 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: PenCount=%ld\n", __LINE__, PenCount));
2600 if (PenCount < 2)
2601 break;
2603 for (Pen=0; Pen<PenCount; Pen++)
2605 struct ScalosPen sPen;
2607 if (ReadChunkBytes(iff, &sPen, sizeof(sPen)) >= 0)
2609 sPen.sp_pentype = SCA_BE2WORD(sPen.sp_pentype);
2610 sPen.sp_pen = SCA_BE2WORD(sPen.sp_pen);
2611 SearchAndSetPen(inst, &sPen);
2615 else if (ID_SPAL == cn->cn_ID)
2617 LONG n, ScreenColorListEntries;
2618 LONG Actual;
2620 Actual = ReadChunkBytes(iff, &ScreenColorListEntries, sizeof(ScreenColorListEntries));
2621 if (Actual < 0)
2622 break;
2623 ScreenColorListEntries = SCA_BE2LONG(ScreenColorListEntries);
2624 ScreenColorListEntries >>= 16;
2626 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: ScreenColorListEntries=%ld\n", __LINE__, ScreenColorListEntries));
2628 for (n=0; n<ScreenColorListEntries; n++)
2630 struct PensListConstruct splc;
2631 struct PensListEntry sple;
2633 Actual = ReadChunkBytes(iff, &splc, sizeof(splc));
2635 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Read Palette Size=%ld Actual=%ld\n", __LINE__, cn->cn_Size, Actual));
2636 if (Actual < 0)
2638 Result = IoErr();
2639 break;
2642 sple.sple_Index = n;
2643 sple.sple_Red = SCA_BE2LONG(splc.splc_Red);
2644 sple.sple_Green = SCA_BE2LONG(splc.splc_Green);
2645 sple.sple_Blue = SCA_BE2LONG(splc.splc_Blue);
2647 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList],
2648 MUIM_NList_InsertSingle, &sple, MUIV_NList_Insert_Sorted);
2653 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Result=%ld\n", __LINE__, Result));
2654 if (IFFERR_EOF == Result)
2655 Result = RETURN_OK;
2656 } while (0);
2658 if (iff)
2660 if (iffOpened)
2661 CloseIFF(iff);
2663 if (iff->iff_Stream)
2664 Close((BPTR)iff->iff_Stream);
2666 FreeIFF(iff);
2669 if (RETURN_OK != Result && !Quiet)
2671 char Buffer[120];
2673 Fault(Result, "", Buffer, sizeof(Buffer) - 1);
2675 // MUI_RequestA()
2676 MUI_Request(inst->ppb_Objects[OBJNDX_APP_Main], inst->ppb_Objects[OBJNDX_WIN_Main], 0, NULL,
2677 GetLocString(MSGID_ABOUTREQOK),
2678 GetLocString(MSGID_REQTITLE_READERROR),
2679 Filename,
2680 Buffer);
2683 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_Redraw, MUIV_NList_Redraw_All);
2684 UpdatePalettePenCount(inst);
2686 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Result=%ld\n", __LINE__, Result));
2688 return Result;
2692 static void SearchAndSetPen(struct PalettePrefsInst *inst, const struct ScalosPen *sPen)
2694 ULONG n = 0;
2696 while (1)
2698 struct ScalosPenListEntry *snle = NULL;
2700 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, n, &snle);
2701 if (NULL == snle)
2702 break;
2704 if (snle->snle_PenIndex == sPen->sp_pentype)
2706 snle->snle_PenNr = sPen->sp_pen;
2709 n++;
2714 static LONG WritePrefsFile(struct PalettePrefsInst *inst, CONST_STRPTR Filename)
2716 struct IFFHandle *iff;
2717 LONG Result;
2718 BOOL IffOpen = FALSE;
2720 do {
2721 static const struct PrefHeader prefHeader = { 1, 0, 0L };
2722 ULONG n, Entries;
2723 UWORD wEntries;
2725 iff = AllocIFF();
2726 if (NULL == iff)
2728 Result = IoErr();
2729 break;
2732 InitIFFasDOS(iff);
2734 iff->iff_Stream = (IPTR)Open(Filename, MODE_NEWFILE);
2735 if (0 == iff->iff_Stream)
2737 // ... try to create missing directories here
2738 STRPTR FilenameCopy;
2740 Result = IoErr();
2741 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Result=%ld\n", __LINE__, Result));
2743 FilenameCopy = AllocVec(1 + strlen(Filename), MEMF_PUBLIC);
2745 if (FilenameCopy)
2747 STRPTR lp;
2749 strcpy(FilenameCopy, Filename);
2751 lp = PathPart(FilenameCopy);
2752 if (lp)
2754 BPTR dirLock;
2756 *lp = '\0';
2757 dirLock = CreateDir(FilenameCopy);
2759 if (dirLock)
2760 UnLock(dirLock);
2762 iff->iff_Stream = (IPTR)Open(Filename, MODE_NEWFILE);
2763 if (0 == iff->iff_Stream)
2764 Result = IoErr();
2765 else
2766 Result = RETURN_OK;
2769 FreeVec(FilenameCopy);
2772 d1(kprintf(__FILE__ "/" __FUNC__ "/%ld: Result=%ld\n", __LINE__, Result));
2773 if (RETURN_OK != Result)
2774 break;
2777 Result = OpenIFF(iff, IFFF_WRITE);
2778 if (RETURN_OK != Result)
2779 break;
2781 IffOpen = TRUE;
2783 Result = PushChunk(iff, ID_PREF, ID_FORM, IFFSIZE_UNKNOWN);
2784 if (RETURN_OK != Result)
2785 break;
2787 Result = PushChunk(iff, 0, ID_PRHD, IFFSIZE_UNKNOWN);
2788 if (RETURN_OK != Result)
2789 break;
2791 if (WriteChunkBytes(iff, (APTR) &prefHeader, sizeof(prefHeader)) < 0)
2793 Result = IoErr();
2794 break;
2797 Result = PopChunk(iff);
2798 if (RETURN_OK != Result)
2799 break;
2801 Result = PushChunk(iff, 0, ID_SPAL, IFFSIZE_UNKNOWN);
2802 if (RETURN_OK != Result)
2803 break;
2805 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_List_Entries, &Entries);
2807 Entries <<= 16;
2808 Entries = SCA_LONG2BE(Entries);
2810 if (WriteChunkBytes(iff, &Entries, sizeof(Entries)) < 0)
2812 Result = IoErr();
2813 break;
2816 n = 0;
2817 while (RETURN_OK == Result)
2819 struct PensListConstruct splc;
2820 struct PensListEntry *sple = NULL;
2822 DoMethod(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIM_List_GetEntry, n, &sple);
2823 if (NULL == sple)
2824 break;
2826 splc.splc_Red = SCA_LONG2BE(sple->sple_Red);
2827 splc.splc_Green = SCA_LONG2BE(sple->sple_Green);
2828 splc.splc_Blue = SCA_LONG2BE(sple->sple_Blue);
2830 if (WriteChunkBytes(iff, &splc, sizeof(struct PensListConstruct)) < 0)
2832 Result = IoErr();
2833 break;
2835 n++;
2837 if (RETURN_OK != Result)
2838 break;
2840 Result = PopChunk(iff);
2841 if (RETURN_OK != Result)
2842 break;
2844 Result = PushChunk(iff, 0, ID_PENS, IFFSIZE_UNKNOWN);
2845 if (RETURN_OK != Result)
2846 break;
2848 get(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIA_List_Entries, &Entries);
2850 wEntries = Entries;
2851 wEntries = SCA_WORD2BE(wEntries);
2853 if (WriteChunkBytes(iff, &wEntries, sizeof(wEntries)) < 0)
2855 Result = IoErr();
2856 break;
2859 n = 0;
2860 while (RETURN_OK == Result)
2862 struct ScalosPen sPen;
2863 struct ScalosPenListEntry *snle = NULL;
2865 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_List_GetEntry, n, &snle);
2866 if (NULL == snle)
2867 break;
2869 sPen.sp_pentype = SCA_WORD2BE(snle->snle_PenIndex);
2870 sPen.sp_pen = SCA_WORD2BE(snle->snle_PenNr);
2872 if (WriteChunkBytes(iff, &sPen, sizeof(sPen)) < 0)
2874 Result = IoErr();
2875 break;
2877 n++;
2879 if (RETURN_OK != Result)
2880 break;
2882 Result = PopChunk(iff);
2883 if (RETURN_OK != Result)
2884 break;
2886 Result = PopChunk(iff);
2887 if (RETURN_OK != Result)
2888 break;
2890 } while (0);
2892 if (iff)
2894 if (IffOpen)
2895 CloseIFF(iff);
2897 if (iff->iff_Stream)
2899 Close((BPTR)iff->iff_Stream);
2900 iff->iff_Stream = 0;
2903 FreeIFF(iff);
2906 if (RETURN_OK != Result)
2908 char Buffer[120];
2910 Fault(Result, "", Buffer, sizeof(Buffer) - 1);
2912 // MUI_RequestA()
2913 MUI_Request(inst->ppb_Objects[OBJNDX_APP_Main], inst->ppb_Objects[OBJNDX_WIN_Main], 0, NULL,
2914 GetLocString(MSGID_ABOUTREQOK),
2915 GetLocString(MSGID_REQTITLE_SAVEERROR),
2916 Filename,
2917 Buffer);
2920 return Result;
2924 static LONG SaveIcon(struct PalettePrefsInst *inst, CONST_STRPTR IconName)
2926 struct DiskObject *icon, *allocIcon;
2928 static UBYTE ImageData[] =
2930 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
2931 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x18, 0x00, 0x60, 0x00, 0x10, 0x00,
2932 0x00, 0x00, 0x20, 0xFC, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x41, 0x02, 0x08, 0x00, 0x0C, 0x00,
2933 0x00, 0x00, 0x40, 0x82, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x40, 0x82, 0x08, 0x00, 0x0C, 0x00,
2934 0x00, 0x00, 0x21, 0x04, 0x08, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x1E, 0x18, 0x10, 0x00, 0x0C, 0x00,
2935 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x00, 0x0C, 0x00,
2936 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x1C, 0x00, 0x00, 0x0C, 0x00,
2937 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0C, 0x00,
2938 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x0C, 0x00,
2939 0x40, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00,
2940 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,
2941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00,
2942 0xD5, 0x55, 0x55, 0x55, 0x55, 0x56, 0x00, 0x00, 0xD5, 0x55, 0x50, 0x00, 0x55, 0x55, 0x80, 0x00,
2943 0xD5, 0x55, 0x47, 0xFF, 0x95, 0x55, 0x60, 0x00, 0xD5, 0x55, 0x5F, 0x03, 0xE5, 0x55, 0x50, 0x00,
2944 0xD5, 0x55, 0x3E, 0x55, 0xF5, 0x55, 0x50, 0x00, 0xD5, 0x55, 0x3F, 0x55, 0xF5, 0x55, 0x50, 0x00,
2945 0xD5, 0x55, 0x3F, 0x55, 0xF5, 0x55, 0x50, 0x00, 0xD5, 0x55, 0x5E, 0x53, 0xF5, 0x55, 0x50, 0x00,
2946 0xD5, 0x55, 0x41, 0x47, 0xE5, 0x55, 0x50, 0x00, 0xD5, 0x55, 0x55, 0x1F, 0xD5, 0x55, 0x50, 0x00,
2947 0xD5, 0x55, 0x55, 0x7F, 0x15, 0x55, 0x50, 0x00, 0xD5, 0x55, 0x54, 0xFC, 0x55, 0x55, 0x50, 0x00,
2948 0xD5, 0x55, 0x55, 0xE1, 0x55, 0x55, 0x50, 0x00, 0xD5, 0x55, 0x54, 0xF5, 0x55, 0x55, 0x50, 0x00,
2949 0xD5, 0x55, 0x55, 0x05, 0x55, 0x55, 0x50, 0x00, 0xD5, 0x55, 0x54, 0xF5, 0x55, 0x55, 0x50, 0x00,
2950 0xD5, 0x55, 0x54, 0xF5, 0x55, 0x55, 0x50, 0x00, 0x35, 0x55, 0x55, 0x05, 0x55, 0x55, 0x50, 0x00,
2951 0x0D, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0x00, 0x03, 0x55, 0x55, 0x55, 0x55, 0x55, 0x50, 0x00,
2952 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2955 static struct Image NormalImage =
2957 0, 0, 54, 23,
2959 (UWORD *)ImageData,
2960 3, 0,
2961 NULL
2964 static STRPTR defToolTypes[] =
2966 "ACTION=USE",
2967 NULL
2970 static struct DiskObject DefaultIcon =
2972 WB_DISKMAGIC, WB_DISKVERSION,
2975 NULL,
2976 0, 0, 54, 24,
2977 GFLG_GADGIMAGE | GFLG_GADGHBOX,
2978 GACT_RELVERIFY | GACT_IMMEDIATE,
2979 GTYP_BOOLGADGET,
2980 &NormalImage, NULL,
2981 NULL,
2983 NULL,
2985 NULL
2988 WBPROJECT,
2989 NULL,
2990 defToolTypes,
2991 NO_ICON_POSITION, NO_ICON_POSITION,
2992 NULL,
2993 NULL,
2994 8192
2997 icon = allocIcon = GetDiskObject("ENV:sys/def_ScaPalettePrefs");
2998 if (NULL == icon)
2999 icon = allocIcon = GetDiskObject("ENV:sys/def_pref");
3000 if (NULL == icon)
3001 icon = &DefaultIcon;
3003 if (icon)
3005 STRPTR oldDefaultTool = icon->do_DefaultTool;
3007 icon->do_DefaultTool = (STRPTR) inst->ppb_ProgramName;
3009 PutDiskObject((STRPTR) IconName, icon);
3011 icon->do_DefaultTool = oldDefaultTool;
3013 if (allocIcon)
3014 FreeDiskObject(allocIcon);
3017 return 0;
3021 static void UpdatePalettePenCount(struct PalettePrefsInst *inst)
3023 ULONG allocatedPens = 0;
3024 UWORD availablePens;
3026 availablePens = 1 + inst->ppb_WBScreen->ViewPort.ColorMap->PalExtra->pe_SharableColors;
3028 if (inst->ppb_Objects[OBJNDX_AllocatedPensList])
3029 get(inst->ppb_Objects[OBJNDX_AllocatedPensList], MUIA_List_Entries, &allocatedPens);
3030 else
3031 allocatedPens = 0;
3033 sprintf(inst->ppb_PalettePenListTitle, GetLocString(MSGID_TITLE_PALETTEPENLIST),
3034 allocatedPens, availablePens);
3036 if (inst->ppb_Objects[OBJNDX_AllocatedPensListTitleObj])
3037 set(inst->ppb_Objects[OBJNDX_AllocatedPensListTitleObj], MUIA_Text_Contents, (ULONG) inst->ppb_PalettePenListTitle);
3039 set(inst->ppb_Objects[OBJNDX_NewButton], MUIA_Disabled, allocatedPens >= availablePens);
3042 //----------------------------------------------------------------------------
3044 static ULONG GetPenReferenceCount(struct PalettePrefsInst *inst, ULONG PenNr)
3046 ULONG Entries = 0;
3047 ULONG References = 0;
3048 ULONG n;
3050 get(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIA_NList_Entries, &Entries);
3052 for (n=0; n<Entries; n++)
3054 const struct ScalosPenListEntry *snle = NULL;
3056 DoMethod(inst->ppb_Objects[OBJNDX_ScalosPenList], MUIM_NList_GetEntry, n, &snle);
3057 if (snle)
3059 if (snle->snle_PenNr == PenNr)
3060 References++;
3064 return References;
3067 //----------------------------------------------------------------------------
3069 static void SetChangedFlag(struct PalettePrefsInst *inst, BOOL changed)
3071 if (changed != inst->ppb_Changed)
3073 set(inst->ppb_Objects[OBJNDX_Lamp_Changed],
3074 MUIA_Lamp_Color, changed ? MUIV_Lamp_Color_Ok : MUIV_Lamp_Color_Off);
3075 inst->ppb_Changed = changed;
3079 //---------------------------------------------------------------
3081 BOOL initPlugin(struct PluginBase *PluginBase)
3083 MajorVersion = PluginBase->pl_LibNode.lib_Version;
3084 MinorVersion = PluginBase->pl_LibNode.lib_Revision;
3086 d1(kprintf("%s/%s/%ld: Signature=%08lx\n", __FILE__, __FUNC__, __LINE__, Signature));
3088 if (0x4711 == Signature++)
3090 d1(kprintf(__FUNC__ "/%ld: PluginBase=%08lx procName=<%s>\n", __LINE__, \
3091 PluginPrefsBase, FindTask(NULL)->tc_Node.ln_Name));
3093 if (!OpenLibraries())
3094 return FALSE;
3096 #if !defined(__amigaos4__) && !defined(__AROS__)
3097 if (_STI_240_InitMemFunctions())
3098 return FALSE;
3099 #endif
3101 PalettePrefsClass = MUI_CreateCustomClass(&PluginBase->pl_LibNode, MUIC_Group,
3102 NULL, sizeof(struct PalettePrefsInst), DISPATCHER_REF(PalettePrefs));
3104 d1(kprintf(__FUNC__ "/%ld: PalettePrefsClass=%08lx\n", __LINE__, PalettePrefsClass));
3105 if (NULL == PalettePrefsClass)
3106 return FALSE;
3108 d1(kprintf(__FUNC__ "/%ld: PalettePrefsCatalog=%08lx\n", __LINE__, PalettePrefsCatalog));
3109 d1(kprintf(__FUNC__ "/%ld: LocaleBase=%08lx\n", __LINE__, LocaleBase));
3111 if (LocaleBase)
3113 d1(kprintf(__FUNC__ "/%ld: PalettePrefsLocale=%08lx\n", __LINE__, PalettePrefsLocale));
3115 if (NULL == PalettePrefsLocale)
3116 PalettePrefsLocale = OpenLocale(NULL);
3118 d1(kprintf(__FUNC__ "/%ld: PalettePrefsLocale=%08lx\n", __LINE__, PalettePrefsLocale));
3120 if (PalettePrefsLocale)
3122 d1(kprintf(__FUNC__ "/%ld: PalettePrefsCatalog=%08lx\n", __LINE__, PalettePrefsCatalog));
3124 if (NULL == PalettePrefsCatalog)
3126 PalettePrefsCatalog = OpenCatalog(PalettePrefsLocale,
3127 (STRPTR) "Scalos/ScalosPalette.catalog", NULL);
3129 d1(kprintf(__FUNC__ "/%ld: \n", __LINE__));
3134 TranslateNewMenu(ContextMenus);
3136 NewColorAdjustClass = MUI_CreateCustomClass(NULL, MUIC_Coloradjust, NULL,
3137 4, DISPATCHER_REF(NewColorAdjust));
3138 d1(kprintf( "%s/%s/%ld: NewColorAdjustClass=%08lx\n", __FILE__, __FUNC__, __LINE__, NewColorAdjustClass));
3139 if (NULL == NewColorAdjustClass)
3140 return FALSE; // Failure
3142 NewPalettePenListClass = MUI_CreateCustomClass(NULL, MUIC_NList, NULL,
3143 4, DISPATCHER_REF(NewPalettePenList));
3144 if (NULL == NewPalettePenListClass)
3145 return FALSE; // Failure
3147 NewScalosPenListClass = MUI_CreateCustomClass(NULL, MUIC_NList, NULL,
3148 sizeof(struct NewScalosPenListInst), DISPATCHER_REF(NewScalosPenList));
3149 if (NULL == NewScalosPenListClass)
3150 return FALSE; // Failure
3152 myNListClass = MUI_CreateCustomClass(NULL, MUIC_NList,
3153 NULL, 4, DISPATCHER_REF(myNList));
3154 if (NULL == myNListClass)
3155 return FALSE; // Failure
3157 DataTypesImageClass = InitDtpicClass();
3158 d1(KPrintF(__FUNC__ "/%ld: DataTypesImageClass=%08lx\n", __LINE__, DataTypesImageClass));
3159 if (NULL == DataTypesImageClass)
3160 return FALSE; // Failure
3163 d1(kprintf(__FUNC__ "/%ld: Success\n", __LINE__));
3165 return TRUE; // Success
3168 //----------------------------------------------------------------------------
3170 static LONG ColorComp(ULONG Color1, ULONG Color2)
3172 if (Color1 == Color2)
3173 return 0;
3174 if (Color1 > Color2)
3175 return 1;
3177 return -1;
3180 static LONG RGBComp(const struct PensListEntry *sple1, const struct PensListEntry *sple2)
3182 LONG Result;
3184 Result = ColorComp(sple1->sple_Red, sple2->sple_Red);
3185 if (0 == Result)
3186 Result = ColorComp(sple1->sple_Green, sple2->sple_Green);
3187 if (0 == Result)
3188 Result = ColorComp(sple1->sple_Blue, sple2->sple_Blue);
3190 return Result;
3193 //----------------------------------------------------------------------------
3195 #if !defined(__SASC) && ! defined(__amigaos4__)
3197 void exit(int x)
3199 (void) x;
3200 while (1)
3204 APTR _WBenchMsg;
3206 #endif /* !__SASC && !__amigaos4__ */
3208 //----------------------------------------------------------------------------