This is Controller.m in view mode; [Download] [Up]
/* This file is part of PinYinEdit, a Chineses PinYin Editor. Copyright (C) 1994 William Wei This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #import "Controller.h" @implementation Controller unsigned short PinYinFieldFilter(unsigned short theChar, int flags) { if (flags & NX_COMMANDMASK) { theChar = 0; } else { if (theChar == NX_DELETE) theChar = NX_BACKSPACE; else if (theChar == NX_CR) { theChar = (flags & NX_SHIFTMASK) ? '\n' : NX_RETURN; } else if (theChar == '\t') { theChar = (flags & NX_SHIFTMASK) ? NX_BACKTAB : NX_TAB; } else if ((theChar < ' ') && (theChar != '\n') && (theChar != NX_BACKSPACE)) { theChar = 0; } else if (theChar == ' ') { theChar = NX_RETURN; } } return (theChar); } - awakeFromNib { char filePath[1024]; int length = [text textLength]; strcpy(filePath, [[NXBundle mainBundle] directory]); strcat(filePath, "/PinYinToBig5Table.strings"); pinyinTable = [[[NXStringTable alloc] init] readFromFile:filePath]; if (!pinyinTable) { NXRunAlertPanel(0,"Couldn't load file %s", 0,0,0,filePath); [NXApp terminate:self]; } [text setCharWrap:YES]; [text setSel:length :length]; [text setSelFont:[Font newFont:"KaiSu-Regular" size:18]]; [[inputPanel getFieldEditor:YES for:nil] setCharFilter:(NXCharFilterFunc)PinYinFieldFilter]; [inputPanel makeKeyAndOrderFront:self]; [pinyinForm selectTextAt:0]; return self; } char* lowerCase(char* str) { int ptr=-1; char offset = 'a' - 'A'; if (!str) return str; while (str[++ptr] != '\0') { str[ptr] = ('Z' > str[ptr]) && (str[ptr] > 'A') ? str[ptr]+offset : str[ptr]; } return str; } - showInfo:sender { if (!infoPanel) { infoPanel = [NXApp loadNibSection:"InfoPanel.nib" owner:self withNames:NO]; } [infoPanel orderFront:self]; return self; } - pinyin:sender { int i = 0, count = 0, cellCount = [charMatrix cellCount]; char* str = (char *)[sender stringValue]; const char* codes; char chin[3] = {'\0','\0','\0'}; lowerCase(str); codes = [pinyinTable valueForStringKey:str]; [inputPanel disableFlushWindow]; if (codes) { while(codes[i] != '\0') { chin[0] = codes[i]; chin[1] = codes[i+1]; [[charMatrix findCellWithTag:i/2] setTitle:chin]; i += 2; count++; } } for (;count < cellCount; count++) { [[charMatrix findCellWithTag:count] setTitle:""]; } [inputPanel reenableFlushWindow]; [sender selectText:self]; return self; } /* put the char into document window */ - draw:sender { [text replaceSel:[[sender selectedCell] title]]; [text scrollSelToVisible]; [pinyinForm selectTextAt:0]; return self; } - showDocWindow:sender { [docWindow makeKeyAndOrderFront:self]; return self; } - showInputPanel:sender; { [inputPanel makeKeyAndOrderFront:self]; [pinyinForm selectTextAt:0]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.