Subversion Repositories stackman

Compare Revisions

No changes between revisions

Regard whitespace Rev 1 → Rev HEAD

/trunk/main.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/name.pas
File deleted
/trunk/texteditor.dfm
File deleted
/trunk/StackMan.dof
File deleted
/trunk/texteditor.pas
File deleted
/trunk/StackMan.dpr
File deleted
/trunk/StackMan.iss
File deleted
/trunk/StackMan.bdsproj
File deleted
/trunk/name.dfm
File deleted
/trunk/about.PAS
File deleted
/trunk/clean.bat
File deleted
/trunk/global.pas
File deleted
/trunk/Res/Refresh.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/appender.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/unknown.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/Open.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/External.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/root.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/text.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/Rename.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/exit.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/gr_delphi_tholos_600.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/journal.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/folder.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/Res/remove.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/about.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/categories.dfm
File deleted
/trunk/journal.PAS
File deleted
/trunk/categories.pas
File deleted
/trunk/main.PAS
File deleted
/trunk/Output/setup.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/publish.bat
File deleted
/trunk/appender.pas
File deleted
/trunk/appender.dfm
File deleted
/trunk/StackMan.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/trunk/StackMan.cfg
File deleted
/trunk/journal.dfm
File deleted
/trunk/Delphi/StackMan.dproj
0,0 → 1,155
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{7D27C417-84DB-4252-8E7A-9DEA11BDDB02}</ProjectGuid>
<MainSource>StackMan.dpr</MainSource>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<TargetedPlatforms>1</TargetedPlatforms>
<AppType>Application</AppType>
<FrameworkType>VCL</FrameworkType>
<ProjectVersion>19.5</ProjectVersion>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_DebugInformation>1</DCC_DebugInformation>
<DCC_E>false</DCC_E>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
<DCC_N>true</DCC_N>
<DCC_S>false</DCC_S>
<DCC_SymbolReferenceInfo>1</DCC_SymbolReferenceInfo>
<DCC_ImageBase>00400000</DCC_ImageBase>
<SanitizedProjectName>StackMan</SanitizedProjectName>
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;FireDAC.VCLUI;$(DCC_Namespace)</DCC_Namespace>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_MajorVer>5</VerInfo_MajorVer>
<VerInfo_Locale>1031</VerInfo_Locale>
<VerInfo_Keys>CompanyName=ViaThinkSoft;FileDescription=Textfile appender and stroker;FileVersion=5.0.0.0;InternalName=STACKMAN;LegalCopyright=© Copyright 2009 ViaThinkSoft;LegalTrademarks=Keine;OriginalFilename=StackMan.exe;ProductName=ViaThinkSoft Stack Manager;ProductVersion=5.0.0.0;Comments=;Webseite=www.viathinksoft.de;Projektleiter=Daniel Marschall - www.daniel-marschall.de</VerInfo_Keys>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
<Icon_MainIcon>StackMan_Icon.ico</Icon_MainIcon>
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<Icon_MainIcon>StackMan_Icon.ico</Icon_MainIcon>
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_DebugInformation>0</DCC_DebugInformation>
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_RangeChecking>true</DCC_RangeChecking>
<DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="main.PAS">
<Form>MainForm</Form>
</DCCReference>
<DCCReference Include="appender.pas">
<Form>MDIAppender</Form>
</DCCReference>
<DCCReference Include="texteditor.pas">
<Form>MDITexteditor</Form>
</DCCReference>
<DCCReference Include="ABOUT.PAS">
<Form>AboutBox</Form>
</DCCReference>
<DCCReference Include="categories.pas">
<Form>MDICategories</Form>
</DCCReference>
<DCCReference Include="NAME.PAS">
<Form>NameDlg</Form>
</DCCReference>
<DCCReference Include="global.pas"/>
<DCCReference Include="JOURNAL.PAS">
<Form>MDIJournalForm</Form>
</DCCReference>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>VCLApplication</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">StackMan.dpr</Source>
</Source>
</Delphi.Personality>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
</Project>
/trunk/Delphi/StackMan.iss
0,0 → 1,67
; StackMan Setup Script for InnoSetup
; by Daniel Marschall
 
; ToDo:
; - For all users or only for me
; - Entry in quick launch
 
[Setup]
AppName=StackManager
AppVerName=StackManager 5.1
AppVersion=5.1
AppCopyright=© Copyright 2009 - 2010 ViaThinkSoft
AppPublisher=ViaThinkSoft
AppPublisherURL=https://www.viathinksoft.de/
AppSupportURL=https://www.daniel-marschall.de/
AppUpdatesURL=https://www.viathinksoft.de/
DefaultDirName={autopf}\Stack Manager
DefaultGroupName=Stack Manager
VersionInfoCompany=ViaThinkSoft
VersionInfoCopyright=© Copyright 2009 - 2010 ViaThinkSoft
VersionInfoDescription=Stack Manager Setup
VersionInfoTextVersion=1.0.0.0
VersionInfoVersion=5.1
OutputDir=.
OutputBaseFilename=StackMan_Setup
; Configure Sign Tool in InnoSetup at "Tools => Configure Sign Tools" (adjust the path to your SVN repository location)
; Name = sign_single
; Command = "C:\SVN\...\sign_single.bat" $f
SignTool=sign_single
SignedUninstaller=yes
 
[Languages]
Name: de; MessagesFile: "compiler:Languages\German.isl"
 
[LangOptions]
LanguageName=Deutsch
LanguageID=$0407
 
[Tasks]
Name: "desktopicon"; Description: "Erstelle eine Verknüpfung auf dem &Desktop"; GroupDescription: "Programmverknüpfungen:"; MinVersion: 4,4
 
[Files]
Source: "StackMan.exe"; DestDir: "{app}"; Flags: ignoreversion signonce
 
[Icons]
;Name: "{group}\Webseiten\ViaThinkSoft"; Filename: "https://www.viathinksoft.de/"
Name: "{group}\Stack Manager"; Filename: "{app}\StackMan.exe"
;Name: "{group}\Stack Manager deinstallieren"; Filename: "{uninstallexe}"
Name: "{autodesktop}\Stack Manager"; Filename: "{app}\StackMan.exe"; MinVersion: 4,4; Tasks: desktopicon
 
[Run]
Filename: "{app}\StackMan.exe"; Description: "Stack Manager starten"; Flags: nowait postinstall skipifsilent
 
[Code]
function InitializeSetup(): Boolean;
begin
if CheckForMutexes('StackManSetup')=false then
begin
Createmutex('StackManSetup');
Result := true;
end
else
begin
Result := False;
end;
end;
 
/trunk/Delphi/StackMan.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/StackMan_Icon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/appender.dfm
0,0 → 1,137
object MDIAppender: TMDIAppender
Left = 215
Top = 137
ClientHeight = 140
ClientWidth = 345
Color = clBtnFace
ParentFont = True
FormStyle = fsMDIChild
Menu = MainMenu
Position = poDefault
Visible = True
OnClose = FormClose
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnShow = FormShow
TextHeight = 15
object VSplitter: TSplitter
Left = 0
Top = 81
Width = 345
Height = 2
Cursor = crVSplit
Align = alBottom
ExplicitTop = 94
ExplicitWidth = 353
end
object topPanel: TPanel
Left = 0
Top = 0
Width = 345
Height = 81
Align = alClient
BevelOuter = bvNone
TabOrder = 0
ExplicitWidth = 353
ExplicitHeight = 94
object CheckListBox1: TCheckListBox
Left = 0
Top = 0
Width = 353
Height = 94
Align = alClient
ItemHeight = 13
TabOrder = 0
OnClick = CheckListBox1Click
OnDrawItem = CheckListBox1DrawItem
OnKeyPress = CheckListBox1KeyPress
OnMeasureItem = CheckListBox1MeasureItem
end
end
object bottomPanel: TPanel
Left = 0
Top = 83
Width = 345
Height = 57
Align = alBottom
BevelOuter = bvNone
TabOrder = 1
ExplicitTop = 96
ExplicitWidth = 353
object newLineEdt: TMemo
Left = 0
Top = 0
Width = 353
Height = 57
Align = alClient
ScrollBars = ssVertical
TabOrder = 0
WantReturns = False
WantTabs = True
OnChange = newLineEdtChange
OnKeyDown = newLineEdtKeyDown
end
end
object MainMenu: TMainMenu
Images = MainForm.ImageList2
Left = 8
Top = 8
object Document1: TMenuItem
Caption = '&Datensatz'
GroupIndex = 5
object Stroke: TMenuItem
Caption = 'Gew'#228'hlte Eintr'#228'ge &ausstreichen...'
GroupIndex = 1
ImageIndex = 23
ShortCut = 46
OnClick = StrokeClick
end
object Neuladen1: TMenuItem
Caption = 'Streichliste &neu laden'
GroupIndex = 1
ImageIndex = 19
ShortCut = 116
OnClick = Neuladen1Click
end
object N2: TMenuItem
Caption = '-'
GroupIndex = 1
end
object Save: TMenuItem
Caption = 'Eintragung &ablegen'
GroupIndex = 1
ImageIndex = 8
OnClick = SaveClick
end
object N3: TMenuItem
Caption = '-'
GroupIndex = 1
end
object ExternalOpen: TMenuItem
Caption = 'Mit &externem Programm '#246'ffnen'
GroupIndex = 1
ImageIndex = 22
ShortCut = 121
OnClick = ExternalOpenClick
end
object Delete: TMenuItem
Caption = 'Datensatz &l'#246'schen...'
GroupIndex = 1
ImageIndex = 5
ShortCut = 16392
OnClick = DeleteClick
end
object N4: TMenuItem
Caption = '-'
GroupIndex = 1
end
object DocumentClose1: TMenuItem
Caption = '&Schlie'#223'en'
GroupIndex = 1
ImageIndex = 20
ShortCut = 27
OnClick = DocumentClose1Click
end
end
end
end
/trunk/Delphi/appender.pas
0,0 → 1,434
unit appender;
 
interface
 
uses
SysUtils, Windows, Classes, Graphics, Forms, Controls, StdCtrls, ExtCtrls,
Dialogs, Menus, ImgList, ShellAPI, CheckLst, System.UITypes;
 
type
TMDIAppender = class(TForm)
newLineEdt: TMemo;
MainMenu: TMainMenu;
Document1: TMenuItem;
Save: TMenuItem;
ExternalOpen: TMenuItem;
DocumentClose1: TMenuItem;
N2: TMenuItem;
Delete: TMenuItem;
N3: TMenuItem;
bottomPanel: TPanel;
topPanel: TPanel;
CheckListBox1: TCheckListBox;
Neuladen1: TMenuItem;
Stroke: TMenuItem;
N4: TMenuItem;
VSplitter: TSplitter;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormShow(Sender: TObject);
procedure ExternalOpenClick(Sender: TObject);
procedure DocumentClose1Click(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure newLineEdtKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DeleteClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CheckListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
procedure CheckListBox1MeasureItem(Control: TWinControl;
Index: Integer; var Height: Integer);
procedure StrokeClick(Sender: TObject);
procedure Neuladen1Click(Sender: TObject);
procedure CheckListBox1Click(Sender: TObject);
procedure newLineEdtChange(Sender: TObject);
procedure CheckListBox1KeyPress(Sender: TObject; var Key: Char);
protected
function DoAppend: boolean;
function DoStroke: boolean;
procedure RefreshList;
private
fcat: string;
fprefix: string;
procedure ExtendedUpdateCaption;
function StrokeCount: integer;
public
property folder: string read fprefix;
property cat: string read fcat;
constructor Create(AOwner: TComponent; Folder, Category: string); reintroduce;
end;
 
implementation
 
{$R *.dfm}
 
uses
main, categories, global;
 
constructor TMDIAppender.Create(AOwner: TComponent; Folder, Category: string);
begin
inherited Create(AOwner);
 
fcat := category;
fprefix := MyAddTrailingPathDelimiter(folder);
end;
 
procedure TMDIAppender.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
 
function TMDIAppender.DoStroke: boolean;
var
i: integer;
begin
AddToJournal(Format(lng_jnl_stroke_from, [folder + cat]));
 
result := true;
// TODO: Downto für den Benutzer nicht ganz nachvollziehbar. Aber wichtig für das Löschen.
for i := CheckListBox1.Items.Count - 1 downto 0 do
begin
if CheckListBox1.Checked[i] then
begin
try
AddToJournal(Format('- %s', [CheckListBox1.Items.Strings[i]]));
StrokeFromFile(getAppenderFileName(folder, cat), i, CheckListBox1.Items.Strings[i]);
CheckListBox1.Items.Delete(i);
except
on E : EStrokeMismatch do
begin
result := false;
ShowMessage(lng_stroke_mismatch);
CheckListBox1.ItemIndex := i;
break; exit;
end;
 
(* on E : EStrokeUnknown do
begin
result := false;
ShowMessage(lng_stroke_error);
CheckListBox1.ItemIndex := i;
break; exit;
end; *)
 
else
begin
result := false;
ShowMessage(lng_stroke_error);
CheckListBox1.ItemIndex := i;
break; exit;
end;
end;
end;
end;
 
Stroke.Enabled := false;
ExtendedUpdateCaption;
end;
 
function TMDIAppender.DoAppend: boolean;
var
f: TextFile;
i: integer;
begin
AddToJournal(Format(lng_jnl_add_to, [folder + cat]));
 
result := true;
try
AssignFile(f, getAppenderFileName(folder, cat));
try
Append(f);
 
if (newLineEdt.Lines.Count = 0) and (CfgAppenderAllowEmptyLines) then
begin
CheckListBox1.Items.Add(newLineEdt.Text{ = ''});
AddToJournal(Format('+ %s', [newLineEdt.Lines.Text]));
WriteLn(f, newLineEdt.Lines.Text);
end
else
begin
for i := 0 to newLineEdt.Lines.Count - 1 do
begin
if ((newLineEdt.Lines.Strings[i] = '') and CfgAppenderAllowEmptyLines) or
(newLineEdt.Lines.Strings[i] <> '') then
begin
CheckListBox1.Items.Add(newLineEdt.Lines.Strings[i]);
AddToJournal(Format('+ %s', [newLineEdt.Lines.Strings[i]]));
WriteLn(f, newLineEdt.Lines.Strings[i]);
end;
end;
end;
finally
CloseFile(f);
end;
except
result := false;
ShowMessage(lng_error);
end;
 
CheckListBox1.TopIndex := CheckListBox1.Items.Count - 1; // Nach unten scrollen
end;
 
procedure TMDIAppender.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
userResponse: integer;
begin
if strokecount > 0 then
begin
userResponse := MessageDlg(Format(lng_strokefirst, [strokecount, cat]),
mtConfirmation, mbYesNoCancel, 0);
 
case userResponse of
idYes: CanClose := DoStroke;
idNo: CanClose := true;
idCancel: begin
CanClose := false;
exit;
end;
end;
end;
 
if newLineEdt.Text = '' then
begin
CanClose := true;
exit;
end
else
begin
BringToFront;
WindowState := wsNormal;
 
userResponse := MessageDlg(Format(lng_appendfirst, [folder + cat]),
mtConfirmation, mbYesNoCancel, 0);
case userResponse of
idYes: CanClose := DoAppend;
idNo: CanClose := true;
idCancel: begin
CanClose := false;
exit;
end;
end;
end;
end;
 
procedure TMDIAppender.FormShow(Sender: TObject);
begin
Caption := Format(lng_editor_title, [folder + cat]);
 
newLineEdt.Clear;
 
RefreshList;
 
Save.Enabled := false;
ExtendedUpdateCaption;
 
newLineEdt.SetFocus;
end;
 
procedure TMDIAppender.ExternalOpenClick(Sender: TObject);
var
fn: string;
begin
fn := getAppenderFileName(folder, cat);
commonExternalOpen(fn);
end;
 
procedure TMDIAppender.DocumentClose1Click(Sender: TObject);
begin
Close;
end;
 
procedure TMDIAppender.SaveClick(Sender: TObject);
begin
if DoAppend then
begin
newLineEdt.Clear;
Save.Enabled := false;
ExtendedUpdateCaption;
end;
end;
 
procedure TMDIAppender.newLineEdtKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_RETURN) then
begin
Key := 0;
if CfgAppenderAllowEmptyLines and (newLineEdt.Text = '') then
begin
Save.Enabled := true;
end;
Save.Click;
end;
end;
 
procedure TMDIAppender.DeleteClick(Sender: TObject);
var
fn: string;
i: integer;
begin
fn := getAppenderFileName(folder, cat);
if commonDelete(fn) then
begin
Close;
 
// TODO: Eigentlich sollte das innerhalb von commonDelete() stattfinden
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDICategories then
begin
TMDICategories(Screen.Forms[i]).DeleteNode(folder, cat);
end
end;
end;
end;
 
procedure TMDIAppender.FormCreate(Sender: TObject);
begin
CheckListBox1.Style := lbOwnerDrawVariable;
CheckListBox1.Clear;
 
Stroke.Enabled := false;
 
ExtendedUpdateCaption;
 
newLineEdt.Clear;
end;
 
procedure TMDIAppender.RefreshList;
begin
CheckListBox1.Items.Clear;
CheckListBox1.Items.LoadFromFile(getAppenderFileName(folder, cat));
CheckListBox1.TopIndex := CheckListBox1.Items.Count-1; // Nach unten scrollen
end;
 
