plopfolio-0.1.0/ 0000755 0001750 0001750 00000000000 10060111202 014272 5 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/English.lproj/ 0000755 0001750 0001750 00000000000 10060103134 017015 5 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/English.lproj/MainMenu.nib/ 0000755 0001750 0001750 00000000000 10060103142 021274 5 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/English.lproj/MainMenu.nib/classes.nib 0000644 0001750 0001750 00000001031 07467615537 023457 0 ustar gurkan gurkan 0000000 0000000 {
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {showPreferencesPanel = id; };
CLASS = PlopFolio;
LANGUAGE = ObjC;
OUTLETS = {
edit = NSMenu;
file = NSMenu;
info = NSMenu;
menu = NSMenu;
services = NSMenu;
windows = NSMenu;
};
SUPERCLASS = NSObject;
}
);
IBVersion = 1;
} plopfolio-0.1.0/English.lproj/MainMenu.nib/info.nib 0000644 0001750 0001750 00000001024 07467615537 022757 0 ustar gurkan gurkan 0000000 0000000
IBDocumentLocation
26 191 356 240 0 0 1024 746
IBEditorPositions
29
114 490 278 44 0 0 1024 746
IBFramework Version
248.0
IBOpenObjects
29
IBSystem Version
5Q125
plopfolio-0.1.0/English.lproj/MainMenu.nib/objects.nib 0000644 0001750 0001750 00000010643 07467615540 023456 0 ustar gurkan gurkan 0000000 0000000 typedstreamè„@„„„NSIBObjectData à„„NSObject …’„„„NSCustomObject)”„@@„„„NSString”„+
NSApplication†…†„i/–„„„
NSMenuItemù”’„„„NSMenu Ì”„i@@@ „˜˜Help†„„„NSMutableArray „„NSArray ”™’™†…†„
i@@IIi@@@@:i@ „˜˜PlopFolio Help†„˜˜?†‚ ‚ÿÿÿ …„„„NSCustomResource)”–„˜˜NSImage†„˜˜NSMenuCheckmark††…„¤–¥„˜˜NSMenuMixedState††… …’…’…†›–„š’„œœ „„„NSMutableString˜˜Find†„Ÿ™’„š’ªŸ „˜˜Find...†„˜˜f†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ªŸ „˜˜ Find Next†„˜˜g†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ªŸ „˜˜
Find Previous†„˜˜d†‚ ‚ÿÿÿ …£…§… …’…’…†’©’„š’ªŸ „˜˜Scroll to Selection†„˜˜j†‚ ‚ÿÿÿ …£…§… …’…’…††…†Ÿ „˜˜Use Selection for Find†„˜˜e†‚ ‚ÿÿÿ …£…§… …’…’…†ª–„œœ „¬˜Services†„Ÿ™ †„˜˜_NSServicesMenu††„š’„œœ „˜˜ PlopFolio†„Ÿ™
’„š’ÁŸ „˜˜About PlopFolio†„˜˜ † ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ „˜˜Preferences...†Æ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ‚@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’À’„š’ÁŸ‚@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ „˜˜Hide NewApplication†„˜˜h†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ „˜˜Hide Others†Æ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ „˜˜Show All†Æ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ‚@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ÁŸ „˜˜Quit PlopFolio†„˜˜q†‚ ‚ÿÿÿ …£…§… …’…’…††„˜˜_NSAppleMenu††Ÿ „˜˜Services†Æ‚ ‚ÿÿÿ …£…§„submenuAction: …’…’¼†–„œœ „¬˜Window†„Ÿ™’„š’ØŸ „˜˜Minimize†„˜˜m†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ØŸ‚@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’ØŸ „˜˜Bring All to Front†Æ‚ ‚ÿÿÿ …£…§… …’…’…††„˜˜_NSWindowsMenu††„š’„œœ‚€ „˜˜MainMenu†„Ÿ™’„š’ãŸ ÂÆ‚ ‚ÿÿÿ …£…§¢ …’…’Á†’„š’㟠„˜˜Edit†Æ‚ ‚ÿÿÿ …£…§¢ …’…’„œœ „¬˜Edit†„Ÿ™’„š’éŸ „˜˜Undo†„˜˜z†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜Redo†„˜˜Z†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’韂@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜Cut†„˜˜x†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜Copy†„˜˜c†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜Paste†„˜˜v†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜Clear†Æ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜
Select All†„˜˜a†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’韂@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’éŸ „˜˜Find†Æ‚ ‚ÿÿÿ …£…§¢ …’…’ª†’„š’éŸ „˜˜Spelling†Æ‚ ‚ÿÿÿ …£…§¢ …’…’„œœ „Ÿ™’„š’Ÿ „˜˜Spelling...†„˜˜:†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Check Spelling†„˜˜;†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Check Spelling As You Type†Æ‚ ‚ÿÿÿ …£…§… …’…’…††…†††…††’â’„š’㟠Ƃ ‚ÿÿÿ …£…§¢ …’…’›††„˜˜_NSMainMenu††Ÿ „˜˜Window†Æ‚ ‚ÿÿÿ …£…§¢ …’…’؆–ÛØ–éç––þé–óé––ã•–·ª–®ª–„––„˜˜ PlopFolio†…†•–ÇÁ–çã–ÎÁ–öé–é–ÐÁ––±ª–„š’…Ÿ „˜˜File†Æ‚ ‚ÿÿÿ …£…§¢ …’…’„œœ „¬˜File†„Ÿ™’„š’Ÿ „˜˜New†„˜˜n†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Open...†„˜˜o†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Open Recent†Æ‚ ‚ÿÿÿ …£…§¢ …’…’„œœ „¬˜Open Recent†„Ÿ™’„š’"Ÿ‚€ „˜˜
Clear Menu†Æ‚ ‚ÿÿÿ …£…§… …’…’…††„˜˜_NSRecentDocumentsMenu†††’„š’Ÿ‚@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Close†„˜˜w†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Save†„˜˜s†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜
Save As...†„˜˜S†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Revert†Æ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ‚@ ÆÆ‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜
Page Setup...†„˜˜P†‚ ‚ÿÿÿ …£…§… …’…’…†’„š’Ÿ „˜˜Print...†„˜˜p†‚ ‚ÿÿÿ …£…§… …’…’…††…††ã–›–ÉÁ–æã–ìé–ùé–ߨ–üé–ÒÁ–ã–ïé–ÊÁ–´ª–âã–ÀÁ––ËÁ–òé–é–ÓÁ–Áæ–ª–ÞØ–ÄÁ–é™!–™„¬˜ †–©„˜˜NSMenuItem2†–鄘˜NSMenu†–󄘘NSMenuItem3†–„˜˜NSMenu†–þ„˜˜NSMenuItem10†––„˜˜NSMenuItem6†–ㄬ˜MainMenu†–·„˜˜NSMenuItem1†–®„˜˜
NSMenuItem†–Ç„˜˜121†–„˜˜
NSMenuItem†–ö„˜˜NSMenuItem1†–„˜˜NSMenuItem12†–„˜˜NSMenuItem8†–±„˜˜NSMenuItem4†–;–›„¬˜2†–˜NSMenuItem11†–섘˜NSMenuItem2†–ù„˜˜NSMenuItem9†–•„¬˜File's Owner†–ü„˜˜NSMenuItem4†–„˜˜NSMenuItem7†–„¬˜1†–´„˜˜NSMenuItem3†–焘˜
NSMenuItem†–ò„˜˜
NSMenuItem†–„˜˜NSMenuItem13†–Ó„˜˜1111†–ª„˜˜NSMenu†–Þ;’„„„NSMutableSet „„NSSet ”„I †’„Ÿ™’„„„NSNibControlConnector Ï„„NSNibConnector”„@@@Û…„¬˜performMiniaturize:††’„^¨ß…„¬˜arrangeInFront:††’„^¨™…„¬˜ showHelp:††’„^¨Ó•„¬˜
terminate:††’„^¨Ä•„¬˜orderFrontStandardAboutPanel:††’„^¨Î•„˜˜hideOtherApplications:††’„^¨Ë•„˜˜hide:††’„^¨Ð•„˜˜unhideAllApplications:††’„^¨ó…„¬˜cut:††’„^¨ù…„¬˜paste:††’„^¨ï…„¬˜redo:††’„^¨þ…„¬˜
selectAll:††’„^¨ì…„¬˜undo:††’„^¨ö…„¬˜copy:††’„^¨ü…„¬˜clear:††’„^¨…„¬˜showGuessPanel:††’„^¨…„¬˜checkSpelling:††’„^¨…„˜˜toggleContinuousSpellChecking:††’„„„NSNibOutletConnector Ï_¨•„˜˜delegate††’„^¨Ç„˜˜showPreferencesPanel:†††’…™D„@i™oª© ¡ªy µª¼ ‚ª]%ªi ’ªæ8ªg ŽªÞ\ªª Ÿª· ›ªÛªé ©ªgª ¾ª•ªÓ ˆªq °ªe ‹ªþ ¬ª´ ¢ªó ª † Ū »ªÊ ªãªSª® šªa'ªs ²ª ÃªÇ ªÀ ƒªç £ª ¿ªË †ªÎ ‘ª ¨ª ƒ ÄªÉ ªò œª ®ªo ¯ªì žª} ¼ª ¸ªk ˜ªÄ:ªm ™ªßªÐ –ª ¹ªü ¤ª ÀªÁ9ª ½ªw ´ªï ª± §ªö ªu ³ªczªØª›jªÒ •ªù «ª{ ·ªâ™ Æ™ ’„¬˜IBCocoaFramework†† plopfolio-0.1.0/English.lproj/InfoPlist.strings 0000644 0001750 0001750 00000001044 07467615537 022376 0 ustar gurkan gurkan 0000000 0000000 þÿ / * L o c a l i z e d v e r s i o n s o f I n f o . p l i s t k e y s * /
C F B u n d l e N a m e = " P l o p F o l i o " ;
C F B u n d l e S h o r t V e r s i o n S t r i n g = " P l o p F o l i o v e r s i o n 0 . 1 " ;
C F B u n d l e G e t I n f o S t r i n g = " P l o p F o l i o v e r s i o n 0 . 1 , C o p y r i g h t 2 0 0 1 L u d o v i c M a r c o t t e . " ;
N S H u m a n R e a d a b l e C o p y r i g h t = " C o p y r i g h t 2 0 0 1 L u d o v i c M a r c o t t e . " ;
plopfolio-0.1.0/English.lproj/Localizable.strings 0000644 0001750 0001750 00000000000 07467615537 022677 0 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/English.lproj/ConfigureWindow.nib/ 0000755 0001750 0001750 00000000000 10060103137 022700 5 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/English.lproj/ConfigureWindow.nib/classes.nib 0000644 0001750 0001750 00000000531 07471501622 025043 0 ustar gurkan gurkan 0000000 0000000 {
IBClasses = (
{
CLASS = ConfigureWindowController;
LANGUAGE = ObjC;
OUTLETS = {imageView = NSImageView; textView = NSTextView; };
SUPERCLASS = NSWindowController;
},
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
);
IBVersion = 1;
} plopfolio-0.1.0/English.lproj/ConfigureWindow.nib/info.nib 0000644 0001750 0001750 00000000644 07470334140 024344 0 ustar gurkan gurkan 0000000 0000000
IBDocumentLocation
29 107 356 240 0 0 1024 746
IBFramework Version
248.0
IBOpenObjects
5
IBSystem Version
5Q125
plopfolio-0.1.0/English.lproj/ConfigureWindow.nib/objects.nib 0000644 0001750 0001750 00000002727 07471501622 025050 0 ustar gurkan gurkan 0000000 0000000 typedstreamè„@„„„NSIBObjectData à„„NSObject …’„„„NSCustomObject)”„@@„„„NSString”„+ConfigureWindowController†…†„i–„„„NSImageView„„ NSControl)„„NSView)„„NSResponder ”’„œ’…™ „@@@@ffffffff„„„NSMutableArray „„NSArray ”™’™’„„„NSScrollView ✒ž™‚ € ž„ ™’„„„
NSClipView:œ’¢™‚ À ž„ ™’„„„NSTextTemplateÆ„„NSViewTemplate.œ’¥™‚ ž………… ³8 ³8’¥’…’…’…’„˜˜NSText†’…’„„„NSColor ”„c„@@@„˜˜System†„˜˜ textColor†„¦„ff ††’„„„NSFont”™„[28c] þÿ H e l v e t i c a„f¦ ¦¦ ¦†™ ’„¦¨†¨@8¨ Ђ ˜–€’…¦¦¦ ¦ ¦ ¦ ¦¦ ¦¦ ¦ ††……… ³ ä ³ ä’¢’…’¨’…’¨„@@ccc³„„„NSCursor”¨û’„„„NSCustomResource)”–„˜˜NSImage†„˜˜
NSIBeamCursor††¦ ¦ † †’„„„
NSScroller Ó›’¢™‚ € ž„ ™ †……… ´ ä ä’¢’…’…’…„icc@ …’¢„ff: „_doScroller:¦ ¦ †’„»’¢™‚ € ž„ ™ †………œœW W’¢’…’…’…° …’¢±ƒ?rC²¦¦ ††……… Ä æ Ä æ’ž’…’¥’…’º’½’¥’…’…„ffffi
‚‚ ††……… ì6 ì6’…’…’…’…†™‚ ž………„„„NSMutableSet „„NSSet ”„I’„˜˜NSFilenamesPboardType††ý ÿ ò: ò:’ž’…’…’…° „„„NSImageCell)„„NSCellA”„ii‚ þ „@@@@…………„iii †¦†ž–„„„NSWindowTemplateø”„
iiffffi@@@@@c*| ì6‚0x „˜˜Window†„˜˜NSWindow†„„„NSMutableString˜˜View†ž…„ffff ꦨ Õ ’…¦ †•–žÆ–¢ž–¨¢™–Æ„˜˜Window†–•„˜˜File's Owner†–¢„˜˜
NSScrollView2†–¨„˜˜
NSTextView†’„À¶ †’„ ™’„„„NSNibOutletConnector Ï„„NSNibConnector”§•Æ„˜˜window††’„Ó§•™„˜˜ imageView††’„Ó§Æ•„˜˜delegate††’„Ó§•¨„˜˜textView†††’…™
„@i•ÂÆÂžÂ™ÂÒÂÖ ÂØ
¢¨ÂÚ
™™ ’„˜˜IBCocoaFramework†† plopfolio-0.1.0/English.lproj/PreferencesPanel.nib/ 0000755 0001750 0001750 00000000000 10060103146 023010 5 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/English.lproj/PreferencesPanel.nib/classes.nib 0000644 0001750 0001750 00000002027 07471465722 025167 0 ustar gurkan gurkan 0000000 0000000 {
IBClasses = (
{CLASS = ExtendedButtonCell; LANGUAGE = ObjC; SUPERCLASS = NSButtonCell; },
{CLASS = ExtendedTableColumn; LANGUAGE = ObjC; SUPERCLASS = NSTableColumn; },
{CLASS = ExtendedTableView; LANGUAGE = ObjC; SUPERCLASS = NSTableView; },
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{CLASS = NSObject; LANGUAGE = ObjC; },
{CLASS = NSTableColumn; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {
configureClicked = id;
deleteClicked = id;
importClicked = id;
selectionInBrowserPopUpButtonHasChanged = id;
};
CLASS = PreferencesPanelController;
LANGUAGE = ObjC;
OUTLETS = {
browserField = NSTextField;
browserPopUpButton = NSPopUpButton;
tableView = NSTableView;
};
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
} plopfolio-0.1.0/English.lproj/PreferencesPanel.nib/info.nib 0000644 0001750 0001750 00000000644 07467615540 024470 0 ustar gurkan gurkan 0000000 0000000
IBDocumentLocation
46 121 356 240 0 0 1024 746
IBFramework Version
248.0
IBOpenObjects
5
IBSystem Version
5Q125
plopfolio-0.1.0/English.lproj/PreferencesPanel.nib/objects.nib 0000644 0001750 0001750 00000010412 07471465722 025160 0 ustar gurkan gurkan 0000000 0000000 typedstreamè„@„„„NSIBObjectData à„„NSObject …’„„„NSCustomObject)”„@@„„„NSString”„+PreferencesPanelController†…†„i–„„„NSTextField„„ NSControl)„„NSView)„„NSResponder ”’„œ’…™ „@@@@ffffffff„„„NSMutableArray „„NSArray ”™’™’„„„
NSPopUpButton Ì„„NSButton ›’ž™ ž………… ( (’ž’…’…’…„icc@ „„„NSPopUpButtonCell1„„NSMenuItemCell Ò„„NSButtonCell?„„NSActionCell„„NSCellA”„ii‚„Aþ ‚ „@@@@…„„„NSFont”™$„[36c] þÿ L u c i d a G r a n d e „f
„c ®® ®†……„i: …’…’¢„ ssii@@@@@K‚‚@ÿ„„„NSMutableString˜˜ †„®˜ †…„¬™$¬ þÿ L u c i d a G r a n d e
® ®® ® †…–„„„
NSMenuItemù”’„„„NSMenu Ì”„i@@@ „®˜
OtherViews†„ ™’±’„²’³„
i@@IIi@@@@:i@ „˜˜Custom†„˜˜ †‚ ‚ÿÿÿ …„„„NSCustomResource)”–„˜˜NSImage†„˜˜NSMenuCheckmark††…„»–¼„˜˜NSMenuMixedState††„_popUpItemAction: …’¥’…††…†µ „˜˜Operating System Default†¹‚ ‚ÿÿÿ…º…¾· …’¥’…†…„i@i‚= ³ ††’„š’ž™ ž…………z" "’ž’…’…’…£ „„„NSTextFieldCell=©©‚”qþA‚ @ ª¹«……¯ …’…’Á„c@@„„„NSColor ”®„@@@„˜˜System†„˜˜textBackgroundColor†„Å®„ff††„Å®¼Æ„˜˜ textColor†„Å®½ †††’…„:…†’„š’ž™ ž…………_A A’ž’…’…’…£ „é‚þ ‚ @ ª„˜˜;Example: mozilla -noraise -remove "openURL(%@, new-window)"†„¬™$¬ þÿ L u c i d a G r a n d e
® ®® ®†……¯ …’…’̺ „Å®¼Æ„˜˜controlColor†„Å®½ƒ?*ª«††„Å®¼Æ„˜˜controlTextColor†Ë††’…¾…††………
!j å j å’…’…’…’…†™ ž………… À( (’ž’…’…’…£ „é‚þ ‚ @ ª„˜˜+Open links using the follwoing web browser:†«……¯ …’…’™º ÐÓ†’…¾…†ž–„„„NSClassSwapper*”„@#„˜˜ExtendedTableColumn†„„
NSTableColumn)”„@fff@@cc„˜˜active†3(è„„„NSTableHeaderCellé‚þ ª„˜˜Active†„¬™$¬ þÿ L u c i d a G r a n d e ® ®® ® †……¯ …’…’…º „Å®½ƒ>ªª«†„Å®¼Æ„˜˜headerTextColor†Ë††„é‚1þ@ ª„˜˜6†«……¯ …’…’„ØÀ„˜˜ExtendedTableView†„„NSTableView=›’„„„
NSClipView:œ’„„„NSScrollView ✒„œ’„„„ NSTabViewœ’„œ’…™ ž„ ™’톅……h h’…’…’…’…†™‚ ž„ ™’솅……õó~ ~’ï’…’…’…„@@@icc„ ™’„„„
NSTabViewItem ”„@@@@@@@„®˜1†ì„˜˜Plops†Ð……톒„ôÊ„®˜2†„œ’…™ ž…………
!j å j å’…’…’…’…†„˜˜Display†Ð……톒„ôÊ…ž„˜˜General†Ð……í††ó« ’…†™ ž„ ™’„š’ì™ ž………… Ìr r’ì’…’…’…£ „é‚þ ‚ @ ª„˜˜Your Plops:†«……¯ …’…’þº ÐÓ†’…¾…†’ê’„¤’ì™ ž…………T T ’ì’…’…’…£ „¨©‚þ ‚8 ª„˜˜Delete†«……¯ …’…’° È‚†‚@ÿ„®˜ †„®˜ †…„¬™„[28c] þÿ H e l v e t i c a
® ®® ® †…††’„¤’ì™ ž…………bg g ’ì’…’…’…£ „¨©‚þ ‚8 ª„˜˜ Configure†«……¯ …’…’° È‚†‚@ÿ„®˜ †„®˜ †……††’„¤’ì™ ž………… âz z ’ì’…’…’…£ „¨©‚þ ‚8 ª„˜˜
Import a Klip†«……¯ …’…’° È‚†‚@ÿ„®˜ †„®˜ †……†††………
!j å j å’í’…’…’…†™‚ € ž„ ™’è’„„„
NSScroller Ó›’Ꙃ € ž„ ™ †………2z z’ê’…’…’…£ …’ê„ff: ƒ?$a„_doScroller:® ® †’„’Ꙃ € ž„ ™ †………œœ1 1’ê’…’…’…£ …’êÍ ƒ?}Ùή® †’„é’Ꙃ À ž„ ™’„„„NSTableHeaderViewœ’™‚ € ž………… 1 1’’…’…’…’円……… 1 1’ê’…’’…’„@@ccc„Å®¼Æ„˜˜controlBackgroundColor†Ò†… †’„„„
_NSCornerView œ’Ꙃ € ž„ ™ †………2 ’ê’…’…’…††………8B Œ B Œ’ì’…’è’…’’’è’’„ffffi
‚„ †™‚ À ž„ ™’内……1z 1z’ê’…’å’…’åÐ… †™ ž„ ™ †……… 1z 1z’è’…’…’…£ …„@@@ff@@f::i„ ™’×’„Ú„˜˜name† øƒBe`è„Ý©‚þ ª„˜˜Name†ß……¯ …’…’…º àᆄé‚1þ@ ª„˜˜ Los Gatos†«……¯ …’…’åº ÈÓ† ’円ȄŮ¼Æ„˜˜ gridColor†„Å®½ƒ? ††……‚R@ ’…’…’…†º ÈÓ† ’å†å–íï–óí–„„„NSWindowTemplateø”„
iiffffi@@@@@c ™{h‚px „˜˜Preferences...†„˜˜NSPanel†„®˜View†ï…„ffff ꮽ Õ ’…® †•–±³–ì–Áž–÷í–êì–·³–ìó–ù÷–ì–Ìž–#å–ì–¢ž–þì–žû–ûí–³¢–åê–ï,™–™„˜˜NSTextField2†–ׄ˜˜
NSTableColumn†–„˜˜ NSButton2†–儘˜NSTableView†–±„˜˜
NSMenuItem†–턘˜ NSTabView†–„˜˜NSButton†–󄘘
NSTabViewItem†–•„˜˜File's Owner†–·„˜˜NSMenuItem1†–þ„˜˜NSTextField2†–ù„˜˜NSView†–ꄘ˜
NSScrollView1†–섘˜NSView†–#„˜˜NSTableColumn1†–÷„˜˜NSTabViewItem1†–¢„˜˜
NSPopUpButton†–Ì„˜˜
NSTextField11†–„˜˜ NSButton1†–Á„˜˜NSTextField†–³„˜˜ PopUpList†–,„˜˜Panel†’„„„NSMutableSet „„NSSet ”„I †’„ ™’„„„NSNibOutletConnector Ï„„NSNibConnector”¼,•„˜˜delegate††’„L¼•,„˜˜window††’„L¼•儘˜ tableView††’„„„NSNibControlConnector ÏM¼•„˜˜deleteClicked:††’„T¼•„˜˜importClicked:††’„L¼å•„˜˜
dataSource††’„L¼å•N†’„T¼•„˜˜configureClicked:††’„L¼•Á„˜˜browserField††’„L¼•¢„˜˜browserPopUpButton††’„T¼¢•„˜˜(selectionInBrowserPopUpButtonHasChanged:†††’…™$„@iKÝOÝ•Ý#ÝQÝ·#ÝݳÝþÝa(Ý™Ý]&ÝXÝSÝ,ÝÌ%Ýž
Ýù
Ý×ÝûÝÁ$ݱ"ÝíÝêÝÝÝóÝ[ÝåÝ_'Ýì Ý¢!ÝZÝVÝ÷Ýï™)™–åæ–×Ù’„˜˜IBCocoaFramework†† plopfolio-0.1.0/COPYING 0000644 0001750 0001750 00000043076 07471532744 015375 0 ustar gurkan gurkan 0000000 0000000 GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C) 19yy
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.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
plopfolio-0.1.0/ChangeLog 0000644 0001750 0001750 00000005014 07710760015 016070 0 ustar gurkan gurkan 0000000 0000000 2003-07-27 Ludovic Marcotte
* Added patches from Richard Frith-Macdonald to
update the PlopFolio code wrt changes in the GSXML code.
* Fixed the count drawing position in PlopView: -drawRect. We now
use the same code as under Mac OS X.
2002-06-06 Francis Lachapelle
* Added dock menu support under Mac OS X.
2002-05-18 Ludovic Marcotte
* Again, some major enhancements. YOU MUST REMOVE all your
previous plops if you upgrade to this version (see
comment on 2002-05-14)
* Added an option to be able to select a custom web browser
in the General tab of the Preferences Panel.
* Updated PreferencePanel.nib (the General tab)
* Added cancel support when loading plops.
* Implemented some parts in ConfigureWindow. Again, you
MUST REMOVE all your plops.
* Updated ConfigureWindow.nib
* Added COPYING and README files.
2002-05-17 Ludovic Marcotte
* Added a temporary reload icon. It also does work when
you click on it. It reloads the content of the actual
plop.
* Fixed some issues of XML parsing under GNUstep.
* Added new look and feel, new animation and new reload icon.
All artwork done by Boris Anthony .
* Updated OS X project file
2002-05-16 Ludovic Marcotte
* Fixed a bug in Channel: -dealloc. We weren't invalidating
and destroying our timer.
* Added non-blocking I/O support on GNUstep and OS X.
2002-05-15 Ludovic Marcotte
* Fixed a bug in the parsing of klips that contain comments
under GNUstep.
* Fixed the same kind of bug that was present when parsing
RDF under GNUstep.
* Fixed the same issues under OS X and also fixed issues with
-stringByTrimmingWhiteSpaces on OS X.
2002-05-14 Ludovic Marcotte
* We now remove previous plops before updating the channel
under OS X.
* Added the ConfigureWindow and ConfigureWindowController classes.
* Modified Plop to save the bannerSource. This breaks the previous
serialized format so you HAVE to remove everything in ~/Library/PlopFolio
(on OS X) or ~/GNUstep/Library/PlopFolio (on GNUstep) and reload
all your Klips.
* Added ConfigureWindow.nib and modified the OS X project file.
2002-05-13 Ludovic Marcotte
* Initial version of this file.
* Fixed A LOT of things tonight. Resizing,
bugs when parsing broken RDF and more.
plopfolio-0.1.0/Channel.h 0000644 0001750 0001750 00000003611 07710760015 016040 0 ustar gurkan gurkan 0000000 0000000 /*
** Channel.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
#import "Element.h"
@class GSXMLNode;
@class Plop;
@class PlopWindowController;
@interface Channel : Element
{
NSMutableArray *allElements;
NSImage *icon;
Plop *plop;
PlopWindowController *plopWindowController;
NSTimer *animation_timer, *timer;
int animation_index;
NSURLHandle *inProgress;
}
//
// access / mutation methods
//
- (void) addElement: (Element *) theElement;
- (void) removeElement: (Element *) theElement;
- (void) removeAllElements;
- (int) count;
- (int) itemCount;
- (Element *) elementAtIndex: (int) theIndex;
- (NSImage *) icon;
- (void) setIcon: (NSImage *) theIcon;
- (Plop *) plop;
- (void) setPlop: (Plop *) thePlop;
- (PlopWindowController *) plopWindowController;
- (void) setPlopWindowController: (PlopWindowController *) theController;
//
// Other methods
//
- (void) update: (id) sender;
- (void) updateAnimation;
//
// Static method
//
@end
//
// Private methods
//
@interface Channel (Private)
- (void) _parseNodeInformationUsingElement: (Element *) theElement
node: (id) theNode;
@end
plopfolio-0.1.0/Channel.m 0000644 0001750 0001750 00000036251 07710760015 016053 0 ustar gurkan gurkan 0000000 0000000 /*
** Channel.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "Channel.h"
#import "Constants.h"
#import "NSStringExtensions.h"
#import "Plop.h"
#import "PlopView.h"
#import "PlopWindowController.h"
// XML Headers needed under GNUstep
#ifndef MACOSX
#import
// XML Headers needed under Cocoa
#else
#import
#endif
@implementation Channel
//
//
//
- (id) init
{
self = [super init];
allElements = [[NSMutableArray alloc] init];
animation_timer = nil;
return self;
}
//
//
//
- (void) dealloc
{
NSLog(@"Channel: -dealloc");
[plop setChannel: nil];
if ( timer )
{
[timer invalidate];
DESTROY(timer);
}
RELEASE(allElements);
RELEASE(icon);
RELEASE(plop);
RELEASE(inProgress);
[super dealloc];
}
//
// access / mutation methods
//
- (void) addElement: (Element *) theElement
{
[allElements addObject: theElement];
}
//
//
//
- (void) removeElement: (Element *) theElement
{
[allElements removeObject: theElement];
}
//
//
//
- (void) removeAllElements
{
[allElements removeAllObjects];
}
//
//
//
- (int) count
{
return [allElements count];
}
//
//
//
- (int) itemCount
{
int i, count;
count = 0;
for (i = 0; i < [allElements count]; i++)
{
Element *aElement;
aElement = [allElements objectAtIndex: i];
if ( [aElement type] == ITEM )
{
count++;
}
}
return count;
}
//
//
//
- (Element *) elementAtIndex: (int) theIndex
{
return [allElements objectAtIndex: theIndex];
}
//
//
//
- (NSImage *) icon
{
return icon;
}
//
//
//
- (void) setIcon: (NSImage *) theIcon
{
RETAIN(theIcon);
RELEASE(icon);
icon = theIcon;
}
//
//
//
- (Plop *) plop
{
return plop;
}
//
//
//
- (void) setPlop: (Plop *) thePlop
{
if ( thePlop )
{
NSImage *aImage;
RETAIN(thePlop);
RELEASE(plop);
plop = thePlop;
[plop setChannel: self];
// We set our icon
aImage = [[NSImage alloc] initWithContentsOfFile: [NSString stringWithFormat: @"%@/%@",
PlopFolioUserLibraryPath(),
[thePlop iconName]] ];
[self setIcon: aImage];
RELEASE(aImage);
#if 0
// We start our timer
NSLog(@"Starting timer with %d minutes interval.", [thePlop refresh]);
timer = [NSTimer scheduledTimerWithTimeInterval: ([thePlop refresh]*60)
target: self
selector: @selector(update:)
userInfo: nil
repeats: YES];
RETAIN(timer);
#endif
}
else
{
if ( timer )
{
[timer invalidate];
DESTROY(timer);
}
DESTROY(plop);
}
}
//
//
//
- (PlopWindowController *) plopWindowController
{
return plopWindowController;
}
// No need to RETAIN here
- (void) setPlopWindowController: (PlopWindowController *) theController
{
plopWindowController = theController;
}
//
// Delegate methods
//
- (void) URLHandleResourceDidBeginLoading:(NSURLHandle *)sender
{
PlopView *theView;
NSLog(@"Begin loading");
animation_index = 1;
// We start our animation
animation_timer = [NSTimer scheduledTimerWithTimeInterval: 0.05
target: self
selector: @selector(updateAnimation)
userInfo: nil
repeats: YES];
RETAIN(animation_timer);
// We set the stop icon
theView = [(id)[[self plopWindowController] window] plopView];
[theView setReloadIcon: [NSImage imageNamed: @"stop.tiff"]];
}
//
//
//
- (void) URLHandleResourceDidCancelLoading: (NSURLHandle *) sender
{
PlopView *theView;
NSLog(@"Cancelling update of channel %@... using %@", [plop title], [plop contentSource]);
// We stop our animation
[animation_timer invalidate];
DESTROY(animation_timer);
theView = [(id)[[self plopWindowController] window] plopView];
[theView setAnimationIcon: nil];
[theView setReloadIcon: [NSImage imageNamed: @"reload.tiff"]];
}
//
//
//
- (void) URLHandle: (NSURLHandle *) sender
resourceDataDidBecomeAvailable: (NSData *) newBytes
{
// We do nothing here
}
//
//
//
- (void) URLHandle: (NSURLHandle *) sender
resourceDidFailLoadingWithReason: (NSString *) reason
{
NSLog(@"failed loading URL, reason: %@:", reason);
}
//
//
//
- (void) URLHandleResourceDidFinishLoading: (NSURLHandle *) sender
{
//
// GNUstep XML Parsing Code
//
#ifndef MACOSX
GSXMLParser *aParser;
NSData *aData;
PlopView *theView;
NSLog(@"Updating channel %@... using %@", [plop title], [plop contentSource]);
// We stop our animation
[animation_timer invalidate];
DESTROY(animation_timer);
theView = [(id)[[self plopWindowController] window] plopView];
[theView setAnimationIcon: nil];
[theView setReloadIcon: [NSImage imageNamed: @"reload.tiff"]];
// We get our data
aData = [sender resourceData];
if ( !aData )
{
NSLog(@"Unable to get the data from the content source. Ignoring Plop.");
return;
}
[self removeAllElements];
aParser = [GSXMLParser parserWithData: aData];
if ( [aParser parse] )
{
GSXMLDocument *aDocument;
GSXMLNode *aRoot, *aNode;
aDocument = [aParser document];
aRoot = [aDocument root];
aNode = [aRoot firstChildElement];
//
// We loop inside our channel/image/item nodes
//
while (aNode != nil)
{
NSLog(@"aNode name = %@", [aNode name]);
if ( [[aNode name] caseInsensitiveCompare: @"CHANNEL"] == NSOrderedSame )
{
[self _parseNodeInformationUsingElement: self
node: aNode];
}
else
{
Element *aElement;
aElement = [[Element alloc] init];
[self _parseNodeInformationUsingElement: aElement
node: aNode];
[self addElement: aElement];
RELEASE(aElement);
}
// We get the next node
aNode = [aNode nextElement];
}
// We finally update our "view"
if ( [self plopWindowController] )
{
[[self plopWindowController] update];
}
}
else
{
NSLog(@"Error while decoding the RDF content.");
}
//
// OS X XML Parsing Code
//
#else
CFXMLTreeRef aTreeRef, xmlTreeRoot;
CFXMLNodeRef xmlRoot;
NSData *aData;
int i;
PlopView *theView;
// We stop our animation
[animation_timer invalidate];
DESTROY(animation_timer);
theView = [(id)[[self plopWindowController] window] plopView];
[theView setAnimationIcon: nil];
[theView setReloadIcon: [NSImage imageNamed: @"reload.tiff"]];
// We get our data
aData = [sender resourceData];
aTreeRef = CFXMLTreeCreateFromData(kCFAllocatorDefault,
(CFDataRef)aData,
NULL,
kCFXMLParserSkipWhitespace|kCFXMLParserSkipMetaData,
kCFXMLNodeCurrentVersion);
if ( !aTreeRef )
{
NSRunAlertPanel(_(@"Error!"),
_(@"Corrupted RDF. Ignoring %@ Plop."),
_(@"OK"),
NULL,
NULL,
[plop title]);
return;
}
[self removeAllElements];
for (i = 0; i < CFTreeGetChildCount(aTreeRef); i++)
{
xmlTreeRoot = CFTreeGetChildAtIndex(aTreeRef, i);
xmlRoot = CFXMLTreeGetNode(xmlTreeRoot);
if ( CFXMLNodeGetTypeCode(xmlRoot) == kCFXMLNodeTypeElement )
{
CFXMLTreeRef xmlSubTreeRef;
CFXMLNodeRef aNode;
int j;
// We get our RDF info
for (j = 0; j < CFTreeGetChildCount(xmlTreeRoot); j++)
{
xmlSubTreeRef = CFTreeGetChildAtIndex(xmlTreeRoot, j);
aNode = CFXMLTreeGetNode(xmlSubTreeRef);
if ( CFXMLNodeGetTypeCode(aNode) == kCFXMLNodeTypeElement )
{
NSString *aString;
aString = [(NSString*)CFXMLNodeGetString(aNode) stringByTrimmingWhiteSpaces];
if ( [aString caseInsensitiveCompare: @"CHANNEL"] == NSOrderedSame )
{
[self _parseNodeInformationUsingElement: self
node: (id)xmlSubTreeRef];
}
else
{
Element *aElement;
aElement = [[Element alloc] init];
[self _parseNodeInformationUsingElement: aElement
node: (id)xmlSubTreeRef];
[self addElement: aElement];
RELEASE(aElement);
}
}
} // for
}
}
// We finally update our "view"
if ( [self plopWindowController] )
{
[[self plopWindowController] update];
}
#endif
}
//
// Other methods
//
- (void) update: (id) sender
{
// If the animation is already running, we just return
if ( animation_timer && [animation_timer isValid] )
{
// We must stop...
if ( [sender isKindOfClass: [PlopView class]] )
{
NSLog(@"Cancelling load in background...");
// FIXME: This doesn't work and it's normal. We should handle the stop
// differently.
[inProgress cancelLoadInBackground];
[inProgress release];
inProgress = nil;
}
NSLog(@"Update already running.");
return;
}
else
{
inProgress = [[[self plop] contentSource] URLHandleUsingCache: NO];
[inProgress retain];
[inProgress addClient: self];
[inProgress loadInBackground];
}
}
//
//
//
- (void) updateAnimation
{
PlopView *theView;
theView = [(id)[[self plopWindowController] window] plopView];
//NSLog(@"Downloading...");
[theView setAnimationIcon: [NSImage imageNamed: [NSString stringWithFormat: @"anim%d.tiff",
animation_index]] ];
animation_index += 1;
[theView setNeedsDisplay: YES];
if ( animation_index > 16 )
{
animation_index = 1;
}
}
@end
//
// Private methods
//
@implementation Channel (Private)
- (void) _updateElement: (Element *) theElement
name: (NSString *) theName
content: (NSString *) theContent
{
if ( [theName caseInsensitiveCompare: @"TITLE"] == NSOrderedSame )
{
[theElement setTitle: theContent];
}
else if ( [theName caseInsensitiveCompare: @"LINK"] == NSOrderedSame )
{
[theElement setLink: [NSURL URLWithString: theContent] ];
}
else if ( [theName caseInsensitiveCompare: @"DESCRIPTION"] == NSOrderedSame )
{
[theElement setDescription: theContent];
}
else if ( [theName caseInsensitiveCompare: @"URL"] == NSOrderedSame )
{
[theElement setURL: [NSURL URLWithString: theContent] ];
}
}
//
//
//
- (void) _parseNodeInformationUsingElement: (Element *) theElement
node: (id) theNode
{
NSString *aNodeName;
#ifndef MACOSX
static int textNodeType = -1;
GSXMLNode *aChild;
if (textNodeType < 0)
{
textNodeType = [GSXMLNode typeFromDescription: @"XML_TEXT_NODE"];
}
aNodeName = [(GSXMLNode *)theNode name];
#else
CFXMLNodeRef xmlNode, aNode;
CFXMLTreeRef xmlTreeRef;
int i;
xmlNode = CFXMLTreeGetNode((CFXMLTreeRef)theNode);
aNodeName = (NSString *)CFXMLNodeGetString(xmlNode);
#endif
// We decode the right type
if ( [aNodeName caseInsensitiveCompare: @"CHANNEL"] == NSOrderedSame )
{
[theElement setType: CHANNEL];
}
else if ( [aNodeName caseInsensitiveCompare: @"IMAGE"] == NSOrderedSame )
{
[theElement setType: IMAGE];
}
else if ( [aNodeName caseInsensitiveCompare: @"ITEM"] == NSOrderedSame )
{
[theElement setType: ITEM];
}
else if ( [aNodeName caseInsensitiveCompare: @"TEXTINPUT"] == NSOrderedSame )
{
[theElement setType: TEXTINPUT];
}
else
{
[theElement setType: UNKNOWN];
}
#ifndef MACOSX
// We loop inside our channel/image/item node attributes
if ( (aChild = [theNode firstChild]) )
{
while ( aChild )
{
NSString *aName, *aContent;
GSXMLNode *aNode;
//
// Ok, this is kinda weird. Some klips are defined like that:
//
// ...
// - ...
//
// and some like:
//
//
// - ...
//
//
if ( [[aChild name] caseInsensitiveCompare: @"ITEM"] == NSOrderedSame ||
[[aChild name] caseInsensitiveCompare: @"IMAGE"] == NSOrderedSame ||
[[aChild name] caseInsensitiveCompare: @"TEXTINPUT"] == NSOrderedSame )
{
Element *aElement;
aElement = [[Element alloc] init];
[self _parseNodeInformationUsingElement: aElement
node: aChild];
[self addElement: aElement];
RELEASE(aElement);
aChild = [aChild next];
continue;
}
aNode = [aChild firstChild];
while ( aNode )
{
if ( [aNode type] == textNodeType )
{
if ( [[[aNode content] stringByTrimmingWhiteSpaces] length] > 0 )
{
break;
}
}
aNode = [aNode next];
}
if ( !aNode )
{
aChild = [aChild next];
continue;
}
aName = [aChild name];
aContent = [[aNode content] stringByTrimmingWhiteSpaces];
if ( aName && aContent )
{
[self _updateElement: theElement
name: aName
content: aContent];
}
aChild = [aChild next];
}
}
else
{
NSLog(@"No children");
}
//
// OS X XML Parsing Code
//
#else
for (i = 0; i < CFTreeGetChildCount((CFXMLTreeRef)theNode); i++)
{
NSString *aName, *aContent;
CFXMLTreeRef xmlSubTreeRef;
CFXMLNodeRef xmlSubNode;
int j;
xmlTreeRef = CFTreeGetChildAtIndex((CFXMLTreeRef)theNode, i);
aNode = CFXMLTreeGetNode(xmlTreeRef);
xmlSubTreeRef = NULL;
xmlSubNode = NULL;
for ( j = 0; j < CFTreeGetChildCount(xmlTreeRef); j++ )
{
xmlSubTreeRef = CFTreeGetChildAtIndex(xmlTreeRef, j);
xmlSubNode = CFXMLTreeGetNode(xmlSubTreeRef);
if ( CFXMLNodeGetTypeCode(xmlNode) == kCFXMLNodeTypeElement )
{
break;
}
else
{
xmlSubNode = NULL;
}
}
if ( !xmlSubNode )
{
continue;
}
aName = (NSString *)CFXMLNodeGetString(aNode);
aContent = [(NSString *)CFXMLNodeGetString(xmlSubNode) stringByTrimmingWhiteSpaces];
//
// See description above.
//
if ( [aName caseInsensitiveCompare: @"ITEM"] == NSOrderedSame ||
[aName caseInsensitiveCompare: @"IMAGE"] == NSOrderedSame ||
[aName caseInsensitiveCompare: @"TEXTINPUT"] == NSOrderedSame )
{
Element *aElement;
aElement = [[Element alloc] init];
[self _parseNodeInformationUsingElement: aElement
node: (id)xmlTreeRef];
[(Channel *)theElement addElement: aElement];
RELEASE(aElement);
}
if ( aName && aContent )
{
[self _updateElement: theElement
name: aName
content: aContent];
}
}
#endif
}
@end
plopfolio-0.1.0/ConfigureWindow.h 0000644 0001750 0001750 00000002071 07471501065 017602 0 ustar gurkan gurkan 0000000 0000000 /*
** ConfigureWindow.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class ConfigureView;
@interface ConfigureWindow : NSWindow
{
NSImageView *imageView;
NSTextView *textView;
}
- (void) layoutWindow;
//
// access/mutation methods
//
- (NSImageView *) imageView;
- (NSTextView *) textView;
@end
plopfolio-0.1.0/ConfigureWindow.m 0000644 0001750 0001750 00000005106 07471501065 017611 0 ustar gurkan gurkan 0000000 0000000 /*
** ConfigureWindow.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "ConfigureWindow.h"
#import "Constants.h"
@implementation ConfigureWindow
//
//
//
- (void) dealloc
{
NSLog(@"ConfigureWindow: -dealloc");
RELEASE(imageView);
RELEASE(textView);
[super dealloc];
}
//
//
//
- (void) layoutWindow
{
NSScrollView *scrollView;
imageView = [[NSImageView alloc] initWithFrame:NSMakeRect(0,250,236,60)];
[imageView setImageScaling: NSScaleToFit];
scrollView = [[NSScrollView alloc] initWithFrame: NSMakeRect(5,5,224,240)];
textView = [[NSTextView alloc] initWithFrame: [[scrollView contentView] frame]];
//[textView setTextContainerInset: NSMakeSize(5,5)];
[textView setBackgroundColor: [NSColor whiteColor]];
[textView setDrawsBackground: YES];
[textView setRichText: NO];
[textView setUsesFontPanel: NO];
[textView setHorizontallyResizable: NO];
[textView setVerticallyResizable: YES];
[textView setMinSize: NSMakeSize (0, 0)];
[textView setMaxSize: NSMakeSize (1E7, 1E7)];
[textView setAutoresizingMask: NSViewHeightSizable|NSViewWidthSizable];
[[textView textContainer] setContainerSize: NSMakeSize([[scrollView contentView] frame].size.width,
1E7)];
[[textView textContainer] setWidthTracksTextView: YES];
[textView setEditable: NO];
[textView setDelegate: [self windowController]];
[scrollView setDocumentView: textView];
[scrollView setHasHorizontalScroller: NO];
[scrollView setHasVerticalScroller: YES];
[scrollView setBorderType: NSLineBorder];
[scrollView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[[self contentView] addSubview: imageView];
[[self contentView] addSubview: scrollView];
RELEASE(scrollView);
}
//
// access/mutation methods
//
- (NSImageView *) imageView
{
return imageView;
}
- (NSTextView *) textView
{
return textView;
}
@end
plopfolio-0.1.0/ConfigureWindowController.h 0000644 0001750 0001750 00000002673 07471501065 021656 0 ustar gurkan gurkan 0000000 0000000 /*
** ConfigureWindowController.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class Plop;
@interface ConfigureWindowController : NSWindowController
{
// Outlets
IBOutlet NSImageView *imageView;
IBOutlet NSTextView *textView;
// Other ivar
Plop *plop;
}
- (id) initWithWindowNibName: (NSString *) theNibName;
- (void) dealloc;
//
// delegate methods
//
- (void) windowDidLoad;
- (BOOL) windowShouldClose: (id) sender;
- (void) windowWillClose: (NSNotification *) theNotification;
//
// access / mutation
//
- (Plop *) plop;
- (void) setPlop: (Plop *) thePlop;
//
// Other methods
//
@end
//
// private methods
//
@interface ConfigureWindowController (Private)
@end
plopfolio-0.1.0/ConfigureWindowController.m 0000644 0001750 0001750 00000007777 07471501712 021674 0 ustar gurkan gurkan 0000000 0000000 /*
** ConfigureWindowController.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "ConfigureWindowController.h"
#import "Constants.h"
#ifndef MACOSX
#import "ConfigureWindow.h"
#endif
#import "Plop.h"
static id lastConfigureWindowOnTop = nil;
@implementation ConfigureWindowController
//
//
//
- (id) initWithWindowNibName: (NSString *) theNibName
{
#ifdef MACOSX
self = [super initWithWindowNibName: theNibName];
#else
ConfigureWindow *configureWindow;
configureWindow = [[ConfigureWindow alloc] initWithContentRect:NSMakeRect(10,10,236,310)
styleMask: NSClosableWindowMask
backing: NSBackingStoreBuffered
defer: NO];
self = [super initWithWindow: configureWindow];
RELEASE(configureWindow);
[configureWindow layoutWindow];
[configureWindow setDelegate: self];
// We link our outlets
imageView = [configureWindow imageView];
textView = [configureWindow textView];
#endif
// We set the title to an empty string
[[self window] setTitle: _(@"Configure a Plop...")];
return self;
}
//
//
//
- (void) dealloc
{
NSLog(@"ConfigureWindowController: -dealloc");
RELEASE(plop);
[super dealloc];
}
//
//
//
- (void) windowDidLoad
{
lastConfigureWindowOnTop = [self window];
[super windowDidLoad];
}
//
//
//
- (BOOL) windowShouldClose: (id) sender
{
return YES;
}
//
//
//
- (void) windowWillClose: (NSNotification *) theNotification
{
AUTORELEASE(self);
}
//
// access / mutation
//
- (Plop *) plop
{
return plop;
}
//
//
//
- (void) setPlop: (Plop *) thePlop
{
if ( thePlop )
{
NSMutableString *aMutableString;
RETAIN(thePlop);
RELEASE(plop);
plop = thePlop;
// We load our banner image
if ( [plop bannerSource] )
{
NSData *aData;
aData = [[plop bannerSource] resourceDataUsingCache: NO];
if ( aData )
{
NSString *aString;
aString = [NSString stringWithFormat: @"%@/bannerSource_%d.gif",
NSTemporaryDirectory(),
[[NSProcessInfo processInfo] processIdentifier]];
if ( [aData writeToFile: aString
atomically: YES] )
{
NSImage *aImage;
aImage = [[NSImage alloc] initWithContentsOfFile: aString];
if ( aImage )
{
[imageView setImage: aImage];
[imageView setNeedsDisplay: YES];
RELEASE(aImage);
}
else
{
NSLog(@"Unable to create the image from the content of the file.");
}
[[NSFileManager defaultManager] removeFileAtPath: aString
handler: nil];
}
}
else
{
NSLog(@"Unable to obtain the banner for the URL.");
}
} // if ( [plop bannerSource] )
else
{
NSLog(@"No banner was specified in this Plop.");
}
// We set the content of our text view
aMutableString = [[NSMutableString alloc] init];
[aMutableString appendFormat: @"%@\n", [plop title]];
[aMutableString appendFormat: @"Version %@\n\n", [plop plopVersion]];
[aMutableString appendFormat: @"%@\n\n", [plop description]];
[aMutableString appendFormat: @"Refresh Rate:\n%d minutes.", [plop refresh]];
[textView setString: aMutableString];
RELEASE(aMutableString);
}
else
{
DESTROY(plop);
}
}
@end
//
// private methods
//
@implementation ConfigureWindowController (Private)
@end
plopfolio-0.1.0/Constants.h 0000644 0001750 0001750 00000004502 07471465067 016461 0 ustar gurkan gurkan 0000000 0000000 /*
** Constants.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
#ifndef GNUSTEP_BASE_VERSION
#define RETAIN(object) [object retain]
#define RELEASE(object) [object release]
#define AUTORELEASE(object) [object autorelease]
#define TEST_RELEASE(object) ({ if (object) [object release]; })
#define ASSIGN(object,value) ({\
id __value = (id)(value); \
id __object = (id)(object); \
if (__value != __object) \
{ \
if (__value != nil) \
{ \
[__value retain]; \
} \
object = __value; \
if (__object != nil) \
{ \
[__object release]; \
} \
} \
})
#define DESTROY(object) ({ \
if (object) \
{ \
id __o = object; \
object = nil; \
[__o release]; \
} \
})
#define CREATE_AUTORELEASE_POOL(X) \
NSAutoreleasePool *(X) = [NSAutoreleasePool new]
#define NSLocalizedString(key, comment) \
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
#define _(X) NSLocalizedString (X, @"")
#endif
#define BLUE 1
#define GRAY 2
#define GREEN 3
#define PURPLE 4
#define YELLOW 5
#define TOP_LEFT 1
#define TOP_RIGHT 2
#define CENTER 3
#define BOTTOM_LEFT 4
#define BOTTOM_RIGHT 5
#define NO_TITLE 1
#define FIRST_LINE_OF_PLOP 2
#define CUSTOM 3
#define DEFAULT_PLOP_WIDTH 200
#define DEFAULT_PLOP_HEIGHT 100
#define USE_DEFAULT_BROWSER 0
#define USE_CUSTOM_BROWSER 1
// Contants for the UI
extern const int TextFieldHeight;
extern const int ButtonHeight;
NSString *PathToPlops();
NSString *PlopFolioUserLibraryPath();
plopfolio-0.1.0/Constants.m 0000644 0001750 0001750 00000002375 07467615531 016472 0 ustar gurkan gurkan 0000000 0000000 /*
** Constants.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "Constants.h"
// Constants for the UI
const int TextFieldHeight = 21;
const int ButtonHeight = 25;
NSString *PathToPlops()
{
return [NSString stringWithFormat: @"%@/Plops", PlopFolioUserLibraryPath()];
}
NSString *PlopFolioUserLibraryPath()
{
NSString *aString;
aString = [NSString stringWithFormat: @"%@/PlopFolio",
[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0] ];
return aString;
}
plopfolio-0.1.0/Element.h 0000644 0001750 0001750 00000001157 07467615531 016077 0 ustar gurkan gurkan 0000000 0000000
#import
#define UNKNOWN 1
#define CHANNEL 1
#define IMAGE 2
#define ITEM 3
#define TEXTINPUT 4
@interface Element : NSObject
{
NSString *title, *description;
NSURL *link, *url;
int type;
}
- (id) init;
- (void) dealloc;
//
// access / mutation methods
//
- (NSString *) title;
- (void) setTitle: (NSString *) theTitle;
- (NSString *) description;
- (void) setDescription: (NSString *) theDescription;
- (NSURL *) link;
- (void) setLink: (NSURL *) theLink;
- (NSURL *) url;
- (void) setURL: (NSURL *) theURL;
- (int) type;
- (void) setType: (int) theType;
@end
plopfolio-0.1.0/Element.m 0000644 0001750 0001750 00000001740 07467615531 016102 0 ustar gurkan gurkan 0000000 0000000
#import "Element.h"
#import "Constants.h"
@implementation Element
//
//
//
- (id) init
{
self = [super init];
return self;
}
//
//
//
- (void) dealloc
{
RELEASE(title);
RELEASE(description);
RELEASE(link);
RELEASE(url);
[super dealloc];
}
//
// access / mutation methods
//
- (NSString *) title
{
return title;
}
- (void) setTitle: (NSString *) theTitle
{
RETAIN(theTitle);
RELEASE(title);
title = theTitle;
}
- (NSString *) description
{
return description;
}
- (void) setDescription: (NSString *) theDescription
{
RETAIN(theDescription);
RELEASE(description);
description = theDescription;
}
- (NSURL *) link
{
return link;
}
- (void) setLink: (NSURL *) theLink
{
RETAIN(theLink);
RELEASE(link);
link = theLink;
}
- (NSURL *) url
{
return url;
}
- (void) setURL: (NSURL *) theURL
{
RETAIN(theURL);
RELEASE(url);
url = theURL;
}
- (int) type
{
return type;
}
- (void) setType: (int) theType
{
type = theType;
}
@end
plopfolio-0.1.0/ExtendedTableColumn.h 0000644 0001750 0001750 00000002702 07467615531 020371 0 ustar gurkan gurkan 0000000 0000000 /*
ExtendedTableColumn.h
Copyright (C) 2001 Pierre-Yves Rivaille
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _GNUstep_H_ExtendedTableColumn
#define _GNUstep_H_ExtendedTableColumn
#import
#import
@interface ExtendedTableColumn: NSTableColumn
{
BOOL _setTag;
BOOL _setState;
BOOL _useMouse;
}
- (BOOL) shouldUseTag;
- (BOOL) shouldUseAndSetState;
- (BOOL) shouldUseMouse;
- (void) setShouldUseTag: (BOOL) aBool;
- (void) setShouldUseAndSetState: (BOOL) aBool;
- (void) setShouldUseMouse: (BOOL) aBool;
@end
@interface NSTableColumn (ExtendedExtensions)
- (BOOL) shouldUseTag;
- (BOOL) shouldUseAndSetState;
- (BOOL) shouldUseMouse;
@end
#endif // _GNUstep_H_ExtendedTableColumn
plopfolio-0.1.0/ExtendedTableColumn.m 0000644 0001750 0001750 00000003165 07467615532 020403 0 ustar gurkan gurkan 0000000 0000000 /*
ExtendedTableColumn.m
Copyright (C) 2001 Pierre-Yves Rivaille
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import
#import "ExtendedTableColumn.h"
@implementation ExtendedTableColumn
- (id)initWithIdentifier: (id)anObject
{
self = [super initWithIdentifier: anObject];
_setTag = NO;
_setState = NO;
_useMouse = NO;
return self;
}
- (BOOL) shouldUseTag
{
return _setTag;
}
- (BOOL) shouldUseAndSetState
{
return _setState;
}
- (BOOL) shouldUseMouse
{
return _useMouse;
}
- (void) setShouldUseTag: (BOOL) aBool
{
_setTag = aBool;
}
- (void) setShouldUseAndSetState: (BOOL) aBool
{
_setState = aBool;
}
- (void) setShouldUseMouse: (BOOL) aBool
{
_useMouse = aBool;
}
@end
@implementation NSTableColumn (ExtendedExtensions)
- (BOOL) shouldUseTag
{
return NO;
}
- (BOOL) shouldUseAndSetState
{
return NO;
}
- (BOOL) shouldUseMouse
{
return NO;
}
@end
plopfolio-0.1.0/ExtendedTableView.h 0000644 0001750 0001750 00000002715 07467615532 020053 0 ustar gurkan gurkan 0000000 0000000 /*
ExtendedTableView.h
Copyright (C) 2001 Pierre-Yves Rivaille
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _GNUstep_H_ExtendedTableView
#define _GNUstep_H_ExtendedTableView
#import
@interface ExtendedTableView : NSTableView
@end
@interface NSObject (ExtendedTableDataSource)
- (int) tableView: (NSTableView *)aTableView
stateForTableColumn: (NSTableColumn *)aTableColumn
row: (int)rowIndex;
- (void) tableView: (NSTableView *)aTableView
setState: (int)aState
forTableColumn: (NSTableColumn *)aTableColumn
row: (int)rowIndex;
- (int) tableView: (NSTableView *)aTableView
tagForTableColumn: (NSTableColumn *)aTableColumn
row: (int)rowIndex;
@end
#endif // _GNUstep_H_ExtendedTableView
plopfolio-0.1.0/ExtendedTableView.m 0000644 0001750 0001750 00000015741 07467615533 020064 0 ustar gurkan gurkan 0000000 0000000 /*
ExtendedTableView.m
Copyright (C) 2001 Pierre-Yves Rivaille
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import
#import "ExtendedTableView.h"
#import "ExtendedTableColumn.h"
@implementation ExtendedTableView
- (void) mouseDown: (NSEvent *)theEvent
{
NSPoint location = [theEvent locationInWindow];
NSTableColumn *tb;
#ifdef MACOSX
int _clickedRow;
int _clickedColumn;
int _numberOfRows = [self frame].size.height / _rowHeight;
int _numberOfColumns = [_tableColumns count];
#endif
//
// Pathological case -- ignore mouse down
//
if ((_numberOfRows == 0) || (_numberOfColumns == 0))
{
[super mouseDown: theEvent];
return;
}
// Determine row and column which were clicked
location = [self convertPoint: location fromView: nil];
_clickedRow = [self rowAtPoint: location];
_clickedColumn = [self columnAtPoint: location];
if (_clickedRow == -1 || _clickedColumn == -1)
return;
tb = [_tableColumns objectAtIndex: _clickedColumn];
if ([tb shouldUseMouse] == YES)
{
NSApplication *theApp = [NSApplication sharedApplication];
BOOL mouseUp = NO, done = NO;
NSEvent *e;
int oldActionMask;
NSPoint location;
unsigned int event_mask = NSLeftMouseDownMask | NSLeftMouseUpMask
| NSMouseMovedMask | NSLeftMouseDraggedMask
| NSRightMouseDraggedMask;
NSCell *mouseCell;
NSRect mouseCellFrame;
mouseCell = [[_tableColumns objectAtIndex: _clickedColumn]
dataCellForRow: _clickedRow];
mouseCellFrame = [self frameOfCellAtColumn: _clickedColumn
row: _clickedRow];
[mouseCell setObjectValue: [_dataSource tableView: self
objectValueForTableColumn: tb
row: _clickedRow]];
if ([tb shouldUseAndSetState] == YES)
[mouseCell setState: [_dataSource tableView: self
stateForTableColumn: tb
row: _clickedRow]];
if ([tb shouldUseTag] == YES)
[mouseCell setTag: [_dataSource tableView: self
tagForTableColumn: tb
row: _clickedRow]];
#ifdef MACOSX
if (_tvFlags.delegateWillDisplayCell)
#else
if (_del_responds)
#endif
{
[_delegate tableView: self willDisplayCell: mouseCell
forTableColumn: tb row: _clickedRow];
}
if ([mouseCell isEnabled] == NO)
return;
if ([mouseCell isContinuous])
oldActionMask = [mouseCell sendActionOn: 0];
else
oldActionMask = [mouseCell sendActionOn: NSPeriodicMask];
// [_window _captureMouse: self];
e = theEvent;
while (!done) // loop until mouse goes up
{
location = [e locationInWindow];
location = [self convertPoint: location fromView: nil];
// ask the cell to track the mouse only
// if the mouse is within the cell
if (NSMouseInRect(location, mouseCellFrame, YES))
{
[mouseCell highlight: YES
withFrame: mouseCellFrame
inView: self];
[_window flushWindow];
if ([mouseCell trackMouse: e
inRect: mouseCellFrame
ofView: self
untilMouseUp: /*[[mouseCell class] prefersTrackingUntilMouseUp]]*/NO])
done = mouseUp = YES;
else
{
[mouseCell highlight: NO
withFrame: mouseCellFrame
inView: self];
[_window flushWindow];
}
}
if (done)
break;
e = [theApp nextEventMatchingMask: event_mask
untilDate: nil
inMode: NSEventTrackingRunLoopMode
dequeue: YES];
if ([e type] == NSLeftMouseUp)
done = YES;
}
// [_window _releaseMouse: self];
if (mouseUp)
{
#ifdef MACOSX
[mouseCell setNextState];
#endif
if ([tb shouldUseAndSetState] == YES)
[_dataSource tableView: self
setState: [mouseCell state]
forTableColumn: tb
row: _clickedRow];
// [cell setState: ![cell state]];
[mouseCell highlight: NO
withFrame: mouseCellFrame
inView: self];
[_window flushWindow];
}
[mouseCell sendActionOn: oldActionMask];
if (mouseUp)
{
SEL theAction;
theAction = [mouseCell action];
if (theAction)
[NSApp sendAction: theAction
to: [mouseCell target]
from: mouseCell];
}
return;
}
[super mouseDown: theEvent];
}
- (void)drawRow: (int)rowIndex clipRect: (NSRect)aRect
{
int startingColumn;
int endingColumn;
NSTableColumn *tb;
NSRect drawingRect;
NSCell *cell;
int i;
#ifndef MACOSX
float x_pos;
#endif
if (_dataSource == nil)
{
return;
}
#ifdef MACOSX
startingColumn = [self columnAtPoint: NSMakePoint(NSMinX(aRect), NSMinY(aRect))];
#else
/* Using columnAtPoint: here would make it called twice per row per drawn
rect - so we avoid it and do it natively */
/* Determine starting column as fast as possible */
x_pos = NSMinX (aRect);
i = 0;
while ((x_pos > _columnOrigins[i]) && (i < _numberOfColumns))
{
i++;
}
startingColumn = (i - 1);
if (startingColumn == -1)
startingColumn = 0;
#endif
#ifdef MACOSX
endingColumn = [self columnAtPoint: NSMakePoint(NSMaxX(aRect), NSMinY(aRect))];
#else
/* Determine ending column as fast as possible */
x_pos = NSMaxX (aRect);
// Nota Bene: we do *not* reset i
while ((x_pos > _columnOrigins[i]) && (i < _numberOfColumns))
{
i++;
}
endingColumn = (i - 1);
if (endingColumn == -1)
endingColumn = _numberOfColumns - 1;
#endif
/* Draw the row between startingColumn and endingColumn */
for (i = startingColumn; i <= endingColumn; i++)
{
#ifdef MACOSX
if (i != _editingColumn || rowIndex != _editingRow)
#else
if (i != _editedColumn || rowIndex != _editedRow)
#endif
{
tb = [_tableColumns objectAtIndex: i];
cell = [tb dataCellForRow: rowIndex];
#ifdef MACOSX
if (_tvFlags.delegateWillDisplayCell)
#else
if (_del_responds)
#endif
{
[_delegate tableView: self willDisplayCell: cell
forTableColumn: tb row: rowIndex];
}
[cell setObjectValue: [_dataSource tableView: self
objectValueForTableColumn: tb
row: rowIndex]];
if ([tb shouldUseAndSetState] == YES)
[cell setState: [_dataSource tableView: self
stateForTableColumn: tb
row: rowIndex]];
drawingRect = [self frameOfCellAtColumn: i
row: rowIndex];
[cell drawWithFrame: drawingRect inView: self];
}
}
}
@end
plopfolio-0.1.0/GNUmakefile 0000644 0001750 0001750 00000003052 07710760015 016370 0 ustar gurkan gurkan 0000000 0000000 #
# PlopFolio Makefile for GNUstep
# Copyright (C) 2002, 2003
#
# Author: Ludovic Marcotte
#
# 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. */
include $(GNUSTEP_MAKEFILES)/common.make
# The application to be compiled
APP_NAME = PlopFolio
# The Objective-C source files to be compiled
PlopFolio_OBJC_FILES = PlopFolio.m Element.m Channel.m PlopWindow.m PlopWindowController.m PlopView.m Constants.m PreferencesPanel.m PreferencesPanelController.m LabelWidget.m Plop.m NSStringExtensions.m ExtendedTableView.m ExtendedTableColumn.m ConfigureWindow.m ConfigureWindowController.m
# The Resource files to be copied into the app's resources directory
PlopFolio_RESOURCE_FILES = Images/*
PlopFolio_LANGUAGES = English
PlopFolio_LOCALIZED_RESOURCE_FILES = Localizable.strings
# We want to get all the warnings...
ADDITIONAL_OBJCFLAGS = -Wall -Wno-import
include $(GNUSTEP_MAKEFILES)/application.make
plopfolio-0.1.0/LabelWidget.h 0000644 0001750 0001750 00000002074 07467615533 016672 0 ustar gurkan gurkan 0000000 0000000 /*
** LabelWidget.h
**
** Copyright (c) 2002
**
** Author: Jonathan B. Leffert
**
** 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
@interface LabelWidget: NSTextField
{
}
- (id) initWithFrame: (NSRect) theFrame;
- (id) initWithFrame: (NSRect) theFrame label: (NSString *) theLabel;
+ (id) labelWidgetWithFrame: (NSRect) theFrame label: (NSString *) theLabel;
@end
plopfolio-0.1.0/LabelWidget.m 0000644 0001750 0001750 00000003032 07467615533 016672 0 ustar gurkan gurkan 0000000 0000000 /*
** LabelWidget.m
**
** Copyright (c) 2002
**
** Author: Jonathan B. Leffert
**
** 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 "LabelWidget.h"
#import "Constants.h"
@implementation LabelWidget
- (id) initWithFrame: (NSRect) theFrame
{
self = [super initWithFrame: theFrame];
[self setEditable: NO];
[self setSelectable: NO];
[self setBezeled: NO];
[self setDrawsBackground: NO];
return self;
}
- (id) initWithFrame: (NSRect) theFrame label: (NSString *) theLabel
{
self = [self initWithFrame: theFrame];
if ( theLabel )
{
[self setStringValue: theLabel];
}
else
{
[self setStringValue: @""];
}
return self;
}
+ (id) labelWidgetWithFrame: (NSRect) theFrame label: (NSString *) theLabel
{
LabelWidget *lw = [[self alloc] initWithFrame: theFrame
label: theLabel];
return AUTORELEASE(lw);
}
@end
plopfolio-0.1.0/NSStringExtensions.h 0000644 0001750 0001750 00000001672 07467615533 020301 0 ustar gurkan gurkan 0000000 0000000 /*
** NSStringExtensions.h
**
** Copyright (C) 2002
**
** Author: Ludovic Marcotte
**
** 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
@interface NSString (GNUMailStringExtensions)
- (NSString *) stringByTrimmingWhiteSpaces;
@end
plopfolio-0.1.0/NSStringExtensions.m 0000644 0001750 0001750 00000003136 07470606577 020305 0 ustar gurkan gurkan 0000000 0000000 /*
** NSStringExtensions.m
**
** Copyright (C) 2002
**
** Author: Ludovic Marcotte
**
** 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 "NSStringExtensions.h"
#import "Constants.h"
@implementation NSString (PlopFolioStringExtensions)
- (NSString *) stringByTrimmingWhiteSpaces
{
#ifndef MACOSX
return [self stringByTrimmingSpaces];
#else
NSMutableString *aMutableCopy;
aMutableCopy = [[NSMutableString alloc] initWithString: self];
while ( [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember: [aMutableCopy characterAtIndex: 0]] )
{
[aMutableCopy deleteCharactersInRange: NSMakeRange(0,1)];
}
while ( [[NSCharacterSet whitespaceAndNewlineCharacterSet] characterIsMember: [aMutableCopy characterAtIndex: ([aMutableCopy length] - 1)]] )
{
[aMutableCopy deleteCharactersInRange: NSMakeRange([aMutableCopy length]-1, 1)];
}
return AUTORELEASE(aMutableCopy);
#endif
}
@end
plopfolio-0.1.0/Plop.h 0000644 0001750 0001750 00000004314 07471501065 015405 0 ustar gurkan gurkan 0000000 0000000 /*
** Plop.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class Channel;
@interface Plop : NSObject
{
// Owner informations
NSString *author, *copyright, *email, *web;
// Identity informations
NSString *title, *plopVersion, *lastModified, *description;
NSArray *keywords;
// Location informations
NSURL *defaultLink, *contentSource, *iconSource, *bannerSource, *klipLocation;
// Setup
int refresh;
// Other ivars
NSString *iconName;
BOOL active;
NSRect frame;
Channel *channel;
}
//
// access / mutation methods
//
- (BOOL) isActive;
- (void) setActive: (BOOL) theBOOL;
- (NSURL *) bannerSource;
- (void) setBannerSource: (NSURL *) theBannerSource;
- (NSURL *) contentSource;
- (void) setContentSource: (NSURL *) theContentSource;
- (NSURL *) defaultLink;
- (void) setDefaultLink: (NSURL *) theDefaultLink;
- (NSString *) description;
- (void) setDescription: (NSString *) theDescription;
- (NSRect) frame;
- (void) setFrame: (NSRect) theFrame;
- (NSURL *) iconSource;
- (void) setIconSource: (NSURL *) theIconSource;
- (NSString *) iconName;
- (void) setIconName: (NSString *) theName;
- (int) refresh;
- (void) setRefresh: (int) theRefresh;
- (NSString *) title;
- (void) setTitle: (NSString *) theTitle;
- (Channel *) channel;
- (void) setChannel: (Channel *) theChannel;
- (NSString *) plopVersion;
- (void) setPlopVersion: (NSString *) thePlopVersion;
//
// Other methods
//
- (void) cache;
@end
plopfolio-0.1.0/Plop.m 0000644 0001750 0001750 00000014037 07471501065 015415 0 ustar gurkan gurkan 0000000 0000000 /*
** Plop.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "Plop.h"
#import "Channel.h"
#import "Constants.h"
static int currentVersion = 1;
@implementation Plop
//
//
//
- (id) init
{
self = [super init];
// We give a defaut size to our frame
[self setActive: NO];
[self setFrame: NSMakeRect(10,10,DEFAULT_PLOP_WIDTH,DEFAULT_PLOP_HEIGHT)];
[self setRefresh: 600];
[self setBannerSource: nil];
[self setContentSource: nil];
[self setChannel: nil];
return self;
}
//
//
//
- (void) dealloc
{
RELEASE(bannerSource);
RELEASE(contentSource);
RELEASE(defaultLink);
RELEASE(description);
RELEASE(iconSource);
RELEASE(iconName);
RELEASE(plopVersion);
[super dealloc];
}
//
// coding protocol
//
- (void) encodeWithCoder: (NSCoder *) theCoder
{
[Plop setVersion: currentVersion];
[theCoder encodeObject: [NSNumber numberWithBool: [self isActive]] ];
[theCoder encodeObject: [self bannerSource]];
[theCoder encodeObject: [self contentSource]];
[theCoder encodeObject: [self defaultLink]];
[theCoder encodeObject: [self description]];
[theCoder encodeObject: [self iconSource]];
[theCoder encodeObject: [self iconName]];
[theCoder encodeObject: [self title]];
[theCoder encodeObject: [NSNumber numberWithInt: [self refresh]] ];
[theCoder encodeObject: [self plopVersion]];
// We finally encode our frame
[theCoder encodeObject: [NSNumber numberWithFloat: frame.origin.x] ];
[theCoder encodeObject: [NSNumber numberWithFloat: frame.origin.y] ];
[theCoder encodeObject: [NSNumber numberWithFloat: frame.size.width] ];
[theCoder encodeObject: [NSNumber numberWithFloat: frame.size.height] ];
}
//
//
//
- (id) initWithCoder: (NSCoder *) theCoder
{
int aVersion;
aVersion = [theCoder versionForClassName: NSStringFromClass([self class])];;
self = [self init];
// Version 1 - Corresponds to PlopFolio v0.1
if ( aVersion == 1 )
{
[self setActive: [[theCoder decodeObject] boolValue]];
[self setBannerSource: [theCoder decodeObject]];
[self setContentSource: [theCoder decodeObject]];
[self setDefaultLink: [theCoder decodeObject]];
[self setDescription: [theCoder decodeObject]];
[self setIconSource: [theCoder decodeObject]];
[self setIconName: [theCoder decodeObject]];
[self setTitle: [theCoder decodeObject]];
[self setRefresh: [[theCoder decodeObject] intValue]];
[self setPlopVersion: [theCoder decodeObject]];
// We finally decode our frame
frame.origin.x = [[theCoder decodeObject] floatValue];
frame.origin.y = [[theCoder decodeObject] floatValue];
frame.size.width = [[theCoder decodeObject] floatValue];
frame.size.height = [[theCoder decodeObject] floatValue];
}
return self;
}
//
// access / mutation methods
//
- (BOOL) isActive
{
return active;
}
- (void) setActive: (BOOL) theBOOL
{
active = theBOOL;
}
//
//
//
- (NSURL *) bannerSource
{
return bannerSource;
}
- (void) setBannerSource: (NSURL *) theBannerSource
{
RETAIN(theBannerSource);
RELEASE(bannerSource);
bannerSource = theBannerSource;
}
//
//
//
- (NSURL *) iconSource
{
return iconSource;
}
- (void) setIconSource: (NSURL *) theIconSource
{
RETAIN(theIconSource);
RELEASE(iconSource);
iconSource = theIconSource;
}
//
//
//
- (NSString *) iconName
{
return iconName;
}
- (void) setIconName: (NSString *) theName
{
RETAIN(theName);
RELEASE(iconName);
iconName = theName;
}
//
//
//
- (NSURL *) contentSource
{
return contentSource;
}
- (void) setContentSource: (NSURL *) theContentSource
{
RETAIN(theContentSource);
RELEASE(contentSource);
contentSource = theContentSource;
}
//
//
//
- (NSURL *) defaultLink
{
return defaultLink;
}
- (void) setDefaultLink: (NSURL *) theDefaultLink
{
RETAIN(theDefaultLink);
RELEASE(defaultLink);
defaultLink = theDefaultLink;
}
//
//
//
- (NSString *) description
{
return description;
}
- (void) setDescription: (NSString *) theDescription
{
RETAIN(theDescription);
RELEASE(description);
description = theDescription;
}
//
//
//
- (NSRect) frame
{
return frame;
}
- (void) setFrame: (NSRect) theFrame
{
frame = theFrame;
}
//
//
//
- (int) refresh
{
return refresh;
}
- (void) setRefresh: (int) theRefresh
{
if ( theRefresh <= 0 )
{
theRefresh = 600;
}
refresh = theRefresh;
}
//
//
//
- (NSString *) title
{
return title;
}
- (void) setTitle: (NSString *) theTitle
{
RETAIN(theTitle);
RELEASE(title);
title = theTitle;
}
//
//
//
- (Channel *) channel
{
return channel;
}
// No need to retain the channel here since the channel
// already retains the Plop.
- (void) setChannel: (Channel *) theChannel
{
channel = theChannel;
}
//
//
//
- (NSString *) plopVersion
{
return plopVersion;
}
- (void) setPlopVersion: (NSString *) thePlopVersion
{
RETAIN(thePlopVersion);
RELEASE(plopVersion);
plopVersion = thePlopVersion;
}
//
// Other methods
//
- (void) cache
{
if ( [self iconSource] )
{
NSData *aData;
aData = [iconSource resourceDataUsingCache: NO];
if ( aData )
{
[self setIconName: [NSString stringWithFormat: @"%@_%@", [self title],
[[iconSource path] lastPathComponent]] ];
[aData writeToFile: [NSString stringWithFormat: @"%@/%@", PlopFolioUserLibraryPath(),
[self iconName]]
atomically: YES];
}
}
}
@end
plopfolio-0.1.0/PlopFolio.h 0000644 0001750 0001750 00000003064 07477701532 016406 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopFolio.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class Plop;
@interface PlopFolio : NSObject
{
// Outlets
IBOutlet NSMenu *menu;
IBOutlet NSMenu *info;
IBOutlet NSMenu *file;
IBOutlet NSMenu *edit;
IBOutlet NSMenu *windows;
IBOutlet NSMenu *services;
// ivars
NSMutableArray *allPlops;
NSMenu *dockMenu;
}
- (id) init;
- (void) dealloc;
//
// action methods
//
- (IBAction) showPreferencesPanel: (id) sender;
//
// delegate methods
//
- (void) applicationDidFinishLaunching: (NSNotification *) not;
- (void) applicationWillFinishLaunching: (NSNotification *) not;
//
// other methods
//
- (void) showAllPlops;
- (void) showPlop: (Plop *) thePlop;
- (BOOL) synchronize;
//
// access / mutation methods
//
- (NSMutableArray *) allPlops;
//
// static methods
//
@end
plopfolio-0.1.0/PlopFolio.m 0000644 0001750 0001750 00000016322 07477701532 016414 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopFolio.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "PlopFolio.h"
#import "Channel.h"
#import "Constants.h"
#import "Plop.h"
#import "PlopWindowController.h"
#import "PreferencesPanelController.h"
// XML header needed under GNUstep
#ifndef MACOSX
#import
#endif
@implementation PlopFolio
//
//
//
- (id) init
{
self = [super init];
return self;
}
//
//
//
- (void) dealloc
{
RELEASE(allPlops);
[super dealloc];
}
//
// action methods
//
- (IBAction) showPreferencesPanel: (id) sender
{
PreferencesPanelController *aController;
aController = [[PreferencesPanelController alloc] initWithWindowNibName: @"PreferencesPanel"];
[[aController window] orderFront: nil];
//[NSApp runModalForWindow: [aController window]];
}
//
// delegate methods
//
- (void) applicationDidFinishLaunching: (NSNotification *) not
{
NSFileManager *aFileManager;
BOOL isDir;
aFileManager = [NSFileManager defaultManager];
if ( [aFileManager fileExistsAtPath: (NSString *)PlopFolioUserLibraryPath()
isDirectory: &isDir] )
{
if ( !isDir )
{
NSLog(@"%@ exists but it is a file not a directory.",
PlopFolioUserLibraryPath());
exit(1);
}
}
else
{
if ( ![aFileManager createDirectoryAtPath: (NSString *)PlopFolioUserLibraryPath()
attributes: nil] )
{
// directory creation failed. quit.
NSLog(@"Could not create directory: %@", PlopFolioUserLibraryPath());
exit(1);
}
else
{
NSLog(@"Created directory: %@", PlopFolioUserLibraryPath());
}
}
// We verify if our archived NSMutableArray exists, if not,
// we create. If yes, we decode it.
if ( [aFileManager fileExistsAtPath: PathToPlops()] )
{
allPlops = [NSUnarchiver unarchiveObjectWithFile: PathToPlops()];
RETAIN(allPlops);
}
else
{
allPlops = [[NSMutableArray alloc] init];
[self synchronize];
}
[self showAllPlops];
}
//
//
//
#ifdef MACOSX
- (NSApplicationTerminateReply) applicationShouldTerminate: (NSApplication *) theSender
#else
- (BOOL) applicationShouldTerminate: (NSApplication *) theSender
#endif
{
[self synchronize];
return YES;
}
//
//
//
- (void) applicationWillFinishLaunching: (NSNotification *) not
{
// Local variable
#ifndef MACOSX
SEL action = NULL;
#endif
// We begin by setting our NSApp's logo
[NSApp setApplicationIconImage: [NSImage imageNamed: @"PlopFolio.tiff"]];
// We continue by creating our NSMenu
#ifndef MACOSX
menu = [[NSMenu alloc] init];
[menu addItemWithTitle:_(@"Info") action: action keyEquivalent: @""];
[menu addItemWithTitle:_(@"Edit") action: action keyEquivalent: @""];
[menu addItemWithTitle:_(@"Windows") action: action keyEquivalent: @"p"];
[menu addItemWithTitle:_(@"Print") action: action keyEquivalent: @"p"];
[menu addItemWithTitle:_(@"Services") action: action keyEquivalent: @""];
[menu addItemWithTitle:_(@"Hide") action: @selector (hide:) keyEquivalent: @"h"];
[menu addItemWithTitle:_(@"Quit") action:@selector(terminate:) keyEquivalent: @"q"];
// Our Info menu / submenus
info = [[NSMenu alloc] init];
[menu setSubmenu:info forItem:[menu itemWithTitle:_(@"Info")]];
[info addItemWithTitle:_(@"Info Panel...")
action: @selector(orderFrontStandardInfoPanel:)
keyEquivalent:@""];
[info addItemWithTitle:_(@"Preferences...")
action: @selector(showPreferencesPanel:)
keyEquivalent:@""];
[info addItemWithTitle:_(@"Help...")
action: action
keyEquivalent:@"?"];
RELEASE(info);
// Our Edit menu / submenus
edit = [[NSMenu alloc] init];
[menu setSubmenu:edit forItem:[menu itemWithTitle:_(@"Edit")]];
[edit addItemWithTitle: _(@"Cut")
action: @selector(cut:)
keyEquivalent: @"x"];
[edit addItemWithTitle: _(@"Copy")
action: @selector(copy:)
keyEquivalent: @"c"];
[edit addItemWithTitle: _(@"Paste")
action: @selector(paste:)
keyEquivalent: @"v"];
[edit addItemWithTitle: _(@"Delete")
action: @selector(delete:)
keyEquivalent: @""];
[edit addItemWithTitle: _(@"Select All")
action: @selector(selectAll:)
keyEquivalent: @"a"];
RELEASE(edit);
// Our Windows menu
windows = [[NSMenu alloc] init];
[menu setSubmenu:windows forItem: [menu itemWithTitle:_(@"Windows")]];
// Our Services menu
services = [[NSMenu alloc] init];
[menu setSubmenu: services forItem: [menu itemWithTitle: _(@"Services")]];
[NSApp setMainMenu: menu];
[NSApp setServicesMenu: services];
[NSApp setWindowsMenu: windows];
RELEASE(services);
RELEASE(windows);
RELEASE(menu);
#endif
}
#ifdef MACOSX
- (void) awakeFromNib
{
dockMenu = [[NSMenu alloc] init];
[dockMenu setAutoenablesItems: NO];
}
- (NSMenu *) applicationDockMenu: (NSApplication *) sender
{
return dockMenu;
}
#endif
//
// other methods
//
- (void) showAllPlops
{
int i;
// We show all the Plops
for (i = 0; i < [allPlops count]; i++)
{
[self showPlop: [allPlops objectAtIndex: i]];
}
}
//
//
//
- (void) showPlop: (Plop *) thePlop
{
PlopWindowController *aPlopWindowController;
Channel *aChannel;
if ( ![thePlop isActive] )
{
// We verify if it had an opened channel. If so, we close the channel.
if ( [thePlop channel] )
{
NSLog(@"Must close the channel!");
[[[thePlop channel] plopWindowController] close];
}
return;
}
else
{
// If the plop is active and has a channel, we simply do NOTHING here.
if ( [thePlop channel] )
{
return;
}
}
// The plop is active but has no channel, let's create a channel for this plop.
aChannel = [[Channel alloc] init];
[aChannel setPlop: thePlop];
[aChannel update: self];
aPlopWindowController = [[PlopWindowController alloc] initWithWindowNibName: @"PlopWindow"];
[aPlopWindowController setChannel: aChannel];
[[aPlopWindowController window] orderFront: nil];
RELEASE(aChannel);
}
//
//
//
- (BOOL) synchronize
{
return [NSArchiver archiveRootObject: allPlops
toFile: PathToPlops()];
}
//
// access / mutation methods
//
- (NSMutableArray *) allPlops
{
return allPlops;
}
//
// static methods
//
@end
//
// Starting point for Terminal.app
//
int main(int argc, const char *argv[], char *env[])
{
NSAutoreleasePool *pool;
PlopFolio *plop;
pool = [[NSAutoreleasePool alloc] init];
plop = [[PlopFolio alloc] init];
[NSApplication sharedApplication];
[NSApp setDelegate: plop];
NSApplicationMain(argc, argv);
RELEASE(plop);
RELEASE(pool);
return 0;
}
plopfolio-0.1.0/PlopFolioInfo.plist 0000644 0001750 0001750 00000000602 07467615534 020126 0 ustar gurkan gurkan 0000000 0000000 {
ApplicationName = "PlopFolio";
ApplicationDescription = "A plop lost in the space!";
ApplicationRelease = "PlopFolio 0.1.0";
FullVersionID = "0.1.0 May 2002";
Authors = ("Ludovic Marcotte ");
Copyright = "Copyright (C) 2002 Ludovic Marcotte";
CopyrightDescription = "Released under the GNU General Public License 2.0";
NSIcon = "PlopFolio.tiff";
}
plopfolio-0.1.0/PlopView.h 0000644 0001750 0001750 00000002376 07471471435 016255 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopView.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@interface PlopView : NSView
{
NSImage *reload, *resize, *icon, *animationIcon;
NSColor *titleBarColor, *plopColor;
NSWindow *window;
NSPoint lastLocationOfWindow;
int count;
}
//
// access/mutation methods
//
- (void) setWindow: (NSWindow *) theWindow;
- (void) setIcon: (NSImage *) theIcon;
- (void) setCount: (int) theCount;
- (void) setAnimationIcon: (NSImage *) theIcon;
- (void) setReloadIcon: (NSImage *) theIcon;
@end
plopfolio-0.1.0/PlopView.m 0000644 0001750 0001750 00000015561 07710760015 016251 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopView.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "PlopView.h"
#import "Channel.h"
#import "Constants.h"
#import "Plop.h"
#import "PlopWindow.h"
#import "PlopWindowController.h"
@implementation PlopView
//
//
//
- (id) init
{
self = [super init];
resize = [NSImage imageNamed: @"resize.tiff"];
[self setReloadIcon: [NSImage imageNamed: @"reload.tiff"]];
icon = nil;
animationIcon = nil;
count = 0;
titleBarColor = [NSColor colorWithDeviceRed: 0.75
green: 0.75
blue: 0.75
alpha: 1.0];
plopColor = [NSColor colorWithDeviceRed: 0.90
green: 0.90
blue: 0.90
alpha: 1.0];
RETAIN(resize);
RETAIN(titleBarColor);
RETAIN(plopColor);
return self;
}
//
//
//
- (void) dealloc
{
RELEASE(reload);
RELEASE(resize);
RELEASE(icon);
RELEASE(titleBarColor);
RELEASE(plopColor);
[super dealloc];
}
//
//
//
- (BOOL) acceptsFirstResponder
{
return YES;
}
//
//
//
- (BOOL) acceptsFirstMouse: (NSEvent *) theEvent
{
return YES;
}
//
//
//
- (void) drawRect: (NSRect) theRect
{
NSMutableAttributedString *title;
NSFont *aFont;
// We fill our rect with the color of our title bar's image for the buttons
[titleBarColor set];
NSRectFill(theRect);
// Our reload button
[reload compositeToPoint: NSMakePoint(theRect.size.width - 23, theRect.size.height - 11)
operation: NSCompositeSourceAtop];
// Our animation icon, if we need to draw it
if ( animationIcon )
{
//NSLog(@"drawing animation icon");
[animationIcon compositeToPoint: NSMakePoint(theRect.size.width - 63, theRect.size.height - 11)
operation: NSCompositeSourceAtop];
}
// We now fill it with the color of the content of the plop
[plopColor set];
NSRectFill( NSMakeRect(0,0,theRect.size.width, theRect.size.height - 11) );
// Our 16x16 icon
if ( icon )
{
[icon compositeToPoint: NSMakePoint(4, theRect.size.height - 32)
operation: NSCompositeSourceAtop];
}
// Our bottom (resize) image
[resize compositeToPoint: NSMakePoint(theRect.size.width - 14, 0)
operation: NSCompositeSourceAtop];
// We draw the count title
aFont = [NSFont boldSystemFontOfSize: 16];
title = [[NSMutableAttributedString alloc]
initWithString: [NSString stringWithFormat: @"%d", count]];
[title addAttribute: NSFontAttributeName
value: aFont
range: NSMakeRange(0, [[title string] length])];
[title addAttribute: NSForegroundColorAttributeName
value: [NSColor blackColor]
range: NSMakeRange(0, [[title string] length])];
[title drawAtPoint: NSMakePoint( (16-[title size].width)/2 + 4,
theRect.size.height - 60)];
}
//
//
//
- (void) mouseDown: (NSEvent *) theEvent
{
NSRect windowRect, resizeRect;
NSPoint bottomRightOrigin;
NSEvent *nextEvent;
BOOL resizing;
lastLocationOfWindow = [theEvent locationInWindow];
windowRect = [window frame];
// We get the point corresponding to the origin of our bottom right corner
bottomRightOrigin = [window convertBaseToScreen: lastLocationOfWindow];
//NSLog(@"%@", NSStringFromRect(windowRect));
resizeRect = NSMakeRect(windowRect.size.width - 8, 0, 8, 8);
resizing = NSMouseInRect(lastLocationOfWindow, resizeRect, NO);
//NSLog(@"Resizing = %d", resizing);
while (YES)
{
nextEvent = [window nextEventMatchingMask: NSLeftMouseUpMask | NSLeftMouseDraggedMask];
if ( [nextEvent type] == NSLeftMouseUp )
{
[self mouseUp: theEvent];
break;
}
else if ( [nextEvent type] == NSLeftMouseDragged )
{
NSPoint aPoint;
aPoint = [window mouseLocationOutsideOfEventStream];
if ( !resizing )
{
NSPoint origin;
origin = [window frame].origin;
origin.x += (aPoint.x - lastLocationOfWindow.x);
origin.y += (aPoint.y - lastLocationOfWindow.y);
[window setFrameOrigin: origin];
}
else
{
NSRect aRect;
float dx, dy;
aPoint = [window convertBaseToScreen: aPoint];
dx = (aPoint.x - bottomRightOrigin.x);
dy = (aPoint.y - bottomRightOrigin.y);
aRect = NSMakeRect(windowRect.origin.x,
windowRect.origin.y + dy,
windowRect.size.width + dx,
windowRect.size.height - dy);
// We don't resize if we reached our minimum size...
if (aRect.size.width < [window minSize].width)
{
aRect.size.width = [window minSize].width;
}
if (aRect.size.height < [window minSize].height)
{
aRect.origin.y -= [window minSize].height - aRect.size.height;
aRect.size.height = [window minSize].height;
}
if ( aRect.size.width >= [window minSize].width &&
aRect.size.height >= [window minSize].height )
{
[window setFrame: aRect
display: YES];
}
}
}
}
}
//
// Method used to detect when the user release the left mouse button
// in order to know if we must minimize, maximize or close the window.
//
- (void) mouseUp: (NSEvent *) theEvent
{
NSRect iconRect, reloadRect, windowRect;
NSPoint aPoint;
aPoint = [theEvent locationInWindow];
windowRect = [window frame];
iconRect = NSMakeRect(4,windowRect.size.height - 32,16,16);
reloadRect = NSMakeRect(windowRect.size.width - 23, windowRect.size.height - 10, 23, 7);
//NSLog(@"Location = %f %f", aPoint.x, aPoint.y);
if ( NSMouseInRect(aPoint, reloadRect, NO) )
{
[(Channel *)[[(PlopWindow *)window windowController] channel] update: self];
}
else if ( NSMouseInRect(aPoint, iconRect, NO) )
{
Plop *aPlop;
aPlop = [[[(PlopWindow *)window windowController] channel] plop];
if ( [aPlop defaultLink] )
{
[[(PlopWindow *)window windowController] openURL: [aPlop defaultLink]];
}
}
}
//
// access/mutation methods
//
- (void) setWindow: (NSWindow *) theWindow
{
window = theWindow;
}
- (void) setIcon: (NSImage *) theIcon
{
RETAIN(theIcon);
RELEASE(icon);
icon = theIcon;
}
- (void) setCount: (int) theCount
{
count = theCount;
}
- (void) setAnimationIcon: (NSImage *) theIcon
{
RETAIN(theIcon);
RELEASE(animationIcon);
animationIcon = theIcon;
}
- (void) setReloadIcon: (NSImage *) theIcon
{
RETAIN(theIcon);
RELEASE(reload);
reload = theIcon;
}
@end
plopfolio-0.1.0/PlopWindow.h 0000644 0001750 0001750 00000002235 07470066647 016610 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopWindow.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class PlopView;
@interface PlopWindow : NSWindow
{
PlopView *plopView;
NSScrollView *scrollView;
NSTextView *textView;
NSSize previousSize;
}
- (void) layoutWindow;
//
// access/mutation methods
//
- (PlopView *) plopView;
- (NSTextView *) textView;
- (NSSize) previousSize;
- (void) setPreviousSize: (NSSize) theSize;
@end
plopfolio-0.1.0/PlopWindow.m 0000644 0001750 0001750 00000006674 07471450637 016625 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopWindow.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "PlopWindow.h"
#import "Constants.h"
#import "PlopView.h"
@implementation PlopWindow
//
//
//
- (id) initWithContentRect: (NSRect) contentRect
styleMask: (unsigned int) styleMask
backing: (NSBackingStoreType) backingType
defer: (BOOL) flag
{
self = [super initWithContentRect: contentRect
styleMask: styleMask
backing: backingType
defer: flag];
[self setPreviousSize: NSMakeSize(DEFAULT_PLOP_WIDTH, DEFAULT_PLOP_HEIGHT)];
return self;
}
//
//
//
- (void) dealloc
{
//NSLog(@"PlopWindow: -dealloc");
RELEASE(plopView);
RELEASE(textView);
RELEASE(scrollView);
[super dealloc];
}
//
//
//
- (void) layoutWindow
{
plopView = [[PlopView alloc] init];
[plopView setFrame: NSMakeRect(0,0,DEFAULT_PLOP_WIDTH,DEFAULT_PLOP_HEIGHT)];
[plopView setAutoresizingMask: (NSViewWidthSizable|NSViewHeightSizable)];
[plopView setWindow: self];
scrollView = [[NSScrollView alloc] initWithFrame: NSMakeRect(30,14,DEFAULT_PLOP_WIDTH-6,DEFAULT_PLOP_HEIGHT - 25)];
textView = [[NSTextView alloc] initWithFrame: [[scrollView contentView] frame]];
//[textView setTextContainerInset: NSMakeSize(5,5)];
[textView setBackgroundColor: [NSColor whiteColor]];
[textView setDrawsBackground: YES];
[textView setRichText: YES];
[textView setUsesFontPanel: YES];
[textView setHorizontallyResizable: NO];
[textView setVerticallyResizable: YES];
[textView setMinSize: NSMakeSize (0, 0)];
[textView setMaxSize: NSMakeSize (1E7, 1E7)];
[textView setAutoresizingMask: NSViewHeightSizable|NSViewWidthSizable];
[[textView textContainer] setContainerSize: NSMakeSize([[scrollView contentView] frame].size.width,
1E7)];
[[textView textContainer] setWidthTracksTextView: YES];
[textView setEditable: NO];
[textView setDelegate: [self windowController]];
[scrollView setDocumentView: textView];
[scrollView setHasHorizontalScroller: NO];
[scrollView setHasVerticalScroller: NO];
[scrollView setBorderType: NSNoBorder];
[scrollView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[[self contentView] addSubview: plopView];
[[self contentView] addSubview: scrollView];
}
//
//
//
- (BOOL) canBecomeKeyWindow
{
return YES;
}
//
// access/mutation methods
//
- (NSSize) maxSize
{
NSRect aRect;
aRect = [[NSScreen mainScreen] frame];
return NSMakeSize(aRect.size.width - 140, aRect.size.height - 140);
}
- (NSSize) minSize
{
return NSMakeSize(36,40);
}
- (NSSize) previousSize
{
return previousSize;
}
- (void) setPreviousSize: (NSSize) theSize
{
previousSize = theSize;
}
- (PlopView *) plopView
{
return plopView;
}
- (NSTextView *) textView
{
return textView;
}
@end
plopfolio-0.1.0/PlopWindowController.h 0000644 0001750 0001750 00000004417 07477701532 020654 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopWindowController.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
// Because of bug #2751274, on Mac OS X 10.1.x, we set up a #define here
// for the AppKit version that is fixed so that the code can automatically switch
// over to doing things the right way when the time comes.
#define kFixedDockMenuAppKitVersion 632
@class Channel;
@class PlopView;
@interface PlopWindowController : NSWindowController
{
// Outlets
IBOutlet NSTextView *textView;
// Other ivar
Channel *channel;
NSMenu *dockMenu;
NSMenu *dockSubMenu;
}
- (id) initWithWindowNibName: (NSString *) theNibName;
- (void) dealloc;
//
// delegate methods
//
- (void) windowDidBecomeKey: (NSNotification *) aNotification;
- (void) windowDidLoad;
- (void) windowDidMove: (NSNotification *) aNotification;
- (void) windowDidResize: (NSNotification *) aNotification;
- (void) windowWillClose: (NSNotification *) theNotification;
//
// action methods
//
#ifdef MACOSX
- (IBAction) dockItemSelected: (id) sender;
- (IBAction) dockItemUpdate: (id) sender;
#endif
//
// access / mutation
//
+ (id) lastPlopWindowOnTop;
- (NSTextView *) textView;
- (PlopView *) plopView;
- (Channel *) channel;
- (void) setChannel: (Channel *) theChannel;
//
// Other methods
//
- (BOOL) openURL: (NSURL *) theURL;
- (void) update;
@end
//
// private methods
//
@interface PlopWindowController (Private)
- (void) _updateWindowFrame;
#ifdef MACOSX
- (NSMenuItem *) _constructMenuItem: (NSString *) theTitle action: (SEL) theSelector url: (NSURL *) theURL;
#endif
@end
plopfolio-0.1.0/PlopWindowController.m 0000644 0001750 0001750 00000023242 07477701532 020656 0 ustar gurkan gurkan 0000000 0000000 /*
** PlopWindowController.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "PlopWindowController.h"
#import "Channel.h"
#import "Constants.h"
#import "NSStringExtensions.h"
#import "Plop.h"
#import "PlopView.h"
#import "PlopWindow.h"
static id lastPlopWindowOnTop = nil;
@implementation PlopWindowController
- (id) initWithWindowNibName: (NSString *) theNibName
{
PlopWindow *plopWindow;
plopWindow = [[PlopWindow alloc] initWithContentRect:NSMakeRect(10,10,DEFAULT_PLOP_WIDTH,DEFAULT_PLOP_HEIGHT)
styleMask: NSBorderlessWindowMask
backing: NSBackingStoreBuffered
defer: NO];
self = [super initWithWindow: plopWindow];
RELEASE(plopWindow);
[plopWindow layoutWindow];
[plopWindow setDelegate: self];
// We link our outlets
textView = [plopWindow textView];
// We set our text view color
[textView setBackgroundColor: [NSColor colorWithDeviceRed: 0.90
green: 0.90
blue: 0.90
alpha: 1.0]];
// We set the title to an empty string
[[self window] setTitle: @""];
#ifdef MACOSX
// We link the dock menu
dockMenu = [[NSApp delegate] applicationDockMenu: nil];
#endif
return self;
}
//
//
//
- (void) dealloc
{
NSLog(@"PlopWindowController: -dealloc");
lastPlopWindowOnTop = nil;
[channel setPlopWindowController: nil];
RELEASE(channel);
#ifdef MACOSX
RELEASE(dockSubMenu);
#endif
[super dealloc];
}
//
// delegate methods
//
- (BOOL) textView: (NSTextView *) textView
clickedOnLink: (id) link
atIndex: (unsigned) charIndex
{
return [self openURL: link];
}
//
//
//
- (void) windowDidBecomeKey: (NSNotification *) aNotification
{
lastPlopWindowOnTop = [self window];
//[[PlopInfoWindowController singleInstance] setPlop: [self plop]];
}
//
//
//
- (void) windowDidLoad
{
lastPlopWindowOnTop = [self window];
[super windowDidLoad];
}
//
//
//
- (void) windowDidMove: (NSNotification *) aNotification
{
[self _updateWindowFrame];
}
//
//
//
- (void) windowDidResize: (NSNotification *) aNotification
{
[self _updateWindowFrame];
}
//
//
//
- (void) windowWillClose: (NSNotification *) theNotification
{
AUTORELEASE(self);
}
//
// access / mutation
//
+ (id) lastPlopWindowOnTop
{
return lastPlopWindowOnTop;
}
//
//
//
- (Channel *) channel
{
return channel;
}
//
//
//
- (void) setChannel: (Channel *) theChannel
{
if ( theChannel )
{
RETAIN(theChannel);
RELEASE(channel);
channel = theChannel;
[channel setPlopWindowController: self];
// We set our count variable and our icon
[[self plopView] setCount: [channel itemCount]];
[[self plopView] setIcon: [channel icon]];
// We now update the text view with the content of the channel
[self update];
// We finally set the window title and frame
if ( [channel title] )
{
[[self window] setTitle: [channel title]];
}
[[self window] setFrame: [[channel plop] frame]
display: NO];
#ifdef MACOSX
// We create a submenu in the dock menu
[dockMenu addItemWithTitle: [[channel plop] title] action: nil keyEquivalent: @""];
dockSubMenu = [[NSMenu alloc] init];
[dockMenu setSubmenu: dockSubMenu forItem: [dockMenu itemWithTitle: [[channel plop] title]]];
#endif
}
else
{
RELEASE(channel);
channel = nil;
}
}
//
//
//
- (NSTextView *) textView
{
return textView;
}
//
//
//
- (PlopView *) plopView
{
return [(PlopWindow *)[self window] plopView];
}
//
// action methods
//
#ifdef MACOSX
- (IBAction) dockItemSelected: (id) sender
{
if ( [sender isKindOfClass: [NSMenuItem class]] )
{
[self openURL: (NSURL *)[(NSMenuItem *)sender representedObject]];
}
}
- (IBAction) dockItemUpdate: (id) sender
{
if ( [sender isKindOfClass: [NSMenuItem class]] )
{
[channel update: [self plopView]];
}
}
#endif
//
// Other methods
//
- (BOOL) openURL: (NSURL *) theURL
{
NSLog(@"Opening %@...", [theURL description]);
if ( [[NSUserDefaults standardUserDefaults] integerForKey: @"BROWSER_SOURCE"] == USE_DEFAULT_BROWSER )
{
return [[NSWorkspace sharedWorkspace] openURL: theURL];
}
else
{
NSString *handler;
handler = [[NSUserDefaults standardUserDefaults] objectForKey: @"BROWSER_PATH"];
if ( !handler || [[handler stringByTrimmingWhiteSpaces] length] == 0 )
{
NSBeep();
return NO;
}
[NSTask launchedTaskWithLaunchPath: @"/bin/sh"
arguments: [NSArray arrayWithObjects: @"-c",
[NSString stringWithFormat: handler, [theURL description]],
nil] ];
}
return YES;
}
//
//
//
- (void) update
{
NSMutableAttributedString *aMutableAttributedString;
int i;
if ( ![self channel] )
{
return;
}
#ifdef MACOSX
// We empty the dock sub menu
for (i = [dockSubMenu numberOfItems] - 1; i > -1; i--)
{
[dockSubMenu removeItem: [dockSubMenu itemAtIndex: i]];
}
#endif
aMutableAttributedString = [[NSMutableAttributedString alloc] init];
for (i = 0; i < [[self channel] count]; i++)
{
NSDictionary *linkAttributes;
Element *aElement;
aElement = [[self channel] elementAtIndex: i];
if ( [aElement type] == ITEM && [aElement link] )
{
NSAttributedString *aAttributedString;
linkAttributes= [NSDictionary dictionaryWithObjectsAndKeys: [aElement link], NSLinkAttributeName,
#ifdef MACOSX
[NSNumber numberWithInt: NSNoUnderlineStyle],
#else
[NSNumber numberWithInt: GSNoUnderlineStyle],
#endif
NSUnderlineStyleAttributeName,
[NSColor blackColor], NSForegroundColorAttributeName,
NULL];
aAttributedString = [[NSAttributedString alloc] initWithString: [[aElement title]
stringByAppendingString: @"\n"]
attributes: linkAttributes];
[aMutableAttributedString appendAttributedString: aAttributedString];
#ifdef MACOSX
// We add a menu item in the dock sub menu
[dockSubMenu addItem: [self _constructMenuItem: [aElement title]
action: @selector(dockItemSelected:)
url: [aElement link]]];
#endif
}
}
#ifdef MACOSX
// We complete the dock sub menu but a Refresh menu item
[dockSubMenu addItem: [NSMenuItem separatorItem]];
[dockSubMenu addItem: [self _constructMenuItem: @"Refresh"
action: @selector(dockItemUpdate:)
url: nil]];
#endif
[[textView textStorage] setAttributedString: aMutableAttributedString];
RELEASE(aMutableAttributedString);
// We set the count of plopview and ask to refresh it
[[self plopView] setCount: [channel itemCount]];
[[self plopView] setNeedsDisplay: YES];
}
@end
//
// private methods
//
@implementation PlopWindowController (Private)
#ifdef MACOSX
- (NSMenuItem *) _constructMenuItem: (NSString *) theTitle
action: (SEL) theSelector
url: (NSURL *) theURL
{
NSMenuItem *item;
// This is the "correct" way to create the menu items - this code is used if we're
// running on a fixed system
if (NSAppKitVersionNumber >= kFixedDockMenuAppKitVersion)
{
item = [[NSMenuItem alloc] initWithTitle: theTitle
action: theSelector
keyEquivalent: @""];
AUTORELEASE(item);
[item setTarget: self];
[item setRepresentedObject: theURL];
[item setEnabled: YES];
}
else // we're running on an OS version that isn't fixed; use NSInvocation
{
// This invocation is going to be of the form aSelector
NSInvocation *myInv;
myInv = [NSInvocation invocationWithMethodSignature: [self methodSignatureForSelector: theSelector]];
item = [[NSMenuItem alloc] initWithTitle: theTitle
action: @selector(invoke)
keyEquivalent: @""];
AUTORELEASE(item);
// This invocation is going to be an invocation of aSelector
[myInv setSelector: theSelector];
// This invocation is going to send its message to self
[myInv setTarget: self];
// The parameter to this invocation will be item, i.e. the NSMenuItem that should
// be the sender to -menuSelected: Note that we pass it at index 2 - indices 0 and 1
// are taken by the hidden arguments self and _cmd, accessible through -setTarget:
// and -setSelector:
[myInv setArgument: &item atIndex: 2];
// here we retain the invocation so it won't go away. Later on we'll have to
// release it to avoid leaking
[item setTarget: RETAIN(myInv)];
[item setTag: 1];
[item setRepresentedObject: theURL];
[item setEnabled: YES];
}
return item;
}
#endif
- (void) _updateWindowFrame
{
if ( [[self channel] plop] )
{
NSRect theFrame;
theFrame = [[self window] frame];
[[[self channel] plop] setFrame: theFrame];
}
}
@end
plopfolio-0.1.0/PreferencesPanel.h 0000644 0001750 0001750 00000002261 07471465067 017726 0 ustar gurkan gurkan 0000000 0000000 /*
** PreferencesPanel.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class ExtendedTableView;
@interface PreferencesPanel : NSPanel
{
NSTabView *tabView;
ExtendedTableView *tableView;
NSPopUpButton *browserPopUpButton;
NSTextField *browserField;
}
- (void) layoutPanel;
//
// access/mutation methods
//
- (NSTableView *) tableView;
- (NSPopUpButton *) browserPopUpButton;
- (NSTextField *) browserField;
@end
plopfolio-0.1.0/PreferencesPanel.m 0000644 0001750 0001750 00000016245 07471465573 017744 0 ustar gurkan gurkan 0000000 0000000 /*
** PreferencesPanel.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "PreferencesPanel.h"
#import "Constants.h"
#import "ExtendedTableColumn.h"
#import "ExtendedTableView.h"
#import "LabelWidget.h"
#import "PreferencesPanelController.h"
@implementation PreferencesPanel
//
//
//
- (void) dealloc
{
NSLog(@"PreferencesPanel: -dealloc");
RELEASE(tableView);
RELEASE(browserPopUpButton);
RELEASE(browserField);
[super dealloc];
}
//
//
//
- (void) layoutPanel
{
ExtendedTableColumn *activeTableColumn, *nameTableColumn;
ExtendedButtonCell *cell;
NSScrollView *scrollView;
NSTabViewItem *item;
NSButton *configure, *delete, *import;
LabelWidget *label, *browserLabel, *browserExampleLabel;
NSBox *box;
tabView = [[NSTabView alloc] initWithFrame: NSMakeRect(0,0,355,270)];
[tabView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
//
// First tab view item
//
item = [[NSTabViewItem alloc] initWithIdentifier: @"Plops"];
[item setLabel: _(@"Plops")];
box = [[NSBox alloc] initWithFrame: NSMakeRect(0,0,355,270)];
[box setBorderType: NSNoBorder];
[box setTitlePosition: NSNoTitle];
[box setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[item setView: box];
RELEASE(box);
// Label
label = [LabelWidget labelWidgetWithFrame: NSMakeRect(5,220,345,TextFieldHeight)
label: _(@"Your Plops:")];
[label setAutoresizingMask: NSViewMaxXMargin|NSViewMaxYMargin];
[[item view] addSubview: label];
// Tableview
activeTableColumn = [[ExtendedTableColumn alloc] initWithIdentifier: @"Active"];
[activeTableColumn setEditable: YES];
[[activeTableColumn headerCell] setStringValue: _(@"Active")];
[activeTableColumn setWidth: 60];
cell = [[ExtendedButtonCell alloc] init];
[cell setButtonType: NSSwitchButton];
[cell setImagePosition: NSImageOnly];
[activeTableColumn setDataCell: cell];
RELEASE(cell);
[activeTableColumn setShouldUseAndSetState: YES];
[activeTableColumn setShouldUseMouse: YES];
nameTableColumn = [[ExtendedTableColumn alloc] initWithIdentifier: @"Name"];
[nameTableColumn setEditable: YES];
[[nameTableColumn headerCell] setStringValue: _(@"Name")];
tableView = [[ExtendedTableView alloc] initWithFrame: NSMakeRect(5,40,335,185)];
[tableView setDrawsGrid: NO];
[tableView setAllowsColumnSelection: NO];
[tableView setAllowsColumnReordering: NO];
[tableView setAllowsEmptySelection: NO];
[tableView setAllowsMultipleSelection: NO];
[tableView addTableColumn: activeTableColumn];
[tableView addTableColumn: nameTableColumn];
[tableView setDataSource: [self windowController]];
[tableView setDelegate: [self windowController]];
RELEASE(activeTableColumn);
RELEASE(nameTableColumn);
scrollView = [[NSScrollView alloc] initWithFrame: NSMakeRect(5,40,335,185)];
[scrollView setHasHorizontalScroller: NO];
[scrollView setHasVerticalScroller: YES];
[scrollView setDocumentView:tableView];
[scrollView setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[[item view] addSubview: scrollView];
RELEASE(scrollView);
// Delete button
delete = [[NSButton alloc] initWithFrame: NSMakeRect(5,5,80,ButtonHeight)];
[delete setTitle: _(@"Delete")];
[delete setTarget: [self windowController]];
[delete setAction: @selector(deleteClicked:)];
[delete setAutoresizingMask: NSViewMaxXMargin|NSViewMaxYMargin];
[[item view] addSubview: delete];
RELEASE(delete);
// Configure button
configure = [[NSButton alloc] initWithFrame: NSMakeRect(90,5,80,ButtonHeight)];
[configure setTitle: _(@"Configure")];
[configure setTarget: [self windowController]];
[configure setAction: @selector(configureClicked:)];
[configure setAutoresizingMask: NSViewMaxXMargin|NSViewMaxYMargin];
[[item view] addSubview: configure];
RELEASE(configure);
// Import button
import = [[NSButton alloc] initWithFrame: NSMakeRect(220,5,120,ButtonHeight)];
[import setTitle: _(@"Import a Klip")];
[import setTarget: [self windowController]];
[import setAction: @selector(importClicked:)];
[import setAutoresizingMask: NSViewMinXMargin|NSViewMaxYMargin];
[[item view] addSubview: import];
RELEASE(import);
[tabView addTabViewItem: item];
RELEASE(item);
//
// Display
//
item = [[NSTabViewItem alloc] initWithIdentifier: @"Display"];
[item setLabel: _(@"Display")];
box = [[NSBox alloc] initWithFrame: NSMakeRect(0,0,355,270)];
[box setBorderType: NSNoBorder];
[box setTitlePosition: NSNoTitle];
[box setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[item setView: box];
RELEASE(box);
[tabView addTabViewItem: item];
RELEASE(item);
//
// General
//
item = [[NSTabViewItem alloc] initWithIdentifier: @"General"];
[item setLabel: _(@"General")];
box = [[NSBox alloc] initWithFrame: NSMakeRect(0,0,355,270)];
[box setBorderType: NSNoBorder];
[box setTitlePosition: NSNoTitle];
[box setAutoresizingMask: NSViewWidthSizable|NSViewHeightSizable];
[item setView: box];
RELEASE(box);
browserLabel = [LabelWidget labelWidgetWithFrame: NSMakeRect(5,220,335,TextFieldHeight)
label: _(@"Open links using the following web browser:")];
[browserLabel setAutoresizingMask: NSViewMaxXMargin|NSViewMaxYMargin];
[[item view] addSubview: browserLabel];
browserPopUpButton = [[NSPopUpButton alloc] initWithFrame: NSMakeRect(5,190,335,ButtonHeight)];
[browserPopUpButton addItemWithTitle: _(@"Operating System Default")];
[browserPopUpButton addItemWithTitle: _(@"Custom")];
[browserPopUpButton setTarget: [self windowController]];
[browserPopUpButton setAction: @selector(selectionInBrowserPopUpButtonHasChanged:)];
[[item view] addSubview: browserPopUpButton];
browserField = [[NSTextField alloc] initWithFrame: NSMakeRect(5,160,335,TextFieldHeight)];
[[item view] addSubview: browserField];
browserExampleLabel = [LabelWidget labelWidgetWithFrame: NSMakeRect(5,130,335,TextFieldHeight)
label: _(@"Example: mozilla -noraise -remote \"openURL(%@,new-window)\"")];
[browserExampleLabel setAutoresizingMask: NSViewMaxXMargin|NSViewMaxYMargin];
[browserExampleLabel setFont: [NSFont systemFontOfSize: 10]];
[[item view] addSubview: browserExampleLabel];
[tabView addTabViewItem: item];
RELEASE(item);
[[self contentView] addSubview: tabView];
}
//
// access/mutation methods
//
- (NSTableView *) tableView
{
return tableView;
}
- (NSPopUpButton *) browserPopUpButton
{
return browserPopUpButton;
}
- (NSTextField *) browserField
{
return browserField;
}
@end
plopfolio-0.1.0/PreferencesPanelController.h 0000644 0001750 0001750 00000003357 07471465067 022001 0 ustar gurkan gurkan 0000000 0000000 /*
** PreferencesPanelController.h
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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
@class GSXMLNode;
@class Plop;
@interface PreferencesPanelController : NSWindowController
{
// Outlets
IBOutlet NSTableView *tableView;
IBOutlet NSPopUpButton *browserPopUpButton;
IBOutlet NSTextField *browserField;
// Other ivars
}
- (id) initWithWindowNibName: (NSString *) theNibName;
- (void) dealloc;
- (void) initializeFromDefaults;
//
// action methods
//
- (IBAction) configureClicked: (id) sender;
- (IBAction) deleteClicked: (id) sender;
- (IBAction) importClicked: (id) sender;
- (IBAction) selectionInBrowserPopUpButtonHasChanged: (id) sender;
@end
//
// private methods
//
@interface PreferencesPanelController (Private)
- (void) _importKlipUsingPath: (NSString *) thePath;
- (void) _parseKlipInformationsFromNode: (id) theNode
plop: (Plop *) thePlop;
@end
//
// Custom NSButton cell
//
@interface ExtendedButtonCell : NSButtonCell
{
}
@end
plopfolio-0.1.0/PreferencesPanelController.m 0000644 0001750 0001750 00000034050 07710760015 021763 0 ustar gurkan gurkan 0000000 0000000 /*
** PreferencesPanelController.m
**
** Copyright (c) 2002
**
** Author: Ludovic Marcotte
**
** 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 "PreferencesPanelController.h"
#import "ConfigureWindowController.h"
#import "Constants.h"
#import "ExtendedTableColumn.h"
#import "NSStringExtensions.h"
#import "Plop.h"
#import "PlopFolio.h"
#import "PreferencesPanel.h"
// XML Headers needed under GNUstep
#ifndef MACOSX
#import
// XML Headers needed under Cocoa
#else
#import
#endif
@implementation PreferencesPanelController
//
//
//
- (id) initWithWindowNibName: (NSString *) theNibName
{
#ifdef MACOSX
self = [super initWithWindowNibName: theNibName];
#else
PreferencesPanel *thePanel;
thePanel = [[PreferencesPanel alloc] initWithContentRect:NSMakeRect(100,100,355,275)
styleMask: (NSClosableWindowMask|NSResizableWindowMask)
backing: NSBackingStoreBuffered
defer: NO];
self = [super initWithWindow: thePanel];
[thePanel layoutPanel];
[thePanel setDelegate: self];
// We link our outlets
tableView = [thePanel tableView];
browserPopUpButton = [thePanel browserPopUpButton];
browserField = [thePanel browserField];
RELEASE(thePanel);
#endif
// We set our title
[[self window] setTitle: _(@"Preferences...")];
// We set our custom table column on OS X
#ifdef MACOSX
{
ExtendedTableColumn *extendedTableColumn;
ExtendedButtonCell *cell;
cell = [[ExtendedButtonCell alloc] init];
[cell setButtonType: NSSwitchButton];
[cell setImagePosition: NSImageOnly];
[cell setControlSize: NSSmallControlSize];
extendedTableColumn = (ExtendedTableColumn *)[tableView tableColumnWithIdentifier: @"active"];
[extendedTableColumn setDataCell: cell];
[extendedTableColumn setShouldUseMouse: YES];
[extendedTableColumn setShouldUseAndSetState: YES];
RELEASE(cell);
}
#endif
// We get our defaults for this panel
[self initializeFromDefaults];
return self;
}
//
//
//
- (void) dealloc
{
[super dealloc];
}
//
//
//
- (void) initializeFromDefaults
{
int index;
index = [[NSUserDefaults standardUserDefaults] integerForKey: @"BROWSER_SOURCE"];
[browserPopUpButton selectItemAtIndex: index];
[browserPopUpButton synchronizeTitleAndSelectedItem];
if ( index > 0 )
{
[browserField setEditable: YES];
}
else
{
[browserField setEditable: NO];
}
if ( [[NSUserDefaults standardUserDefaults] objectForKey: @"BROWSER_PATH"] )
{
[browserField setStringValue: [[NSUserDefaults standardUserDefaults]
objectForKey: @"BROWSER_PATH"] ];
}
}
//
// datasource methods
//
- (id) tableView: (NSTableView *) aTableView
objectValueForTableColumn: (NSTableColumn *) aTableColumn
row: (int) rowIndex
{
Plop *aPlop;
aPlop = [[(PlopFolio *)[NSApp delegate] allPlops] objectAtIndex: rowIndex];
if ( [[[aTableColumn headerCell] stringValue] isEqual: _(@"Name")] )
{
return [aPlop title];
}
else
{
return ( [aPlop isActive] ? _(@"Yes") : _(@"No") );
}
}
//
//
//
- (int) numberOfRowsInTableView: (NSTableView *) aTableView
{
return [[(PlopFolio *)[NSApp delegate] allPlops] count];
}
//
//
//
- (int) tableView: (NSTableView *) aTableView
stateForTableColumn: (NSTableColumn *) aTableColumn
row: (int) rowIndex
{
Plop *aPlop;
aPlop = [[(PlopFolio *)[NSApp delegate] allPlops] objectAtIndex: rowIndex];
return ( [aPlop isActive] ? NSOnState : NSOffState );
}
//
//
//
- (void) tableView: (NSTableView *) aTableView
setState: (int) aState
forTableColumn: (NSTableColumn *) aTableColumn
row: (int) rowIndex
{
Plop *aPlop;
aPlop = [[(PlopFolio *)[NSApp delegate] allPlops] objectAtIndex: rowIndex];
if (aState == NSOnState)
{
[aPlop setActive: YES];
}
else if (aState == NSOffState)
{
[aPlop setActive: NO];
}
}
//
// delegate methods
//
- (void) windowWillClose: (id) sender
{
NSLog(@"Closing the Preferences Panel.");
// We save our userdefaults
[browserPopUpButton synchronizeTitleAndSelectedItem];
[[NSUserDefaults standardUserDefaults] setInteger: [browserPopUpButton indexOfSelectedItem]
forKey: @"BROWSER_SOURCE"];
[[NSUserDefaults standardUserDefaults] setObject: [browserField stringValue]
forKey: @"BROWSER_PATH"];
[[NSUserDefaults standardUserDefaults] synchronize];
// We synchronize our plops
[(PlopFolio *)[NSApp delegate] synchronize];
[(PlopFolio *)[NSApp delegate] showAllPlops];
}
//
// action methods
//
- (IBAction) configureClicked: (id) sender
{
ConfigureWindowController *aConfigureWindowController;
int index;
index = [tableView selectedRow];
if ( index < 0 )
{
NSBeep();
return;
}
aConfigureWindowController = [[ConfigureWindowController alloc] initWithWindowNibName: @"ConfigureWindow"];
[aConfigureWindowController setPlop: [[(PlopFolio *)[NSApp delegate] allPlops] objectAtIndex: index]];
[[aConfigureWindowController window] orderFront: nil];
}
- (IBAction) deleteClicked: (id) sender
{
int choice, index;
index = [tableView selectedRow];
if ( index < 0 )
{
NSBeep();
return;
}
choice = NSRunAlertPanel(_(@"Delete..."),
_(@"Are you sure you want to delete this Plop?"),
_(@"Cancel"), // default
_(@"Yes"), // alternate
NULL);
// If we must delete it...
if ( choice == NSAlertAlternateReturn )
{
Plop *aPlop;
aPlop = [[(PlopFolio *)[NSApp delegate] allPlops] objectAtIndex: index];
// We remove the icon of the plop
[[NSFileManager defaultManager] removeFileAtPath: [NSString stringWithFormat: @"%@/%@",
PlopFolioUserLibraryPath(),
[aPlop iconName]]
handler: nil];
// We remove the plop
[[(PlopFolio *)[NSApp delegate] allPlops] removeObjectAtIndex: index];
[tableView reloadData];
}
}
//
//
//
- (IBAction) importClicked: (id) sender
{
NSOpenPanel *oPanel;
int result;
oPanel = [NSOpenPanel openPanel];
[oPanel setAllowsMultipleSelection:NO];
result = [oPanel runModalForDirectory: NSHomeDirectory()
file: nil
types: nil];
if ( result == NSOKButton )
{
NSArray *fileToOpen;
int count;
fileToOpen = [oPanel filenames];
count = [fileToOpen count];
if ( count > 0 )
{
[self _importKlipUsingPath: [fileToOpen objectAtIndex: 0]];
}
}
}
//
//
//
- (IBAction) selectionInBrowserPopUpButtonHasChanged: (id) sender
{
[browserPopUpButton synchronizeTitleAndSelectedItem];
if ( [browserPopUpButton indexOfSelectedItem] == 0 )
{
[browserField setEditable: NO];
}
else
{
[browserField setEditable: YES];
}
}
@end
//
// private methods
//
@implementation PreferencesPanelController (Private)
- (void) _importKlipUsingPath: (NSString *) thePath
{
// GNUstep XML Parsing Code
#ifndef MACOSX
GSXMLParser *aParser;
NSData *aData;
aData = [NSData dataWithContentsOfFile: thePath];
aParser = [GSXMLParser parserWithData: aData];
[aParser keepBlanks: NO];
if ( [aParser parse] )
{
GSXMLDocument *aDocument;
GSXMLNode *aRoot, *aNode;
Plop *aPlop;
aDocument = [aParser document];
aRoot = [aDocument root];
if ( [[aRoot name] caseInsensitiveCompare: @"KLIP"] != NSOrderedSame )
{
NSLog(@"Not a Klip. Ignoring.");
return;
}
aNode = [aRoot firstChildElement];
// We initialize our plop
aPlop = [[Plop alloc] init];
//
// We loop inside our owner/identity/locations/setup/script nodes
//
while (aNode != nil)
{
[self _parseKlipInformationsFromNode: aNode
plop: aPlop];
// We get the next node
aNode = [aNode nextElement];
}
// We add our plop to our list of active plops
[aPlop cache];
[[(PlopFolio *)[NSApp delegate] allPlops] addObject: aPlop];
[(PlopFolio *)[NSApp delegate] synchronize];
RELEASE(aPlop);
}
else
{
NSLog(@"error occured while parsing .klip");
}
// Cocoa XML Parsing Code
#else
CFXMLTreeRef aTreeRef, xmlTreeRoot;
CFXMLNodeRef xmlRoot;
NSData *aData;
int i;
aData = [NSData dataWithContentsOfFile: thePath];
aTreeRef = CFXMLTreeCreateFromData(kCFAllocatorDefault,
(CFDataRef)aData,
NULL,
kCFXMLParserSkipWhitespace|kCFXMLParserSkipMetaData,
kCFXMLNodeCurrentVersion);
if ( !aTreeRef )
{
NSRunAlertPanel(_(@"Error!"),
_(@"Corrupted XML. Ignoring Klip."),
_(@"OK"),
NULL,
NULL);
return;
}
for (i = 0; i < CFTreeGetChildCount(aTreeRef); i++)
{
xmlTreeRoot = CFTreeGetChildAtIndex(aTreeRef, i);
xmlRoot = CFXMLTreeGetNode(xmlTreeRoot);
if ( [(NSString*)CFXMLNodeGetString(xmlRoot) caseInsensitiveCompare: @"KLIP"] == NSOrderedSame )
{
// We found a klip!
CFXMLTreeRef xmlSubTreeRef;
CFXMLNodeRef aNode;
int j;
Plop *aPlop;
// We initialize our plop
aPlop = [[Plop alloc] init];
for (j = 0; j < CFTreeGetChildCount(xmlTreeRoot); j++)
{
xmlSubTreeRef = CFTreeGetChildAtIndex(xmlTreeRoot, j);
aNode = CFXMLTreeGetNode(xmlSubTreeRef);
if ( CFXMLNodeGetTypeCode(aNode) == kCFXMLNodeTypeElement )
{
[self _parseKlipInformationsFromNode: (id)xmlSubTreeRef
plop: aPlop];
}
}
// We add our plop to our list of active plops
[aPlop cache];
[[(PlopFolio *)[NSApp delegate] allPlops] addObject: aPlop];
[(PlopFolio *)[NSApp delegate] synchronize];
RELEASE(aPlop);
}
}
#endif
[tableView reloadData];
}
//
//
//
- (void) _updatePlop: (Plop *) thePlop
name: (NSString *) theName
content: (NSString *) theContent
{
if ( [theName caseInsensitiveCompare: @"TITLE"] == NSOrderedSame )
{
[thePlop setTitle: theContent];
}
else if ( [theName caseInsensitiveCompare: @"ICON"] == NSOrderedSame )
{
[thePlop setIconSource: [NSURL URLWithString: theContent]];
}
else if ( [theName caseInsensitiveCompare: @"BANNER"] == NSOrderedSame )
{
[thePlop setBannerSource: [NSURL URLWithString: theContent] ];
}
else if ( [theName caseInsensitiveCompare: @"CONTENTSOURCE"] == NSOrderedSame )
{
[thePlop setContentSource: [NSURL URLWithString: theContent] ];
}
else if ( [theName caseInsensitiveCompare: @"DEFAULTLINK"] == NSOrderedSame )
{
[thePlop setDefaultLink: [NSURL URLWithString: theContent] ];
}
else if ( [theName caseInsensitiveCompare: @"DESCRIPTION"] == NSOrderedSame )
{
[thePlop setDescription: theContent];
}
else if ( [theName caseInsensitiveCompare: @"REFRESH"] == NSOrderedSame )
{
[thePlop setRefresh: [theContent intValue] ];
}
else if ( [theName caseInsensitiveCompare: @"VERSION"] == NSOrderedSame )
{
[thePlop setPlopVersion: theContent];
}
}
//
//
//
- (void) _parseKlipInformationsFromNode: (id) theNode
plop: (Plop *) thePlop
{
//
// GNUstep XML Parsing Code
//
#ifndef MACOSX
GSXMLNode *aChild;
static int textNodeType = -1;
if (textNodeType < 0)
{
textNodeType = [GSXMLNode typeFromDescription: @"XML_TEXT_NODE"];
}
// We loop inside our channel/image/item node attributes
if ( (aChild = [theNode firstChildElement]) )
{
while ( aChild )
{
NSString *aName, *aContent;
GSXMLNode *aNode;
aNode = [aChild firstChild];
while ( aNode )
{
if ( [aNode type] == textNodeType )
{
if ( [[[aNode content] stringByTrimmingWhiteSpaces] length] > 0 )
{
break;
}
}
aNode = [aNode next];
}
if ( !aNode )
{
aChild = [aChild next];
continue;
}
aName = [aChild name];
aContent = [[aNode content] stringByTrimmingWhiteSpaces];
if (aName && aContent)
{
[self _updatePlop: thePlop
name: aName
content: aContent];
}
aChild = [aChild nextElement];
}
}
else
{
NSLog(@"No children");
}
#else
int i;
for (i = 0; i < CFTreeGetChildCount((CFXMLTreeRef)theNode); i++)
{
CFXMLTreeRef xmlTreeRef;
CFXMLNodeRef xmlNode;
xmlTreeRef = CFTreeGetChildAtIndex((CFXMLTreeRef)theNode, i);
xmlNode = CFXMLTreeGetNode(xmlTreeRef);
if ( CFXMLNodeGetTypeCode(xmlNode) == kCFXMLNodeTypeElement )
{
NSString *aName, *aContent;
CFXMLTreeRef xmlSubTreeRef;
CFXMLNodeRef xmlSubNode;
int j;
xmlSubTreeRef = NULL;
xmlSubNode = NULL;
for ( j = 0; j < CFTreeGetChildCount(xmlTreeRef); j++ )
{
xmlSubTreeRef = CFTreeGetChildAtIndex(xmlTreeRef, j);
xmlSubNode = CFXMLTreeGetNode(xmlSubTreeRef);
if ( CFXMLNodeGetTypeCode(xmlNode) == kCFXMLNodeTypeElement )
{
break;
}
else
{
xmlSubNode = NULL;
}
}
if ( !xmlSubNode )
{
continue;
}
aName = (NSString *)CFXMLNodeGetString(xmlNode);
aContent = [(NSString *)CFXMLNodeGetString(xmlSubNode) stringByTrimmingWhiteSpaces];
if (aName && aContent)
{
[self _updatePlop: thePlop
name: aName
content: aContent];
}
}
}
#endif
}
@end
//
// Custom NSButton cell
//
@implementation ExtendedButtonCell
@end
plopfolio-0.1.0/README 0000644 0001750 0001750 00000001036 07471532744 015210 0 ustar gurkan gurkan 0000000 0000000 PlopFolio
===============================================================================
PlopFolio is a clone of Serence's excellent KlipFolio application.
PlopFolio supports Klips, available from http://www.klipfarm.com.
To use PlopFolio, you need GNUstep. You can get GNUstep here:
http://www.gnustep.org
To compile PlopFolio:
% cd PlopFolio
% make
% make install (optional)
% openapp PlopFolio.app
Enjoy!
===============================================================================
(c) Ludovic Marcotte
plopfolio-0.1.0/Images/ 0000755 0001750 0001750 00000000000 10060103152 015504 5 ustar gurkan gurkan 0000000 0000000 plopfolio-0.1.0/Images/PlopFolio.tiff 0000644 0001750 0001750 00000022406 07467615541 020320 0 ustar gurkan gurkan 0000000 0000000 II* $ žž¦ÿ¦¢¦ÿ žž¦ÿ¾º¾ÿ ¦¢¦ÿŽqaÿŽqaÿ¦¢¦ÿ žšžÿ¦¢¦ÿ žšžÿ¾º¾ÿ÷óïÿ÷óïÿ –M(ÿÇY ÿ–M(ÿŽ4ÿŽqaÿ¦Šyÿ ¦¢¦ÿ¾º¾ÿ¾º¾ÿžšžÿ ¦¢¦ÿ¦¢¦ÿßÓÏÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿßšYÿߊIÿïãßÿïãßÿÏ‚Iÿ–M(ÿyE(ÿŽqaÿ†‚†ÿ ¦¢¦ÿïãßÿ¦Šyÿßßçÿ –’–ÿ–’–ÿžšžÿžšžÿ ¦¢¦ÿžšžÿÇÇÏÿ÷óïÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿßÓÏÿßÓÏÿßÓÏÿÿûÿÿïªiÿïªiÿßšYÿÇyAÿ–M(ÿyE(ÿŽqaÿŽŠŽÿ žšžÿ¾º¾ÿ ¦Šyÿß¶Žÿÿûÿÿÿûÿÿ÷óïÿÇÇÏÿžšžÿ ŽŠŽÿßßçÿÿûÿÿßÓÏÿ–M(ÿßÓÏÿŽqaÿ¾º¾ÿÿûÿÿ÷óïÿ¦Šyÿ ßÓÏÿÏ‚IÿïªiÿïªiÿïªiÿïªiÿßšYÿŽqaÿŽ4ÿyE(ÿYUQÿIMQÿŽqaÿ¦ŠyÿßÓÏÿ÷óïÿ÷óïÿYYYÿYYYÿÇÇÏÿ iqqÿ000ÿ÷óïÿß¶Žÿß¶Žÿ–M(ÿïãßÿÿûÿÿ÷óïÿßÓÏÿ¾º¾ÿYYYÿ¾º¾ÿ–M(ÿßšYÿïªiÿïªiÿïªiÿßšYÿï¶qÿï¶qÿÇyAÿ–M(ÿq8ÿQ4 ÿ000ÿYYYÿžšžÿQ4 ÿŽŠŽÿ ¦ŠyÿyE(ÿyE(ÿ000ÿ÷óïÿßÓÏÿ¾º¾ÿÿûÿÿ÷óïÿßÓÏÿ¾º¾ÿßßçÿAAIÿ¾º¾ÿ8 ÿ ÿyE(ÿßšYÿïªiÿïªiÿïªiÿï¶qÿï¶qÿï¶qÿßšYÿÇyAÿyE(ÿq8ÿ8 ÿ¦Šyÿ ž’–ÿ–M(ÿ–M(ÿÇyAÿߊIÿÇyAÿIMQÿÿûÿÿïãßÿÇÇÏÿ¦ŠyÿßÓÏÿÇÇÏÿžšžÿIMQÿiqqÿ ÿŽŠŽÿ000ÿŽqaÿïªiÿï¶qÿï¶qÿïªiÿï¶qÿï¶qÿï¶qÿï¶qÿß¶Žÿß¶ŽÿQ4 ÿ¦Šyÿ Žqaÿ–M(ÿÇi0ÿßšYÿß¶ŽÿïãßÿÇÇÏÿ000ÿ–’–ÿßÓÏÿ¦ŠyÿßÓÏÿ¾º¾ÿŽqaÿAAIÿ ÿ ÿYYYÿßÓÏÿÿûÿÿÿûÿÿÇÇÏÿÿûÿÿßÓÏÿïªiÿïªiÿï¶qÿï¶qÿÿÛ–ÿÿÛ–ÿߊIÿ8 ÿ†‚†ÿ ¦ŠyÿyE(ÿÇi0ÿÇyAÿßšYÿ žšžÿ÷óïÿ÷óïÿžšžÿ8$ ÿŽŠŽÿ žšžÿiqqÿ000ÿÿ8$ ÿiqqÿ žž¦ÿÇÇÏÿiqqÿžž¦ÿÿûÿÿÿÛ–ÿïªiÿïªiÿï¶qÿÿÛ–ÿß¶ŽÿߊIÿÏi0ÿ8 ÿ†‚†ÿ ž’–ÿ–M(ÿ–M(ÿÏu8ÿׂAÿׂAÿׂAÿÏ‚IÿyE(ÿ8 ÿYYYÿÇÇÏÿYUQÿ ÿYYYÿYYYÿQ4 ÿÿQ4 ÿ†‚†ÿÇÇÏÿiqqÿßßçÿ(( ÿ ïãßÿï¶qÿïªiÿïªiÿï¶qÿÿÛ–ÿï¶qÿ×y8ÿ×y8ÿ×y8ÿ8 ÿ†‚†ÿ Žqaÿ–M(ÿÇi0ÿÏu8ÿÏu8ÿ×y8ÿׂAÿÏu8ÿyE(ÿQÿAÿ8$ ÿYYYÿÇÇÏÿ000ÿÿ000ÿ ÿQ4 ÿYYYÿÇÇÏÿÿûÿÿÿûÿÿ†‚†ÿÇÇÏÿŽqaÿAÿQ4 ÿßšYÿß¶ŽÿÿÛ–ÿßšYÿ×y8ÿ×y8ÿ×y8ÿ×y8ÿ8 ÿ†‚†ÿ ¦ŠyÿyE(ÿ–M(ÿ×y8ÿ×y8ÿÏu8ÿÏu8ÿÏu8ÿ×y8ÿÏu8ÿÇi0ÿÇi0ÿ–M(ÿÿ(( ÿiqqÿ–’–ÿ ÿ ÿÿ ÿ ÿÿAAIÿ÷óïÿÿûÿÿïãßÿyE(ÿŽqaÿßšYÿÿÛ–ÿÿÛ–ÿߊIÿ×y8ÿ×y8ÿ×y8ÿÏi0ÿyE(ÿ ÿ–’–ÿžšžÿžšžÿžšžÿ ŽqaÿAÿq8ÿ×y8ÿ×y8ÿ×y8ÿÏu8ÿÏu8ÿÏu8ÿÏu8ÿׂAÿׂAÿׂAÿߊIÿ¦Šyÿ ÿ ÿ ÿÿ ÿ ÿÿAÿAÿQÿAAIÿ÷óïÿïªiÿßšYÿïªiÿÿÛ–ÿß¶Žÿ×y8ÿÏi0ÿ×y8ÿ×y8ÿÇY ÿQÿ000ÿIMQÿÇÇÏÿßßçÿßßçÿžšžÿ YUQÿ8 ÿAÿQÿ–M(ÿ×y8ÿÏu8ÿÏu8ÿÏu8ÿÏu8ÿÏu8ÿׂAÿׂAÿ×y8ÿÿÛ–ÿq8ÿ ÿ ÿ ÿÿq8ÿߊIÿߊIÿyE(ÿAÿq8ÿïªiÿßšYÿï¶qÿÿÛ–ÿïªiÿÏi0ÿÏi0ÿÏi0ÿÏi0ÿ–M(ÿAÿ(( ÿiiiÿßÓÏÿß¶Žÿ¾º¾ÿßßçÿžšžÿ YUQÿ( ÿŽ8ÿa ÿAÿQÿ–M(ÿÏu8ÿÏu8ÿÏu8ÿÏu8ÿ×y8ÿׂAÿׂAÿߊIÿß¶ŽÿŽqaÿ ÿQ4 ÿÇyAÿߊIÿߊIÿߊIÿߊIÿyE(ÿߊIÿßšYÿß¶ŽÿÿÛ–ÿߊIÿÇa(ÿÏi0ÿÏi0ÿÏi0ÿ†4ÿAÿ( ÿ ÿIMQÿQ4 ÿQ4 ÿ ÿYYYÿ YUQÿÿŽ8ÿŽ8ÿ†4ÿa ÿAÿi(ÿ–M(ÿÏu8ÿÏu8ÿÏu8ÿ×y8ÿׂAÿׂAÿׂAÿߊIÿ×y8ÿ×y8ÿߊIÿߊIÿߊIÿߊIÿߊIÿߊIÿßšYÿÿÛ–ÿß¶Žÿ×y8ÿÇa(ÿÇa(ÿÇa(ÿÇY ÿa ÿ†4ÿÇa(ÿŽ4ÿq8ÿŽ4ÿ( ÿ YUQÿ( ÿ†4ÿŽ8ÿŽ8ÿŽ8ÿ†4ÿQÿAÿi(ÿÇi0ÿÏu8ÿÏu8ÿ×y8ÿׂAÿׂAÿׂAÿׂAÿ×y8ÿ×y8ÿߊIÿߊIÿߊIÿߊIÿßšYÿÿÛ–ÿï¶qÿÏi0ÿÇa(ÿÇa(ÿÇa(ÿ¶M ÿQÿq8ÿÇa(ÿÇa(ÿÏi0ÿ®Eÿ–M(ÿ8 ÿ YUQÿÿÿQÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿq8ÿQÿAÿyE(ÿÇi0ÿÏu8ÿׂAÿׂAÿׂAÿׂAÿׂAÿ×y8ÿߊIÿߊIÿߊIÿï¶qÿÿÛ–ÿßšYÿÇY ÿÇY ÿÇa(ÿÇa(ÿŽ4ÿ8 ÿa ÿŽ4ÿÇY ÿÏi0ÿÏi0ÿÏi0ÿ–M(ÿ8 ÿ ( ÿ( ÿÿÿi(ÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿi(ÿQÿAÿyE(ÿÏu8ÿׂAÿׂAÿׂAÿׂAÿׂAÿ×y8ÿߊIÿß¶ŽÿÿÛ–ÿ×y8ÿÇY ÿÇY ÿÇY ÿÇY ÿq8ÿ( ÿ ÿ8$ ÿïãßÿïãßÿ×y8ÿÏi0ÿÏi0ÿ–M(ÿ8 ÿ ( ÿ( ÿ( ÿ ÿ ÿ8 ÿ†4ÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿi(ÿQÿQÿ–M(ÿÏu8ÿׂAÿׂAÿׂAÿߊIÿÿÛ–ÿß¶ŽÿÇY ÿÇY ÿÇY ÿÇY ÿ¶M ÿa ÿÿ ÿ000ÿŽqaÿ÷óïÿßÓÏÿÇa(ÿÏi0ÿÏi0ÿ–M(ÿ8 ÿ ŽŠŽÿ†‚†ÿÿ ÿYYYÿYYYÿ(( ÿ ÿ ÿQÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿQ4 ÿAÿQÿ–M(ÿ×y8ÿßšYÿÿÛ–ÿïªiÿ¶M ÿ¶M ÿ¶M ÿÇY ÿ–M(ÿAÿ ÿÿ000ÿž’–ÿßßçÿïãßÿÇa(ÿÇa(ÿÇa(ÿÏi0ÿ–M(ÿ8 ÿ ¦¢¦ÿŽŠŽÿŽqaÿŽŠŽÿ÷óïÿßßçÿIMQÿAAIÿQ4 ÿÿÿÿi(ÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿQ4 ÿAÿQÿï¶qÿ×y8ÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ†4ÿ8 ÿ ÿÿYYYÿß¶ŽÿyE(ÿÿûÿÿßšYÿÇa(ÿÇa(ÿÇa(ÿÇa(ÿ†4ÿ( ÿ ¦¢¦ÿžšžÿ¾º¾ÿ÷óïÿÿûÿÿ÷óïÿ¾º¾ÿ–’–ÿAAIÿYUQÿAAIÿ ÿ ÿAÿ†4ÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿ†4ÿAÿ–M(ÿ¶M ÿ¶M ÿ¶M ÿ®EÿQ4 ÿ8 ÿÿ8 ÿQ4 ÿIMQÿiqqÿŽqaÿ(( ÿ–M(ÿÇa(ÿÇa(ÿÇY ÿi(ÿ( ÿiqqÿ ¦¢¦ÿYUQÿ¾º¾ÿ÷óïÿiqqÿ ÇÇÏÿYUQÿ( ÿ( ÿ8 ÿ( ÿÿQÿŽ8ÿŽ8ÿŽ8ÿŽ8ÿAÿ¦8ÿ®Eÿ¶M ÿ¦8ÿa ÿi(ÿŽ4ÿ†4ÿi(ÿŽ4ÿŽ4ÿŽ4ÿŽ4ÿÇY ÿÇY ÿÇa(ÿÇY ÿQÿ( ÿiqqÿžšžÿ¦¢¦ÿ YUQÿ( ÿ ÿûÿÿŽŠŽÿÇÇÏÿÿ( ÿ8 ÿi(ÿ†4ÿQÿÿ( ÿa ÿŽ8ÿŽ8ÿAÿ¦8ÿ®Eÿ¦8ÿ†4ÿ–M(ÿ¶M ÿ¶M ÿ¶M ÿ®EÿŽ4ÿŽ4ÿÇY ÿÇY ÿÇY ÿÇY ÿ¶M ÿQÿ ÿiiiÿ–’–ÿžšžÿ YUQÿ( ÿ( ÿ¦Šyÿßßçÿ¾º¾ÿ( ÿa ÿ†4ÿ†4ÿq8ÿq8ÿi(ÿAÿ ÿ8 ÿq8ÿAÿŽ4ÿq8ÿq8ÿ®Eÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ®Eÿ¶M ÿÇY ÿÇY ÿÇY ÿ¶M ÿAÿ ÿiqqÿŽŠŽÿžšžÿ YUQÿ( ÿa ÿ8 ÿq8ÿŽqaÿQ4 ÿq8ÿq8ÿq8ÿq8ÿq8ÿq8ÿq8ÿQ4 ÿ( ÿÿ( ÿQÿ†4ÿ®Eÿ®Eÿ®Eÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ–M(ÿŽqaÿ¦ŠyÿAÿ(( ÿiqqÿŽŠŽÿžšžÿ YUQÿ( ÿq8ÿi(ÿQÿQÿa ÿq8ÿq8ÿq8ÿq8ÿi(ÿi(ÿi(ÿi(ÿi(ÿQÿ( ÿQ4 ÿ®Eÿ®Eÿ®Eÿ®Eÿ®Eÿ¶M ÿ¶M ÿ¶M ÿ¶M ÿ–M(ÿ000ÿ ÷óïÿŽŠŽÿ†‚†ÿŽŠŽÿžšžÿ¦¢¦ÿ ¦¢¦ÿYYYÿ( ÿq8ÿq8ÿq8ÿi(ÿQ4 ÿi(ÿi(ÿi(ÿi(ÿi(ÿi(ÿi(ÿi(ÿQ4 ÿQÿ8 ÿ†4ÿ®Eÿ®Eÿ®Eÿ®Eÿ®Eÿ®Eÿ¶M ÿ¶M ÿŽ4ÿ000ÿ ßßçÿÿûÿÿ÷óïÿßÓÏÿžšžÿ–’–ÿžšžÿžšžÿ¦¢¦ÿ¦¢¦ÿ ¦¢¦ÿžšžÿYYYÿ ÿ8 ÿi(ÿi(ÿi(ÿi(ÿQ4 ÿi(ÿi(ÿi(ÿQ4 ÿQ4 ÿQ4 ÿQ4 ÿQ4 ÿa ÿ8 ÿ†4ÿ®Eÿ®Eÿ®Eÿ®Eÿ®Eÿ®EÿŽ4ÿ8$ ÿQ4 ÿ¦¢¦ÿßßçÿÿûÿÿßßçÿÿûÿÿÿûÿÿÿûÿÿ÷óïÿßßçÿÇÇÏÿ¾º¾ÿ¦¢¦ÿ–’–ÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿiqqÿÿ ÿÿQÿi(ÿAÿIMQÿq8ÿQ4 ÿQ4 ÿQ4 ÿa ÿa ÿa ÿa ÿa ÿ8 ÿ†4ÿ®Eÿ®Eÿ®Eÿ®Eÿ†4ÿQ4 ÿIMQÿ–’–ÿÇÇÏÿÇÇÏÿIMQÿ†‚†ÿAAIÿÇÇÏÿ¾º¾ÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿ¦¢¦ÿ¦¢¦ÿ ¦¢¦ÿ–’–ÿŽqaÿYYYÿQ4 ÿÿ ÿ ÿ( ÿ000ÿ–’–ÿ†‚†ÿQ4 ÿa ÿa ÿa ÿa ÿa ÿa ÿa ÿ8 ÿi(ÿ®Eÿ®Eÿ®Eÿ®EÿyE(ÿ000ÿ¾º¾ÿßÓÏÿ÷óïÿYYYÿ†‚†ÿAAIÿ¾º¾ÿAAIÿßßçÿ÷óïÿ000ÿÿûÿÿÿûÿÿÿûÿÿßÓÏÿŽŠŽÿžšžÿ žšžÿŽŠŽÿiqqÿIMQÿAAIÿ(( ÿ ÿ ÿ–’–ÿÇÇÏÿ–’–ÿiqqÿQ4 ÿa ÿa ÿa ÿa ÿa ÿa ÿ8 ÿi(ÿ¦8ÿ®Eÿ®EÿŽ4ÿ( ÿ( ÿ ÿ8$ ÿßÓÏÿ¾º¾ÿ–’–ÿ¾º¾ÿAAIÿ÷óïÿ÷óïÿAAIÿÇÇÏÿÿûÿÿÿûÿÿ÷óïÿ–’–ÿ–’–ÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿŽqaÿYYYÿAAIÿ000ÿ(( ÿÿûÿÿßÓÏÿÇÇÏÿžšžÿiiiÿQ4 ÿa ÿQÿQÿQÿQÿ8 ÿQ4 ÿ¦8ÿ¦8ÿ®Eÿ¦8ÿQÿ( ÿÿ(( ÿÿŽqaÿÿûÿÿIMQÿ÷óïÿÿûÿÿYYYÿžš®ÿÿûÿÿÿûÿÿÿûÿÿ¾º¾ÿŽŠŽÿžšžÿ ¦¢¦ÿ¦¢¦ÿ¦¢¦ÿžšžÿŽŠŽÿiiiÿQ4 ÿ(( ÿÇÇÏÿßßçÿ¾º¾ÿßßçÿßÓÏÿžšžÿiqqÿq8ÿQÿQÿQÿQÿ8 ÿa ÿ¦8ÿ¦8ÿ¦8ÿŽ4ÿ8 ÿ( ÿAAIÿAAIÿ000ÿ ÿ000ÿÇÇÏÿÿûÿÿ–’–ÿ–’–ÿ¾º¾ÿÿûÿÿÿûÿÿ÷óïÿŽŠŽÿ–’–ÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿ(( ÿ(( ÿ ÿ(( ÿIMQÿŽŠŽÿÿûÿÿÿûÿÿ÷óïÿAAIÿÇÇÏÿßßçÿßÓÏÿßÓÏÿž’–ÿAÿQÿQÿQÿ( ÿa ÿ¦8ÿ¦8ÿŽ4ÿ8 ÿ(( ÿiiiÿiqqÿYYYÿIMQÿQ4 ÿ000ÿÿŽqaÿÿûÿÿ†‚†ÿžš®ÿÿûÿÿ÷óïÿ¦¢¦ÿŽŠŽÿžšžÿ žšžÿ†‚†ÿ†‚†ÿßßçÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿÿûÿÿžšžÿ†‚†ÿßßçÿAAIÿ¦¢¦ÿßßçÿ÷óïÿ(( ÿ( ÿAÿQÿQÿ( ÿa ÿ¦8ÿ†4ÿ8 ÿ000ÿiqqÿŽŠŽÿ–’–ÿŽŠŽÿiqqÿYYYÿAAIÿ000ÿ ÿ000ÿÇÇÏÿÿûÿÿ÷óïÿ¦¢¦ÿ†‚†ÿžšžÿ¦¢¦ÿ ŽŠŽÿiiiÿIMQÿŽŠŽÿ÷óïÿÿûÿÿ–’–ÿÇÇÏÿÿûÿÿ¾º¾ÿÇÇÏÿ¾º¾ÿYYYÿ¾º¾ÿiqqÿÿûÿÿ ÿ ÿÿ8 ÿAÿ( ÿa ÿq8ÿ( ÿAAIÿŽqaÿ–’–ÿžšžÿ¦¢¦ÿžšžÿ–’–ÿŽŠŽÿiiiÿIMQÿQ4 ÿ000ÿ ÿžšžÿŽŠŽÿiqqÿŽŠŽÿžšžÿ ŽŠŽÿYYYÿAAIÿAAIÿžšžÿ÷óïÿ÷óïÿiqqÿžš®ÿßßçÿAAIÿYYYÿžš®ÿžš®ÿÿûÿÿßÓÏÿYYYÿ000ÿ ÿ ÿ ÿÿ( ÿ8 ÿ( ÿAAIÿ†‚†ÿ–’–ÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿiqqÿYYYÿAAIÿAAIÿYYYÿiqqÿŽŠŽÿžšžÿ –’–ÿiqqÿIMQÿQ4 ÿIMQÿ ÷óïÿÿûÿÿžš®ÿiqqÿßßçÿžš®ÿßßçÿÿûÿÿ÷óïÿŽŠŽÿYYYÿYUQÿAAIÿQ4 ÿ ÿ ÿ ÿ ÿIMQÿ†‚†ÿ–’–ÿ¦¢¦ÿ ¦¢¦ÿžšžÿ–’–ÿ†‚†ÿiqqÿiqqÿŽqaÿŽŠŽÿžšžÿ¦¢¦ÿ žšžÿŽŠŽÿiiiÿAAIÿ000ÿIMQÿ–’–ÿ÷óïÿÿûÿÿÇÇÏÿ–’–ÿÿûÿÿÿûÿÿßßçÿžšžÿ†‚†ÿŽŠŽÿ†‚†ÿiiiÿIMQÿAAIÿAAIÿQ4 ÿiiiÿ†‚†ÿžšžÿ¦¢¦ÿ ¦¢¦ÿžšžÿ–’–ÿ–’–ÿžšžÿžšžÿ ¦¢¦ÿžšžÿŽŠŽÿiiiÿIMQÿQ4 ÿ000ÿYYYÿßÓÏÿÿûÿÿßÓÏÿ÷óïÿ¾º¾ÿiqqÿŽqaÿ–’–ÿžšžÿžšžÿ–’–ÿ†‚†ÿiqqÿiqqÿŽqaÿŽŠŽÿžšžÿ¦¢¦ÿ ¦¢¦ÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿiqqÿYUQÿAAIÿ000ÿIMQÿ ßÓÏÿ–’–ÿiiiÿŽqaÿ–’–ÿžšžÿ ¦¢¦ÿ¦¢¦ÿžšžÿžšžÿžšžÿžšžÿ¦¢¦ÿ ¦¢¦ÿžšžÿ–’–ÿŽqaÿYYYÿAAIÿAAIÿIMQÿiqqÿiiiÿ†‚†ÿ–’–ÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿiiiÿYYYÿYYYÿiqqÿŽŠŽÿžšžÿ¦¢¦ÿ ¦¢¦ÿžšžÿŽŠŽÿŽŠŽÿŽŠŽÿ–’–ÿžšžÿ þ 0 0 Ú$
â$ @ $ ö$ þ$ ( R /tmp/PlopFolio.tif H H plopfolio-0.1.0/Images/anim1.tiff 0000644 0001750 0001750 00000051220 07471330002 017373 0 ustar gurkan gurkan 0000000 0000000 II* þ ( þ îK ( ( 1 2 ( ¼ ) < I† ˆ8 f i‡ Q %ˆ ˆR €ü
' ۟
' Adobe Photoshop 7.0 2002:05:17 18:45:35
adobe:docid:photoshop:77175321-6b68-11d6-aee5-961c28c20271