function TransformDrawingText(s: string): string;
begin
result := StringReplace(s, #9, ' ', [rfReplaceAll]); // TODO: gilt nicht für w95...
end;
 
// http://www.delphipraxis.net/post1068742.html#1068742
// Bugfix: Invalidate
// Bugfix: Leere Zeilen
 
procedure TMDIAppender.CheckListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
with CheckListbox1.Canvas do
begin
FillRect(Rect);
DrawText(Handle, PChar(TransformDrawingText(CheckListBox1.Items[Index])), -1, Rect, DT_LEFT or DT_TOP or DT_WORDBREAK);
Invalidate;
end;
end;
 
procedure TMDIAppender.CheckListBox1KeyPress(Sender: TObject; var Key: Char);
begin
CheckListBox1Click(self); // z.B. wenn man die Leertaste drückt
end;
 
procedure TMDIAppender.CheckListBox1MeasureItem(Control: TWinControl;
Index: Integer; var Height: Integer);
var
tempCanvas: TCanvas;
notUsed: HWND;
destRect: TRect;
txt: PChar;
begin
tempCanvas := TCanvas.Create;
try
tempCanvas.Handle := GetDeviceContext(notUsed);
destRect := CheckListBox1.ClientRect;
if CheckListBox1.Items[Index] = '' then
txt := ' '
else
txt := PChar(TransformDrawingText(CheckListBox1.Items[Index]));
Height := DrawText(tempCanvas.Handle, txt, -1, destRect, DT_WORDBREAK);
finally
tempCanvas.Free;
end;
end;
 
procedure TMDIAppender.StrokeClick(Sender: TObject);
var
userResponse: integer;
begin
userResponse := MessageDlg(Format(lng_stroker_really, [StrokeCount]), mtConfirmation, mbYesNoCancel, 0);
 
if userResponse = idYes then
begin
DoStroke;
end;
end;
 
function TMDIAppender.StrokeCount: integer;
var
i: integer;
begin
result := 0;
for i := 0 to CheckListBox1.Count - 1 do
begin
if CheckListBox1.Checked[i] then
begin
inc(result);
end;
end;
end;
 
procedure TMDIAppender.Neuladen1Click(Sender: TObject);
var
userResponse: integer;
begin
userResponse := 0;
 
if stroke.Enabled then
begin
userResponse := MessageDlg(Format(lng_refresh_strokes_loss, [StrokeCount]), mtWarning, mbYesNoCancel, 0);
end;
 
if (not stroke.Enabled) or (userResponse = idYes) then
begin
CheckListBox1.Visible := false;
RefreshList;
CheckListBox1.Visible := true;
end;
end;
 
procedure TMDIAppender.CheckListBox1Click(Sender: TObject);
var
i: integer;
begin
Stroke.Enabled := false;
 
for i := 0 to CheckListBox1.Count - 1 do
begin
if CheckListBox1.Checked[i] then
begin
Stroke.Enabled := true;
break;
end;
end;
 
ExtendedUpdateCaption;
end;
 
procedure TMDIAppender.newLineEdtChange(Sender: TObject);
begin
Save.Enabled := newLineEdt.Text <> '';
ExtendedUpdateCaption;
end;
 
procedure TMDIAppender.ExtendedUpdateCaption;
var
changed: boolean;
capname: string;
begin
changed := Save.Enabled or Stroke.Enabled;
 
capname := Format(lng_editor_title, [folder + cat]);
if changed then capname := capname + ' *';
 
if Caption <> capname then Caption := capname; // Kein Aufblitzen
end;
 
end.
/trunk/Delphi/global.pas
0,0 → 1,961
unit global;
 
interface
 
uses
SysUtils, Classes, Dialogs, Forms, Windows, ShellAPI, Controls,
ComCtrls, WinInet, System.UITypes;
 
type
TAMode = (emUnknown, emFolder, emText, emAppender, emForeign);
 
// TODO: So viel wie möglich in den implementation Teil schieben
function allFiles(folder: string): string;
function FilenameToCatname(fil: string): string;
procedure StrokeFromFile(filename: string; index: integer; expected_text: string);
procedure AddToJournal(text: string);
function RemoveForbiddenChars(fn: string; dir: boolean): string;
procedure JournalDeleteEntry(fn: string);
function commonDelete(fn: string): boolean;
procedure commonExternalOpen(fn: string);
function GetUserFriendlyElementName(fn: string): string;
procedure openCategoriesWindow();
procedure newDialog(folder: string);
procedure OpenTextEditor(folder, cat: string);
procedure OpenAppenderEditor(folder, cat: string);
procedure renameDialog(Node: TTreeNode);
function DelTree(DirName : string): Boolean;
function MyAddTrailingPathDelimiter(folder: string): string;
function getDataPath(): string;
function getJournalFileName(): string;
function getAppenderFileName(Folder, Name: string): string;
function getTextFileName(Folder, Name: string): string;
function getFolderName(Folder, Name: string): string;
function GetRelativeNameFromNode(Node: TTreeNode): string;
function GetRelativeFileName(Filename: string): string;
function GetFileNameFromNode(Node: TTreeNode): string;
function GetFolderFromNode(Node: TTreeNode): string;
function IsTextNode(Node: TTreeNode): boolean;
function IsFolderNode(Node: TTreeNode): boolean;
function IsAppenderNode(Node: TTreeNode): boolean;
function IsForeignNode(Node: TTreeNode): boolean;
function IsRootNode(Node: TTreeNode): boolean;
// function GetPersonalFolder(Default: string): string; overload;
function GetPersonalFolder(): string; overload;
function GetCatFromNode(Node: TTreeNode): string;
Function GetHTML(AUrl: string): RawByteString;
procedure explode(delim: char; s: string; sl: TStringList);
 
type
EStrokeUnknown = class(Exception);
EStrokeMismatch = class(Exception);
ENodeError = class(Exception);
EInternalError = class(Exception);
 
resourcestring
lng_cap_new = 'Neue Datei anlegen';
lng_cap_rename = 'Umbennen';
lng_jnl_renamed = 'Umbenannt: "%s" zu "%s".';
lng_already_exists = 'Fehler! Die Datei "%s" existiert bereits.';
lng_move_error = 'Fehler! Konnte nicht von "%s" nach "%s" verschieben.';
lng_jnl_delete = 'LÖSCHE %s';
lng_content_was = 'Der Inhalt war:';
lng_no_content = 'Die Datei war leer.';
lng_jnl_open_external = 'Öffne mit externem Programm: %s';
lng_jnl_created = 'Erstellt: %s';
lng_jnl_stroke_from = 'Streiche von %s:';
lng_jnl_add_to = 'Füge hinzu: %s';
lng_jnl_textchange = 'Textinhalt geändert: %s';
lng_filenotfound = 'Datei wurde nicht gefunden.';
lng_editor_title = '%s - Streichlisteneditor';
lng_texteditor_title = '%s - AUTOSAVE Texteditor';
lng_stroker_really = 'Möchten Sie diese %d Zeilen wirklich streichen?';
lng_refresh_strokes_loss = 'Warnung: Beim Neu-Laden werden alle Streich-Vormerkungen (%d) entfernt. Wirklich neu laden?';
lng_appendfirst = 'Neue Zeile vor dem Schließen in "%s" ablegen?';
lng_savefirst = 'Die Änderungen an "%s" abspeichern?';
lng_strokefirst = '%d markierte Zeilen in "%s" vor dem Schließen streichen?';
lng_notdeleted = 'Fehler: Datei konnte nicht gelöscht werden!';
lng_error = 'Ein Fehler ist aufgetreten.';
lng_journal_error = 'Es konnte nicht in das Journal geschrieben werden!';
lng_deletethis = 'Datensatz "%s" wirklich löschen?';
lng_notcreated = 'Fehler: Datei konnte nicht erstellt werden!';
lng_alreadyexists_open = 'Die Datei existiert bereits. Sie wird nun geöffnet.';
lng_stroke_mismatch = 'Die zu streichende Zeile stimmt nicht mit der angezeigten Fassung überein.';
lng_stroke_error = 'Unbekannter Fehler beim Streichen.';
lng_root = 'Datensätze';
lng_text = 'Text';
lng_appender = 'Streichliste';
 
const
app_pfx = 'app_';
txt_pfx = 'tex_';
c_length_of_pfx = Length(app_pfx); // = Length(txt_pfx)
II_APPENDER = 0;
II_TEXT = 1;
II_FOLDER = 2;
II_FOREIGN = 3;
II_ROOT = 4;
FOLDER_VIEWER = 'Explorer';
 
// Konfiguration
const
CfgExpandNodesAtBeginning = false;
CfgOpenCatWhenEverythingClosed = false;
CfgAppenderAllowEmptyLines = true;
 
implementation
 
uses
categories, journal, name, appender, texteditor;
 
resourcestring
lng_internal_prefix_length_error = 'Entwicklungstechnischer Fehler! Präfixe dürfen nicht unterschiedlich lang sein!';
lng_internal_unknown_node_type_error = 'Programminterner Fehler! Node-Typ unbekannt!';
 
function GetModeFromNode(ANode: TTreeNode): TAMode; forward;
function getFileName(mode: TAMode; folder, name: string): string; forward;
function ExtractFileNameWithoutExt(fil: string): string; forward;
function getRawFileName(folder, name: string): string; forward;
function Quote(arg: string): string; forward;
 
function allFiles(folder: string): string;
begin
result := getRawFilename(folder, '*');
end;
 
function ExtractFileNameWithoutExt(fil: string): string;
begin
result := Copy(ExtractFileName(fil), 1, Length(ExtractFileName(fil))-Length(ExtractFileExt(fil)));
end;
 
function FilenameToCatname(fil: string): string;
begin
result := ExtractFileNameWithoutExt(fil);
result := Copy(result, 1+c_length_of_pfx, length(result)-c_length_of_pfx);
result := ExtractFilePath(fil) + result;
end;
 
procedure StrokeFromFile(filename: string; index: integer; expected_text: string);
var
str: TStrings;
begin
str := TStringList.Create;
try
try
str.LoadFromFile(filename);
if str.Strings[index] = expected_text then
str.Delete(index)
else
raise EStrokeMismatch.Create(lng_stroke_mismatch);
str.SaveToFile(filename);
except
on E: EStrokeMismatch do
raise
else
raise EStrokeUnknown.Create(lng_stroke_error);
end;
finally
str.Free;
end;
end;
 
procedure AddToJournal(text: string);
var
f: TextFile;
l: string;
i: integer;
begin
l := Format('[%s] %s', [DateTimeToStr(Now()), text]);
 
try
AssignFile(f, getJournalFileName());
try
if FileExists(getJournalFileName()) then
Append(f)
else
ReWrite(f);
WriteLn(f, l);
finally
CloseFile(f);
end;
except
ShowMessage(lng_journal_error);
end;
 
// Andere Forms benachrichtigen
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDIJournalForm then
begin
TMDIJournalForm(Screen.Forms[i]).DoRefresh;
break;
end
end;
end;
 
function RemoveForbiddenChars(fn: string; dir: boolean): string;
begin
result := fn;
fn := StringReplace(fn, '<', '_', [rfReplaceAll]);
fn := StringReplace(fn, '>', '_', [rfReplaceAll]);
fn := StringReplace(fn, '|', '_', [rfReplaceAll]);
fn := StringReplace(fn, '"', '_', [rfReplaceAll]);
fn := StringReplace(fn, '?', '_', [rfReplaceAll]);
fn := StringReplace(fn, ':', '_', [rfReplaceAll]);
fn := StringReplace(fn, '/', '_', [rfReplaceAll]);
if not dir then fn := StringReplace(fn, '\', '_', [rfReplaceAll]);
fn := StringReplace(fn, '*', '_', [rfReplaceAll]);
end;
 
procedure JournalDeleteEntry(fn: string);
var
dump: TStringList;
i: integer;
begin
if not fileexists(fn) then exit;
 
AddToJournal(Format(lng_jnl_delete, [GetUserFriendlyElementName(fn)]));
 
dump := TStringList.Create;
try
dump.LoadFromFile(fn);
 
if dump.Count > 0 then
begin
AddToJournal(lng_content_was);
for i := 0 to dump.Count - 1 do
begin
AddToJournal('- ' + dump.Strings[i]);
end;
end
else
begin
AddToJournal(lng_no_content);
end;
finally
dump.Free;
end;
end;
 
function commonDelete(fn: string): boolean;
var
userResponse: integer;
begin
result := false;
 
userResponse := MessageDlg(Format(lng_deletethis, [GetRelativeFileName(fn)]),
mtConfirmation, mbYesNoCancel, 0);
 
if userResponse = idYes then
begin
JournalDeleteEntry(fn);
 
if fileexists(fn) then
begin
DeleteFile(PChar(fn));
end
else if directoryexists(fn) then
begin
DelTree(fn);
end;
 
if FileExists(fn) or DirectoryExists(fn) then
begin
ShowMessage(lng_notdeleted);
Exit;
end;
 
result := true;
end;
end;
 
function GetUserFriendlyElementName(fn: string): string;
begin
result := GetRelativeFileName(fn); // TODO: Benutzer soll was anderes sehen als die Dateinamenserweiterungen
end;
 
procedure commonExternalOpen(fn: string);
begin
AddToJournal(Format(lng_jnl_open_external, [GetUserFriendlyElementName(fn)]));
 
if FileExists(fn) then
begin
ShellExecute(Application.Handle, 'open', PChar(fn), '',
PChar(Quote(fn)), SW_NORMAL);
end
else if DirectoryExists(fn) then
begin
ShellExecute(Application.Handle, 'open', FOLDER_VIEWER,
PChar(Quote(fn)), '', SW_NORMAL);
end
else
begin
ShowMessage(lng_filenotfound);
end;
end;
 
procedure openCategoriesWindow();
var
i: integer;
somethingfound: boolean;
begin
somethingfound := false;
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDICategories then
begin
TMDICategories(Screen.Forms[i]).RefreshList;
Screen.Forms[i].BringToFront;
Screen.Forms[i].WindowState := wsNormal;
somethingfound := true;
break;
end
end;
 
if not somethingfound then
begin
TMDICategories.Create(Application);
end;
end;
 
procedure newDialog(folder: string);
var
f: TextFile;
realfolder, new_folder, new_cat: string;
i: integer;
new_fn: string;
em: TAMode;
beschreibung: string;
begin
NameDlg.Caption := lng_cap_new;
NameDlg.NameEdt.Text := '';
NameDlg.Textmode.Checked := false;
NameDlg.Textmode.Enabled := true;
 
if NameDlg.ShowModal = mrOk then
begin
new_cat := ExtractFileName(namedlg.NameEdt.Text);
new_cat := RemoveForbiddenChars(new_cat, false);
 
folder := MyAddTrailingPathDelimiter(folder);
 
new_folder := ExtractFilePath(namedlg.NameEdt.Text);
new_folder := RemoveForbiddenChars(folder + new_folder, true);
 
if NameDlg.Textmode.Checked then
begin
new_fn := getTextFileName(new_folder, new_cat);
em := emText;
beschreibung := lng_text;
end
else
begin
new_fn := getAppenderFileName(new_folder, new_cat);
em := emAppender;
beschreibung := lng_appender;
end;
 
new_fn := RemoveForbiddenChars(new_fn, false);
 
realfolder := ExtractFilePath(new_fn);
ForceDirectories(realfolder);
 
if FileExists(new_fn) then
begin
ShowMessage(lng_alreadyexists_open);
if em = emText then
OpenTextEditor(new_folder, new_cat)
else
OpenAppenderEditor(new_folder, new_cat);
Exit;
end;
 
AssignFile(f, new_fn);
ReWrite(f);
CloseFile(f);
 
if not FileExists(new_fn) then
begin
ShowMessage(lng_notcreated);
Exit;
end;
 
AddToJournal(Format(lng_jnl_created, [GetUserFriendlyElementName(new_fn)]));
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDICategories then
begin
// TMDICategories(Screen.Forms[i]).RefreshList;
 
TMDICategories(Screen.Forms[i]).InsertNode(new_folder, new_cat, em);
end
end;
 
if em = emText then
OpenTextEditor(new_folder, new_cat)
else
OpenAppenderEditor(new_folder, new_cat);
end;
end;
 
procedure OpenTextEditor(folder, cat: string);
var
somethingfound: boolean;
i: integer;
begin
somethingfound := false;
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDITextEditor then
begin
if (TMDITextEditor(Screen.Forms[i]).cat = cat) and
(TMDITextEditor(Screen.Forms[i]).folder = folder) then
begin
Screen.Forms[i].BringToFront;
Screen.Forms[i].WindowState := wsNormal;
somethingfound := true;
break;
end;
end
end;
 
if not somethingfound then
begin
TMDITextEditor.Create(Application, folder, cat);
end;
end;
 
procedure OpenAppenderEditor(folder, cat: string);
var
somethingfound: boolean;
i: integer;
begin
somethingfound := false;
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDIAppender then
begin
if (TMDIAppender(Screen.Forms[i]).cat = cat) and
(TMDIAppender(Screen.Forms[i]).folder = folder) then
begin
Screen.Forms[i].BringToFront;
Screen.Forms[i].WindowState := wsNormal;
somethingfound := true;
break;
end;
end
end;
 
if not somethingfound then
begin
TMDIAppender.Create(Application, folder, cat);
end;
end;
 
function GetModeFromNode(ANode: TTreeNode): TAMode;
begin
result := emUnknown;
 
if IsAppenderNode(ANode) then
begin
result := emAppender;
end
else if IsTextNode(ANode) then
begin
result := emText;
end
else if IsFolderNode(ANode) then
begin
result := emFolder;
end else if IsForeignNode(ANode) then
begin
result := emForeign;
end;
 
if result = emUnknown then
begin
raise ENodeError.Create(lng_internal_unknown_node_type_error);
end;
end;
 
function getFileName(mode: TAMode; folder, name: string): string;
begin
if (mode = emFolder) or (mode = emForeign) then
begin
result := getFolderName(folder, name);
result := RemoveForbiddenChars(result, true);
end
else if mode = emText then
begin
result := getTextFileName(folder, name);
result := RemoveForbiddenChars(result, false);
end
else if mode = emAppender then
begin
result := getAppenderFileName(folder, name);
result := RemoveForbiddenChars(result, false);
end
else
begin
raise ENodeError.Create(lng_internal_unknown_node_type_error);
end;
end;
 
procedure renameDialog(Node: TTreeNode);
var
realfolder, new_cat, new_folder: string;
i: integer;
tofile, fromfile: string;
old_folder, old_cat: string;
old_em, new_em: TAMode;
const
folder = ''; // Wir gehen beim Umbenennen von der Wurzel aus
begin
old_em := GetModeFromNode(Node);
old_folder := GetFolderFromNode(Node);
old_cat := GetCatFromNode(Node);
 
NameDlg.Caption := lng_cap_rename;
NameDlg.NameEdt.Text := old_folder + old_cat;
NameDlg.Textmode.Checked := IsTextNode(Node);
NameDlg.Textmode.Enabled := not IsFolderNode(Node) and not IsForeignNode(Node);
 
if NameDlg.ShowModal = mrOk then
begin
if IsFolderNode(Node) or IsForeignNode(Node) then
begin
new_em := old_em;
end
else
begin
if NameDlg.Textmode.Checked then
new_em := emText
else
new_em := emAppender;
end;
 
new_cat := ExtractFileName(namedlg.NameEdt.Text);
new_cat := RemoveForbiddenChars(new_cat, false);
 
// folder := MyAddTrailingPathDelimiter(folder);
 
new_folder := ExtractFilePath(namedlg.NameEdt.Text);
new_folder := RemoveForbiddenChars(folder + new_folder, true);
 
realfolder := ExtractFilePath(getFileName(old_em, new_folder, new_cat));
if not IsFolderNode(Node) then ForceDirectories(realfolder);
 
// Enthält RemoveForbiddenChars()
fromfile := getFileName(old_em, old_folder, old_cat);
tofile := getFileName(new_em, new_folder, new_cat);
 
if fromfile = tofile then exit;
 
if fileExists(tofile) then
begin
ShowMessageFmt(lng_already_exists, [GetUserFriendlyElementName(tofile)]);
Exit;
end;
 
if not moveFile(pchar(fromfile), pchar(tofile)) then
begin
ShowMessageFmt(lng_move_error, [GetUserFriendlyElementName(fromfile), GetUserFriendlyElementName(tofile)]);
Exit;
end;
 
AddToJournal(Format(lng_jnl_renamed, [GetUserFriendlyElementName(fromfile), GetUserFriendlyElementName(tofile)]));
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDICategories then
begin
// TMDICategories(Screen.Forms[i]).RefreshList;
 
TMDICategories(Screen.Forms[i]).DeleteNode(old_folder, old_cat);
TMDICategories(Screen.Forms[i]).InsertNode(new_folder, new_cat, new_em);
end
end;
 
Node.Selected := true;
end;
end;
 
// http://delphi.about.com/cs/adptips1999/a/bltip1199_2.htm
// Modifiziert
Function DelTree(DirName : string): Boolean;
var
SHFileOpStruct : TSHFileOpStruct;
DirBuf : array [0..MAX_PATH] of char;
begin
// Backslash am Ende entfernen
if Copy(DirName, length(DirName), 1) = PathDelim then
DirName := Copy(DirName, 1, Length(DirName)-1);
 
try
Fillchar(SHFileOpStruct, SizeOf(SHFileOpStruct), 0);
FillChar(DirBuf, SizeOf(DirBuf), 0);
StrPCopy(DirBuf, DirName);
with SHFileOpStruct do
begin
Wnd := 0;
pFrom := @DirBuf;
wFunc := FO_DELETE;
fFlags := FOF_ALLOWUNDO;
fFlags := fFlags or FOF_NOCONFIRMATION;
fFlags := fFlags or FOF_SILENT;
end;
Result := (SHFileOperation(SHFileOpStruct) = 0);
except
Result := False;
end;
end;
 
function MyAddTrailingPathDelimiter(folder: string): string;
begin
result := folder;
 
if folder = '' then exit;
 
result := IncludeTrailingPathDelimiter(folder);
 
//if Copy(folder, length(folder), 1) <> PathDelim then
// result := result + PathDelim;
end;
 
function getDataPath(): string;
const
DataDirName = 'StackMan-Data';
begin
if directoryExists(DataDirName) then
result := DataDirName + PathDelim
else
result := GetPersonalFolder() + DataDirName + PathDelim;
end;
 
function getJournalFileName(): string;
const
JournalFile = 'Journal.txt';
begin
result := getDataPath() + JournalFile;
end;
 
function getRawFileName(folder, name: string): string;
begin
Folder := MyAddTrailingPathDelimiter(folder);
result := getDataPath() + Folder + name;
end;
 
function getAppenderFileName(Folder, Name: string): string;
begin
result := getRawFileName(folder, app_pfx + Name + '.txt');
end;
 
function getTextFileName(Folder, Name: string): string;
begin
result := getRawFileName(folder, txt_pfx + Name + '.txt');
end;
 
function getFolderName(Folder, Name: string): string;
begin
result := getRawFileName(folder, Name);
end;
 
function GetRelativeFileName(Filename: string): string;
var
datadir: string;
begin
result := filename;
datadir := getDataPath();
 
if LowerCase(copy(result, 1, length(datadir))) = LowerCase(datadir) then
begin
result := copy(result, 1+length(datadir), length(result)-length(datadir));
end;
end;
 
function GetRelativeNameFromNode(Node: TTreeNode): string;
begin
result := getFilenameFromNode(Node);
result := GetRelativeFileName(result);
// result := FilenameToCatname(result);
end;
 
function IsTextNode(Node: TTreeNode): boolean;
begin
result := Node.ImageIndex = II_TEXT;
end;
 
function IsFolderNode(Node: TTreeNode): boolean;
begin
result := Node.ImageIndex = II_FOLDER;
end;
 
function IsAppenderNode(Node: TTreeNode): boolean;
begin
result := Node.ImageIndex = II_APPENDER;
end;
 
function IsForeignNode(Node: TTreeNode): boolean;
begin
result := Node.ImageIndex = II_FOREIGN;
end;
 
function IsRootNode(Node: TTreeNode): boolean;
begin
result := Node.ImageIndex = II_ROOT;
end;
 
function GetFileNameFromNode(Node: TTreeNode): string;
var
folder: string;
begin
folder := GetFolderFromNode(Node);
 
if IsTextNode(Node) then
begin
result := GetTextFileName(folder, GetCatFromNode(Node));
end
else if IsAppenderNode(Node) then
begin
result := GetAppenderFileName(folder, GetCatFromNode(Node));
end
else if IsForeignNode(Node) then
begin
result := GetRawFileName(folder, GetCatFromNode(Node));
end
else if isRootNode(Node) then
begin
result := getDataPath();
end
else if IsFolderNode(Node) then
begin
result := GetRawFileName(folder, '');
end
else
begin
raise ENodeError.Create(lng_internal_unknown_node_type_error);
end;
end;
 
function GetFolderFromNode(Node: TTreeNode): string;
var
par: TTreeNode;
begin
if isRootNode(node) then exit;
if isFolderNode(node) then
par := node
else
par := node.Parent;
while not isRootNode(par) do
begin
result := par.Text + PathDelim + result;
par := par.Parent;
end;
end;
 
function Quote(arg: string): string;
begin
result := '"' + arg + '"';
end;
 
(* function GetPersonalFolder: string;
var
path : array [0..MAX_PATH] of char;
begin
SHGetSpecialFolderPath(0, @path, CSIDL_PERSONAL, false);
if path = '' then
result := ExtractFilePath(Application.ExeName)
else
result := IncludeTrailingPathDelimiter(path);
end; *)
 
function GetPersonalFolder(DefaultPath: string): string; overload;
// This function replaces SHGetSpecialFolderPath from ShlObj.pas .
// It dynamically loads the DLL, so that also Windows 95 without
// Internet Explorer 4 Extension can work with it.
type
TSHGetSpecialFolderPath = function(hwndOwner: HWND; lpszPath: PChar;
nFolder: Integer; fCreate: BOOL): BOOL; stdcall;
procedure Fail;
begin
if DefaultPath = '' then
result := ExtractFilePath(ParamStr(0))
else
result := IncludeTrailingPathDelimiter(DefaultPath);
end;
 
const
{$IFDEF MSWINDOWS}
shell32 = 'shell32.dll';
{$ENDIF}
{$IFDEF LINUX}
shell32 = 'libshell32.borland.so';
{$ENDIF}
CSIDL_PERSONAL = $0005;
var
SpecialFolder: TSHGetSpecialFolderPath;
Handle: THandle;
path: array [0..MAX_PATH] of char;
begin
result := '';
Handle := LoadLibrary(shell32);
if Handle <> 0 then
begin
{$IFDEF UNICODE}
@SpecialFolder := GetProcAddress(Handle, 'SHGetSpecialFolderPathW');
{$ELSE}
@SpecialFolder := GetProcAddress(Handle, 'SHGetSpecialFolderPathA');
{$ENDIF}
if @SpecialFolder <> nil then
begin
FillChar(path, sizeof(path), 0);
if SpecialFolder(0, @path, CSIDL_PERSONAL, false) and (path <> '') then
begin
result := IncludeTrailingPathDelimiter(path)
end
else
begin
Fail;
end;
end
else
begin
Fail;
end;
FreeLibrary(Handle);
end
else
begin
Fail;
end;
end;
 
function GetPersonalFolder(): string;
begin
result := GetPersonalFolder('C:\');
end;
 
function GetCatFromNode(Node: TTreeNode): string;
begin
if IsFolderNode(Node) then
result := ''
else
result := Node.Text;
end;
 
// https://www.delphipraxis.net/post43515.html , fixed , works for Delphi 12 Athens
function GetHTML(AUrl: string): RawByteString;
var
databuffer : array[0..4095] of ansichar; // SIC! ansichar!
ResStr : ansistring; // SIC! ansistring
hSession, hfile: hInternet;
dwindex,dwcodelen,dwread,dwNumber: cardinal;
dwcode : array[1..20] of char;
res : pchar;
Str : pansichar; // SIC! pansichar
begin
ResStr:='';
if (system.pos('http://',lowercase(AUrl))=0) and
(system.pos('https://',lowercase(AUrl))=0) then
AUrl:='http://'+AUrl;
 
// Hinzugefügt
if Assigned(Application) then Application.ProcessMessages;
 
hSession:=InternetOpen('InetURL:/1.0',
INTERNET_OPEN_TYPE_PRECONFIG,
nil,
nil,
0);
if assigned(hsession) then
begin
// Hinzugefügt
if Assigned(Application) then application.ProcessMessages;
 
hfile:=InternetOpenUrl(
hsession,
pchar(AUrl),
nil,
0,
INTERNET_FLAG_RELOAD,
0);
dwIndex := 0;
dwCodeLen := 10;
 
// Hinzugefügt
if Assigned(Application) then application.ProcessMessages;
 
HttpQueryInfo(hfile,
HTTP_QUERY_STATUS_CODE,
@dwcode,
dwcodeLen,
dwIndex);
res := pchar(@dwcode);
dwNumber := sizeof(databuffer)-1;
if (res ='200') or (res = '302') then
begin
while (InternetReadfile(hfile,
@databuffer,
dwNumber,
DwRead)) do
begin
 
// Hinzugefügt
if Assigned(Application) then application.ProcessMessages;
 
if dwRead =0 then
break;
databuffer[dwread]:=#0;
Str := pansichar(@databuffer);
resStr := resStr + Str;
end;
end
else
ResStr := 'Status:'+AnsiString(res);
if assigned(hfile) then
InternetCloseHandle(hfile);
end;
 
// Hinzugefügt
if Assigned(Application) then application.ProcessMessages;
 
InternetCloseHandle(hsession);
Result := resStr;
end;
 
procedure explode(delim: char; s: string; sl: TStringList);
var
i: integer;
tmp: string;
begin
tmp := '';
for i := 1 to length(s) do
begin
if s[i] = delim then
begin
sl.Add(tmp);
tmp := '';
end
else
tmp := tmp + s[i];
end;
sl.Add(tmp);
end;
 
begin
if Length(app_pfx) <> Length(txt_pfx) then
begin
raise EInternalError.Create(lng_internal_prefix_length_error);
Halt;
end;
end.
 
 
 
 
/trunk/Delphi/main.PAS
0,0 → 1,223
unit main;
 
interface
 
uses
Windows, SysUtils, Classes, Graphics, Forms, Controls, Menus,
StdCtrls, Dialogs, Buttons, Messages, ExtCtrls, ComCtrls, StdActns,
ActnList, ToolWin, ImgList, ShellAPI, System.ImageList, System.Actions;
 
type
TMainForm = class(TForm)
MainMenu1: TMainMenu;
Window1: TMenuItem;
Help1: TMenuItem;
WindowCascadeItem: TMenuItem;
WindowTileItem: TMenuItem;
WindowArrangeItem: TMenuItem;
HelpAboutItem: TMenuItem;
WindowMinimizeItem: TMenuItem;
StatusBar: TStatusBar;
ActionList1: TActionList;
FileKategorien1: TAction;
FileExit1: TAction;
WindowCascade1: TWindowCascade;
WindowTileHorizontal1: TWindowTileHorizontal;
WindowArrangeAll1: TWindowArrange;
WindowMinimizeAll1: TWindowMinimizeAll;
HelpAbout1: TAction;
WindowTileVertical1: TWindowTileVertical;
WindowTileItem2: TMenuItem;
ToolBar2: TToolBar;
ToolButton3: TToolButton;
ToolButton9: TToolButton;
ToolButton8: TToolButton;
ToolButton10: TToolButton;
ToolButton11: TToolButton;
N1: TMenuItem;
Beenden1: TMenuItem;
Kategorie1: TMenuItem;
N2: TMenuItem;
JournalOpen: TMenuItem;
Timer1: TTimer;
Timer2: TTimer;
Neu1: TMenuItem;
AufUpdatesprfen1: TMenuItem;
FileNeu1: TAction;
FileJournal1: TAction;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
HelpUpdates1: TAction;
ImageList2: TImageList;
procedure FileKategorien1Execute(Sender: TObject);
procedure HelpAbout1Execute(Sender: TObject);
procedure FileExit1Execute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure JournalOpenClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Neu1Click(Sender: TObject);
procedure AufUpdates1Click(Sender: TObject);
private
CloseTimerInitialized: boolean;
CloseTimerMin: Integer;
end;
 
var
MainForm: TMainForm;
 
implementation
 
{$R *.dfm}
 
uses
about, categories, global, journal;
 
procedure TMainForm.FileKategorien1Execute(Sender: TObject);
begin
openCategoriesWindow();
end;
 
procedure TMainForm.HelpAbout1Execute(Sender: TObject);
begin
AboutBox.ShowModal;
end;
 
procedure TMainForm.JournalOpenClick(Sender: TObject);
var
i: integer;
somethingfound: boolean;
begin
somethingfound := false;
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDIJournalForm then
begin
Screen.Forms[i].BringToFront;
Screen.Forms[i].WindowState := wsNormal;
somethingfound := true;
break;
end
end;
 
if not somethingfound then
begin
TMDIJournalForm.Create(Application);
end;
end;
 
procedure TMainForm.Neu1Click(Sender: TObject);
var
i: integer;
somethingfound: boolean;
begin
somethingfound := false;
 
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDICategories then
begin
TMDICategories(Screen.Forms[i]).DoNew;
somethingfound := true;
break;
end
end;
 
if not somethingfound then
begin
newDialog(''); // Aus der Wurzel erstellen
end;
end;
 
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
// timer1.Enabled := false;
 
if not CloseTimerInitialized then
begin
CloseTimerMin := Screen.FormCount;
end;
 
if Screen.FormCount <= CloseTimerMin then
begin
if not CloseTimerInitialized then
begin
Kategorie1.Click; // Im OnShow ist das Ergebnis anders (Fenster zu klein, schwarze Ränder an abgerundeten Fensterkanten)
end
else
begin
if CfgOpenCatWhenEverythingClosed then Kategorie1.Click; // Das Fenster soll immer geöffnet werden, wenn alles andere geschlossen ist
end;
end;
 
if not CloseTimerInitialized then
begin
CloseTimerInitialized := true;
end;
end;
 
procedure TMainForm.Timer2Timer(Sender: TObject);
begin
StatusBar.Panels.Items[1].Text := DateTimeToStr(Now());
end;
 
procedure TMainForm.AufUpdates1Click(Sender: TObject);
const
abbreviation = 'stackman';
thisversion = '5.1';
resourcestring
lng_no_new_version = 'Es ist keine neue Programmversion vorhanden.';
lng_update_error = 'Ein Fehler ist aufgetreten. Wahrscheinlich ist keine Internetverbindung aufgebaut, oder der der ViaThinkSoft-Server temporär offline.';
lng_caption_error = 'Fehler';
lng_caption_information = 'Information';
lng_update_new_version = 'Eine neue Programmversion (%s) ist vorhanden. Möchten Sie diese jetzt herunterladen?';
const
url_comparison = 'https://www.viathinksoft.de/update/?id=%s&expect_version=%s';
url_version = 'https://www.viathinksoft.de/update/?id=%s';
url_download = 'https://www.viathinksoft.de/update/?id=@%s';
res_nothing = 'NO_UPDATES';
res_updates = 'UPDATE_AVAILABLE';
var
temp: RawByteString;
begin
temp := GetHTML(Format(url_comparison, [abbreviation, thisversion]));
 
if temp = res_nothing then
begin
Application.MessageBox(PChar(lng_no_new_version), PChar(lng_caption_information), MB_OK + MB_ICONASTERISK);
end
else if temp = res_updates then
begin
temp := GetHTML(Format(url_version, [abbreviation]));
if Application.MessageBox(PChar(Format(lng_update_new_version, [temp])), PChar(lng_caption_information), MB_YESNO + MB_ICONASTERISK) = ID_YES then
begin
ShellExecute(application.handle, 'open', pchar(Format(url_download, [abbreviation])), '', '', sw_normal);
end;
end
else
begin
Application.MessageBox(PChar(lng_update_error), PChar(lng_caption_error), MB_OK + MB_ICONERROR)
end;
end;
 
procedure TMainForm.FileExit1Execute(Sender: TObject);
begin
Close;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
if not DirectoryExists(getDataPath()) then
begin
ForceDirectories(getDataPath());
end;
end;
 
procedure TMainForm.FormResize(Sender: TObject);
begin
StatusBar.Panels.Items[0].Width := StatusBar.Width - StatusBar.Panels.Items[1].Width;
end;
 
end.
/trunk/Delphi/main.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/texteditor.dfm
0,0 → 1,90
object MDITextEditor: TMDITextEditor
Left = 255
Top = 367
Caption = 'Text-Editor'
ClientHeight = 121
ClientWidth = 331
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
FormStyle = fsMDIChild
Menu = MainMenu1
Position = poDefault
Visible = True
OnClose = FormClose
OnCloseQuery = FormCloseQuery
OnShow = FormShow
TextHeight = 13
object Memo1: TMemo
Left = 0
Top = 0
Width = 331
Height = 121
Align = alClient
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
ScrollBars = ssVertical
TabOrder = 0
OnChange = Memo1Change
ExplicitWidth = 339
ExplicitHeight = 134
end
object MainMenu1: TMainMenu
Images = MainForm.ImageList2
Left = 8
Top = 8
object Document1: TMenuItem
Caption = '&Datensatz'
GroupIndex = 5
object Save: TMenuItem
Caption = 'Text abspeichern'
GroupIndex = 1
ImageIndex = 8
ShortCut = 16467
OnClick = SaveClick
end
object N2: TMenuItem
Caption = '-'
GroupIndex = 1
end
object ExternalOpen: TMenuItem
Caption = 'Mit &externem Programm '#246'ffnen'
GroupIndex = 1
ImageIndex = 22
ShortCut = 121
OnClick = ExternalOpenClick
end
object Delete: TMenuItem
Caption = 'Datensatz &l'#246'schen...'
GroupIndex = 1
ImageIndex = 5
ShortCut = 16392
OnClick = DeleteClick
end
object N4: TMenuItem
Caption = '-'
GroupIndex = 1
end
object DocumentClose1: TMenuItem
Caption = '&Schlie'#223'en'
GroupIndex = 1
ImageIndex = 20
ShortCut = 27
OnClick = DocumentClose1Click
end
end
end
object AutoSaveTimer: TTimer
Interval = 10000
OnTimer = AutoSaveTimerTimer
Left = 40
Top = 8
end
end
/trunk/Delphi/texteditor.pas
0,0 → 1,192
unit texteditor;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ShellAPI, ExtCtrls, System.UITypes;
 
type
TMDITextEditor = class(TForm)
MainMenu1: TMainMenu;
Document1: TMenuItem;
Save: TMenuItem;
N2: TMenuItem;
ExternalOpen: TMenuItem;
Delete: TMenuItem;
N4: TMenuItem;
DocumentClose1: TMenuItem;
Memo1: TMemo;
AutoSaveTimer: TTimer;
procedure DocumentClose1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure DeleteClick(Sender: TObject);
procedure ExternalOpenClick(Sender: TObject);
procedure Memo1Change(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure AutoSaveTimerTimer(Sender: TObject);
private
fcat: string;
fprefix: string;
fautosave: boolean;
changed: boolean;
function DoSave: boolean;
procedure UpdateCaption;
public
property folder: string read fprefix;
property cat: string read fcat;
property autosave: boolean read fautosave;
constructor Create(AOwner: TComponent; Folder, Category: string); reintroduce;
end;
 
var
MDITextEditor: TMDITextEditor;
 
implementation
 
{$R *.dfm}
 
uses
main, categories, global;
 
constructor TMDITextEditor.Create(AOwner: TComponent; Folder, Category: string);
begin
inherited Create(AOwner);
 
fautosave := true;
fcat := category;
fprefix := MyAddTrailingPathDelimiter(folder);
end;
 
procedure TMDITextEditor.DeleteClick(Sender: TObject);
var
fn: string;
i: integer;
begin
fn := getTextFileName(folder, cat);
if commonDelete(fn) then
begin
Close;
 
// TODO: Eigentlich sollte das innerhalb von commonDelete() stattfinden
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] is TMDICategories then
begin
TMDICategories(Screen.Forms[i]).DeleteNode(folder, cat);
end
end;
end;
end;
 
procedure TMDITextEditor.DocumentClose1Click(Sender: TObject);
begin
Close;
end;
 
function TMDITextEditor.DoSave: boolean;
begin
//if changed then
//begin
result := true;
 
AddToJournal(Format(lng_jnl_textchange, [folder + cat]));
 
try
Memo1.Lines.SaveToFile(getTextFileName(folder, cat));
except
result := false;
end;
 
changed := false;
AutoSaveTimer.Enabled := false;
UpdateCaption;
//end
//else result := true;
end;
 
procedure TMDITextEditor.ExternalOpenClick(Sender: TObject);
var
fn: string;
begin
fn := getTextFileName(folder, cat);
commonExternalOpen(fn);
end;
 
procedure TMDITextEditor.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
 
procedure TMDITextEditor.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
userResponse: integer;
begin
if changed then
begin
if not AUTOSAVE then
begin
BringToFront;
WindowState := wsNormal;
 
userResponse := MessageDlg(Format(lng_savefirst, [folder + cat]),
mtConfirmation, mbYesNoCancel, 0);
case userResponse of
idYes: CanClose := DoSave;
idNo: CanClose := true;
idCancel: begin
CanClose := false;
Exit;
end;
end;
end
else
CanClose := DoSave;
end;
end;
 
procedure TMDITextEditor.FormShow(Sender: TObject);
begin
Memo1.Lines.Clear;
Memo1.Lines.LoadFromFile(getTextFileName(folder, cat));
 
changed := false;
AutoSaveTimer.Enabled := false;
UpdateCaption;
 
Memo1.SetFocus;
end;
 
procedure TMDITextEditor.Memo1Change(Sender: TObject);
begin
changed := true;
AutoSaveTimer.Enabled := true;
UpdateCaption;
end;
 
procedure TMDITextEditor.SaveClick(Sender: TObject);
begin
DoSave;
end;
 
procedure TMDITextEditor.AutoSaveTimerTimer(Sender: TObject);
begin
if AUTOSAVE and Changed then
begin
DoSave;
end;
end;
 
procedure TMDITextEditor.UpdateCaption;
var
capname: string;
begin
capname := Format(lng_texteditor_title, [folder + cat]);
if changed then capname := capname + ' *';
 
if Caption <> capname then Caption := capname; // Kein Aufblitzen
end;
 
end.
/trunk/Delphi/Output/setup.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/External.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/Open.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/Refresh.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/Rename.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/appender.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/exit.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/folder.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/gr_delphi_tholos_600.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/journal.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/remove.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/root.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/text.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/Res/unknown.BMP
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/StackMan.bdsproj
0,0 → 1,177
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType">VCLApplication</Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{7D27C417-84DB-4252-8E7A-9DEA11BDDB02}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">StackMan.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">0</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">0</Compiler>
<Compiler Name="R">0</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">1</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">True</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">1</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription"></Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath"></Directories>
<Directories Name="Packages"></Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams"></Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">5</VersionInfo>
<VersionInfo Name="MinorVer">0</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1031</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Textfile appender and stroker</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">5.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">STACKMAN</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">© Copyright 2009 ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks">Keine</VersionInfoKeys>
<VersionInfoKeys Name="OriginalFilename">StackMan.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">ViaThinkSoft Stack Manager</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">5.0.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Comments"></VersionInfoKeys>
<VersionInfoKeys Name="Webseite">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
</VersionInfoKeys>
</Delphi.Personality>
</BorlandProject>
/trunk/Delphi/StackMan.cfg
0,0 → 1,35
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J-
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"c:\programme\borland\delphi6\Projects\Bpl"
-LN"c:\programme\borland\delphi6\Projects\Bpl"
/trunk/Delphi/StackMan.dof
0,0 → 1,87
[FileVersion]
Version=6.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=0
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=vcl;rtl;vclx;VclSmp;vclshlctrls
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=0
MajorVer=5
MinorVer=1
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1031
CodePage=1252
[Version Info Keys]
CompanyName=ViaThinkSoft
FileDescription=Textfile appender and stroker
FileVersion=5.1.0.0
InternalName=STACKMAN
LegalCopyright=© Copyright 2009 - 2010 ViaThinkSoft
LegalTrademarks=Keine
OriginalFilename=StackMan.exe
ProductName=ViaThinkSoft Stack Manager
ProductVersion=5.1.0.0
Webseite=www.viathinksoft.de
Projektleiter=Daniel Marschall - www.daniel-marschall.de
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
/trunk/Delphi/StackMan.dpr
0,0 → 1,23
program StackMan;
 
uses
Forms,
main in 'MAIN.PAS' {MainForm},
appender in 'appender.pas' {MDIAppender},
texteditor in 'texteditor.pas' {MDITexteditor},
about in 'ABOUT.PAS' {AboutBox},
categories in 'categories.pas' {MDICategories},
name in 'NAME.PAS' {NameDlg},
global in 'global.pas',
journal in 'JOURNAL.PAS' {MDIJournalForm};
 
{$R *.RES}
 
begin
Application.Initialize;
Application.Title := 'ViaThinkSoft Stack Manager';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TAboutBox, AboutBox);
Application.CreateForm(TNameDlg, NameDlg);
Application.Run;
end.
/trunk/Delphi/about.PAS
0,0 → 1,38
unit about;
 
interface
 
uses
Windows, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls,
jpeg;
 
type
TAboutBox = class(TForm)
Panel1: TPanel;
OKButton: TButton;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
end;
 
var
AboutBox: TAboutBox;
 
implementation
 
{$R *.dfm}
 
procedure TAboutBox.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_ESCAPE then
begin
Close;
end;
end;
 
end.
/trunk/Delphi/about.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/trunk/Delphi/categories.dfm
0,0 → 1,537
object MDICategories: TMDICategories
Left = 546
Top = 219
Width = 290
Height = 259
Caption = 'Datens'#228'tze'
Color = clBtnFace
ParentFont = True
FormStyle = fsMDIChild
Menu = MainMenu1
OldCreateOrder = False
Position = poDefault
Visible = True
OnClose = FormClose
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object TreeView1: TTreeView
Left = 0
Top = 0
Width = 282
Height = 213
Align = alClient
Images = ImageList1
Indent = 22
PopupMenu = PopupMenu1
ReadOnly = True
RightClickSelect = True
SortType = stBoth
TabOrder = 0
OnChange = TreeView1Change
OnDblClick = TreeView1DblClick
OnKeyDown = TreeView1KeyDown
OnKeyPress = TreeView1KeyPress
end
object ImageList1: TImageList
Left = 8
Top = 8
Bitmap = {
494C010105000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
0000000000003600000028000000400000003000000001002000000000000030
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000FFFF0000FFFF00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000FFFF0000FFFF0000FFFF000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000FFFF0000FFFF00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000FFFF0000FFFF0000FF
FF00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000FFFF0000FFFF000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000FF000000FF000000FF000000FF000000FF000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF0000000000FF000000FF000000FF000000FF00
0000FF000000FF000000BFBFBF0000000000BFBFBF00FF000000FF000000FF00
0000FF000000FF000000FF000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00000000000000000000000000000000000000000000000000000000000000
000000000000FFFFFF0000000000FFFFFF000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00000000000000000000000000BFBFBF00BFBF
BF00BFBFBF00BFBFBF00000000007F7F7F0000000000BFBFBF00BFBFBF00BFBF
BF00BFBFBF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF0000000000000000000000000000000000FFFFFF00FFFFFF00FFFF
FF0000000000000000000000000000000000000000000000000000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF000000000000000000FFFFFF00000000007F7F
7F007F7F7F0000000000FFFFFF007F7F7F00FFFFFF00000000007F7F7F007F7F
7F0000000000FFFFFF0000000000000000000000000000000000000000000000
0000000000000000000000000000FFFFFF000000000000000000FFFFFF000000
00000000000000000000FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000
00000000000000000000FFFFFF00000000007F7F7F0000000000FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF007F7F7F00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00000000007F7F7F00000000000000000000000000000000000000
0000000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00000000000000000000000000000000000000000000000000FFFF
FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000007F7F7F0000000000FFFFFF00FFFF
FF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FFFF00FFFFFF00FFFF
FF00FFFFFF00000000007F7F7F00000000000000000000000000000000000000
FF00000000000000000000000000FFFFFF0000000000BFBFBF00000000000000
0000FFFFFF0000000000FFFFFF00000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF000000000000000000000000000000
00000000000000000000FFFFFF00000000000000000000000000FFFFFF00FFFF
FF0000FFFF00FFFFFF000000FF000000FF0000FFFF00FFFFFF0000FFFF00FFFF
FF00FFFFFF000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000FFFFFF00000000000000000000000000000000000000000000000000FFFF
FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF0000000000000000007F7F7F000000000000FF
FF00FFFFFF0000FFFF00FFFFFF007F7F7F00FFFFFF0000FFFF00FFFFFF0000FF
FF00000000007F7F7F000000000000000000000000000000FF000000FF000000
FF000000FF000000FF0000000000FFFFFF000000000000000000FFFFFF000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF00000000000000000000000000FFFF
FF00FFFFFF00FFFFFF00FFFFFF0000000000000000007F7F7F0000000000FFFF
FF0000FFFF00FFFFFF000000FF00BFBFBF0000FFFF00FFFFFF0000FFFF00FFFF
FF00000000007F7F7F000000000000000000000000000000FF000000FF000000
FF000000FF000000FF000000FF0000000000FFFFFF00FFFFFF00FFFFFF000000
0000FFFFFF00FFFFFF0000000000000000000000000000000000000000000000
0000FFFFFF00000000000000000000000000FFFFFF00FFFFFF00FFFFFF00FFFF
FF000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00000000000000000000000000000000000000000000FFFF000000000000FF
FF00FFFFFF0000FFFF000000FF000000FF000000000000FFFF00FFFFFF0000FF
FF0000000000000000000000000000000000000000000000FF000000FF000000
FF000000FF000000FF000000FF000000FF0000000000BFBFBF00FFFFFF000000
0000FFFFFF000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000
00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF000000000000000000FFFFFF00FFFF
FF0000000000FFFFFF00000000000000000000000000FFFFFF0000FFFF000000
0000000000000000000000FFFF000000FF000000FF0000000000000000000000
000000FFFF00000000000000000000000000000000000000FF000000FF000000
FF000000FF000000FF000000FF0000000000FFFFFF00FFFFFF00FFFFFF000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF000000000000000000FFFFFF00FFFFFF0000000000FFFFFF000000
00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00000000000000000000000000000000000000000000FFFF00FFFFFF0000FF
FF00FFFFFF0000FFFF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FF
FF00FFFFFF00000000000000000000000000000000000000FF000000FF000000
FF000000FF000000FF0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000000000000000
00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF0000000000FFFFFF0000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000FFFFFF0000FFFF00FFFF
FF000000FF000000FF0000FFFF00FFFFFF000000FF000000FF0000FFFF00FFFF
FF0000FFFF000000000000000000000000000000000000000000000000000000
FF000000FF000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
FF00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000FFFFFF0000FF
FF000000FF000000FF00FFFFFF0000FFFF000000FF000000FF00FFFFFF0000FF
FF00000000000000000000000000000000000000000000000000000000000000
FF00000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000FFFFFF00000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000FFFF
FF0000FFFF000000FF000000FF000000FF000000FF00FFFFFF0000FFFF000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
000000000000000000000000000000000000424D3E000000000000003E000000
2800000040000000300000000100010000000000800100000000000000000000
000000000000000000000000FFFFFF0000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000BFFF000000000000BFFF000000000000
B049000000000000807F000000000000B07F000000000000B9FF000000000000
BFFF000000000000B049000000000000807F000000000000B07F000000000000
B9FF000000000000BFFF000000000000048F00000000000007FF000000000000
07FF0000000000009FFF000000000000FFFFFFFFFC00F83FFC00E007F0000001
FC00E007C0000001FC00E00700000001FC00E00700000001EC00E00700000001
E400E00700008003E000E007000080030000E007000080030001E00700008007
0003E007000180070007E00F00038007000FE01F00078007E3FFE03F001FC00F
E7FFFFFF007FE01FEFFFFFFF01FFF03F00000000000000000000000000000000
000000000000}
end
object MainMenu1: TMainMenu
Images = MainForm.ImageList2
Left = 40
Top = 8
object Kategorie1: TMenuItem
Caption = '&Kategorie'
GroupIndex = 5
object EditorOpen: TMenuItem
Caption = '&'#214'ffnen'
Enabled = False
ImageIndex = 21
OnClick = EditorOpenClick
end
object ExternalOpen: TMenuItem
Caption = 'Mit &externem Programm '#246'ffnen'
Enabled = False
ImageIndex = 22
ShortCut = 121
OnClick = ExternalOpenClick
end
object N2: TMenuItem
Caption = '-'
end
object KategorieUmbenennen1: TMenuItem
Caption = '&Umbenennen...'
Enabled = False
ImageIndex = 18
ShortCut = 16469
OnClick = KategorieUmbenennen1Click
end
object KategorieDelete1: TMenuItem
Caption = '&L'#246'schen...'
Enabled = False
ImageIndex = 5
ShortCut = 46
OnClick = KategorieDelete1Click
end
object N4: TMenuItem
Caption = '-'
end
object KategorieRefresh1: TMenuItem
Caption = 'Liste neu laden'
ImageIndex = 19
ShortCut = 116
OnClick = KategorieRefresh1Click
end
object KategorieClose1: TMenuItem
Caption = '&Schlie'#223'en'
ImageIndex = 20
ShortCut = 27
OnClick = KategorieClose1Click
end
end
end
object PopupMenu1: TPopupMenu
OnPopup = PopupMenu1Popup
Left = 72
Top = 8
object PNeu: TMenuItem
Caption = '&Neu...'
Enabled = False
OnClick = PNeuClick
end
object N1: TMenuItem
Caption = '-'
end
object PEditor: TMenuItem
Caption = '&'#214'ffnen'
Default = True
Enabled = False
ImageIndex = 10
OnClick = EditorOpenClick
end
object PExternal: TMenuItem
Caption = 'Mit &externem Programm '#246'ffnen'
Enabled = False
ImageIndex = 9
OnClick = ExternalOpenClick
end
object N5: TMenuItem
Caption = '-'
end
object PUmbenennen: TMenuItem
Caption = '&Umbenennen...'
Enabled = False
OnClick = KategorieUmbenennen1Click
end
object PDelete: TMenuItem
Caption = '&L'#246'schen...'
Enabled = False
ImageIndex = 5
OnClick = KategorieDelete1Click
end
end
end
/trunk/Delphi/categories.pas
0,0 → 1,518
unit categories;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ImgList, Menus, ShellAPI, global;
 
type
TMDICategories = class(TForm)
ImageList1: TImageList;
MainMenu1: TMainMenu;
Kategorie1: TMenuItem;
KategorieDelete1: TMenuItem;
EditorOpen: TMenuItem;
N2: TMenuItem;
KategorieRefresh1: TMenuItem;
KategorieClose1: TMenuItem;
PopupMenu1: TPopupMenu;
PEditor: TMenuItem;
PDelete: TMenuItem;
PExternal: TMenuItem;
N4: TMenuItem;
ExternalOpen: TMenuItem;
N5: TMenuItem;
PUmbenennen: TMenuItem;
KategorieUmbenennen1: TMenuItem;
TreeView1: TTreeView;
PNeu: TMenuItem;
N1: TMenuItem;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure TreeView1DblClick(Sender: TObject);
procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure KategorieDelete1Click(Sender: TObject);
procedure EditorOpenClick(Sender: TObject);
procedure KategorieClose1Click(Sender: TObject);
procedure KategorieRefresh1Click(Sender: TObject);
procedure ExternalOpenClick(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure KategorieUmbenennen1Click(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure PNeuClick(Sender: TObject);
procedure TreeView1KeyPress(Sender: TObject; var Key: Char);
private
procedure recursiveItemListing(folder: string; parentnode: TTreeNode);
public
procedure DeleteNode(folder, cat: string);
procedure InsertNode(folder, cat: string; em: TAMode);
procedure RefreshList;
procedure DoNew;
end;
 
var
MDICategories: TMDICategories;
 
implementation
 
{$R *.dfm}
 
uses
main;
 
procedure TMDICategories.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
 
procedure TMDICategories.FormShow(Sender: TObject);
begin
RefreshList;
TreeView1.SetFocus;
end;
 
procedure TMDICategories.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
// if Change = ctState then
// begin
PNeu.Visible := true;
N1.Visible := true;
PEditor.Visible := true;
PExternal.Visible := true;
N2.Visible := true;
PDelete.Visible := true;
 
PNeu.Default := false;
PEditor.Default := true;
 
//PNeu.Enabled := (TreeView1.SelectionCount = 1) and
// ((IsFolderNode(TreeView1.Selected)) or
// (IsRootNode(TreeView1.Selected)));
PNeu.Enabled := true;
 
EditorOpen.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
ExternalOpen.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsRootNode(TreeView1.Selected)) or
(IsFolderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
KategorieDelete1.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsFolderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
KategorieUmbenennen1.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsFolderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
 
PEditor.Enabled := EditorOpen.Enabled;
PExternal.Enabled := ExternalOpen.Enabled;
PDelete.Enabled := KategorieDelete1.Enabled;
PUmbenennen.Enabled := KategorieUmbenennen1.Enabled;
// end;
end;
 
procedure TMDICategories.TreeView1DblClick(Sender: TObject);
begin
if TreeView1.SelectionCount = 1 then
begin
EditorOpen.Click;
end;
end;
 
procedure TMDICategories.TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
Key := 0;
if TreeView1.SelectionCount = 1 then
begin
if TreeView1.Selected.HasChildren then
begin
if TreeView1.Selected.Expanded then
TreeView1.Selected.Collapse(false)
else
TreeView1.Selected.Expand(false);
end
else
begin
EditorOpen.Click;
end;
end;
end;
end;
 
procedure TMDICategories.RefreshList;
var
root: TTreeNode;
begin
TreeView1.Visible := false;
TreeView1.Items.Clear;
TreeView1.Visible := true;
 
root := TreeView1.Items.Add(nil, lng_root);
root.ImageIndex := II_ROOT;
root.SelectedIndex := II_ROOT;
recursiveItemListing('', root);
root.Expand(false);
end;
 
procedure TMDICategories.KategorieDelete1Click(Sender: TObject);
var
fn: string;
begin
if TreeView1.SelectionCount = 1 then
begin
fn := GetFileNameFromNode(TreeView1.Selected);
if commonDelete(fn) then
begin
// TODO: Eigentlich sollte das innerhalb von commonDelete() stattfinden
TreeView1.Selected.Delete;
end;
end;
end;
 
procedure TMDICategories.DeleteNode(folder, cat: string);
 
procedure Rec(folder, cat: string; t: TTreeNode);
var
i: integer;
begin
if (folder = GetFolderFromNode(t)) and
(cat = GetCatFromNode(t)) then
begin
t.Delete;
exit;
end;
 
for i := t.Count - 1 downto 0 do
begin
Rec(folder, cat, t.Item[i]);
end;
end;
 
begin
Rec(folder, cat, treeview1.Items.Item[0]);
end;
 
procedure TMDICategories.InsertNode(folder, cat: string; em: TAMode);
 
procedure Rec(folder, cat: string; em: TAMode; t: TTreeNode);
var
i: integer;
n: TTreeNode;
begin
if (folder = GetFolderFromNode(t)) and
(IsFolderNode(t) or IsRootNode(t)) then
begin
n := treeview1.Items.AddChild(t, cat);
t.Expand(false); // Ordner aufklappen
with n do
begin
if em = emFolder then
begin
ImageIndex := II_FOLDER;
SelectedIndex := II_FOLDER;
recursiveItemListing(folder + cat, n);
end
else
begin
if em = emText then
begin
ImageIndex := II_TEXT;
SelectedIndex := II_TEXT;
end
else if em = emAppender then
begin
ImageIndex := II_APPENDER;
SelectedIndex := II_APPENDER;
end
else if em = emForeign then
begin
ImageIndex := II_FOREIGN;
SelectedIndex := II_FOREIGN;
end;
end;
end;
 
exit;
end;
 
for i := t.Count - 1 downto 0 do
begin
Rec(folder, cat, em, t.Item[i]);
end;
end;
 
procedure NodeForceDir(folder: string);
 
function CreateIfExists(foldername: string; node: TTreeNode): TTreeNode;
var
i: integer;
somethingfound: boolean;
begin
result := nil;
 
somethingfound := false;
for i := 0 to node.Count - 1 do
begin
if (node.Item[i].Text = foldername) and
(IsFolderNode(node.Item[i]) or IsRootNode(node.Item[i])) then
begin
somethingfound := true;
result := node.Item[i];
break;
end;
end;
 
if not somethingfound then
begin
result := treeview1.Items.AddChild(node, foldername);
node.Expand(false);
 
with result do
begin
ImageIndex := II_FOLDER;
SelectedIndex := II_FOLDER;
end;
end;
end;
 
var
x: tstringlist;
i: Integer;
node: TTreeNode;
begin
x := TStringList.Create;
try
Explode(PathDelim, folder, x);
node := treeview1.Items.Item[0];
for i := 0 to x.count - 1 do
begin
if x.Strings[i] <> '' then
begin
node := CreateIfExists(x.Strings[i], node);
end;
end;
finally
x.Free;
end;
end;
 
var
sl: TStringList;
i: integer;
begin
if (em = emFolder) and (cat = '') then
begin
sl := TStringList.Create;
try
explode(PathDelim, folder, sl);
cat := sl.Strings[sl.Count-2];
folder := '';
for i := 0 to sl.Count - 3 do
begin
folder := folder + sl.Strings[i] + PathDelim;
end;
finally
sl.Free;
end;
end;
 
NodeForceDir(folder);
Rec(folder, cat, em, treeview1.Items.Item[0]);
end;
 
procedure TMDICategories.DoNew;
var
folder: string;
pnode: TTreeNode;
begin
if TreeView1.SelectionCount = 1 then
begin
if IsFolderNode(TreeView1.Selected) or
IsRootNode(TreeView1.Selected) then
begin
pnode := TreeView1.Selected;
end
else
begin
pnode := TreeView1.Selected.Parent;
end;
folder := GetFolderFromNode(pnode);
newDialog(folder);
end
else
begin
newDialog(''); // In der Wurzel erstellen
TreeView1.Items.Item[0];
end;
end;
 
procedure TMDICategories.EditorOpenClick(Sender: TObject);
var
cat, folder: string;
begin
if TreeView1.SelectionCount = 1 then
begin
cat := TreeView1.Selected.Text;
folder := GetFolderFromNode(TreeView1.Selected);
 
if (IsForeignNode(TreeView1.Selected)) then
begin
ExternalOpen.Click;
end
else if (IsAppenderNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)) then
begin
if not FileExists(GetFileNameFromNode(TreeView1.Selected)) then
begin
ShowMessage(lng_filenotfound);
Exit;
end;
 
if IsAppenderNode(TreeView1.Selected) then
begin
OpenAppenderEditor(folder, cat);
end
else
begin
OpenTextEditor(folder, cat);
end;
end;
end;
end;
 
procedure TMDICategories.KategorieClose1Click(Sender: TObject);
begin
Close;
end;
 
procedure TMDICategories.KategorieRefresh1Click(Sender: TObject);
begin
RefreshList;
 
TreeView1.SetFocus;
end;
 
procedure TMDICategories.KategorieUmbenennen1Click(Sender: TObject);
begin
renameDialog(TreeView1.Selected);
end;
 
procedure TMDICategories.PNeuClick(Sender: TObject);
begin
DoNew();
end;
 
procedure TMDICategories.ExternalOpenClick(Sender: TObject);
var
fn: string;
begin
if TreeView1.SelectionCount = 1 then
begin
fn := GetFileNameFromNode(TreeView1.Selected);
commonExternalOpen(fn);
end;
end;
 
procedure TMDICategories.PopupMenu1Popup(Sender: TObject);
begin
if TreeView1.SelectionCount = 1 then
begin
PNeu.Visible := isFolderNode(TreeView1.Selected) or IsRootNode(TreeView1.Selected);
N1.Visible := isFolderNode(TreeView1.Selected) or IsRootNode(TreeView1.Selected);
PEditor.Visible := true;
PExternal.Visible := true;
N2.Visible := true;
PDelete.Visible := true;
PUmbenennen.Visible := true;
 
PNeu.Default := false;
PEditor.Default := true;
end
else
begin
PNeu.Visible := true;
N1.Visible := false;
PEditor.Visible := false;
PExternal.Visible := false;
N2.Visible := false;
PDelete.Visible := false;
PUmbenennen.Visible := false;
 
PNeu.Default := true;
PEditor.Default := false;
end;
end;
 
procedure TMDICategories.recursiveItemListing(folder: string;
parentnode: TTreeNode);
var
tmp_sr: TSearchRec;
i_folder: TTreeNode;
begin
folder := MyAddTrailingPathDelimiter(folder);
if FindFirst(allFiles(folder), faAnyFile, tmp_sr) = 0 then
begin
repeat
if (tmp_sr.Name <> '.') and (tmp_sr.Name <> '..') then
begin
if directoryExists(getFolderName(folder, tmp_sr.Name)) then
begin
i_folder := TreeView1.Items.AddChild(parentnode, tmp_sr.Name);
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
i_folder.ImageIndex := II_FOLDER;
i_folder.SelectedIndex := II_FOLDER;
recursiveItemListing(folder + tmp_sr.Name, i_folder);
end
else if (folder + tmp_sr.Name) = GetRelativeFileName(getAppenderFileName(folder, FilenameToCatname(tmp_sr.Name))) then
begin
with TreeView1.Items.AddChild(parentnode, FilenameToCatname(tmp_sr.Name)) do
begin
ImageIndex := II_APPENDER;
SelectedIndex := II_APPENDER;
end;
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
end
else if (folder + tmp_sr.Name) = GetRelativeFileName(getTextFileName(folder, FilenameToCatname(tmp_sr.Name))) then
begin
with TreeView1.Items.AddChild(parentnode, FilenameToCatname(tmp_sr.Name)) do
begin
ImageIndex := II_TEXT;
SelectedIndex := II_TEXT;
end;
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
end
else if getFolderName(folder, tmp_sr.Name) <> getJournalFileName() then
begin
with TreeView1.Items.AddChild(parentnode, tmp_sr.Name) do
begin
ImageIndex := II_FOREIGN;
SelectedIndex := II_FOREIGN;
end;
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
end;
end;
until FindNext(tmp_sr) <> 0;
FindClose(tmp_sr);
end;
end;
 
procedure TMDICategories.TreeView1KeyPress(Sender: TObject; var Key: Char);
begin
// Verhindert einen Windows-Sound beim Drücken von Enter
if key = #13 then key := #0;
if key = #10 then key := #0;
end;
 
end.
/trunk/Delphi/clean.bat
0,0 → 1,6
@echo off
rd /s /q __history
del *.~*
del *.identcache
del *.local
del *.dcu
/trunk/Delphi/journal.PAS
0,0 → 1,56
unit journal;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, ImgList;
 
type
TMDIJournalForm = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
Journal1: TMenuItem;
Close1: TMenuItem;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Close1Click(Sender: TObject);
public
procedure DoRefresh;
end;
 
var
MDIJournalForm: TMDIJournalForm;
 
implementation
 
{$R *.dfm}
 
uses
main, global;
 
procedure TMDIJournalForm.Close1Click(Sender: TObject);
begin
Close;
end;
 
procedure TMDIJournalForm.DoRefresh;
begin
if FileExists(getJournalFileName()) then
begin
Memo1.Lines.LoadFromFile(getJournalFileName());
end;
SendMessage(Memo1.Handle, WM_VSCROLL, SB_BOTTOM, 0); // TODO: geht nicht in w95
end;
 
procedure TMDIJournalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
 
procedure TMDIJournalForm.FormShow(Sender: TObject);
begin
DoRefresh;
end;
 
end.
/trunk/Delphi/journal.dfm
0,0 → 1,48
object MDIJournalForm: TMDIJournalForm
Left = 288
Top = 156
Width = 347
Height = 180
Caption = 'Journal'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
FormStyle = fsMDIChild
Menu = MainMenu1
OldCreateOrder = False
Position = poDefault
Visible = True
OnClose = FormClose
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Memo1: TMemo
Left = 0
Top = 0
Width = 339
Height = 134
Align = alClient
Color = clBtnFace
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 0
end
object MainMenu1: TMainMenu
Images = MainForm.ImageList2
Left = 8
Top = 8
object Journal1: TMenuItem
Caption = '&Journal'
GroupIndex = 5
object Close1: TMenuItem
Caption = '&Schlie'#223'en'
ImageIndex = 20
ShortCut = 27
OnClick = Close1Click
end
end
end
end
/trunk/Delphi/name.dfm
0,0 → 1,62
object NameDlg: TNameDlg
Left = 245
Top = 108
BorderIcons = [biSystemMenu]
BorderStyle = bsDialog
ClientHeight = 113
ClientWidth = 233
Color = clBtnFace
ParentFont = True
OldCreateOrder = True
Position = poScreenCenter
OnKeyDown = FormKeyDown
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 9
Width = 32
Height = 13
Caption = 'Name?'
end
object NameEdt: TEdit
Left = 8
Top = 27
Width = 217
Height = 21
TabOrder = 0
OnChange = NameEdtChange
end
object OKBtn: TButton
Left = 70
Top = 77
Width = 75
Height = 25
Caption = 'OK'
Default = True
ModalResult = 1
TabOrder = 2
OnClick = OKBtnClick
end
object CancelBtn: TButton
Left = 151
Top = 78
Width = 75
Height = 25
Cancel = True
Caption = 'Abbrechen'
ModalResult = 2
TabOrder = 3
OnClick = CancelBtnClick
end
object Textmode: TCheckBox
Left = 8
Top = 54
Width = 97
Height = 17
Caption = 'Textmodus'
TabOrder = 1
OnClick = NameEdtChange
end
end
/trunk/Delphi/name.pas
0,0 → 1,65
unit name;
 
interface
 
uses
Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons;
 
type
TNameDlg = class(TForm)
Label1: TLabel;
NameEdt: TEdit;
OKBtn: TButton;
CancelBtn: TButton;
Textmode: TCheckBox;
procedure CancelBtnClick(Sender: TObject);
procedure OKBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure NameEdtChange(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
end;
 
var
NameDlg: TNameDlg;
 
implementation
 
{$R *.dfm}
 
procedure TNameDlg.CancelBtnClick(Sender: TObject);
begin
ModalResult := mrAbort;
end;
 
procedure TNameDlg.FormShow(Sender: TObject);
begin
OkBtn.Enabled := false;
NameEdt.SetFocus;
end;
 
procedure TNameDlg.NameEdtChange(Sender: TObject);
begin
OKBtn.Enabled := NameEdt.Text <> '';
end;
 
procedure TNameDlg.OKBtnClick(Sender: TObject);
begin
if NameEdt.Text <> '' then
begin
ModalResult := mrOk;
end;
end;
 
procedure TNameDlg.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_ESCAPE) then
begin
close;
end;
end;
 
end.
/trunk/Delphi/publish.bat
0,0 → 1,27
@echo off
 
REM (Keine Delphi Compilierung)
 
SET NAME=ViaThinkSoft Stack Manager 5.1
SET URL=http://www.viathinksoft.de/
SET EXE=StackMan.exe
 
echo Unterzeichne %EXE%...
 
signtool sign -d "%NAME%" -du "%URL%" -a -t "http://timestamp.verisign.com/scripts/timstamp.dll" -r "ViaThinkSoft Root Certificate Signing Authority" -i "ViaThinkSoft Intermediate Code Signing Certificate Authority" "%EXE%"
 
echo Compiliere Setup...
 
"C:\Programme\Inno Setup 5\iscc.exe" /Q "StackMan.iss"
 
echo Unterzeichne Setup...
 
SET EXE=Output\setup.exe
 
signtool sign -d "%NAME%" -du "%URL%" -a -t "http://timestamp.verisign.com/scripts/timstamp.dll" -r "ViaThinkSoft Root Certificate Signing Authority" -i "ViaThinkSoft Intermediate Code Signing Certificate Authority" "%EXE%"
 
echo Fertig!
 
pause.
cls
exit
/trunk/Delphi
Property changes:
Added: svn:global-ignores
+__history
+*.dcu
+*.local
+*.identcache
+*.otares
Added: svn:ignore
+*.exe
/trunk/SSH/weblog_add
0,0 → 1,131
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
if ($argc <> 2) {
echo "Syntax: $argv[0] <line>\n";
exit(2);
}
 
if (isset($stam_cfg['weblog2_system']) && !empty($stam_cfg['weblog2_system'])) {
 
 
$ent = rtrim($argv[1]);
 
if (isset($stam_cfg['weblog_password']) && !empty($stam_cfg['weblog_password'])) {
$iv = 'AAAAAAAAAAAAAAAA';
$ent = base64_encode(openssl_encrypt($ent, 'AES-128-CBC', $stam_cfg['weblog_password'], OPENSSL_RAW_DATA, $iv));
}
 
# ---
 
 
$oidplus_rest_auth = $stam_cfg['weblog2_auth'];
 
/*
$data = array();
$ch = curl_init($stam_cfg['weblog2_system']."rest/v1/objects/oid:".$stam_cfg['weblog2_oid']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $oidplus_rest_auth"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$i=0; for($i=0;$i<10;$i++) { $response = curl_exec($ch); if ($response) { break; } else { sleep(1); } }
if ((!$response) || (json_decode($response,true)['status'] < 0))
{
fwrite(STDERR, "Weblog GET failed: $response\n");
exit(2);
}
#echo "$response\n\n";
$children = json_decode($response,true)['children'];
if (count($children) == 0) {
$lfd = 1;
} else {
natsort($children);
$last = end($children);
$arcs = explode('.', $last);
$lfd = end($arcs)+1;
}
*/
 
$lfd = floor(microtime(true)*10000);
 
$data = array("title" => "STAM Weblog Entry", "description" => $ent, "ra_email" => "info@daniel-marschall.de");
$ch = curl_init($stam_cfg['weblog2_system']."rest/v1/objects/oid:".$stam_cfg['weblog2_oid'].".".$lfd);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $oidplus_rest_auth"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$i=0; for($i=0;$i<10;$i++) { $response = curl_exec($ch); if ($response) { break; } else { sleep(1); } }
if ((!$response) || (json_decode($response,true)['status'] < 0))
{
fwrite(STDERR, "Weblog POST failed: $response\n");
exit(2);
}
#echo "$response\n\n";
 
echo green("Weblog written (".$stam_cfg['weblog2_oid'].".$lfd)!\n");
 
# ---
 
 
 
 
 
 
}
 
if (isset($stam_cfg['weblog_host']) && !empty($stam_cfg['weblog_host'])) {
db_close();
 
$weblog_host = $stam_cfg['weblog_host'];
$weblog_user = $stam_cfg['weblog_user'];
$weblog_pass = $stam_cfg['weblog_pass'];
$weblog_base = $stam_cfg['weblog_base'];
 
if (!db_connect($weblog_host, $weblog_user, $weblog_pass)) {
fwrite(STDERR, "Weblog MySQL connect error\n");
exit(2);
}
 
if (!db_select_db($weblog_base)) {
fwrite(STDERR, "Weblog MySQL DB select error\n");
db_close();
exit(2);
}
 
$ent = rtrim($argv[1]);
 
if (isset($stam_cfg['weblog_password']) && !empty($stam_cfg['weblog_password'])) {
$iv = 'AAAAAAAAAAAAAAAA';
$ent = base64_encode(openssl_encrypt($ent, 'AES-128-CBC', $stam_cfg['weblog_password'], OPENSSL_RAW_DATA, $iv));
}
 
$x = db_query("INSERT INTO stam_weblog (ts, inp) VALUES (
NOW(),
'".db_real_escape_string($ent)."'
)");
if (!$x) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
 
$id = db_insert_id();
if (!$id) {
fwrite(STDERR, "Error: Could not insert\n");
db_close();
exit(1);
}
 
echo green("Weblog written\n");
}
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/stam
0,0 → 1,317
#!/bin/bash
 
# Get the directory of this script (also works with symlinks)
# http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
# ToDo for Future: Implement getopt
if [[ "$1" == "--batchmode" ]]; then
IS_BATCHMODE=1
else
IS_BATCHMODE=0
fi
 
# Read in the system identifier
if [ $IS_BATCHMODE -eq 0 ]; then
echo "Terminal Stackman 2.5"
echo "(C) 2013-2023 ViaThinkSoft"
echo ""
 
if [ -f ~/".autorun" ]; then
echo "Starting autorun script..."
~/".autorun"
echo ""
fi
 
sysid=$( "$DIR"/sysname )
echo "System ID: lta:$sysid"
echo ""
echo "Enter '-help' for available commands."
echo ""
fi
 
# Check MySQL config
"$DIR"/check_db_conn -q
if [ $? -ne 0 ]; then
# TODO: fragen ob man write_stam_config aufrufen möchte
exit 1
fi
 
DEFAULTCAT="."
 
CURCAT="$DEFAULTCAT"
PREV_CAT="$DEFAULTCAT"
LAST_ID=-1
 
echo_yellow() {
echo -ne "\033[1;33;40m"
echo "$*"
echo -ne "\033[0m"
}
 
echo_red() {
echo -ne "\033[1;31;40m"
echo "$*"
echo -ne "\033[0m"
}
 
echo_cyan() {
echo -ne "\033[1;36;40m"
echo "$*"
echo -ne "\033[0m"
}
 
echo_green() {
echo -ne "\033[1;32;40m"
echo "$*"
echo -ne "\033[0m"
}
 
# Main menu
while (( 1 )); do
# Warning if category does not exist yet.
"$DIR"/exists1 "$CURCAT"
if [ $? -eq 1 ]; then
SIGN="*"
else
SIGN="+"
fi
 
# "-r" übernimmt alle "\". gut für z.B. "\\netbios\", schlecht für "\" am zeilenende, um weiterzuschreiben
read -erp "<$CURCAT> $SIGN " inp
if [[ $? -gt 0 ]]; then
# For example end of stream -- exit
break
fi
 
# No empty lines
if [[ "$inp" == "" ]]; then
continue
fi
 
# Log to journal
echo "$inp" >> ~/.stam_history
if [ -f ~/.stam_history_mir ]; then
echo "$inp" >> ~/.stam_history_mir
fi
"$DIR"/weblog_add "$inp"
 
# Split command and (single combined) argument
cmd=$( echo "$inp" | cut -d " " -f 1 )
arg=$( echo "$inp" | cut -s -d " " -f 2- )
 
# Commands begin with '-'. The first character can be escaped by using '--'
echo "$cmd" | grep -E "^-" > /dev/null
COMMANDMODE=$?
echo "$cmd" | grep -E "^--" > /dev/null
if [ $? -eq 0 ]; then
cmd="${cmd:1}"
# 1=nein, 0=ja
COMMANDMODE=1
fi
 
# Category will be changed with '#'. The first character can be escaped by using '##'
echo "$cmd" | grep -E "^#" > /dev/null
CATCHANGE=$?
echo "$cmd" | grep -E "^##" > /dev/null
if [ $? -eq 0 ]; then
cmd="${cmd:1}"
# 1=nein, 0=ja
CATCHANGE=1
fi
 
if [ $CATCHANGE -eq 0 ]; then
PREV_CAT="$CURCAT"
 
# Change category: "#<cat>"
cmd="-"
arg=$( echo "$inp" | sed 's/^#//' )
 
# Do not allow empty category (reserved for '*')
if [[ "$arg" == "" ]]; then
# echo_red "[!] FATAL ERROR: Category cannot be empty!"
# continue
arg="$DEFAULTCAT"
fi
 
# change category
CURCAT="$arg"
 
# if [ $IS_BATCHMODE -eq 0 ]; then
# echo_green "Your category is now '$CURCAT'"
# fi
 
# Warning if category does not exist yet.
"$DIR"/exists1 "$CURCAT"
if [ $? -eq 1 ]; then
echo_yellow "(i) Note: The category does not exist and will be created if you continue:"
echo_yellow " $CURCAT"
fi
elif [ $COMMANDMODE -eq 0 ]; then
# Command mode: "-<cmd> [<arg>]"
cmd="${cmd:1}"
 
# Kommando verarbeiten
if [[ "$cmd" == "listcat" || "$cmd" == "ls" || "$cmd" == "lc" ]]; then
# List categories
"$DIR"/listcat "$arg" | less
elif [[ "$cmd" == "strike" || "$cmd" == "str" ]]; then
# Strike entry
if [[ "$arg" == "last" ]]; then
arg=$LAST_ID
fi
"$DIR"/str "$arg"
elif [[ "$cmd" == "unstrike" || "$cmd" == "unstr" ]]; then
# Un-Strike entry
if [[ "$arg" == "last" ]]; then
arg=$LAST_ID
fi
"$DIR"/unstr "$arg"
elif [[ "$cmd" == "singleadd" || "$cmd" == "sa" || "$cmd" == "as" || "$cmd" == "appendsingle" || "$cmd" == "aps" ]]; then
array=(${arg// / })
CAT="${array[0]}"
TXT="${array[@]:1}"
 
# Warning if category does not exist yet.
"$DIR"/exists1 "$CAT"
if [ $? -eq 1 ]; then
echo_yellow "(i) Note: Category '$CAT' will be created."
fi
 
OUT=$( "$DIR"/aps "$CAT" "$TXT" )
EC=$?
echo -n "$OUT"
if [ $EC -ne 0 ]; then
echo_red "[!] FATAL ERROR: Could not append the entry!" 1>&2
else
LAST_ID=$( echo "$OUT" | sed -r 's/^.*OK! ([[:digit:]]+).*$/\1/g' )
fi
elif [[ "$cmd" == "movefromid" || "$cmd" == "mfi" ]]; then
# Move ID $arg to category $CURCAT
if [[ "$arg" == "last" ]]; then
arg=$LAST_ID
fi
"$DIR"/id_move "$CURCAT" "$arg"
elif [[ "$cmd" == "movefromcat" || "$cmd" == "mfc" ]]; then
# Move CAT $arg to category $CURCAT
"$DIR"/cat_move "$CURCAT" "$arg"
elif [[ "$cmd" == "listent" || "$cmd" == "le" ]]; then
# List entries
"$DIR"/listent "$arg" | less
elif [[ "$cmd" == "listcurent" || "$cmd" == "lce" ]]; then
# List current entries
"$DIR"/listent "$CURCAT" | less
elif [[ "$cmd" == "clear" || "$cmd" == "cls" ]]; then
clear
elif [[ "$cmd" == "batch" || "$cmd" == "bat" ]]; then
TMPFIL=$( mktemp --suffix=.stam )
# TODO: can the .nanorc file be enforced?
nano -Y stam -- "$TMPFIL"
if [ -f "$TMPFIL" ]; then
echo_cyan "Processing batch script..."
"$0" --batchmode < "$TMPFIL"
rm "$TMPFIL"
echo_cyan "Batch finished!"
else
echo_yellow "No data entered in batch mode editor. Cancelled."
fi
elif [[ "$cmd" == "sub" || "$cmd" == "su" ]]; then
# At the moment, we do not use '--subshell'
"$0" --subshell
elif [[ "$cmd" == "back" || "$cmd" == "b" ]]; then
X_PREV_CAT="$CURCAT"
 
# change category
CURCAT="$PREV_CAT"
 
# if [ $IS_BATCHMODE -eq 0 ]; then
# echo_green "Your category is now '$CURCAT'"
# fi
 
# Warning if category does not exist yet.
"$DIR"/exists1 "$CURCAT"
if [ $? -eq 1 ]; then
echo_yellow "(i) Note: The category does not exist and will be created if you continue:"
echo_yellow " $CURCAT"
fi
 
# Special ability: Allow that you can go forward again
PREV_CAT="$X_PREV_CAT"
elif [[ "$cmd" == "showhistory" || "$cmd" == "shi" ]]; then
# Leider enthält das nicht die Ausgaben :-(
cat ~/.stam_history | less
elif [[ "$cmd" == "help" || "$cmd" == "h" || "$cmd" == "?" ]]; then
echo_cyan "#<cat>"
echo -e "\tChange category. Parameter: Category"
echo -e "\tUse '##' at the beginning, if you want to create an entry beginning with '#'."
echo_cyan "-(back|b)"
echo -e "\tSwitch to previous used category"
echo_cyan "-(strike|str) <id>"
echo -e "\tStrike entry <id>"
echo -e "\t<id> can have ranges using '<min>-<max>' or be 'last' for the last inserted ID."
echo_cyan "-(singleadd|sa|as|appendsingle|aps) <cat> <entry>"
echo -e "\tAdd <entry> to category <cat> without changing the category."
echo -e "\t<cat> may not contain a white space"
echo_cyan "-(unstrike|unstr) <id>"
echo -e "\tUn-Strike entry <id>"
echo -e "\t<id> can have ranges using '<min>-<max>' or be 'last' for the last inserted ID."
echo_cyan "-(movefromid|mfi) <id>"
echo -e "\tMove ID <id> to the current selected category"
echo -e "\t<id> can have ranges using '<min>-<max>' or be 'last' for the last inserted ID."
echo_cyan "-(movefromcat|mfc) <cat>"
echo -e "\tMove all entries of category <cat> to the current selected category"
echo -e "\t<cat> can have wildcards (*)"
echo_cyan "-(listent|le) [<cat>]"
echo -e "\tShow all entries. Optional parameter: Category"
echo -e "\t<cat> can have wildcards (*)"
echo_cyan "-(listcurent|lce)"
echo -e "\tShow all entries of the selected category."
echo_cyan "-(listcat|ls|lc) [<cat>]"
echo -e "\tShow all categories. Optional parameter: Category"
echo -e "\t<cat> can have wildcards (*)"
echo_cyan "-(clear|cls)"
echo -e "\tClears the screen"
echo_cyan "-(batch|bat)"
echo -e "\tEnters batch mode (opens a subshell, without keeping your current category!)"
echo_cyan "-(sub|su)"
echo -e "\tEnters subshell mode"
echo_cyan "-(showhistory|shi)"
echo -e "\tShow history of all entered commands"
echo_cyan "-(help|h|?)"
echo -e "\tThis help screen"
echo_cyan "-(exit|quit|x|q)"
echo -e "\tExits the program"
elif [[ "$cmd" == "exit" || "$cmd" == "quit" || "$cmd" == "x" || "$cmd" == "q" ]]; then
# Exit the program
break
else
# Unknown command
echo_red "[!] FATAL ERROR: Unknown command '$cmd'. Use '-help' for available commands." 1>&2
echo_red " If you want to add an entry, Use '--' to escape the first character." 1<&2
fi
else
# (Blind) appender mode
 
# Add single entry (aps)
OUT=$( "$DIR"/aps "$CURCAT" "$inp" )
EC=$?
echo -n "$OUT"
if [ $EC -ne 0 ]; then
echo_red "[!] FATAL ERROR: Could not append the entry!" 1>&2
else
LAST_ID=$( echo "$OUT" | sed -r 's/^.*OK! ([[:digit:]]+).*$/\1/g' )
fi
fi
done
 
if [ $IS_BATCHMODE -eq 0 ]; then
echo ""
echo "Goodbye."
fi
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/weblog_read
0,0 → 1,108
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
if ($argc <> 1) {
echo "Syntax: $argv[0]\n";
exit(2);
}
 
if (isset($stam_cfg['weblog2_system']) && !empty($stam_cfg['weblog2_system'])) {
 
 
# ---
 
 
$oidplus_rest_auth = $stam_cfg['weblog2_auth'];
 
$data = array();
$ch = curl_init($stam_cfg['weblog2_system']."rest/v1/objects/oid:".$stam_cfg['weblog2_oid']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $oidplus_rest_auth"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$i=0; for($i=0;$i<10;$i++) { $response = curl_exec($ch); if ($response) { break; } else { sleep(1); } }
if ((!$response) || (json_decode($response,true)['status'] < 0))
{
fwrite(STDERR, "Weblog GET failed: $response\n");
#weblog_close();
exit(2);
}
#echo "$response\n\n";
$children = json_decode($response,true)['children'];
 
foreach ($children as $child) {
$data = array();
$ch = curl_init($stam_cfg['weblog2_system']."rest/v1/objects/".$child);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $oidplus_rest_auth"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$i=0; for($i=0;$i<10;$i++) { $response = curl_exec($ch); if ($response) { break; } else { sleep(1); } }
if ((!$response) || (json_decode($response,true)['status'] < 0))
{
fwrite(STDERR, "Weblog GET failed: $response\n");
#weblog_close();
exit(2);
}
#echo "$response\n\n";
$data = json_decode($response,true);
$ent = $data['description'];
 
if (isset($stam_cfg['weblog_password']) && !empty($stam_cfg['weblog_password'])) {
$iv = 'AAAAAAAAAAAAAAAA';
$ent = openssl_decrypt(base64_decode($ent), 'AES-128-CBC', $stam_cfg['weblog_password'], OPENSSL_RAW_DATA, $iv);
}
 
echo $data['created'] . ': ' . trim($ent) . "\n";
}
 
 
 
# ---
 
 
 
 
}
 
if (isset($stam_cfg['weblog_host']) && !empty($stam_cfg['weblog_host'])) {
db_close();
 
$weblog_host = $stam_cfg['weblog_host'];
$weblog_user = $stam_cfg['weblog_user'];
$weblog_pass = $stam_cfg['weblog_pass'];
$weblog_base = $stam_cfg['weblog_base'];
 
if (!db_connect($weblog_host, $weblog_user, $weblog_pass)) {
fwrite(STDERR, "Weblog MySQL connect error\n");
exit(2);
}
 
if (!db_select_db($weblog_base)) {
fwrite(STDERR, "Weblog MySQL DB select error\n");
db_close();
exit(2);
}
 
$res = db_query("select * from stam_weblog order by id asc");
while ($row = db_fetch_array($res)) {
$ent = $row['inp'];
if (isset($stam_cfg['weblog_password']) && !empty($stam_cfg['weblog_password'])) {
$iv = 'AAAAAAAAAAAAAAAA';
$ent = openssl_decrypt(base64_decode($ent), 'AES-128-CBC', $stam_cfg['weblog_password'], OPENSSL_RAW_DATA, $iv);
}
echo $row['ts'] . ': ' . trim($ent) . "\n";
 
}
}
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/weblog_rewrite
0,0 → 1,144
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
if ($argc <> 1) {
echo "Syntax: $argv[0]\n";
exit(2);
}
 
if (isset($stam_cfg['weblog2_system']) && !empty($stam_cfg['weblog2_system'])) {
 
 
 
$home = posix_getpwuid(posix_getuid())['dir'];
$ents = file($home.'/.stam_history');
foreach ($ents as $ent) {
$ent = rtrim($ent);
if (isset($stam_cfg['weblog_password']) && !empty($stam_cfg['weblog_password'])) {
$iv = 'AAAAAAAAAAAAAAAA';
$ent = base64_encode(openssl_encrypt($ent, 'AES-128-CBC', $stam_cfg['weblog_password'], OPENSSL_RAW_DATA, $iv));
}
 
# ---
 
 
$oidplus_rest_auth = $stam_cfg['weblog2_auth'];
 
/*
$data = array();
$ch = curl_init($stam_cfg['weblog2_system']."rest/v1/objects/oid:".$stam_cfg['weblog2_oid']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $oidplus_rest_auth"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$i=0; for($i=0;$i<10;$i++) { $response = curl_exec($ch); if ($response) { break; } else { sleep(1); } }
if ((!$response) || (json_decode($response,true)['status'] < 0))
{
fwrite(STDERR, "Weblog GET failed: $response\n");
#weblog_close();
exit(2);
}
#echo "$response\n\n";
$children = json_decode($response,true)['children'];
if (count($children) == 0) {
$lfd = 1;
} else {
natsort($children);
$last = end($children);
$arcs = explode('.', $last);
$lfd = end($arcs)+1;
}
*/
 
$lfd = floor(microtime(true)*10000);
 
$data = array("title" => "STAM Weblog Entry", "description" => $ent, "ra_email" => "info@daniel-marschall.de");
$ch = curl_init($stam_cfg['weblog2_system']."rest/v1/objects/oid:".$stam_cfg['weblog2_oid'].".".$lfd);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json", "Authorization: Bearer $oidplus_rest_auth"));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$i=0; for($i=0;$i<10;$i++) { $response = curl_exec($ch); if ($response) { break; } else { sleep(1); } }
if ((!$response) || (json_decode($response,true)['status'] < 0))
{
fwrite(STDERR, "Weblog POST failed: $response\n");
#weblog_close();
exit(2);
}
#echo "$response\n\n";
 
echo green("Weblog written (".$stam_cfg['weblog2_oid'].".$lfd)!\n");
 
# ---
 
 
 
 
 
}
 
 
 
}
 
if (isset($stam_cfg['weblog_host']) && !empty($stam_cfg['weblog_host'])) {
db_close();
 
$weblog_host = $stam_cfg['weblog_host'];
$weblog_user = $stam_cfg['weblog_user'];
$weblog_pass = $stam_cfg['weblog_pass'];
$weblog_base = $stam_cfg['weblog_base'];
 
if (!db_connect($weblog_host, $weblog_user, $weblog_pass)) {
fwrite(STDERR, "Weblog MySQL connect error\n");
exit(2);
}
 
if (!db_select_db($weblog_base)) {
fwrite(STDERR, "Weblog MySQL DB select error\n");
db_close();
exit(2);
}
 
db_query("TRUNCATE TABLE stam_weblog");
 
$home = posix_getpwuid(posix_getuid())['dir'];
$ents = file($home.'/.stam_history');
foreach ($ents as $ent) {
$ent = rtrim($ent);
if (isset($stam_cfg['weblog_password']) && !empty($stam_cfg['weblog_password'])) {
$iv = 'AAAAAAAAAAAAAAAA';
$ent = base64_encode(openssl_encrypt($ent, 'AES-128-CBC', $stam_cfg['weblog_password'], OPENSSL_RAW_DATA, $iv));
}
 
$x = db_query("INSERT INTO stam_weblog (ts, inp) VALUES (
NOW(),
'".db_real_escape_string($ent)."'
)");
if (!$x) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
 
$id = db_insert_id();
if (!$id) {
fwrite(STDERR, "Error: Could not insert\n");
db_close();
exit(1);
}
 
echo green("Weblog written!\n");
}
}
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/aps
0,0 → 1,50
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
 
$src = '???';
require_once __DIR__ . '/includes/src.inc.php';
 
$stam_cfg = array();
$stam_cfg['simulation'] = false;
require_once __DIR__ . '/includes/config.inc.php';
 
if ($argc <> 3) {
echo "Syntax: $argv[0] <cat> <entry>\n";
exit(2);
}
 
$cat = trim($argv[1]);
$ent = rtrim($argv[2]);
 
if ($stam_cfg['simulation']) {
fwrite(STDERR, "============ APS SIMULATION: $cat :: $ent\n");
die();
}
 
$x = db_query("INSERT INTO stam_entries (cat, txt, src) VALUES (
'".db_real_escape_string($cat)."',
'".db_real_escape_string($ent)."',
'".db_real_escape_string($src)."'
)");
if (!$x) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
 
$id = db_insert_id();
if (!$id) {
fwrite(STDERR, "Error: Could not insert\n");
db_close();
exit(1);
}
#echo green("OK! Created ID $id\n<$cat> $ent\n");
echo green("OK! $id * <$cat> $ent\n");
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/cat_move
0,0 → 1,80
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
require_once __DIR__ . '/includes/wildcard.inc.php';
 
$stam_cfg = array();
$stam_cfg['simulation'] = false;
require_once __DIR__ . '/includes/config.inc.php';
 
if ($argc < 3) {
echo "Syntax: $argv[0] <newCategory> <categoryWildcard>\n";
#db_close();
exit(2);
}
 
array_shift($argv);
$newcat = trim($argv[0]);
 
array_shift($argv);
if (!isset($argv[0]) || (trim($argv[0])=='')) $argv[0] = '*';
 
$arg = trim(implode(' ', $argv));
# while ($arg = array_shift($argv)) {
$wildcard = trim(mywc($arg));
 
# Simulation mode
if ($stam_cfg['simulation']) {
fwrite(STDERR, "============ CAT-MOVETO SIMULATION: $wildcard :: $newcat\n");
#db_close();
exit(0);
}
 
$res = db_query("SELECT id, cat, txt FROM stam_entries WHERE
cat LIKE '".db_real_escape_string($wildcard)."'
");
if (!$res) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
while ($row = db_fetch_array($res)) {
$id = $row['id'];
$oldcat = $row['cat'];
$txt = $row['txt'];
 
if ($oldcat == $newcat) {
echo "ID $id is already in <$oldcat>: $txt\n";
continue; // not affected
}
 
$x = db_query("UPDATE stam_entries SET
cat = '".db_real_escape_string($newcat)."'
WHERE
id = '".db_real_escape_string($id)."'
");
if (!$x) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
 
$afr = db_affected_rows();
if ($afr != 1) {
fwrite(STDERR, "Error: Could not update $id <$oldcat> '$txt'\n");
#db_close();
exit(1);
} else {
echo green("OK! Moved $id from '$oldcat' to '$newcat': $txt\n");
}
}
# }
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/id_move
0,0 → 1,95
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
$stam_cfg = array();
$stam_cfg['simulation'] = false;
require_once __DIR__ . '/includes/config.inc.php';
 
if ($argc <> 3) {
echo "Syntax: $argv[0] <newCategory> <id>\n";
#db_close();
exit(2);
}
 
$newcat = trim($argv[1]);
$id = trim($argv[2]);
 
# Range support
if (strpos($id, '-') !== false) {
$ary = explode('-', $id, 2);
$id_min = $ary[0];
$id_max = $ary[1];
} else {
$id_min = $id;
$id_max = $id;
}
if (($id_min == 0) || ($id_max == 0)) {
fwrite(STDERR, "0 not a valid ID\n");
#db_close();
exit(3);
}
$id_min = (int)$id_min;
$id_max = (int)$id_max;
if ($id_min>$id_max) {
fwrite(STDERR, "RANGE ERROR $id_min>$id_max\n");
#db_close();
exit(3);
}
$id_cnt = $id_max - $id_min + 1;
 
# Simulation mode
if ($stam_cfg['simulation']) {
fwrite(STDERR, "============ ID-MOVETO SIMULATION: $id_min..$id_max :: $newcat\n");
#db_close();
exit(0);
}
 
$res = db_query("SELECT id, cat, txt FROM stam_entries WHERE
id >= '".db_real_escape_string($id_min)."'
AND id <= '".db_real_escape_string($id_max)."'
");
if (!$res) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
while ($row = db_fetch_array($res)) {
$id = $row['id'];
$oldcat = $row['cat'];
$txt = $row['txt'];
 
if ($oldcat == $newcat) {
echo "ID $id is already in <$oldcat>: $txt\n";
continue; // not affected
}
 
$x = db_query("UPDATE stam_entries SET
cat = '".db_real_escape_string($newcat)."'
WHERE
id = '".db_real_escape_string($id)."'
");
if (!$x) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
 
$afr = db_affected_rows();
if ($afr != 1) {
fwrite(STDERR, "Error: Could not update $id <$oldcat> '$txt'\n");
#db_close();
exit(1);
} else {
echo green("OK! Moved $id from '$oldcat' to '$newcat': $txt\n");
}
}
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/includes/db.inc.php
0,0 → 1,103
<?php
 
$vts_mysqli = null;
 
# ---
 
$stam_cfg = array();
$stam_cfg['db_host'] = null;
$stam_cfg['db_user'] = null;
$stam_cfg['db_pass'] = null;
$stam_cfg['db_base'] = null;
 
require __DIR__ . '/config.inc.php';
 
$db_host = $stam_cfg['db_host'];
$db_user = $stam_cfg['db_user'];
$db_pass = $stam_cfg['db_pass'];
$db_base = $stam_cfg['db_base'];
 
if (!db_connect($db_host, $db_user, $db_pass)) {
fwrite(STDERR, "MySQL connect error\n");
exit(2);
}
 
if (!db_select_db($db_base)) {
fwrite(STDERR, "MySQL DB select error\n");
db_close();
exit(2);
}
 
register_shutdown_function('db_close');
 
# ---
 
// Sendet eine Anfrage an MySQL
function db_query($query, $link_identifier=NULL) {
global $vts_mysqli;
return (!is_null($link_identifier) ? $link_identifier : $vts_mysqli)->query($query, $resultmode=MYSQLI_STORE_RESULT);
}
 
// Maskiert spezielle Zeichen innerhalb eines Strings für die Verwendung in einer SQL-Anweisung
function db_real_escape_string($unescaped_string, $link_identifier=NULL) {
global $vts_mysqli;
return (!is_null($link_identifier) ? $link_identifier : $vts_mysqli)->escape_string($unescaped_string);
}
 
// Öffnet eine Verbindung zu einem MySQL-Server
function db_connect($server=null, $username=null, $password=null, $new_link=false, $client_flags=0) {
global $vts_mysqli;
$ary = explode(':', $server);
$host = $ary[0];
$ini_port = ini_get("mysqli.default_port");
$port = isset($ary[1]) ? (int)$ary[1] : ($ini_port ? (int)$ini_port : 3306);
if (is_null($server)) $server = ini_get("mysqli.default_host");
if (is_null($username)) $username = ini_get("mysqli.default_user");
if (is_null($password)) $password = ini_get("mysqli.default_password");
$vts_mysqli = new mysqli($host, $username, $password, /*dbname*/'', $port, ini_get("mysqli.default_socket"));
return (empty($vts_mysqli->connect_error) && ($vts_mysqli->connect_errno == 0)) ? $vts_mysqli : false;
}
 
// Schließt eine Verbindung zu MySQL
function db_close($link_identifier=NULL) {
global $vts_mysqli;
return (!is_null($link_identifier) ? $link_identifier : $vts_mysqli)->close();
}
 
// Auswahl einer MySQL Datenbank
function db_select_db($database_name, $link_identifier=NULL) {
global $vts_mysqli;
return (!is_null($link_identifier) ? $link_identifier : $vts_mysqli)->select_db($database_name);
}
 
define('DB_ASSOC', MYSQLI_ASSOC);
define('DB_NUM', MYSQLI_NUM);
define('DB_BOTH', MYSQLI_BOTH);
function db_fetch_array($result, $result_type=DB_BOTH) {
return $result->fetch_array($result_type);
}
 
// Liefert die ID, die in der vorherigen Abfrage erzeugt wurde
function db_insert_id($link_identifier=NULL) {
global $vts_mysqli;
return (!is_null($link_identifier) ? $link_identifier : $vts_mysqli)->insert_id;
}
 
// Liefert die Anzahl betroffener Datensätze einer vorhergehenden MySQL Operation
function db_affected_rows($link_identifier=NULL) {
global $vts_mysqli;
return (!is_null($link_identifier) ? $link_identifier : $vts_mysqli)->affected_rows;
}
 
// Liefert die Anzahl der Zeilen im Ergebnis
function db_num_rows($result) {
return $result->num_rows;
}
 
// Liefert den Fehlertext der zuvor ausgeführten MySQL Operation
function db_error($link_identifier=NULL) {
global $vts_mysqli;
$x = (!is_null($link_identifier) ? $link_identifier : $vts_mysqli);
return !empty($x->connect_error) ? $x->connect_error : $x->error;
}
 
/trunk/SSH/includes/config.inc.php
0,0 → 1,30
<?php
 
// Defaults
stam_read_config(__DIR__ . '/../defaults/.stam_config');
 
// Read config in user dir
$home = $_SERVER['HOME'];
stam_read_config($home.'/.stam_config');
 
// ---
 
function stam_read_config($file) {
if (!file_exists($file)) return false;
global $stam_cfg;
$x = file($file);
foreach ($x as &$a) {
$a = trim($a);
if ($a == '') continue;
$ary = explode('=', $a, 2);
$name = trim($ary[0]);
if ($name[0] == '#') continue; // Comment
if (!isset($ary[1])) {
// Invalid entry
fwrite(STDERR, "Ignore invalid config line: $a\n");
continue;
}
$val = trim($ary[1]);
$stam_cfg[$name] = $val;
}
}
/trunk/SSH/includes/src.inc.php
0,0 → 1,6
<?php
 
$src = exec(escapeshellcmd(__DIR__.'/../sysname'), $cont, $code);
if ($code > 0) $src = 'unknown@unknown';
$src = "lta:$src";
 
/trunk/SSH/includes/wildcard.inc.php
0,0 → 1,13
<?php
 
function mywc($arg) {
$wildcard = $arg;
$wildcard = str_replace('*', '%', $wildcard);
$wildcard = str_replace('?', '%', $wildcard);
#$wildcard = '%'.$wildcard.'%';
while (strpos($wildcard, '%%') !== false) {
$wildcard = str_replace('%%', '%', $wildcard);
}
# echo "Wildcard: $wildcard\n";
return $wildcard;
}
/trunk/SSH/str
0,0 → 1,87
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
$stam_cfg = array();
$stam_cfg['simulation'] = false;
require_once __DIR__ . '/includes/config.inc.php';
 
if ($argc <> 2) {
echo "Syntax: $argv[0] <id>\n";
#db_close();
exit(2);
}
 
$id = trim($argv[1]);
 
# Range support
if (strpos($id, '-') !== false) {
$ary = explode('-', $id, 2);
$id_min = $ary[0];
$id_max = $ary[1];
} else {
$id_min = $id;
$id_max = $id;
}
if (($id_min == 0) || ($id_max == 0)) {
fwrite(STDERR, "0 not a valid ID\n");
#db_close();
exit(3);
}
$id_min = (int)$id_min;
$id_max = (int)$id_max;
if ($id_min>$id_max) {
fwrite(STDERR, "RANGE ERROR $id_min>$id_max\n");
#db_close();
exit(3);
}
$id_cnt = $id_max - $id_min + 1;
 
# Simulation mode
if ($stam_cfg['simulation']) {
fwrite(STDERR, "============ STRIKE SIMULATION: $id_min..$id_max\n");
#db_close();
exit(0);
}
 
$str = db_query("SELECT id, cat, txt FROM stam_entries WHERE
id >= '".db_real_escape_string($id_min)."'
AND id <= '".db_real_escape_string($id_max)."'
");
if (!$str) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
while ($row = db_fetch_array($str)) {
$id = $row['id'];
$cat = $row['cat'];
$txt = $row['txt'];
 
$x = db_query("UPDATE stam_entries SET state = 'S' WHERE
id = '".db_real_escape_string($id)."'");
if (!$x) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
 
$afr = db_affected_rows();
if ($afr != 1) {
fwrite(STDERR, "Error: Could not update $id <$cat> '$txt'\n");
#db_close();
exit(1);
} else {
#echo green("OK! Striked: $id <$cat> $txt\n");
echo green("OK! $id - <$cat> $txt\n");
}
}
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/unstr
0,0 → 1,87
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
$stam_cfg = array();
$stam_cfg['simulation'] = false;
require_once __DIR__ . '/includes/config.inc.php';
 
if ($argc <> 2) {
echo "Syntax: $argv[0] <id>\n";
#db_close();
exit(2);
}
 
$id = trim($argv[1]);
 
# Range support
if (strpos($id, '-') !== false) {
$ary = explode('-', $id, 2);
$id_min = $ary[0];
$id_max = $ary[1];
} else {
$id_min = $id;
$id_max = $id;
}
if (($id_min == 0) || ($id_max == 0)) {
fwrite(STDERR, "0 not a valid ID\n");
#db_close();
exit(3);
}
$id_min = (int)$id_min;
$id_max = (int)$id_max;
if ($id_min>$id_max) {
fwrite(STDERR, "RANGE ERROR $id_min>$id_max\n");
#db_close();
exit(3);
}
$id_cnt = $id_max - $id_min + 1;
 
# Simulation mode
if ($stam_cfg['simulation']) {
fwrite(STDERR, "============ UN-STRIKE SIMULATION: $id_min..$id_max\n");
#db_close();
exit(0);
}
 
$str = db_query("SELECT id, cat, txt FROM stam_entries WHERE
id >= '".db_real_escape_string($id_min)."'
AND id <= '".db_real_escape_string($id_max)."'
");
if (!$str) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
while ($row = db_fetch_array($str)) {
$id = $row['id'];
$cat = $row['cat'];
$txt = $row['txt'];
 
$x = db_query("UPDATE stam_entries SET state = 'E' WHERE
id = '".db_real_escape_string($id)."'");
if (!$x) {
fwrite(STDERR, db_error()."\n");
#db_close();
exit(1);
}
 
$afr = db_affected_rows();
if ($afr != 1) {
fwrite(STDERR, "Error: Could not update $id <$cat> '$txt'\n");
#db_close();
exit(1);
} else {
# echo green("OK! Revealed: $id <$cat> $txt\n");
echo green("OK! $id + <$cat> $txt\n");
}
}
 
# ---
 
function green($txt) {
return "\033[1;32;40m".$txt."\033[0m";
}
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/stam_entries.sql
Cannot display: file marked as a binary type.
svn:mime-type = application/x-sql
Property changes:
Added: svn:mime-type
+application/x-sql
\ No newline at end of property
/trunk/SSH/stam_weblog.sql
0,0 → 1,6
CREATE TABLE `stam_weblog` (
`id` int(21) NOT NULL AUTO_INCREMENT,
`ts` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`inp` varchar(32000) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/trunk/SSH/defaults/.stam_config
0,0 → 1,16
# !!! THIS IS A TEMPLATE AND SOURCE OF DEFAULT VALUES !!!
# !!! DO NOT EDIT THIS FILE !!!
# To overwrite these values, please create a file in your homedir:
# ~/.stam_config
db_host=localhost
db_user=root
db_pass=
db_base=stackman
 
weblog_host=localhost
weblog_user=root
weblog_pass=
weblog_base=stackman
weblog_password=
 
simulation=0
/trunk/SSH/INSTALL
0,0 → 1,61
How to install StackMan Terminal Edition
----------------------------------------
 
1. Create a new Linux user, for example
 
sudo useradd stamuser
sudo groupadd stamuser
 
2. Copy the stam program archive to the user's folder and unpack it
 
su stamuser
cd ~
tar -xvf stackmanager_linux.tar.gz
sudo chown -r stamuser:stamuser ~stamuser/stam
 
3. Optional: If you want to avoid direct shell access, you make stam the default shell. For example, the user's entry in /etc/passwd could look like this:
 
stamuser:x:1002:1004:StackMan Terminal Edition,,,:/home/stamuser:/home/stamuser/stam/stam
 
4. Create a MySQL database (and users) and import the following SQL dump:
 
stam_entries.sql
 
5. Copy the default configuration file to the home directory of the user and edit it (add the MySQL data).
 
Method 1:
 
su stamuser
cp ~/stam/defaults/.stam_config ~
nano ~/.stam_config
 
Method 2:
 
su stamuser
~/stam/write_stam_config
 
6. Copy the nanorc file (for syntax highlighting) and, if necessary correct the path to stam.nanorc to the absolute path of your user:
 
su stamuser
cp ~/stam/nanorc/.nanorc ~
rnano ~/.nanorc
 
You can test the syntax highlight with this command:
 
nano ~/stam/nanorc/test.stam
 
7. Optional: If you want to create a live-backup on a external media (e.g. floppy disk or USB flash drive), you can create a symlink for the second history file
 
sudo mkdir /mnt/fdd
sudo mount -o umask=0000,gid=1004,uid=1002 /dev/sda /mnt/fdd
su stamuser
touch /mnt/fdd/stam_history
ln -s /mnt/fdd/stam_history ~/.stam_history_mir
 
---
 
Additional notes:
 
- If you want to run *.stam scripts, you have to correct the shebang to the correct location of the stam executable (#!/.../stam), and make the files executable (chmod +x test.stam)
 
- You can begin with running ~/stam/stam and enter "-help" to view all available commands.
/trunk/SSH/LICENSE
0,0 → 1,674
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
 
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
Preamble
 
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
 
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. 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
them 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 prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
 
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. 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.
 
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
 
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
 
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
 
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
 
The precise terms and conditions for copying, distribution and
modification follow.
 
TERMS AND CONDITIONS
 
0. Definitions.
 
"This License" refers to version 3 of the GNU General Public License.
 
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
 
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
 
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
 
A "covered work" means either the unmodified Program or a work based
on the Program.
 
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
 
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
 
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
 
1. Source Code.
 
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
 
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
 
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
 
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
 
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
 
The Corresponding Source for a work in source code form is that
same work.
 
2. Basic Permissions.
 
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
 
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
 
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
 
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
 
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
 
4. Conveying Verbatim Copies.
 
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
 
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
 
5. Conveying Modified Source Versions.
 
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
 
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
 
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
 
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
 
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
 
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
 
6. Conveying Non-Source Forms.
 
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
 
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
 
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
 
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
 
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
 
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
 
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
 
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
 
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
 
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
 
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
 
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
 
7. Additional Terms.
 
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
 
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
 
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
 
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
 
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
 
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
 
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
 
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
 
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
 
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
 
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
 
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
 
8. Termination.
 
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
 
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
 
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
 
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
 
9. Acceptance Not Required for Having Copies.
 
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
 
10. Automatic Licensing of Downstream Recipients.
 
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
 
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
 
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
 
11. Patents.
 
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
 
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
 
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
 
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
 
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
 
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
 
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
 
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
 
12. No Surrender of Others' Freedom.
 
If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
 
13. Use with the GNU Affero General Public License.
 
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
 
14. Revised Versions of this License.
 
The Free Software Foundation may publish revised and/or new versions of
the GNU 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 that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
 
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
 
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
 
15. Disclaimer of Warranty.
 
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.
 
16. Limitation of Liability.
 
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.
 
17. Interpretation of Sections 15 and 16.
 
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
 
END OF TERMS AND CONDITIONS
 
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
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
 
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
 
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 3 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, see <http://www.gnu.org/licenses/>.
 
Also add information on how to contact you by electronic and paper mail.
 
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
 
<program> Copyright (C) <year> <name of author>
This program 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, your program's commands
might be different; for a GUI interface, you would use an "about box".
 
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
 
The GNU 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 Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
/trunk/SSH/README
0,0 → 1,2
open ./stam.sh and type "-help"
 
/trunk/SSH/TODO
0,0 → 1,7
db-config in INI auslagern
export_file alternative: ausgabe als *.stam format (problem: timestamps gehen velroren)
import_file aus stam-format ODER raw-text-format ODER format mit timestamps
united systemwide journal (-> mysql), nicht userjournal (~.stam_journal) -- anzeigbar in stam direkt
"-le" dauert ewig, direkt ans ende springen
komplett anonymer eingabemodus
 
/trunk/SSH/app
0,0 → 1,75
#!/bin/bash
 
# Get the directory of this script (also works with symlinks)
# http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
# Check MySQL config
"$DIR"/check_db_conn -q
if [ $? -ne 0 ]; then
# TODO: fragen ob man write_stam_config aufrufen möchte
exit 1
fi
 
echo_yellow() {
echo -ne "\033[1;33;40m"
echo "$*"
echo -ne "\033[0m"
}
 
echo_red() {
echo -ne "\033[1;31;40m"
echo "$*"
echo -ne "\033[0m"
}
 
#categ="$1"
categ=$( echo $@ )
if [[ "$categ" == "" ]]; then
echo "Syntax: $0 <entry>" 1>&2
exit 2
fi
 
# Do not allow empty category (reserved for '*')
if [[ "$categ" == "" ]]; then
echo_red "[!] FATAL ERROR: Category cannot be empty!"
exit 1
fi
 
# Warning if it does not exist yet.
"$DIR"/exists1 "$categ"
if [ $? -eq 1 ]; then
echo_yellow "(i) Note: The category does not exist and will be created if you continue:"
echo_yellow " $categ"
SIGN="*"
else
SIGN="+"
fi
 
while (( 1 )); do
# "-r" übernimmt alle "\". gut für z.B. "\\netbios\", schlecht für "\" am zeilenende, um weiterzuschreiben
read -erp "<$categ> $SIGN " entry
if [[ $? -gt 0 ]]; then
# For example end of stream -- exit
break
fi
 
# Keine leeren Zeilen (ist das OK?)
if [[ "$entry" == "" ]]; then
continue
fi
 
# Eintrag hinzufügen
"$DIR"/aps "$categ" "$entry"
if [ $? -ne 0 ]; then
echo_red "[!] FATAL ERROR: Could not append the entry!" 1>&2
else
SIGN="+"
fi
done
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/check_db_conn
0,0 → 1,17
#!/usr/bin/php
<?php
 
if (($argc > 2) || (isset($argv[1]) && ($argv[1] != '-q'))) {
echo "Syntax: $argv[0] [-q]\n";
exit(2);
}
 
require_once __DIR__ . '/includes/db.inc.php';
 
if ((!isset($argv[1])) || ($argv[1] != '-q')) {
echo "MySQL connection OK!\n";
}
 
# TODO: check if tables are set up correctly
 
exit(0);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/exists
0,0 → 1,27
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/wildcard.inc.php';
 
array_shift($argv);
if (!isset($argv[0]) || (trim($argv[0])=='')) $argv[0] = '*';
 
$arg = trim(implode(' ', $argv));
# while ($arg = array_shift($argv)) {
$wildcard = trim(mywc($arg));
 
$res = db_query("SELECT DISTINCT cat FROM stam_entries
WHERE cat LIKE '".db_real_escape_string($wildcard)."'
AND state != 'S'
ORDER BY ts ASC, cat ASC");
if (!$res) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
while ($row = db_fetch_array($res)) {
exit(0);
}
exit(1);
# }
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/exists1
0,0 → 1,26
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
 
array_shift($argv);
if (!isset($argv[0]) || (trim($argv[0])=='')) {
echo "Syntax: $0 <category>\n";
echo "Category may not be a wildcard\n";
exit(2);
}
 
$arg = trim(implode(' ', $argv));
$res = db_query("SELECT DISTINCT cat FROM stam_entries
WHERE cat = '".db_real_escape_string($arg)."'
AND state != 'S'
ORDER BY ts ASC, cat ASC");
if (!$res) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
while ($row = db_fetch_array($res)) {
exit(0);
}
exit(1);
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/export_file
0,0 → 1,38
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/wildcard.inc.php';
 
array_shift($argv);
#if (!isset($argv[0]) || (trim($argv[0])=='')) $argv[0] = '*';
if (!isset($argv[0])) $argv[0] = ''; # keine wildcards erlauben
 
$arg = trim(implode(' ', $argv));
# while ($arg = array_shift($argv)) {
# $wildcard = trim(mywc($arg));
$wildcard = trim($arg); # keine wildcards erlauben
 
$res = db_query("SELECT * FROM stam_entries
WHERE cat LIKE '".db_real_escape_string($wildcard)."'
AND state != 'S'
ORDER BY ts ASC, cat ASC");
if (!$res) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
if (db_num_rows($res) == 0) {
fwrite(STDERR, "Category '$wildcard' not found!\n");
exit(1);
}
while ($row = db_fetch_array($res)) {
$id = $row['id'];
$cat = $row['cat'];
$txt = $row['txt'];
$src = $row['src'];
$ts = $row['ts'];
$short_ts = date('d.m.y H:i', strtotime($ts));
echo "$txt\n";
}
# }
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/import_file
0,0 → 1,27
#!/bin/bash
 
# Get the directory of this script (also works with symlinks)
# http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
 
inputfile="$1"
if [ ! -f "$inputfile" ]; then
echo "ERROR: file '$inputfile' does not exist." 1>&2
fi
shift
 
category=$( echo $@ )
if [[ "$category" == "" ]]; then
echo "Syntax: $0 <inputfile> <category>" 1>&2
exit 2
fi
shift
 
# Process
cat "$inputfile" | "$DIR"/app "$category"
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/listcat
0,0 → 1,30
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/wildcard.inc.php';
 
array_shift($argv);
if (!isset($argv[0]) || (trim($argv[0])=='')) $argv[0] = '*';
 
$arg = trim(implode(' ', $argv));
# while ($arg = array_shift($argv)) {
$wildcard = trim(mywc($arg));
 
$res = db_query("SELECT DISTINCT cat FROM stam_entries
WHERE cat LIKE '".db_real_escape_string($wildcard)."'
ORDER BY cat ASC");
if (!$res) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
if (db_num_rows($res) == 0) {
fwrite(STDERR, "No categories matched to wildcard '$wildcard'\n");
exit(1);
}
while ($row = db_fetch_array($res)) {
$cat = $row['cat'];
echo "$cat\n";
}
# }
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/listent
0,0 → 1,36
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/wildcard.inc.php';
 
array_shift($argv);
if (!isset($argv[0]) || (trim($argv[0])=='')) $argv[0] = '*';
 
$arg = trim(implode(' ', $argv));
# while ($arg = array_shift($argv)) {
$wildcard = trim(mywc($arg));
 
$res = db_query("SELECT * FROM stam_entries
WHERE cat LIKE '".db_real_escape_string($wildcard)."'
AND state != 'S'
ORDER BY ts ASC, cat ASC");
if (!$res) {
fwrite(STDERR, db_error()."\n");
db_close();
exit(1);
}
if (db_num_rows($res) == 0) {
fwrite(STDERR, "No categories matched to wildcard '$wildcard'\n");
exit(1);
}
while ($row = db_fetch_array($res)) {
$id = $row['id'];
$cat = $row['cat'];
$txt = $row['txt'];
$src = $row['src'];
$ts = $row['ts'];
$short_ts = date('d.m.y H:i', strtotime($ts));
echo "$id\t$short_ts\t$cat\t$txt\n";
}
# }
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/manual_search_gaps
0,0 → 1,23
#!/usr/bin/php
<?php
 
require_once __DIR__ . '/includes/db.inc.php';
require_once __DIR__ . '/includes/src.inc.php';
 
$min = 1;
 
$res = db_query("select max(id) as cnt from stam_entries");
$row = db_fetch_array($res);
$max = $row['cnt'];
 
echo "Search gaps between $min and $max\n";
 
for ($i=$min; $i<=$max; $i++) {
 
$res = db_query("select count(*) as cnt from stam_entries where id = $i");
$row = db_fetch_array($res);
if ($row['cnt'] != 1) echo "Fehler: $i\n";
 
}
 
echo "Finished searching for gaps\n";
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/mydump
0,0 → 1,2
#!/bin/bash
mysqldump --flush-privileges --force --dump-date --create-options --opt --extended-insert=FALSE --tz-utc --comments --quote-names --quick --complete-insert --lock-tables -- "$1"
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/nanorc/.nanorc
0,0 → 1,5
set nowrap
 
## Stam files
include "/home/stamuser/stam/nanorc/stam.nanorc"
 
/trunk/SSH/nanorc/stam.nanorc
0,0 → 1,60
syntax "stam" "\.stam(_history){0,1}$"
header "^#!.*/stam$"
 
## Category change
color yellow "^#[^#]*$"
 
## Shebang
color green "^#!.*/stam$"
 
## Mark invalid parameters
color ,red "^-(back|b).+"
color ,red "^-(clear|cls).+"
color ,red "^-(batch|bat).+"
color ,red "^-(sub|su).+"
color ,red "^-(showhistory|shi).+"
color ,red "^-(listcurent|lce).+"
color ,red "^-(help|h|\?).+"
color ,red "^-(exit|quit|x|q).+"
color ,red "^-(unstrike|unstr).+"
color ,red "^-(strike|str).+"
color ,red "^-(movefromid|mfi).+"
 
## Known command parameters
color yellow "^-(singleadd|sa|as|appendsingle|aps)[[:space:]]+[^[:space:]]+"
color yellow "^-(movefromcat|mfc)[[:space:]]+[^[:space:]]+"
color yellow "^-(listent|le)[[:space:]]+.+"
color yellow "^-(listcat|ls|lc)[[:space:]]+.+"
color magenta "^-(unstrike|unstr)[[:space:]]+([[:digit:]]+(\-[[:digit:]]+){0,1}|last)"
color magenta "^-(strike|str)[[:space:]]+([[:digit:]]+(\-[[:digit:]]+){0,1}|last)"
color magenta "^-(movefromid|mfi)[[:space:]]+([[:digit:]]+(\-[[:digit:]]+){0,1}|last)"
 
## Unknown commands
color ,red "^-[^-][^[:space:]]*"
 
## Known commands
color red "^-(back|b)([[:space:]]|$)"
color red "^-(strike|str)([[:space:]]|$)"
color red "^-(singleadd|sa|as|appendsingle|aps)([[:space:]]|$)"
color red "^-(unstrike|unstr)([[:space:]]|$)"
color red "^-(movefromid|mfi)([[:space:]]|$)"
color red "^-(movefromcat|mfc)([[:space:]]|$)"
color red "^-(listent|le)([[:space:]]|$)"
color red "^-(listcurent|lce)([[:space:]]|$)"
color red "^-(listcat|ls|lc)([[:space:]]|$)"
color red "^-(clear|cls)([[:space:]]|$)"
color red "^-(batch|bat)([[:space:]]|$)"
color red "^-(sub|su)([[:space:]]|$)"
color red "^-(showhistory|shi)([[:space:]]|$)"
color red "^-(help|h|\?)([[:space:]]|$)"
color black,green "^-(exit|quit|x|q)([[:space:]]|$)"
 
## Missing parameters
color black,yellow "^-(strike|str)[[:space:]]*$"
color black,yellow "^-(unstrike|unstr)[[:space:]]*$"
color black,yellow "^-(movefromid|mfi)[[:space:]]*$"
color black,yellow "^-(movefromcat|mfc)[[:space:]]*$"
color black,yellow "^-(singleadd|sa|as|appendsingle|aps)([[:space:]][^[:space:]]+){0,1}[[:space:]]*$"
 
## Trailing whitespace
color ,yellow "[[:space:]]+$"
/trunk/SSH/nanorc/test.stam
0,0 → 1,151
#!/usr/bin/stam
 
-unknowncommand
-unknowncommand xyz
 
#categorychange
#category with spaces
##append string with '#' beginning
any other string
--append a string with '-' beginning
 
(no parameters allowed)
-b
-back
-b invalid parameters
-back invalid parameters
 
(requires <id> as paramter)
-strike
-str
-strike 123
-str 123
-strike 123-456
-str 123-456
-strike last
-str last
-strike 123 invalid
-str 123 invalid
-strike invalid invalid
-str invalid invalid
 
(requires <cat> and <entry> as parameters)
-singleadd
-sa
-as
-singleadd cat
-sa cat
-as cat
-singleadd cat entries with space
-sa cat entries with space
-as cat entries with space
-appendsingle cat entries with space
-aps cat entries with space
 
(requires <id> as paramter)
-unstrike
-unstr
-unstrike 123
-unstr 123
-unstrike 123-456
-unstr 123-456
-unstrike last
-unstr last
-unstrike 123 invalid
-unstr 123 invalid
-unstrike invalid invalid
-unstr invalid invalid
 
(requires <id> as paramter)
-movefromid
-mfi
-movefromid 123
-mfi 123
-movefromid 123-456
-mfi 123-456
-movefromid last
-mfi last
-movefromid 123 invalid
-mfi 123 invalid
-movefromid invalid invalid
-mfi invalid invalid
 
(requires <cat> as paramter)
-movefromcat
-mfc
-movefromcat cat
-mfc cat
-movefromcat ca*t
-mfc ca*t
-movefromcat cat invalid
-mfc cat invalid
-movefromcat ca*t invalid
-mfc ca*t invalid
 
(parameter <cat> is optional)
-le
-listent
-le category with spaces
-listent category with spaces
-le cate*gory with spaces
-listent cate*gory with spaces
 
(no parameters allowed)
-listcurent
-lce
-listcurent invalid
-lce invalid
 
(parameter <cat> is optional)
-listcat
-ls
-lc
-listcat cat with spaces
-ls cat with spaces
-lc cat with spaces
-listcat cat w*ith spaces
-ls cat w*ith spaces
-lc cat w*ith spaces
 
(no parameters allowed)
-clear
-cls
-clear invalid
-cls invalid
 
(no parameters allowed)
-batch
-bat
-batch invalid
-bat invalid
 
(no parameters allowed)
-sub
-su
-sub invalid
-su invalid
 
(no parameters allowed)
-showhistory
-shi
-showhistory invalid
-shi invalid
 
(no parameters allowed)
-help
-h
-?
-help invalid
-h invalid
-? invalid
 
(no parameters allowed)
-exit
-quit
-x
-q
-exit invalid
-quit invalid
-x invalid
-q invalid
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/old/stam1.zip
Cannot display: file marked as a binary type.
svn:mime-type = application/zip
Property changes:
Added: svn:mime-type
+application/zip
\ No newline at end of property
/trunk/SSH/sysname
0,0 → 1,4
#!/bin/bash
username=$( whoami )
hostname=$( uname -n )
echo "$username@$hostname"
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/SSH/write_stam_config
0,0 → 1,17
#!/bin/bash
 
read -erp "MySQL Host: " m_host
read -erp "MySQL User: " m_user
read -erp "MySQL Password: " m_pass
read -erp "MySQL Database: " m_base
read -erp "Simulation mode (0 or 1)?: " m_simulation
 
echo "db_host=${m_host}" > ~/.stam_config
echo "db_user=${m_user}" >> ~/.stam_config
echo "db_pass=${m_pass}" >> ~/.stam_config
echo "db_base=${m_base}" >> ~/.stam_config
echo "" >> ~/.stam_config
echo "simulation=${m_simulation}" >> ~/.stam_config
 
exit 0
 
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk/phpstan.neon.dist
0,0 → 1,16
parameters:
level: 5
fileExtensions:
- php
- phps
- sh
paths:
- .
excludePaths:
analyseAndScan:
- .phpstan.tmp
tmpDir: .phpstan.tmp
ignoreErrors:
- '#is always (true|false)\.#'
#- '#Call to function assert\(\) with false will always evaluate to false\.#'
#- '#with no typehint specified\.#'
/trunk/phpstan.sh
0,0 → 1,25
#!/bin/bash
 
DIR=$( dirname "$0" )
 
cd "$DIR"
 
# There are several PHP scripts which run in CLI and don't have file extensions
# To check them with PHPstan, we need to temporarily rename them using this script
 
array=( $( grep -r "#!" . | grep php | grep -v ".svn" | cut -d ':' -f 1 | sort | uniq ) )
 
for ix in ${!array[*]}
do
file="${array[$ix]}"
mv "$file" "$file.php"
done
 
# TODO: Adjust to your path
php7 /root/phpstan.phar
 
for ix in ${!array[*]}
do
file="${array[$ix]}"
mv "$file.php" "$file"
done
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/trunk
Property changes:
Added: svn:ignore
+.phpstan.tmp
+phpstan.neon
+